I spent $72 on AliExpress and Amazon. Four orders over the course of a week. What I got back was seven ESP32 boards, a bag of sensors, a proper soldering iron, and enough dupont wire to trip over. The goal: put a microcontroller in every room of my apartment and wire them all into Home Assistant.
No Tuya. No cloud subscriptions. No apps that stop working when some startup gets acqui-hired. Just bare boards running ESPHome, talking to a Home Assistant instance on my Unraid server over WiFi.
The Shopping List
I split this across four AliExpress orders and one Amazon order. AliExpress coupon stacking is a whole game. First order gets you NEWUS04OFF for $4 off, then you cycle through USWA3G, USTK3, and so on. I saved $13 in coupons across the four orders.
The core of the build is the ESP32-S3 SuperMini. These are tiny dual-core boards with WiFi and Bluetooth 5.0, and they cost between $2.64 and $3.64 each depending on the store. I bought six of them. The seventh board is an ESP32-C3 SuperMini for a simpler job that only needs WiFi.
| Category | What | Cost |
|---|---|---|
| Boards | 6x ESP32-S3 + 1x ESP32-C3 SuperMini | $22.45 |
| Sensors | 5x PIR, 1x mmWave, 1x MQ-2 gas, 1x water leak, 1x IR TX/RX | $13.34 |
| Camera | OV5640 5MP module + AC-DC buck converter | $6.14 |
| RF | 433MHz TX+RX module, WS2812B LED strip | $4.46 |
| Components | 100x 2N7000 MOSFETs, 100x 10K resistors, dupont wires | $6.15 |
| Tools | Flux pen, solder wick, desoldering pump, helping hands | $13.89 |
| Solder | 60/40 rosin core 0.8mm + Hakko FX888DX | $136.87 |
| Prototyping | Breadboards (830 + 400 tie points) + jumper wires | $10.76 |
Honest accounting. The $72 covers all the boards, sensors, wires, and consumables. But the Hakko FX888DX was $131 on its own and the breadboard kit was another $11. I'm not counting those because they're shop tools, not project parts. If you already own a soldering iron, the actual project cost is $72.
I also already had a Hakko DASH 25W iron, a Fluke 87V multimeter, flush cutters, wire strippers, an ESD mat, heat shrink, and a soldering microscope. The BSEE pays for itself in saved tool purchases, eventually.
The Room Plan
Seven boards, seven jobs. Each room gets a dedicated ESP32 running ESPHome with whatever sensors make sense for that space.
| Room | Board | Sensors | Control |
|---|---|---|---|
| Bedroom | ESP32-S3 | BLE proxy, PIR, mmWave presence | Ceiling fan via 433MHz RF |
| Living / Kitchen | ESP32-S3 | BLE proxy, MQ-2 gas, water leak | |
| Loft / Office | ESP32-S3 | BLE proxy, PIR | Duct fan PWM (CLOUDLINE T6) |
| Bathroom | ESP32-S3 | BLE proxy | Smart toilet via IR TX/RX |
| Front Door | ESP32-S3 + OV5640 | Camera (Frigate NVR) | Doorbell |
| 14900K PC | ESP32-C3 | Power/reset relay (F_PANEL) | |
| Spare | ESP32-S3 | Unassigned backup |
Every S3 board also acts as a Bluetooth proxy. That means Home Assistant can track BLE devices (phones, watches, AirTags) room by room without dedicated BLE trackers. Five boards spread across the apartment gives surprisingly good room-level presence detection.
ESPHome on Unraid
The brain of the operation is ESPHome running as a Docker container on my Unraid server. Installed it from Community Applications, took about 30 seconds. The dashboard lives at port 6052 and it's where you write YAML configs, flash boards, and watch live logs.
# Config path on Unraid: /mnt/cache/appdata/ESPHome/ # Device configs: bedroom-node.yaml living-room-kitchen-node.yaml loft-office-node.yaml bathroom-node.yaml # All sensitive values use !secret references # WiFi creds, API keys, OTA passwords in secrets.yaml
I flashed all four in-hand ESP32-S3 boards in one session. USB-C cable into each one, hit "Install" in the dashboard, wait 90 seconds. After the initial USB flash, every future update goes over the air. You just click "Update" and ESPHome pushes the new firmware wirelessly.
All four boards came online on 2026-03-28 running ESPHome 2026.3.1. Soldered headers on the bathroom board the next day. The other three still need their pins.
The Builds
BLE Proxy Network (done)
This one was basically free. Every ESP32-S3 already has Bluetooth 5.0, so I just added bluetooth_proxy to each config. Now Home Assistant can see every BLE device in the apartment and triangulate which room it's in based on signal strength.
Four nodes are live. Once I add the fifth (front door) and sixth (loft spare), coverage should be solid enough to distinguish bedroom from kitchen.
Smart Toilet IR Control (in progress)
Yes, really. I have a Luoware smart toilet with an IR remote. The plan is simple: point an IR receiver at the remote, capture each button's protocol and code from the ESPHome logs, then replay those codes from Home Assistant.
# IR wiring: TX on GPIO2, RX on GPIO4 remote_transmitter: pin: GPIO2 carrier_duty_percent: 50% remote_receiver: pin: number: GPIO4 inverted: true dump: all
The board is flashed and the headers are soldered. This was blocked for two days because the IR module and the ESP32 both have male header pins, and I only had male-to-female dupont wires. Picked up Order 1 from my parents' house today and now the female-to-female wires are in hand. Ready to wire up.
Duct Fan PWM Control (wired up, needs parts)
This is the most interesting build. I have an AC Infinity CLOUDLINE T6 in the loft that exhausts hot air from my 14900K workstation down to the living room. Right now it runs at a fixed speed from the stock controller. I want Home Assistant to ramp the fan speed based on how hard the PC is working.
The T6 uses an EC motor controlled by a 5kHz PWM signal. The fun part: the logic is inverted. 0% duty cycle means full speed. 100% duty means off. This is a safety thing. If the control wire gets disconnected, the fan runs at max speed instead of shutting down.
The fan's connector is a standard 4-pin Molex, same as an old IDE drive cable. Pin 1 is +10V (powers the stock controller), pin 2 is ground, pin 3 is the PWM signal, and pin 4 is unused because there's no tachometer output.
output: - platform: ledc pin: GPIO7 id: duct_fan_pwm frequency: 5000 Hz inverted: true # 0% = full speed fan: - platform: speed output: duct_fan_pwm name: "Loft Exhaust Fan" speed_count: 10 # matches stock 10-speed restore_mode: ALWAYS_OFF
The ESP32-S3 outputs 3.3V on its GPIO pins, but the fan expects a 10V PWM signal. In theory, I need a level shifter. A single 2N7000 MOSFET with a couple of 10K pull-up resistors would do it. I've got both now (100x of each from Order 1, which I picked up today). But multiple people on the RollItUp forums report that 3.3V works just fine on the T6's PWM input. So my plan is to try direct first. If the fan speed is erratic, I'll add the MOSFET circuit.
Measure first. Before connecting anything, I'm going to probe the Molex connector with the Fluke to verify the voltages actually match what the manual says. Fried GPIO pins are not fun to debug.
The automation I want: fan speed follows the 14900K's power draw. PC off means fan off. Idle at 60W means low speed. Gaming at 300W means full blast. I already have a smart power strip reporting wattage to Home Assistant, so this is just a threshold automation.
DIY Doorbell Camera (waiting on parts)
An ESP32-S3 paired with an OV5640 5MP camera module, powered by a buck converter stepping the existing AC doorbell transformer down to 5V. The camera feed goes to Frigate NVR on Unraid, which runs AI object detection on a Coral TPU. This replaces my Ring doorbell with something that doesn't phone home to Amazon.
All the parts are in Order 4. ETA early April.
Ceiling Fan RF Control (waiting on parts)
My bedroom Pochfan uses a 433MHz wireless remote. The plan: use the RF receiver to capture the remote's codes, then replay them with the RF transmitter. Same approach as the IR toilet control but at radio frequency instead of infrared. The 433MHz TX/RX module is also in Order 4.
Kitchen Safety Sensors (partially ready)
The kitchen node gets two safety sensors. A water leak detector goes under the sink to catch pipe failures before they become floor damage. That sensor is in hand. The MQ-2 gas/smoke sensor goes near the stove for leak detection. That one is in Order 4.
14900K Power Controller (ready to build)
Quick background on this machine. It's an i9-14900K with a 4090 and a 4070 running dual-GPU inference for local LLMs. The 4070 was stuck at Gen3 x1 for weeks because the board's PCIEX4 slot was defective - it negotiated Gen3 x1 instead of its rated Gen4 x4. I fixed it with a $30 K43SG M.2-to-PCIe adapter that converts an unused NVMe slot into a proper Gen4 x4 link. That took the 4070 from 3% of rated bandwidth to 8x what it had before. 70B parameter models went from unusable to 25 tok/s across both GPUs.
The problem now is simpler but more annoying: Wake-on-LAN no longer works reliably. The K43SG adapter needs DIP switch timing delays (4.5s on PERST#, 9s on CLKRUN#) to prevent the Z790 board from boot-looping at POST code 11. Those delays hold the 4070 off the PCIe bus for ~9-13 seconds after power-on, which is what makes it work at all. The side effect is a two-press boot sequence. The first power press brings the system up to ~57W with a blank debug LED while the delay switches count down. If it sits there for more than 10 seconds, you have to press the power button a second time to push past it. WoL can send the initial wake signal, but it's a one-shot trigger. There's no mechanism to send a "second press" over the network. So the machine powers on, sits in that half-awake state, and hangs there until someone physically presses the button again.
The machine sits in the loft and I don't want to walk upstairs every time I need to power it on. Instead of fighting BIOS settings and network stack quirks, I'm going to bypass WoL entirely. An ESP32-C3 wired to the front panel header with a 2N7000 MOSFET can short the power switch pins on command. Same thing as pressing the physical button, but triggered from Home Assistant over WiFi. And unlike WoL, it can send as many presses as needed - one to power on, another to push past the delay switch standby if it stalls.
The circuit is straightforward. The F_PANEL power switch pins are just a momentary short to ground. A 2N7000 across those pins, gate driven by a GPIO through a 10K resistor, and you've got remote power control. The C3 is the right board for this since it only needs WiFi, no Bluetooth, and it fits inside the case powered by an internal USB header.
All the parts are in hand now. This one is ready to build.
What I Already Had
I went to school for electrical engineering. That means I have a parts bin from college that still has components in it. A Fluke 87V multimeter that has paid for itself ten times over. Flush cutters, wire strippers, an ESD mat, heat shrink, and a soldering microscope with a screen.
Having proper tools matters. The helping hands with flex arms ($6 from AliExpress) turned out to be one of the best purchases in this whole project. Soldering castellated pads on a board the size of a postage stamp without something holding it still is an exercise in frustration.
Current Status
Four ESP32-S3 boards are flashed and online. One has headers soldered. The other three need pins. Three of the four AliExpress orders have arrived. Order 4 is the last one in transit with the doorbell camera parts, RF module, gas sensor, and mmWave radar. Picked up Order 1 from my parents' house today, so the PIR sensors, MOSFETs, resistors, and F-F dupont wires are finally in hand. That unblocks the bathroom IR build, the 14900K power controller, and the duct fan level shifter all at once.
The Hakko FX888DX also showed up today. Significant upgrade from the 25W DASH iron I've been using.
Next steps: solder headers on the remaining three boards, add all four devices to Home Assistant, wire up the bathroom IR module, and probe the CLOUDLINE T6 connector before hooking up the fan control.
Total invested so far: $72 in project parts, plus $142 in tools I'll use for years. Seven rooms covered. No cloud dependencies. No subscriptions. And if any board dies, a replacement is $3 from AliExpress.