# Discord EV interakce — návrh (fáze A nasazena, fáze B čeká na bot token) ## Fáze A — notifikace po příjezdu (HOTOVO, `dev`) Píchneš auto → detekce (~60 s) → Tesla SoC → replan → **Discord zpráva** (webhook `discord_webhook_daily_url`): ``` 🔌 Tesla Model Y připojeno Baterie auta: 55 % → cíl 100 % (~34 kWh) Deadline: po 15.06. 06:30 Plán nabíjení: 11:30–13:45; 02:15–04:30 — 34.2 kWh, ø 1.85 Kč/kWh ``` Implementace: `_notify_ev_arrival_plan` v `telemetry_collector.py` (sloty `ev*_setpoint_w > 0` z aktivního plánu shlukované do oken). ## Fáze B — zpětná vazba dvěma výběry — ✅ IMPLEMENTOVÁNO (2026-06-12) **Architektura: Discord BOT přes gateway** — spojení jde Z backendu VEN (websocket), žádný veřejný endpoint do EMS (na rozdíl od interactions webhooku). Knihovna `discord.py`, token v `/opt/ems-deploy/.env`. Zpráva z fáze A dostane **dva selecty** (místo dřívější řady tlačítek): ``` 🔌 Tesla Model Y připojeno Baterie auta: 55 % → cíl 90 % (~26 kWh) Deadline: po 15.06. 07:00 Plán nabíjení: 11:30–13:45; 02:15–04:30 — 26.2 kWh, ø 1.85 Kč/kWh [ 🕑 Kdy odjíždíš? ▾ ] za 2 h | za 4 h | dnes večer 18:00 | zítra ráno 7:00 | zítra poledne 12:00 | pondělí ráno 7:00 [ 🔋 Kolik potřebuješ? ▾ ] 30 % | 50 % | 70 % | 100 % | Nenabíjet ``` **Sémantika:** - Každý výběr **okamžitě** PATCHne otevřenou session přes `fn_ev_session_apply_patch` — ale jen ve SVÉ dimenzi: výběr 1 nastaví `target_deadline` (absolutní čas Europe/Prague; pevné volby = nejbližší budoucí výskyt, „pondělí ráno" z pátku je validní i přes 48 h), výběr 2 nastaví `target_soc_pct`. Druhý rozměr zůstává beze změny (default z `fn_ev_session_defaults`, případně dřívější výběr). - „Nenabíjet" = stop akce (target = SoC při připojení → solver nic neplánuje). - **No-click = pohotovostní režim:** bez kliknutí jede session na defaultech z `ems.fn_ev_session_defaults` (týdenní požadavek `ev_weekly_requirement` → forecast z rytmu → defaulty vozidla; viz `docs/04-modules/ev-charging.md`). S `min_target_soc_pct` 30 % to znamená: drž aspoň ~30 % pro pohotovost a zbytek doplňuj oportunisticky v levných/záporných slotech (`opportunistic_value_czk_kwh` — měkký cíl). Po každém výběru: patch session → okamžitý `run_rolling_replan` + `export_setpoints` (vzor ev_arrival) → bot **edituje původní zprávu** přepočteným plánem (`build_ev_plan_summary`) + potvrzením `_(nastaveno: odjezd dnes večer 18:00)_` (žádný spam). Bezpečnost: bot reaguje jen na whitelisted user ID (majitel), akce omezené na patch session + replan (žádné režimy/registry). Selecty expirují s koncem session (uzavřená session → ephemeral „Session už není otevřená"). **Implementace:** `services/discord_bot.py` (lifespan task; discord.py gateway), `services/ev_notify.py` (sdílený souhrn plánu; bot-first, webhook fallback). custom_id `ev:::dep` / `:tgt` — obsluha přes `on_interaction` + regex (persistent vzor), selecty přežijí restart backendu. Legacy tlačítka `h2|h4|morning|full|stop` ze starších zpráv zůstávají obsloužená (`action_to_patch`). Env: `DISCORD_BOT_TOKEN`, `DISCORD_EV_CHANNEL_ID`, `DISCORD_ALLOWED_USER_IDS` (čárkami; prázdné = bot vypnut, jede fáze A webhook). Testy: tests/test_discord_bot.py (parse, výběr→patch, absolutní deadline z voleb vč. půlnoci a pondělí z pátku, legacy akce). ## Výhled (fáze C) Stejný bot = kanál pro ranní triáž s dotazy („proč jsi v 19:00 nabíjel?" → delta-triage skill) a rychlé akce (bazén, režimy) — viz noční roadmapa.