System map / Offline pipelines / Solar · PVWatts

Offline pipeline · solar yield

Solar: how much sunshine becomes kWh at your address

For a solar array, the engine needs two things: how many kWh each kW of panels makes in each month, and when in the day those kWh arrive, since noon output can't cover a 7 pm peak unless a battery stores it. Both come from NREL's PVWatts calculator, run ahead of time.

Source
NREL PVWatts v8 · NSRDB weather
Coverage
16 zone stations + ZIPs (SVCE)
System modeled
1 kW DC · 20° tilt · south · 14% losses
Built
2026-09-22 · checksummed raw snapshots

The pipeline

The offline script calls PVWatts once per site for a 1 kW system and saves the reduced result. At run time the model only looks the answer up and scales it by your system size. No API calls happen while you use the app.

data flow(12,) = one value per month · (12×24) = a 24-hour day for each month

What one kilowatt makes

Per kW per year
kWh AC
Your system per year
kWh AC
Summer ÷ winter
July vs December output
Monthly output of your system (kWh).
When in the day it arrives: share of each month's output per clock hour, June vs December.

Across California

Yield per kW differs by about a third from the foggy north coast to the desert. Where a ZIP has its own PVWatts run (so far, Silicon Valley Clean Energy's 29 ZIPs), that is used; otherwise the ZIP's climate-zone station; otherwise San Jose.

ZoneStationkWh / kW / yr

What it feeds

Your system size × this yield gives the solar generation G for each month's representative day. The hourly energy balance matches it against the home's hourly load (from the NREL load profiles): solar serves the home first, then charges the battery, then exports at the NEM 3.0 hourly credit.

G[m,h] = system_kW × ac_monthly[m] / days[m] × intraday_shape[m,h]

What's modeled, what's simplified

  • Real sunshine data (NSRDB typical year) for your zone's station, or your ZIP where harvested.
  • Hour-by-hour shape per month, so evening peaks and battery value are priced correctly.
  • Same clock as the tariff: stored in standard time, shifted +1 h in daylight-saving months, like the load profiles.
  • One orientation: south-facing, 20° tilt. East/west roofs make less and later.
  • No shading from trees or neighbors.
  • No panel degradation: year 20 makes the same as year 1 (real panels lose ~0.5%/yr).

Sources

NREL PVWatts v8 APINSRDB PSM v3 TMYSVCE member communities (ZIP wave 1)
Code
scripts/build_pvwatts.pyscripts/solar_regions.py data/solar/pvwatts_zip.jsondata/solar/sources/zone_stations/ src/solar_loader.py · to_clock_time()docs/OfflineSolarData_Plan.md