☀️ Rooftop Solar · Delft · Rijswijk · Zoetermeer.

Detected rooftop PV · estimated output · 15-minute resolution
capacity
now
today
to date
load factor
0100
time
metric
weather & scope
⚙ settings — model assumptions (recompute live)
what am I looking at?

The map shows every roof in the region where panels were detected, colored by how much power they are making right now. Drag the slider, or hit play, and time moves: sun up, clouds in, output follows. The date picker jumps to another day.

The dashed vertical line in each chart is where the slider sits. Hover a chart to read exact values, click a hexagon to zoom into that cell and see the detected panel masks in red over the aerial photo, and the ⚙ settings below change the assumed panel setup and recalculate everything.

the math behind the curves

Every 15 minutes the same two steps run twice: once on the measured weather (orange) and once on clear-sky irradiance (blue dashed). GHI is the total sunlight on a flat surface, DNI the direct beam, DHI the scattered sky light — all in W/m².

  1. Sunlight on the tilted panel (plane-of-array irradiance): POA = DNI·cos(AOI) + DHI·[(1−AI)·(1+cos β)/2 + AI·Rb] + GHI·ρ·(1−cos β)/2
    In words: the direct beam, dimmed by how far the sun is from straight ahead of the panel (cos(AOI) — the angle between the sun and the panel's surface); plus the scattered sky light, part coming evenly from the whole sky and part boosted around the sun's direction (Rb grows the more the panel faces the sun); plus a little ground reflection (ρ = 20% albedo). β is the panel tilt.
  2. Cell temperature (the panel heats up in the sun): Tcell = Tair + (NOCT − 20)/800 · POA
    In words: the cell runs above air temperature by an amount proportional to the sunlight hitting it. Stronger sun, hotter panel.

That sun-on-panel value becomes power through two plain effects: the panel converts it at a rate that shrinks as the cell heats up (the ⚙ temperature coefficient), and the result is scaled by the roof's installed capacity (panel area × 200 Wp/m²) and the system losses (14% default). Solar position comes from pvlib's NREL SPA; clear-sky irradiance is the pvlib Ineichen model (Linke turbidity 3.0).

how it's built

The red panel masks come from a SegFormer segmentation model (PyTorch) trained on aerial orthophotos — the polygons on the map are its direct output, and each hexagon's capacity is detected panel area × 200 Wp/m². Everything else runs in this one self-contained HTML file: Leaflet for the map, uPlot for the charts, pvlib for the solar physics (NREL SPA, Ineichen clear-sky, PVWatts), Open-Meteo for the weather, H3 cells to aggregate the rooftops.

output today — clear vs actual
cumulative energy
sun & sky — GHI + cloud cover