DIY UPS for Home Assistant Green & Xfinity XB7 Modem
A 12V LiFePO4-based uninterruptible power supply for keeping a Home Assistant Green and Xfinity XB7 cable modem running during grid outages. Built into an IP65 enclosure with Home Assistant monitoring via Shelly Plus Uni.
Honest context: A $85 APC BE600M1 provides comparable backup capability. This build costs roughly the same over 10 years as that option (based on battery replacements and electricity usage). The engineering rationale — longer battery life, faster switchover, direct HA integration, no DC-DC converter voltage regulation — is documented in design-rationale.md. Build this if those tradeoffs matter to you.
Performance Summary — Validated May 6 2026 (INA260)
Validated Runtime: ∼3.6 hours to hardware LVD (11.8V) under sustained 14.9W load. INA260 coulomb-counted 4.18 Ah / 53.3 Wh.
Monitoring upgrade: Shelly Plus Uni replaced April 2026 by ESPHome XIAO ESP32-C3 + Adafruit INA260 + DS18B20. All capacity figures below are now coulomb-counted, not inferred from voltage.
Key Finding: ∼3.6h is ∼42>#/span### of theoretical maximum (10 Ah / 1.18A = 8.47h). Not degradation or software — direct consequence of single-rail 13.3V CV architecture holding battery at ∼65% SOC.
Capacity zone | Ah | Reason |
|---|---|---|
Float ceiling — never loaded | ∼3.5 Ah | 13.3V float ≈ 65% SOC; requires 14.4V charger to recover |
Rate/LVD penalty | ∼1.3 Ah | IR drop at 1.18A strands charge above LVD |
Delivered (INA260 measured) | 4.18 Ah | Coulomb-counted, May 6 2026, 217 min AC-off |
Protected at LVD cutoff | ∼0.8 Ah | Intentional; prevents over-discharge |
Below LVD to rated-empty | ∼0.8 Ah | Intentional; cell protection |
Discharge Characteristics:
- Extremely flat plateau 13.0V down to 12.85V — bulk of usable energy
- Knee region 12.40–12.85V — ∼53 min at production load
- Cliff begins at ∼12.40V: slope accelerates -30 mV/min to -58 mV/min
- 12.4V warning gives 15–20 min action time before hardware LVD
Conclusion: System performs as designed. Layered protection — voltage warnings → automated shutdown → BP-65 hardware LVD — robust and all three tiers now fully live-validated. Two-stage architecture (dedicated 14.4V charger + DC-DC regulator) would be required to approach full ∼7.1–8.5h theoretical.
Last validated: May 6 2026 (INA260)
Commissioning Results
Full two-cycle discharge test March 25–26 2026 using Netgear R6400 router (∼7W DC) as substitute load, Shelly Plus Uni 5-sec logging for baseline, then INA260 validation.
Discharge 1 (7.76h): 13.2V→13.0V over 7.76h, only 0.2V drop at light load — textbook LiFePO4.
Recharge (10.1h): AC restored, PSU returned to float within minutes, peaking 13.28V stable.
Discharge 2 (9.36h): To LVD — Victron BP-65 tripped at 11.77V within 0.03V of 11.8V design target. Post-LVD OCV rebound 12.13V confirms healthy chemistry.
Key findings: plateau variance <0.2%/hr, BP-65 accuracy ±0.03V, internal resistance ∼260mΩ at low SoC (from OCV recovery), bulk recharge 12.9→13.2V in <12 min.
Full reports: <a href="https://github.com/wkcollis1-eng/DIY-LiFePO4-UPS/blob/main/reports/UPS_Report_2026-05-06.md">reports/UPS_Report_2026-05-06.md</a> (INA260 first measurement, 12.2V automation confirmed)
System Overview
AC grid → Mean Well HDR-60-12 PSU set to 13.3V float (trimmer lacquered, drift 3–5 mV/year) → MOSFET ideal diode → 12V 10Ah Cyclenbatt LiFePO4 → Victron BatteryProtect BP-65 disconnects at 11.8V after 90s hold-off. On grid failure, loads switch to battery in <1ms. ESPHome XIAO ESP32-C3 + INA260 + DS18B20 reports voltage, current, power, accumulated Ah/Wh to HA via Pololu D24V7F3 3.3V regulator (30–40 mA draw).
Key Specifications
Parameter | Value |
|---|---|
PSU | Mean Well HDR-60-12, 13.3V float |
Battery | Cyclenbatt 12V 10Ah LiFePO4 |
Float | 13.3V set on PSU trimmer, lacquered |
LVD cutoff | 11.8V Victron BP-65 Setting 7 |
LVD reconnect | 12.8V 30s delay |
Device... |
Bill Collis







markwarren.ee
Manuel Tosone
Manuel Alfonso
Sagar 001
Hi Nicholas,
This is one of the nuances of the design -
Neither — this design bypasses CC-CV entirely by using passive float
charging.
How it works:
- PSU is set to 13.3V (LiFePO4 resting voltage)
- Current is naturally limited by the voltage differential between PSU and battery
- As battery charges, the differential shrinks → current tapers organically
- At equilibrium, current drops to near-zero (microamps)
The BMS role:
- The Cyclenbatt's built-in 10A BMS provides protection only (OVP, UVP, OCP, short circuit)
- It does not regulate charging current — it would only intervene if current exceeded 10A (which can't happen here since max PSU output is 8.5A, and typical charge current is <2A)
Why this works for LiFePO4:
- LiFePO4 has a flat discharge curve and tolerates indefinite float at 13.3V
- No risk of overcharge since 13.3V is below the 14.4-14.6V charge termination voltage
- Trade-off: charges to ~95% SoC rather than 100%, but extends cycle life
Hope that answers you question.
Bill