- Synthesised one hybrid entry (Tesla Powerwall 3, installed price €9500)
appended to the catalog. Tagged installation: hybrid; LP runs with
allows_export=True for those.
- Replaced single 'plug-in only' checkbox with three category filters:
≤0.8 kW plug-in, ≤2.5 kW plug-in, Hybrid/DC-coupled. Default: all on.
Filter selection persists in localStorage.
- API now tags every row with a category so the JS can filter without
re-fetching. SSR rows carry data-category for first-paint filtering.
- Store quote left blank for hybrids since thuisbatterijgids.net only
models plug-in arithmetic.
- ProcessPoolExecutor with fork context: 4 workers each inherit the
scenario df via copy-on-write. linprog/HiGHS doesn't release the GIL
so threads were useless; processes get clean ~3.5× speedup.
- Cross-scenario LP cache keyed on everything the LP depends on
(demand, retail, PV size, saldering, η_rt) but NOT inflation or cost.
Result: tweaking just inflation re-uses every LP — sub-100ms.
Cold cold scenario went 75s → 17s; inflation tweak went 17s → 10ms.
- Checkbox 'plug-in only (≤ 0.8 kW, no electrician)' filters the leaderboard
client-side and re-picks the top recommendation from visible rows.
Filter state is persisted in localStorage.
- scripts/deploy.sh: idempotent rsync + systemd setup against the
'thuisbatterij' SSH alias. Run after provisioning the h4a workload.
- 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.