Every number on this site comes from one of two places: a manufacturer datasheet (cited on the page it appears on, with the date it was checked), or this engine — the same JavaScript that runs live in the checker at /builder/, ported statement-for-statement to PHP so every reference page shows the identical result. 34 compatibility rules, 290 verified components, one set of constants.

Cold-weather voltage (NEC 690.7)

Open-circuit voltage rises in the cold. vocCold(voc, coefficient, t): at temperature t equals the datasheet Voc at 25 °C times (1 + coefficient × (t − 25)). A string in series multiplies that by the panel count. Every panel/controller compatibility table on this site (318 locations, every panel × every controller) runs this formula at the location's design low, not at the 25 °C label figure.

Design low vs. record low

design_low_c is the average of each year's single coldest night, 1991–2020, at the nearest weather station with at least 25 complete years of data — not the coldest night ever recorded there. The string-length tables use design_low_c minus a 5 °C margin (DESIGN_LOW_MARGIN_C); record_low_c is shown separately so a string that is safe on an average cold night but fails on the record one is visible, not hidden.

Array and battery sizing

Every constant lives once in src/Calc.php and assets/js/engine.js — the two are compared line-by-line by bin/test.php on every change (§16 item 2).
ConstantValueWhere it applies
MPPT_DERATE90 %Array sizing behind an MPPT controller — real-world loss vs. the datasheet's STC number.
PWM_DERATE75 %Same, behind a PWM controller (panel Vmp is clamped to battery voltage).
PV_CIRCUIT_FACTOR1.56 × IscPV cable/fuse ampacity (NEC 690.8: continuous-current factor).
FUSE_FACTOR1.25 × drawMinimum fuse rating for a non-PV circuit (ABYC E-11).
VDROP_LIMIT_CRITICAL / GENERAL / PV3 / 10 / 2 %Voltage-drop ceiling used to size wire gauge, by circuit type.
DEFAULT_INVERTER_EFFICIENCY88 %AC load → DC draw when an inverter's own published efficiency is unknown.
INVERTER_DC_EFFICIENCY_CAP85 %Ceiling on published inverter efficiency for the DC-side current calculation — a peak-efficiency datasheet number would understate the real draw on the battery.
DEFAULT_DAYS_AUTONOMY2 daysBattery bank sizing default when no autonomy target is set.

Simulation, not just averages

The monthly peak-sun-hours numbers on a geo page describe an average day. The "Does the battery last through {month}?" block instead runs a full typical-weather-year, hour by hour (8760 hours from NREL's hourly TMY data), because an average conceals the week-long cloudy spell that actually drains a battery. Both numbers are shown because they answer different questions: sizing an array uses the average; predicting a specific bad week needs the simulation.

Verified vs. draft

A component reaches the catalog as <code>draft</code>: every field the compatibility rules touch is filled and cited, but the site will not use it in the checker, a kit audit, or a station's panel table until <code>bin/validate-db.php</code> promotes it to <code>verified</code>. Right now that is 290 components across 6 categories; every draft row and the specific field it is missing is visible on its own /parts/ page.

These results are for reference. Wiring must be installed by a qualified electrician. Mobile installations follow ABYC E-11; stationary ones NEC 690/706.