A free, deterministic standby-generator load-calculation and sizing engine. Generator sizing is engineering math — NEC Article 220, NEMA MG-1, IEEE 399 — not a manufacturer secret. Standby Sizer turns a list of electrical loads into a defensible required generator kW / kVA, and it models the part most calculators skip: the motor-starting transient that actually browns out a site.
Built and open-sourced by GENERasic.
This is a first-order estimating tool for engineers and technicians. It is not a stamped engineering design and does not replace a licensed Professional Engineer or a manufacturer's transient/harmonic sizing software. The voltage-dip figure is an estimate (X″d model), not the alternator's published starting curve. Verify every result before you purchase, install, or connect any equipment.
Not affiliated with, sponsored by, or endorsed by any generator or motor manufacturer, NEMA, or the NFPA/NEC. Provided AS-IS, without warranty of any kind. You are responsible for your own designs.
| Phase | What it does | Standard |
|---|---|---|
| 1. Steady-state | Running kW/kVA; 125% on continuous loads; 1-ph & 3-ph | NEC 210.19 / 220 |
| 2. Motor start | Locked-rotor skVA from NEMA code letter or nameplate LRA; DOL / autotransformer / solid-state / wye-delta reductions; VFD harmonic sizing | NEMA MG-1 |
| 3. Voltage dip | First-order transient dip; solves min alternator kVA for a dip limit | IEEE 399 |
| 4. Step loading | Worst sequential start step governs the alternator | — |
| 5. Derate | Altitude, temperature, harmonic penalty | ISO 8528 |
No dependencies — Python 3.9+ standard library only.
git clone https://github.com/<you>/standby-sizer.git
cd standby-sizer
# validate the engine against a known worked example (100 hp NEMA Code G -> 630 skVA):
python3 standby_sizer.py --selfcheck
# size from your own load file:
python3 standby_sizer.py examples/example_loads.jsonOne JSON object: { "config": {...}, "loads": [ ... ] }. Each load carries what you have; the engine prefers
the most authoritative field and flags any load it had to estimate.
- Running load:
running_kw>fla>hp>kva, plusphase(1|3),voltage,pf. - Motor start:
type:"motor", thenlra> (code_letter+hp).start_method:DOL|soft_at(+start_paramtap 0.80/0.65/0.50) |soft_ss(+start_paramcurrent-limit 600/300/150) |wye_delta.step= sequential start group.continuous:trueapplies the 125%. - VFD / non-linear:
type:"vfd",vfd_type:"pwm"|"6pulse"|"filtered".
Required genset kW/kVA, the governing step and its peak transient kVA, minimum alternator for the dip limit, estimated dip at the recommended size, a per-load breakdown showing the method used, and warnings (wet-stacking / light loading, harmonics, estimated-start loads, and the dip-model caveat).
Every constant traces to a published source (NEMA code table, the Generac "Basic Sizing" white paper, ISO
8528). See the header of standby_sizer.py and the inline comments. Contributions that improve fidelity
(real alternator starting curves, engine-specific derate) are welcome — cite your source in the PR.
MIT (c) 2026 GENERasic. See LICENSE.
{ "config": { "dip_limit": 0.20, "xdpp": 0.15, "site_alt_ft": 15, "amb_temp_c": 35 }, "loads": [ {"name": "Pool heat-pump", "type": "motor", "phase": 3, "voltage": 460, "hp": 7.5, "code_letter": "G", "start_method": "DOL", "continuous": true, "step": 1}, {"name": "River pump (VFD)", "type": "vfd", "phase": 3, "voltage": 460, "hp": 10, "vfd_type": "pwm", "continuous": true, "step": 1}, {"name": "Lighting", "type": "resistive", "phase": 1, "voltage": 240, "running_kw": 12, "continuous": true, "step": 1} ] }