No description
Find a file
Michiel Berger b4d895224b Replace LP with greedy self-consumption — match real battery firmware
The LP was producing visually unintuitive schedules: when several surplus
hours had identical cost benefit (true with constant export_rate), the
solver picked an arbitrary subset, which the user couldn't read as 'this
is the battery doing its job'. Worse, the daily-LP variant drained to 0
every midnight because it placed zero value on next-day SoC.

Replaced oracle_daily_schedule() with a one-pass greedy dispatcher that
matches what every plug-in battery in the catalog (Marstek, Zendure,
EcoFlow, HomeWizard) actually does in 'self-consumption mode':

  for each hour:
      if exporting at meter: charge as fast as power+capacity allows
      if importing at meter: discharge to cover net demand

Trade-offs:
- Greedy doesn't do grid arbitrage (charge cheap → discharge expensive
  without a surplus source). The LP would; real plug-in firmware
  doesn't, so greedy is more honest about what dad's battery would do.
- Charts now show 'fill in the morning, overflow at midday' which is
  what users expect to see.
- Updated tests: dropped LP-arbitrage assertion, added a greedy-fills-
  from-surplus-then-overflows test that locks the new behaviour in.
2026-05-01 10:20:23 +02:00
data/raw Battery timeline modal + switch to real 2025 data 2026-05-01 09:21:16 +02:00
docs Initial import: home-battery ROI simulator + cracked thuisbatterijgids calc 2026-04-30 13:46:27 +02:00
scripts timeline: label columns 'no-bat meter' / 'with-bat meter' to avoid confusion 2026-04-30 22:47:59 +02:00
src/pluginbattery Replace LP with greedy self-consumption — match real battery firmware 2026-05-01 10:20:23 +02:00
tests Replace LP with greedy self-consumption — match real battery firmware 2026-05-01 10:20:23 +02:00
.env.example Initial import: home-battery ROI simulator + cracked thuisbatterijgids calc 2026-04-30 13:46:27 +02:00
.gitignore Move custom batteries from web.py into data/raw/extra_batteries.json 2026-04-30 15:52:16 +02:00
CLAUDE.md Initial import: home-battery ROI simulator + cracked thuisbatterijgids calc 2026-04-30 13:46:27 +02:00
Dockerfile Dockerfile: gunicorn 2 workers x 4 threads (gthread) 2026-04-30 17:39:13 +02:00
Procfile Initial import: home-battery ROI simulator + cracked thuisbatterijgids calc 2026-04-30 13:46:27 +02:00
pyproject.toml Initial import: home-battery ROI simulator + cracked thuisbatterijgids calc 2026-04-30 13:46:27 +02:00
README.md Initial import: home-battery ROI simulator + cracked thuisbatterijgids calc 2026-04-30 13:46:27 +02:00
uv.lock Initial import: home-battery ROI simulator + cracked thuisbatterijgids calc 2026-04-30 13:46:27 +02:00

pluginbattery

Backtest the actual ROI of a home battery against real historical electricity prices and solar irradiance.

Answers: "If I had owned this battery (plug-in or installed) over the last N years, what would it have actually saved me?"

See CLAUDE.md for project intent, open decisions, and assumptions.