Skip to content
Go back

UPS Sizing Without Overpaying APC

By SumGuy 11 min read
UPS Sizing Without Overpaying APC

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:

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.9

The 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 minutes

That’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:

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:

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:

Terminal window
# On the machine connected to UPS via USB
sudo apt update && sudo apt install nut nut-client nut-server
# Identify your UPS
sudo lsusb | grep -i apc
# Output: Bus 001 Device 003: ID 051d:0002 APC Uninterruptible Power Supply

Edit /etc/nut/ups.conf:

[myups]
driver = usbhid-ups
port = auto
desc = "APC BR1500"

Edit /etc/nut/upsd.conf:

LISTEN 0.0.0.0 3493
LISTEN [::1] 3493

Start the service:

Terminal window
sudo systemctl enable nut-server nut-client
sudo systemctl start nut-server nut-client

Now check it from anywhere on the network:

Terminal window
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 python3
import subprocess
import os
from 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:

Terminal window
# Check UPS every 30 minutes
*/30 * * * * /usr/local/bin/check_ups.py >> /var/log/ups_check.log 2>&1

Now 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?

How long does your shutdown need?

What’s your climate?

Are you running audio equipment?

Real world example — medium homelab:

You’re running:

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:

  1. 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.
  2. 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.


Share this post on:

Send a Webmention

Written about this post on your own site? Send a webmention and it'll show up above once verified.


Next Post
Argo Workflows vs Tekton

Discussion

Powered by Garrul . Sign in with GitHub or Google, or post anonymously.

Related Posts