fix(planner): EV session viditelna i bez deadline / nad targetem (BUG2)
Zivy incident home-01: aktivni plan mel ev_sessions:0, ac session bezela (target 70 %). Planovac neviděl ~6 kW zatez auta a spatne rozvrhl baterii (zbytecny vecerni import). Root cause (dve pasti): - fn_planning_site_context vracela session jako null, kdyz needed_wh=0 (auto nad targetem) i kdyz target_deadline is null. - _ev_session_from_json (Python) zahazovala session bez deadline. Fix: - R__038 fn_ev_session_planning_json: session se vyradi (null) JEN bez tvrdych dat (kapacita vozidla / soc_at_connect). target_deadline smi byt NULL -- solver hard deadline constraint aplikuje jen pri needed>0; oportunisticka vrstva bezi i bez deadline. Auto nad targetem zustava v planu jako znama zatez i s headroomem k levnemu doplneni. R__039 vola helper (deduplikace dvou inline poddotazu, SQL-first). - _ev_session_from_json si NULL deadline ponecha (energy_needed_wh default 0). - testy test_ev_session_parse.py; docs ev-charging + planning-changelog; CLAUDE.md funkce. Navrh agresivnejsiho oportunistickeho algoritmu (P50 levnych oken z market_price_stats misto konstanty 1 Kc/kWh) -- NEnasazeno, k rozhodnuti, sepsano v docs/04-modules/planning.md (EV oportunismus); riziko regrese golden ekonomiky, nutny EV fixture + eval. Overeni: pytest -q 362 passed; golden replay gate 7 passed; solver_v2_eval beze zmeny (fixtures bez EV session). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -394,6 +394,26 @@ oportunismus). Session zůstává v plánu i po dosažení targetu, dokud má he
|
||||
**oportunistická vrstva není omezená deadline** (auto bývá doma dál, odjezd
|
||||
řeší rolling replan — rozhodnutí 2026-06-12).
|
||||
|
||||
### Session se NEvyřazuje při needed_wh=0 (fix 2026-06-13)
|
||||
|
||||
Dřív `fn_planning_site_context` vracela `ev_sessions[e] = null`, když
|
||||
`needed_wh = 0` (auto už nad targetem) **a** oportunismus byl vypnutý/headroom
|
||||
nulový — a navíc úplně, když `target_deadline is null`. Druhá past byla v
|
||||
Pythonu: `_ev_session_from_json` zahazovala session bez deadline. Důsledek
|
||||
incidentu: aktivní plán měl `ev_sessions:0`, ač session běžela; **plánovač
|
||||
neviděl ~6 kW zátěž auta** a špatně rozvrhl baterii (zbytečný večerní import).
|
||||
|
||||
Oprava (R__038 `ems.fn_ev_session_planning_json` + `db_io._ev_session_from_json`):
|
||||
|
||||
- Session se vyřadí (`null`) **jen** bez tvrdých dat — neznámá kapacita vozidla
|
||||
nebo `soc_at_connect_pct` (nelze spočítat Wh). Jinak vždy objekt.
|
||||
- **`target_deadline` smí být NULL** (žádný tvrdý cíl) — solver_v2 hard
|
||||
deadline constraint aplikuje jen při `energy_needed_wh > 0`; oportunistická
|
||||
vrstva běží i bez deadline. Auto nad targetem nebo bez cíle tak zůstává v
|
||||
plánu jako známá zátěž i s headroomem k případnému levnému doplnění.
|
||||
- `energy_needed_wh` = 0 bez deadline / cíle; headroom a opportunistic_value
|
||||
beze změny (coalesce session → vozidlo).
|
||||
|
||||
### Min. výkon wallboxu a účtování via-bat (2026-06-12, dev)
|
||||
|
||||
- **`asset_ev_charger.min_power_w`** (1380 W = 6 A IEC 61851) jde přes
|
||||
|
||||
Reference in New Issue
Block a user