feat(telemetry): idle-skip zápisů — neukládat 1min řádky idle zařízení
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:
@@ -51,9 +51,10 @@ export function PoolCard({ siteId }: { siteId: number }) {
|
||||
|
||||
if (!latest) return null
|
||||
|
||||
// Telemetrie je idle-skip: vypnuté čerpadlo zapisuje jen heartbeat po 14 min.
|
||||
const stale =
|
||||
latest.measured_at != null &&
|
||||
Date.now() - new Date(latest.measured_at).getTime() > 5 * 60_000
|
||||
Date.now() - new Date(latest.measured_at).getTime() > 16 * 60_000
|
||||
const running = latest.is_on === true
|
||||
const today = days[0]
|
||||
|
||||
@@ -67,7 +68,7 @@ export function PoolCard({ siteId }: { siteId: number }) {
|
||||
className={`inline-block h-2.5 w-2.5 rounded-full ${
|
||||
stale ? 'bg-slate-600' : running ? 'bg-emerald-400' : 'bg-slate-500'
|
||||
}`}
|
||||
title={stale ? 'telemetrie >5 min stará' : running ? 'běží' : 'stojí'}
|
||||
title={stale ? 'telemetrie >16 min stará' : running ? 'běží' : 'stojí'}
|
||||
/>
|
||||
</div>
|
||||
<span className="text-xs text-slate-400">
|
||||
|
||||
Reference in New Issue
Block a user