Remote Homelab in an Unheated Building

Rough estimate of heat dissipation of internal components. Can they alone keep enclosure above freezing?

TL;DR: Yes, most of the time. No, not always.

i5 : idle reported to be approximately 45W/hr for the entire system
DAC ConnectX3 : 5W/hr
External Hard Drive : 12V 1.5A, 18W, 18W @ 50% load = 9W/hr
Network Switch : 12V 1.5A, 18W @ 50% load = 9W/hr
UPS : 26.3 BTU/hr in AC mode, 8W/hr
RPi5 2.4W/hr idle : 2W/hr

Ignoring effect of intake and exhaust openings:

  • total = 45W/hr (i5) + 5W/hr (X3) + 9W/hr (HD) + 9W/hr (Switch) + 8W/hr (UPS) + 2W/hr (Pi5) = 78W/hr;
  • exceeds 21W/hr required for steady state and may require cooling fans when i5, DAC ConnectX3, and External Hard Drive are active;
  • heat dissipation, especially from the i5, will quickly raise temperature when intake and exhaust fans are idle.

When i5, DAC ConnectX3, and External Hard Drive are disconnected from AC power when they are not required. BTW, this homelab will provide more services over time. Current use-case requires availability once per week as an rsync server:

  • total = 9W/hr (Switch) + 8W/Hr (UPS) + 2W/hr (RPi5) = 19W/hr;
  • less than 21W/hr steady state and would require thermostat controlled heating in worst case;
  • the remaining components alone will not raise temperature

Going to assume that the heating & cooling thermostat will compensate as needed. Only in-situ testing can verify this back of the envelope analysis but it seems reasonable.

Double hulled insulated box is complete. Using plywood scraps made the fabrication slightly harder because all factory edges had already been used in other projects. It’s easy to be off 1/4", two blade widths, when using a skillsaw to cut straight even when using a fence if the cutting surface is not in plane and things wobble a bit. Anyways, done.

AI Query ( aka Steve Burke GamersNexus bot )

Is there optimal placement for intake and exhaust fans, for both cooling and heating, in a temperature controlled enclosure?

TL;DR

  • Optimal fan placement for temperature control involves strategic positioning: intake at the bottom for cooling, exhaust at the top or opposite end, and ensuring a clear, unobstructed path for airflow;
  • For heating, the focus is on mixing and distributing warm air, often using fans to counteract stratification;
  • For optimal temperature control in an enclosure, the placement of intake and exhaust fans should prioritize creating a balanced and efficient airflow path to manage heat effectively, whether cooling or heating.

For cooling, the best strategy is to establish a consistent airflow pattern that draws in cooler air and expels hot air. Intake fans should be positioned at the lower portion of the enclosure, ideally near the bottom corners or sides, to pull in cooler air from the outside:

  • This is particularly effective because hot air rises, so cooler air entering at the bottom can displace warmer air that accumulates at the top;
  • Exhaust fans should be placed at the top or opposite end of the enclosure to remove heated air efficiently;
  • This front-to-back or bottom-to-top configuration ensures that hot air is continuously expelled, preventing stagnation and maintaining stable internal temperatures;
  • A balanced setup with intake and exhaust fans working in tandem helps avoid negative pressure, which can draw in unfiltered dust or disrupt airflow.

In some cases, such as with electronic enclosures, it may be beneficial to create positive pressure by ensuring the intake airflow exceeds the exhaust airflow, which helps keep dust and contaminants out through the intake filter:

  • For maximum cooling efficiency, components that generate significant heat should be placed near the intake to benefit from cooler incoming air, while cooler components can be located further from the intake;
  • In larger spaces, using multiple fans—such as one on the cool side (e.g., north or east) and another on the hot side (e.g., south or west)—can create cross-ventilation, enhancing overall airflow and cooling.

For heating, the principle shifts slightly. Instead of removing heat, the goal is to distribute warm air evenly. In this case, exhaust fans can be used to circulate air and prevent stratification, where hot air accumulates at the top. Placing fans to push warm air down from the top or to mix air throughout the enclosure can help maintain uniform temperature distribution:

  • However, the primary focus in heating scenarios is often on minimizing heat loss and ensuring even distribution rather than active exhaust.

Not mentioned, but important, is where to route waste heat from the exhaust. Obviously not going to drill a hole through the building. Best bet at the moment is to point it at a doorway so that entropy does its magic and disperses the heat by mixing with some outside air. May eventually vent into the adjacent storage cabinet.

Remote Homelab cabinet fabrication is done. Moving on to temperature control testing where the system is run with minimal equipment; more equipment added over time, maybe a couple of weeks. Hope to have entire equipment rack deployed and running real-soon-now. First Remote Homelab service is rsync support for off-site backup.

Two temperature monitoring options are available:

  1. RPi5 Raspberry OS connected to two BME280 modules via I2C;
  2. Tasmota WT32-ETH01 (aka ESP32-S1) connected to two BME280 modules via I2C.

There are six temperature probes in total. Four within the insulated case, one in the remote building, and one external to the building. The only one that counts is the STC-1000 All-Purpose Digital Temperature Controller that runs the show. It switches on the heating and cooling. The others are a sanity check, and for remote monitoring, to help analysis should something go wrong.

Will first try the RPi5 loadout. It can interface to BME 280 temperature probes, and at some point deliver rsync services to the main homelab. With a USB3 2.5G NIC this is a viable replacement for the ITX system, for now, and may be how things shake out until the next project is ready (AI requirements being defined pending more research).

WT32-ETH01 SBC running Tasmota & RPi5 connected to two BME280 sensors


As Pictured (USB Serial to Rpi5 debug port wiring harness). The colors non-standard vendor specific.

USB Serial RX  -> RPi5 TX Red
USB Serial TX  -> RPi5 RX Blue
USB Serial GND -> RPi5 GND Black

RPi5 Bash Shell

ls /dev/i2c*
/dev/i2c-1 /dev/i2c-13 /dev/i2c-14


RPi5 I2C-1 to BME280 via 4 Pin USB-C connector

SD0 -> GND (White) or N/C Address 0x77
	   VCC (White) Address 0x76
CSB -> NC
SDA -> USB D- (Blue)   -> RPi5 Pin 3, GPIO 2, I2C1 SDA 
SCL -> USB D+ (Yellow) -> RPi5 Pin 5, GPIO 3, I2C1 SCL
GND -> USB GND (Black) -> RPi5 Pin 39, Ground
VCC -> USB VCC (Red)   -> RPi5 Pin 1, 3.3V

i2cdetect -y 1

	 0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- 76 77

cat test_bme280.py

#!/usr/bin/python

import time
import smbus2
import bme280

address = 0x76
bus = smbus2.SMBus(1)
calibration_params = bme280.load_calibration_params(bus, address)
data = bme280.sample(bus, address, calibration_params)
temperature_celsius = data.temperature
print("Temperature: {:.2f} °C".format(temperature_celsius))

address = 0x77
bus = smbus2.SMBus(1)
calibration_params = bme280.load_calibration_params(bus, address)
data = bme280.sample(bus, address, calibration_params)
temperature_celsius = data.temperature
print("Temperature: {:.2f} °C".format(temperature_celsius))

python test_bme280.py

Temperature: 25.36 °C
Temperature: 25.60 °C

Fiddling with power distribution options. Simplest is to use a small power bar and separate power supplies for each device. No fun but guaranteed to work.

Second option under consideration is a USB-C PDU. Current LM12596 based PDU, as shown in picture, is not sufficient. Quite a bit of power is needed. Worst case the PDU has to deliver:

  • network switch, 12V @ 1.5A, 18W
  • external hard disk, 12V @ 1.5A, 18W
  • Raspberry Pi 5 as rsync server / temperature monitor: 5V @ 5A, 25W

This is doable with a USB-C PDU but 12V is not widely implemented. Cable vendor says:

USB C to DC Power Cable: This power cord will work with any PD compatible USB Type-C outlet power supply or battery to power your DC 12V devices.

Bold claim. Probably hinges on the word “compatible”. Let’s see which of my three USB-C PDU devices actually work in this scenario.

Going with a power bar and will experiment with a USB-C based PDU as time permits.

Expecting that RemoteHomelab -mini will help verify heating and cooling architecture at the low end of the power consumption spectrum.