Your Homelab Just Ate a Power Fluctuation. Now What?
You’ve got 30 seconds before your Proxmox hypervisor panic-shuts down. Your NAS is mid-rebuild. Your router goes dark. Welcome to the reason UPS units exist — except 90% of homelab folks either massively overspec them (buying a $3,000 tower when a $400 unit would do) or undersell themselves into disappointment.
This is about math, not magic. Let’s talk real sizing, real battery costs, and when the EcoFlow River thing in your garage is actually smarter than slapping down $1,500 for enterprise hardware.
The VA/Watts Confusion Nobody Talks About
APC and every other UPS vendor list capacity in VA (Volt-Amps). Your power supplies list watts. They’re not the same, and that gap is where your money evaporates.
VA = apparent power (volts × amps, the full math). Watts = real power (what actually does work). The ratio between them is called power factor, and it’s usually 0.6–0.8 for UPS units. Translation: that 1500 VA UPS? About 900–1200 actual watts, depending on the load.
Here’s the rule:
Max Watts = VA × Power Factor (typically 0.6–0.8)A 1500 VA APC BR1500 rates at roughly 900 watts of continuous power. An 3000 VA APC SMX3000RM? About 1800 watts. Vendors bury this in the fine print because it sells bigger numbers.
So your first step: add up the actual watts of everything that needs to stay alive during an outage:
- Motherboard + CPU: 20–50W (idle)
- NAS (4-bay RAID): 40–80W (idle); 100–150W (rebuilding)
- Core switch: 15–30W
- Router: 10–20W
- Modem: 10W
- Monitor (optional): 20–40W
If you’re running a gaming rig too, add 150–300W. If you’ve got a small Kubernetes cluster, you’re closer to 200–400W.
Real example: Proxmox box (CPU 25W) + NAS (60W idle, 120W spinning) + switch (20W) + router (15W) + modem (10W) = 130W idle, 200W worst case. You could survive on a 500 VA UPS (300W actual), but you’d be cutting it close. Go 1500 VA (900W) and sleep at night. That’s the difference between “$400 and peace of mind” versus “$400 and prayer hands when a drive rebuilds.”
Runtime Math (The Part That Actually Matters)
VA and watts are one thing. How long does your UPS actually keep your gear alive? That’s runtime, and it’s where the spec sheet lies hardest.
Every APC datasheet lists runtime at a certain load. Their charts look like this:
| Load (%) | Runtime |
|---|---|
| 25% | 100+ min |
| 50% | 45 min |
| 75% | 20 min |
| 100% | 8 min |
See the trap? They’re quoting 25% load. You’re probably pulling 50–75%. Your actual runtime is half to a quarter of what the box says.
Here’s the real formula:
Runtime (minutes) ≈ (Battery Capacity Wh) / (Load Watts) × 0.9The 0.9 factor is because UPS inverters are maybe 80–90% efficient, and you lose a few percent to internal resistance.
Worked example: APC BR1500 (1500 VA) uses two 12V/9Ah batteries wired in series = 24V × 9Ah = 216 Wh actual capacity. If you’re pulling 200W:
Runtime = (850 Wh / 200W) × 0.9 ≈ 3.8 minutesThat’s it. Four minutes. Enough to shut down gracefully, not enough to ride out a 10-minute outage. If you need 15+ minutes of runtime, you’re either buying a bigger UPS or adding batteries. And that’s the next trap.
Battery Replacement: Where UPS Vendors Get Rich
Your UPS batteries are lead-acid. They die in 3–5 years, sometimes sooner if you’re in a hot climate or run deep discharges (which you will, if you actually use your UPS during an outage).
Replacement batteries cost 40–60% of the original UPS price. An APC BR1500 costs ~$400; replacement batteries run $200–$250. SMX3000? $1,500 for the unit, $600+ for batteries.
This is where you need to do the cost-per-year math:
- BR1500 (@$400, batteries @$250, 4-year lifespan): $400 initial, $250 every 4 years = ~$142/year
- SMX3000 (@$1,500, batteries @$600, 4-year lifespan): $1,500 initial, $600 every 4 years = ~$525/year
Unless you genuinely need the larger capacity, you’re throwing away $383 a year for extra runtime you won’t use.
The path forward: Pick a UPS that covers your base load + 30% headroom, then buy spare batteries now while they’re in stock and the UPS is still current. APC discontinues models, and you’ll eat shipping costs to get batteries 2 years later. Stack them in a cool, dry closet.
Sine Wave vs. Simulated Sine Wave (The Audio Equipment Wrinkle)
Most UPS units in the $400–$1,500 range produce simulated (stepped) sine wave output during battery mode. Meaning the inverter approximates a smooth 60 Hz wave with discrete voltage jumps. It looks jagged on an oscilloscope but works fine for 99% of homelab gear.
Except audio equipment. If you’ve got studio monitors, hi-fi DAC, or even a decent powered speaker hooked to your UPS, simulated sine wave can introduce 60 Hz hum and harmonic distortion. It’s audible.
Solution: Pure sine wave UPS. APC makes them (SMX, SRT lines), but they cost 2–3x more. Alternatively, don’t put audio gear on the UPS. Your Proxmox doesn’t care about sine waves. Your speaker does.
If you’re in this camp, consider the EcoFlow River combo (more on that in a sec) — it outputs clean sine wave and it’s cheaper than an equivalent APC SRT unit.
The EcoFlow Weirdness (Why Your Gaming Buddy Bought One)
Somewhere around 2023, UPS vendors realized they had competition: high-capacity lithium-ion battery banks. EcoFlow River, Bluetti AC500, Goal Zero Titan, etc. These aren’t UPS units in the traditional sense (no automatic switchover, you have to run a script or watch manually), but they offer something UPS units can’t:
- Lithium batteries (10–15 year lifespan vs. 4–5 for lead-acid)
- Actual pure sine wave (EcoFlow, Bluetti all ship with it)
- Modular expansion (stack extra batteries without buying a whole new unit)
- Price. A $600 EcoFlow River 600 gives you 600 Wh, pure sine, and when the battery dies in 2030, you drop another $200 on a battery module, not $600 on a whole new unit.
The catch: It’s not automatic. When the power cuts, your homelab goes dark unless you’ve got a script polling your UPS (via NUT, more below) and triggering the EcoFlow to wake up. That 5-second delay between outage and battery takeover? Your Proxmox kernel-panics. You need NUT + custom automation to make it work.
When to use EcoFlow: You need >1 hour of runtime, you have audio gear on the UPS, or you’re running off-grid tech (van, cabin, travel server). When not to: You need automatic failover; you’re too lazy to set up NUT; you’re running a mission-critical rack where 5 seconds of downtime is unacceptable.
For most homelabs, a modest UPS + graceful shutdown is fine. You’ll reboot. Your customers (which is you, or nobody) will live.
NUT: Talking to Your UPS Like It’s a Respectable Citizen
“NUT” stands for Network UPS Tools. It’s the Linux standard for monitoring and controlling UPS units via SNMP, USB, or serial. Connect your UPS to a USB port, install NUT, and suddenly your Proxmox cluster knows when the power’s failing.
Here’s the minimal setup:
# On the machine connected to UPS via USBsudo apt update && sudo apt install nut nut-client nut-server
# Identify your UPSsudo lsusb | grep -i apc# Output: Bus 001 Device 003: ID 051d:0002 APC Uninterruptible Power SupplyEdit /etc/nut/ups.conf:
[myups] driver = usbhid-ups port = auto desc = "APC BR1500"Edit /etc/nut/upsd.conf:
LISTEN 0.0.0.0 3493LISTEN [::1] 3493Start the service:
sudo systemctl enable nut-server nut-clientsudo systemctl start nut-server nut-clientNow check it from anywhere on the network:
upsc myups@localhost# Output:# battery.charge: 100# battery.runtime: 2045# input.voltage: 120# input.frequency: 60# ups.status: OL (on line)From your Proxmox box or NAS, write a cron job that checks battery.runtime and triggers a graceful shutdown if it drops below a threshold:
#!/usr/bin/env python3import subprocessimport osfrom datetime import datetime
def check_ups_status(ups_host="192.168.1.50"): """Poll UPS via NUT. Trigger shutdown if runtime < threshold.""" try: output = subprocess.check_output( ["upsc", f"myups@{ups_host}"], stderr=subprocess.DEVNULL, text=True ) data = {} for line in output.split('\n'): if ':' in line: key, val = line.split(':', 1) data[key.strip()] = val.strip()
# On battery AND runtime < 5 minutes? Shut down gracefully status = data.get('ups.status', '') runtime = int(data.get('battery.runtime', '0'))
if 'OB' in status and runtime < 300: # OB = on battery print(f"[{datetime.now()}] Power fail + low runtime ({runtime}s). Shutting down.") # Trigger graceful shutdown via systemctl subprocess.run(["sudo", "shutdown", "-h", "2"], check=False) else: print(f"[{datetime.now()}] UPS OK. Status={status}, Runtime={runtime}s")
except Exception as e: print(f"[{datetime.now()}] Error: {e}")
if __name__ == "__main__": check_ups_status()Drop this in cron:
# Check UPS every 30 minutes*/30 * * * * /usr/local/bin/check_ups.py >> /var/log/ups_check.log 2>&1Now your homelab gracefully powers down instead of panicking. You get logs. You get alerts (pipe the output to Prometheus, Grafana, whatever). You stop losing data.
How to Actually Size Your Setup (Decision Tree)
You’re staring at the UPS shelf. Here’s the shortcut:
Do you need automatic failover?
- Yes → Buy a proper UPS (APC BR or SMX). Go 1500 VA minimum for any multi-machine homelab.
- No → EcoFlow River + NUT script. Save $200, deal with the 5-second gap.
How long does your shutdown need?
- Under 5 minutes → 1500 VA UPS (900W, ~4 min runtime at 200W).
- 5–15 minutes → 3000 VA UPS (1800W, ~8 min runtime at 200W). Or 1500 VA + second battery module ($250).
- Over 15 minutes → You’re looking at $3K+ UPS or multiple EcoFlow units. Honestly? Just prep for rolling outages instead. Your power company sucks, not your UPS budget.
What’s your climate?
- Hot/humid → Get the UPS you think you need, then buy it one size up. Batteries die faster in heat. The Midwest farmhouse rule: add 25% to everything.
- Temperate → Standard sizing applies.
Are you running audio equipment?
- Yes → Pure sine wave (SMX-class APC or EcoFlow). Don’t cheap out here; hum is real.
- No → Simulated sine is fine. Save the $500.
Real world example — medium homelab:
You’re running:
- Proxmox box (25W CPU, 40W RAM+mobo) = 65W idle
- 4-bay NAS (60W idle, 120W under load) = 120W worst case
- UniFi switch (25W) + router (15W) + modem (10W) = 50W
- Total: 235W under stress
Pick: APC BR1500 (1500 VA, ~900W continuous). Cost: ~$400.
Runtime: 850 Wh / 235W × 0.9 = 3.2 minutes. Enough to shut down the NAS gracefully (rebuild pauses, data flushes).
Battery replacement: $250 every 4 years. That’s $62/year for peace of mind.
Alternative: EcoFlow River 600 + NUT script ($600), pure sine, 1.5 hours runtime, 15-year battery. More headroom, different failure mode (manual failover), saves you $150 over 4 years if you keep it past the first battery cycle.
Both are solid. Neither is “wrong.” The BR1500 is the safe play; EcoFlow is the nerd play.
Don’t Let Perfect Be the Enemy of Running
The mistake most people make is either:
- Oversizing catastrophically. A 5000 VA APC for a home server is like hiring a forklift to move a couch. Technically sound, but your neighbors will have questions.
- Undersizing and hoping. A 500 VA UPS for a full lab is fantasy. When the outage hits (and it will), you’ll be standing there rebuilding your RAID array by hand.
The real rule: Calculate your actual wattage. Add 30% for headroom. Buy the smallest UPS that meets that number. Spend the money you saved on spare batteries and NUT monitoring, not extra VA you’ll never use.
Your power company is unreliable. Your UPS is the only thing standing between graceful shutdown and data corruption. Make it count.