feat(ev): event-driven replan i na odjezd EV (ne jen příjezd)
All checks were successful
CI and deploy / migration-check (push) Successful in 7m17s
CI and deploy / deploy (push) Has been skipped

Odjezd auta (≠available → available) teď spouští okamžitý rolling replan
+ export, symetricky k příjezdu — místo čekání na */15 tick. Řeší stale
plán spočítaný těsně před odjezdem, který držel fantomovou EV alokaci
(~4–11 kW do už odjetého auta). Session už zavřela fn_ev_session_transition
synchronně v poll smyčce, takže replan vidí 'žádná session' a alokaci shodí.

Replan i pozorování jízdy každý ve vlastním try+conn (pád solveru ani spící
auto se navzájem neshodí). +2 regresní testy, +docs (changelog, ev-charging).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dusan Vojacek
2026-06-17 15:38:13 +02:00
parent ce30dbd4a4
commit ab8ddf1fdf
4 changed files with 129 additions and 3 deletions

View File

@@ -225,6 +225,25 @@ Modbus registr stavu konektoru (status):
Polling každou minutu z `telemetry_ev_charger.status`.
### Event-driven replan na příjezd i odjezd
Přechod stavu konektoru (`fn_ev_session_transition` v poll smyčce otevře/zavře
`ev_session` **synchronně**) spustí fire-and-forget hook v `telemetry_collector`,
který **okamžitě přeplánuje** místo čekání na `*/15` rolling tick:
- **Příjezd** (`available` → ≠`available`) → `_on_ev_arrival`: WB hold 0 A → (Tesla)
SoC do session → `run_rolling_replan(triggered_by="ev_arrival:<code>")` → export →
Discord. Auto se začne nabíjet hned, ne až za ≤15 min.
- **Odjezd** (≠`available``available`) → `_on_ev_departure`: session už zavřená
(transition běžel první) → `run_rolling_replan(triggered_by="ev_departure:<code>")`
→ export shodí **fantomovou EV alokaci** posledního planu (spočítaného ještě s autem)
a uvolní přebytek do sítě/baterie; pak best-effort pozorování jízdy (odometr+SoC).
Bez tohoto by plán spočítaný těsně před odjezdem držel EV load až do dalšího ticku
(≤15 min „o krok pozadu"); fyzicky neškodné (Deye přebytek vstřebá proti CT, export
hlídá reg 143), ale interní účtování planu bylo stale. Replan je v samostatném `try` +
vlastní conn, takže pád solveru ani spící auto (Tesla 408) jeden druhého neshodí.
### Tesla API (fáze 2)
Přes Tessie nebo přímé Tesla API: