Running a Home Server and Network Stack from 12V Solar

Overview

The home automation and server infrastructure here runs directly from the 12V LiFePO4 solar battery bank rather than from mains via inverter. This keeps the critical systems online during grid outages and eliminates inverter losses for loads that do not need 240V AC.

The load list:

  • Synology NAS — file server, HA backups, Plex, email server, web server — running 24/7 for 13 years
  • WiFi 7 router
  • ADSL modem
  • Raspberry Pi 5 (Home Assistant)
  • Amazon Echo
  • Several ESP32 sensor and display boards
  • Motion-activated lighting throughout the house

The office — Mac Mini, two screens, active speakers at around 140W — runs from the Victron Phoenix 12/375 pure sine inverter. In summer this runs most days from solar. In winter it is an occasional load.

The solar array is approximately 300W in a partially shaded dense urban setting — not rooftop. Panel placement is a compromise dictated by available locations rather than optimal orientation.


Fusing

Everything is fused. The battery feeds an automotive/marine blade fuse box with around 8 fused outputs, each protected with an appropriately rated blade fuse for the load it serves. The fuse box has a cover. This is not optional — a short circuit on an unfused LiFePO4 system can deliver thousands of amps and start a fire instantly.

The wiring path is: LiFePO4 battery → fuse box → DC-DC converters → loads.


The Problem with LiFePO4 Voltage Swing

A 12V LiFePO4 battery does not sit at a constant 12V. Under charge it reaches 14.4-14.6V. Under moderate discharge it sits around 13.2-13.4V. The BMS cuts off at around 10V but the discharge curve is so steep at that point it is only minutes of runtime. In practice the system is set to trigger mains top-up charging at 11V — well above the BMS cutoff.

Any equipment powered directly from the battery sees that entire range. Routers, NAS units, and modems with cheap internal regulators can behave unpredictably at the top of the charge range, and some protection circuits trip at low voltage before the battery is actually depleted.

The solution is regulated DC-DC conversion between the battery and the loads.


The Core Converter: Buck-Boost 8-40V to 12V

The workhorse of the 12V rail is a DC-DC buck-boost converter rated 8-40V input, 12V/3A output, 36W — around £19 on Amazon.

This is the right tool for a LiFePO4 installation because it is a true buck-boost — it can both step down and step up, meaning it maintains a stable 12.2V output across the full battery voltage range from charged to nearly depleted. A pure buck converter would fail to regulate once the battery drops below its output setpoint.

This single converter has been running continuously for over a year powering:

  • Synology NAS via barrel connector
  • WiFi 7 router via barrel connector
  • ADSL modem via barrel connector
  • Amazon Echo via barrel connector

All four devices see a stable 12.2V regardless of battery state. The converter handles the full swing of LiFePO4 charge/discharge without complaint.


Raspberry Pi 5: The USB-PD Problem

The Pi 5 is more demanding than its predecessors. It uses USB Power Delivery negotiation and expects a compliant 5V/5A PD source. Feed it a plain 5V buck converter output and it boots — but logs a low-power warning and limits the USB ports to 600mA instead of the full 1.6A. For a headless HA server with several USB devices this matters.

The converter used is an XY-3606 buck converter, 9-36V to 5.2V, 6A — around £6 on Amazon. Solid, efficient, handles the full battery voltage range without issue.

The PD problem is solved with a one-line config fix. Add this to /boot/firmware/config.txt on the Pi:

usb_max_current_enable=1

This tells the Pi to skip the PD handshake and assume full current is available. The warning disappears and USB ports operate at full current.

Accessing the Boot Partition on HAOS

This is the fiddly part. Home Assistant OS runs from a read-only boot partition that is not accessible from within HA itself — not via the file editor, not via the SSH add-on.

The only reliable way to edit config.txt is to remove the storage device (USB SSD or SD card), mount it on another computer, edit the file on the FAT32 boot partition, and reinstall it. On a Mac the boot partition mounts automatically in Finder when you plug in the drive.

It is a one-time operation — once the line is in config.txt it survives reboots and HA updates indefinitely.


ESP32 Boards

The ESP32 sensor and display boards run from 5V USB. At 150-250mA per board the total current draw is modest. A USB hub powered from the XY-3606 output handles them cleanly.


Winter Top-Up: Economy 7 Automation

In winter the solar array may not fully cover the 12V loads. When the battery drops below 11V overnight, a Home Assistant automation triggers the Victron BSC IP67 12/17 mains charger on the Economy 7 off-peak tariff (00:30-07:30 GMT, 15.02p/kWh). The charger runs until the battery is full or the off-peak window ends.

Each time it triggers, the charger tops up approximately 600Wh — roughly one day of 12V load. Over an entire winter this happens around 15-20 times in total. From spring through autumn it essentially never happens — solar covers everything.

Both the Victron BSC charger and the Phoenix inverter talk to Home Assistant via BLE, giving full visibility of charge state, current, and energy flows on the dashboard.


Load and Yield Logging

All power flows are monitored in Home Assistant:

  • Solar yield — from the Victron SmartSolar MPPT 100/20 via BLE (see the Victron BLE monitoring post)
  • Battery voltage — live from the same MPPT feed
  • House load — via a Sonoff energy monitoring plug, supplemented by derived sensors
  • Monthly totals — utility meters tracking yield and consumption

The daily yield vs load bar chart gives an immediate picture of whether the solar system is covering the 12V loads or drawing from the charger overnight.


Power Budget

The 12V infrastructure draws roughly:

Device Typical draw
Synology NAS (idle) ~15W
WiFi 7 router ~8W
ADSL modem ~4W
Raspberry Pi 5 ~5W
Amazon Echo ~3W
ESP32 boards (×6) ~6W
Lighting (motion, standby) ~2W
Total ~43W

At 43W continuous the 200Ah LiFePO4 bank (approximately 1.9kWh usable) covers around 44 hours of runtime without any solar input. In practice the system has never depleted the battery to the automation trigger point in summer. In winter the E7 automation handles the occasional overnight shortfall.

The server delivering this page is part of that same 12V infrastructure — solar powered all year round.


fletcher@gingineers.com