Files
ems/docs/discord-ev-interaction.md
Dusan Vojacek 0e7f7b69ae
All checks were successful
CI and deploy / migration-check (push) Successful in 21s
CI and deploy / deploy (push) Has been skipped
Discord bot fáze B: tlačítka na EV zprávě → patch session + okamžitý replan
services/discord_bot.py: gateway klient jako lifespan task (spojení ven,
žádný veřejný endpoint; bez DISCORD_BOT_TOKEN tiše spí). Tlačítka
[za 2h][za 4h][ráno][do plna][nenabíjet] s custom_id ev:<site>:<charger>:<akce>
(přežijí restart); whitelist DISCORD_ALLOWED_USER_IDS; akce = fn_ev_session_
apply_patch → run_rolling_replan → export_setpoints → edit zprávy novým plánem.

services/ev_notify.py: sdílený builder souhrnu (vyčleněno z collectoru),
send bot-first s webhook fallbackem. requirements: discord.py>=2.4.
7 testů helperů (parse, deadline akce vč. morning přes Prague TZ).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 11:41:05 +02:00

2.3 KiB
Raw Blame History

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:3013:45; 02:1504: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 tlačítkem — 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 tlačítka: [Odjezd za 2 h] [za 4 h] [Ráno (typicky)] [Do plna hned] [Nenabíjet]

Callback tlačítka:

  1. fn_ev_session_apply_patch(site, session, {"target_deadline": now+2h, …}) („Do plna hned" navíc target_soc_pct=100; „Nenabíjet" target_soc_pct=soc),
  2. okamžitý run_rolling_replan + export_setpoints (vzor ev_arrival),
  3. bot edituje původní zprávu novým plánem (žádný spam).

Bezpečnost: bot reaguje jen na whitelisted user ID (majitel), akce omezené na patch session + replan (žádné režimy/registry). Tlačítka expirují s koncem session.

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:<site>:<charger>:<akce> — tlačítka přežijí restart. Env: DISCORD_BOT_TOKEN, DISCORD_EV_CHANNEL_ID, DISCORD_ALLOWED_USER_IDS (čárkami; prázdné = bot vypnut, jede fáze A webhook). Akce: h2/h4 (deadline teď+N), morning (další default_deadline_hour vozidla, Prague), full (100 % + deadline za 1 h → max tempo), stop (target = SoC při připojení). Po akci: patch session → okamžitý replan + export → bot zedituje zprávu novým plánem. Testy: tests/test_discord_bot.py (parse, patch akcí).

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.