feat(telemetry): idle-skip zápisů — neukládat 1min řádky idle zařízení
Some checks failed
CI and deploy / migration-check (push) Successful in 28s
CI and deploy / deploy (push) Failing after 17m56s

Slabý server: dict (tabulka, asset_id) → (signature, last_stored_at);
_idle_skip ukládá vždy při změně signature, aktivitě, po startu procesu
a heartbeat po > 840 s (každý 15min bucket má ≥ 1 řádek).

- telemetry_ev_charger: aktivní = status != 'available' nebo power > 50 W;
  signature (status, výkon na 100 W)
- telemetry_pool_pump: aktivní = is_on nebo power > 5 W (ON řádky 1/min
  kvůli on_minutes); signature (is_on, výkon na 10 W)
- telemetry_loxone_sensor: jen změna hodnoty ≥ 0.1 / heartbeat
- telemetry_heat_pump: aktivní = mode != 'off' nebo defrost; signature
  (mode, teploty na 0.2 °C)
- telemetry_inverter: beze změny — NIKDY se nepřeskakuje (audit Wh split,
  baseline, SoC plánovače)

Detekce příjezdu/odjezdu EV: previous_status přesunut z posledního řádku DB
do in-memory _EV_LAST_STATUS (po startu seed z vw_latest_ev_charger —
přechod během výpadku se pozná, prázdná DB nevystřelí falešný příjezd);
fn_ev_session_transition se volá jen při změně statusu.

PoolCard: staleness práh 5 → 16 min (> heartbeat 840 s).
Docs: telemetry.md sekce „Idle-skip zápisů" (pravidla pro nové čtecí dotazy:
sumy/gapfill, ne avg přes řádky), planning-changelog (TUV °C/min).
Testy: tests/test_telemetry_idle_skip.py — _idle_skip jednotkově + EV
arrival/departure přežije skip i restart procesu (303 passed).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dusan Vojacek
2026-06-12 19:06:41 +02:00
parent f71bc944b4
commit 815a233049
5 changed files with 405 additions and 30 deletions

View File

@@ -5,6 +5,28 @@ Formát: **datum (ISO)** · stručný důvod · soubory · chování / ověřen
---
## 2026-06-12 — idle-skip telemetrie: TUV delta normalizovaná na °C/min
**Problém:** telemetry_collector nově přeskakuje 1min zápisy idle zařízení
(heartbeat 840 s — viz `telemetry.md`, sekce Idle-skip zápisů). Vstupy
plánovače čtené z těchto tabulek nesmí předpokládat hustou 1min řadu.
**Mechanismus:** `fn_update_tuv_usage_stats` (R__018) počítá deltu TUV jako
`(temp lag(temp)) / gap_min` (°C/min, mezery > 30 min vyloučeny) — pro
hustá 1min data numericky identické s původním per-row LAG; po idle-skip bez
až 14× nadhodnocení delty. Ostatní vstupy solveru (poslední TUV teplota v
`fn_planning_site_context`, poslední EV status v `fn_load_planning_slots_full`,
baseline stats) pokrývá heartbeat beze změny. Audit: EV/TČ `sum/15` v R__019.
**Soubory:** `telemetry_collector.py`, `R__018_fn_extended_planning.sql`,
`R__019_fn_fill_audit_interval.sql`, `R__097_vw_pool_pump.sql`, `PoolCard.tsx`,
`docs/04-modules/telemetry.md`.
**Ověření:** `tests/test_telemetry_idle_skip.py` (změna/aktivita/heartbeat/
start; EV arrival přežije skip i restart procesu); celá sada 303 passed.
---
## 2026-06-12 — v2 AKTIVNÍ v produkci + robustnostní trojice „nejistota jako cena"
**Přepnutí (847015f):** `PLANNING_ENGINE_VERSION` default **v2** v deploy compose; v1 běží