Modal:
- Click any battery row to open a modal with three uPlot charts:
irradiance (W/m²), battery SoC (kWh), net meter flow (kWh/h).
- Date picker + prev/next buttons + 1/3/7-day window selector.
- 'Battery on' toggle flips the SoC and grid charts to the
no-battery baseline; summary numbers update accordingly.
- New /api/timeline endpoint returns the full per-hour series for
any (battery, scenario, window).
Data:
- Re-exported prices + solar from data-vm for 2025-01-01 → 2025-09-01
(8 months — solar coverage limit). All three signals now share
real 2025 timestamps; no more month/day alignment fudge.
- Re-processed dad's CSV against the new window so power_w is real
net consumption per actual hour.
- Compute_leaderboard now applies an 8766/window-hours annualisation
factor to year-1 savings, capt kWh, throughput, and total surplus
so payback / 10-yr net stay correct on the shorter window.
- Defaults: demand 1010 (= dad's net over 8 months, scale 1.0),
start 2025-06-15.
Tests pass. Local run: PORT=8765 uv run python -m pluginbattery.web,
click any row.
- scripts/import_dad_p1.py converts his 15-min cumulative meter dump
(~/Downloads/P1e-2025-1-1-2026-1-1.csv) into our hourly format.
Net of PV exports — power_w can be negative on surplus hours.
Aligned to our 2023-09 → 2024-09 window by (month, day, hour) so
prices and irradiance stay seasonally matched.
- data/raw/p1_hourly.csv is now dad's data; ours preserved as
p1_hourly_michiel.csv for diff/comparison.
- LP gE upper bound was 'pv[t]'; now max(0, pv − demand). This was
wrong before but invisible because demand was always positive; with
dad's net data demand goes negative and the LP went infeasible.
- New 'Export rate' field in Advanced. Override saldering toggle with
a literal €/kWh — set to −0.106 for terugleveringskosten.
- Hourly data exporter (InfluxDB → CSV) for prices, P1, irradiance.
- LP-based 24h-foresight oracle dispatch with SoC-consistent state engine.
- Reverse-engineered thuisbatterijgids.nl formula (matches their quotes
to within €0.50 across three battery configs).
- Catalog scraper for the 52 batteries on thuisbatterijgids.net via their
/wp-json REST endpoint.
- Web app (Flask) that ranks every catalog battery by honest payback and
contrasts with the store's quote, deployable via the included Procfile.