📝 Build Log · Release Notes

Engineering build log

Není to blog v běžném smyslu. Je to release notes engineera, který staví dům jako product. Každá entry odkazuje na konkrétní deploy, fix nebo roadmap milník.

Recent releases

Posledních 30 dní

Kombinace feature ship, bugfix, deploy a roadmap entries. Tagged barevně podle typu.

2026-05-28 WEB

Sekce „Moje aplikace" živá — 7 aplikací, 50 screenů, audit drift sweep

Dvoudenní intenzivní práce na osobním webu cestovatel69.cz/aplikace. Nová hub sekce prezentuje sedm vlastních aplikací: Config Center, Italia Travel Planner, Účetní kniha, Finance Analytik, Krabičková dieta, Energy Dashboard a Domácí panel na zdi (RPi kiosk). Celkem 50 screenů (14 ITP, 8 UK, 8 Analytik, 8 Meal Planner, 7 CC, 4 RPi, 1 Energy), plně lokalizováno CS/EN/IT (21 stránek = 7×3). Texty pro běžné lidi — tech jargon vždy vysvětlený v 1 větě (DCF, FIFO, AES, ZTL zóny, BMR/TDEE). Site-wide vanilla JS lightbox — klikni na kterýkoli obrázek, otevře se fullscreen modal, ESC zavře. Po finišování proběhl audit drift sweep obou webů (osobni + smart-home-website): nalezeno 25 driftů ve 3 prioritách, opraveno 13 (P0+P1). Hlavní motivy: RPi kiosk umístění (kuchyně → předsíň, oprava i v EN/IT mirrorech), Sheets → SSD framing na 5 stránkách smart-home webu (po 27.5. cutover), Shelly Plug S Gen3 status z „na cestě" → „LIVE od 30.4.", Door/Window Sensor diakritika („Jídelna1" → „Jidelna1") sjednocena, Intenso SSD z „plánováno" → „LIVE od 27.5.2026" (verified /dev/sda1).

2026-05-27 DEPLOY

Energy Dashboard one-click launcher — PC webová aplikace bez blikajícího monitoru

Standalone projekt v C:\.Projekt\.Energy\ dostal kompletní Windows webapp wrapper. Jeden klik na desktop shortcut Energy Dashboard → spustí se hidden pythonw proxy (port 5177) → otevře se Edge/Chrome v --app módu na čistém dashboardu (žádný taskbar, žádné menu). Proxy je server-side reverse fetcher pro http://192.168.1.241:8123/local/smart-home/energy-dashboard.json — řeší CORS problém (HA Core neposílá ACAO header) a poskytuje on-disk fallback když je HA RPi nedostupný (X-Energy-Source: cached-stale header + viditelný alert). Původně byl design „PC scheduled task každých 60 s sync" — vyřazeno, protože blikalo okno. Nahrazeno on-demand proxy: data si stahuje až browser tab je otevřený. RPi data live od 28.5., port přesunut z 5176 (kolize s Meal Plannerem) na 5177. Vlastní programaticky generovaná multi-res ICO ikona (16/32/48/64/128/256, cyan blesk na navy panelu). Repo: bludek69-lgtm/energy-dashboard (private).

2026-05-27 FIX

Roleta zavírala přes otevřené okno — paralelní writer v sh_light_router_v1

User report: „roleta se zavírá i když je otevřené okno". SSD log z 19:12 přesně diagnostikoval problém: sh_jidelna_roleta_router_v2 zafungoval správně (roleta_window_safety skipped v 19:12:48 — window contact = open detected) — ale o sekundu později sh_light_router_v1 zavřel roletu PŘÍMO bez window kontroly (roleta_auto_close_privacy 100% → 15%, trigger evening_deadlock_fix). Root cause: canAutoClose branch (L1009) checkoval jen phase + mode + sleep, žádný alarm_contact guard. Sandbox-first oprava — 8-case test scenarios v _backup_window_safety_fix/test_roleta_window_safety.js (closed/open/sensor-offline/getDevice-throws/null/day-phase/away/sleep) → 8/8 PASS → live PUT v1.16. Fail-CLOSED policy: když je senzor nedostupný / vyhodí exception → považuj okno za otevřené, raději nezavřít. Nový log event roleta_auto_close_skip_window_open. Pure-function logic replica, žádná funkční změna jiných cest. Backup pair pre/post v _backup_window_safety_fix/.

2026-05-22 FIX

Roleta jídelna zavřela přes otevřené okno (P1) — silent-fail kvůli rename device

Předchozí incident stejného typu, jiný root cause. sh_jidelna_roleta_router_v2 měl v lokálním D constu hardcoded starý device name 'Door/Window Sensor (SNZB-04)1', ale device byl mezitím přejmenován na 'Door/Window Sensor Jidelna1'. getDev() vrátil null, try/catch(_) ho potichu spolkl, windowOpen defaultoval na false (unsafe default) → SAFETY skip se nespustil → roleta zavřela přes otevřené okno. Fix commit 349532d: dva string replaces (oba název senzoru), commit + push. Pravidla z incidentu: (1) safety guards musí default-to-fail-CLOSED (windowOpen=true při fetch failu), (2) catch bloky musí volat logEvent aby silent fail šel vidět, (3) device names číst ze sh_device_map namísto hardcoded stringů. Memory entry feedback_device_rename_silent_fail_2026-05-22.md dokumentuje pravidla pro reuse v dalších scriptech.

2026-05-19 FIX

SIGABRT každých 5 minut — group concurrency, ne vadný script

Čtyři dny audit memory, knihoven a logování. Nasazený forensic patch na 80 hot-path scriptech (odstranění Promise.race + wait() z inline fetchWithTimeout). Crash cyklus pokračoval. Teprve když uživatel vizuálně oznámil „padá to přesně každých 5 minut", příčina začala konvergovat. Nešlo o jeden vadný script — bylo to skupinová souběžná zátěž: 17 Advanced Flow s triggerem cron:every_nth {n:5, type:minute} spouštělo HomeyScript synchronně na 00s 5min hranici, runtime nezvládl souběh. Emergency 5-min isolation (vypnutí celé /5min HomeyScript skupiny) zastavila pády — crashedCount +0 za 12 minut. Pak R1 obnovil 3 kritické flows s delay 30/60/90s (Heating, Presence Failsafe, Brain Guardian). R1B rozprostřel 8 lehkých flows přes delays 5–195s. R1C snížil kadenci 3 nejtěžších na /10m (Device Availability, Health Monitor, OpenSpace Autoheal) — mem peak spadl z 235 MB na ~145 MB median (−38 %). ENABLE-ALL sequential vrátil zbývajících 6 heavy flows (Dashboard, Health Alert, Context Full, Diagnostic, Meta, AI Guard) na /15m nebo /30m s offsetem 215–320s, 1 PUT na flow + reálné fire ověření + 10 min observační okno. Tři hodiny, 6 kroků, 0 crashes během deploye. Žádný HomeyScript PUT, žádná business logika dotčená, žádný manual restart. Klíčová lekce: před hlubší crash analýzou nejdřív spočítej intervaly mezi pády — pravidelný interval = trigger-driven cause. Číst delší post →

2026-05-19 FIX

Context Full chain — 7-day stale článek opraven Flow bypassem

Audit po SIGABRT odhalil další pre-existing bug: Flow SH – System – Context Full mělo chain trigger /30m → delay 215s → runWithArg sh_context_full_v1("get") → run sh_context_history_v1, ale první článek dlouhodobě silent-failoval. Skript sh_context_full_v1 byl ~12.5. ručně smazán z Homey UI (vrácel false i bez exception), Flow card si ale držela orphan SID. sh_context_history_v1 tak nedostal control přes outputSuccess chain — jeho lastExecuted ustrnulo na 2026-05-12 18:25 (7 dní stale). Restore-with-patch (recreate skript s Promise.race+wait odstraněním v fetchWithTimeout) ani defensive try/catch wrap kolem koncových setValueSafe volání chování nezměnily — debug ukázal že throw je před hypotetizovaným řádkem. Mezitím sh_context_weather_sync_v1 (separate /10m bridge, existující 3 týdny jako workaround) drží sh_context_json fresh nezávisle. Finální fix: atomický Flow bypass — z 4-card chain odstraněno card #1 (runWithArg), delay přepojen přímo na sh_context_history_v1. První /30m fire @ 11:33:35.979 (exact schedule match, +979 ms latency) — chain obnoven. sh_context_full_v1 ponechán jako legacy artifact (per hard rule nemazat). Slot 215s zachován pro no-overlap plán. Lekce: Pokud Flow míří na smazaný skript, Homey ho NEMUSÍ označit jako broken=true — ověřuj action-level SID reference přes GET /script/<sid>.

2026-05-18 INFRASTRUCTURE

SSD logging cutover — 1 var flip migroval 91+ logEvent callerů

2026-05-18 v 07:09 CEST proběhl migrační moment, na který se v Homey velmi obtížně reaguje retroaktivně. Až do tohoto okamžiku všechny logEvent(...) hovory napříč 91+ skripty směřovaly na Google Sheets Apps Script web app — pomalý, rate-limited a závislý na cloudu. Nasazená architektura umístila SQLite receiver na HA RPi (http://192.168.1.241:9080/log/sheets-compat) s daily JSONL files + WAL-enabled SQLite (4.2 MB po prvním dni). Migrace bez touching jediného skriptu: stačila změna jediné Logic proměnné sh_sheets_url z Apps Script URL na receiver URL. Skripty si target endpoint čtou per-call přes getValue('sh_sheets_url'), takže všechny callery se přepojily okamžitě. Google Sheets endpoint zůstává jako záložní fallback (revert = swap původní URL zpět). Schema kompatibilita 100 % (payload format sheets-compat), zero data loss. Po cutover proběhla séria operací na vrácení Energy Dashboard R1 aggregatoru + UI a osobní web AI page deploye.

2026-05-15 FEATURE

Dashboard Config Center + Weather restore — 8 vln v jeden den

15. května večer. Po sérii R2-R6A oprav Homey runtime se přesun na dashboard. Wave 1 přidal __CANON_ENUMS guard — dashboard přestal psát czech literály (doma, pryc, ano, strong_yes) do logických proměnných, 9 zakázaných tokenů blokováno na write path. Wave 2A obnovil cache-first weather renderer (po SSD migraci RPi se vrátila stará OWM verze — deploy-channel regression, ne code bug); Wave 2B oživil cron sh_weather_yr_bridge_v1 z yr.no, žádné API klíče. Wave 3 udělal z rolety PURE LUX truth (odstraněný short-circuit sh_house_state='home_normal', který občas držel roletu nahoře i v noci). Wave 6 propagoval enum guard na desktop v7_1920 + v7_2880. Wave 4A → 4B-6 Config Center: DASHBOARD_CONFIG_SCHEMA + writeVarValidated + writeCfg dispatcher, růst z 18 entries na 128+ (min/max/enum/crossField/softWarnings), pokrývá morning/heating/audio/light/occupancy/roleta/energy/scenes. Aktuálně soft-reject, po 24h soaku hard-mode flip. Final RPi sha e3216213…. Číst delší post →

2026-05-14 FIX

Memory pressure — 1 var + 6 live patchů + bathroom audio konečně odjelo z koupelny

Druhá půle dne 14. května: po dopoledním úklidu RPi/HAOS přišly živé zásahy do Homey. Diagnostika potvrdila 1 295 cron fires/h napříč 67 cron flows — HomeyScript app cyklovala na 125 MB threshold, watchdog ji restartoval 38× za den, a vacancy guardian běžel reálně jen 5× za 24h místo očekávaných 288×. To vysvětlilo dlouhotrvající stížnost: koupelna která zůstala svítit / s rádiem po opuštění místnosti. Nasazeno 6 live změn v jednom dni — všech 6 bit-perfect SHA verify, žádný flow/dashboard/device touch: (1) nová proměnná sh_vacancy_guardian_heartbeat_ts, (2) sh_room_vacancy_guardian_v1 v1.1 (heartbeat at start + stuck-audio-reset), (3-7) pět throttle patchů (TTS skip-empty-queue, Kaffe time-window, Wake/Score sleep-window). Měřitelný win do 9 minut: guardian dokončil první run za 40+ min a vyresetoval stuck sh_audio_current_mode='radio_bathroom' z ranní rutiny na idle. Pět R2-failsafe sandbox testů (T22-T26), staleness pair-logic OK/WARN/CRASH_MID_RUN/CRON_NOT_FIRING klasifikátor. Číst delší post →

2026-05-14 INFRASTRUCTURE

Sandbox 24/7 + kiosk Phase E + dashboard cache retry — den úklidu

Den, kdy se RPi/HAOS přestal hrát na servisního pomocníka a stal se z něj plnohodnotná testovací brána. Node.js 24.14 nainstalován do core_ssh addonu s persistencí přes apks config. Python sandbox runner nasazen 24/7 přes HA shell_command + automation každou hodinu — gate DEPLOY_GATE_OPEN, testy 20/20 PASS, replay 13/13. Když HA Core container Node neměl, runner přepsán do Pythonu (F1-B). Dashboard cache retry fix v2.1 — transient 417/0 errory teď retry 3× s backoffem místo crashe; error rate spadl z 5 % na 1.8 %. Kiosk Phase E LIVE — RPi kiosek (192.168.1.122) má teď cache→Homey REST→localStorage fallback chain s viditelným badge (● CACHE / ◐ CACHE OLD / ○ HOMEY / ○ LOCAL). Vše rebuilt fresh ze samotného kiosk HTML bez PC reference. 0 Homey writes, 0 dashboard edits, 0 device renames. Číst delší post →

2026-05-12 ARCHITEKTURA

Tři zdroje počasí → jeden. LOCATION_TIME_GUARD den.

Briefing recitoval 13 °C zatímco venku bylo 6 °C. V 3:03 ráno se sám spustil než zazvonil budík. A systém uměl říct „dobré ráno" v noci. Audit odhalil tři paralelní zdroje počasí (yr.no + OpenWeatherMap + Open-Meteo) ve dvou různých městech (Semily / Praha) a hardcoded fallback teplotu. Konsolidace: yr.no jako jediný zdroj (lokalita Semily 50.6012/15.495), nový skript sh_weather_yr_bridge_v1 (cron 10 min → 22 vars), centrální vrstva sh_location_time_context_v1 (master JSON pro lokaci+čas+phase, refresh 5 min). Smazáno: Open-Meteo fetcher, OWM HTTP fetch v context_full (−2 868 znaků dead code), sh_owm_api_key, hardcoded GPS v dashboards. Greeting guard v briefingu: phase=night → „Vítej, Luďku" místo „Dobré ráno". Phase guard v morning_brain blokuje motion-trigger v noci bez alarmu. Číst delší post →

2026-05-05 INFRASTRUCTURE

Sheets cleanup + dashboard fix — den po rozbité rutině

Ranní rutina v pondělí nezačala. Začalo to fixem jednoho bugu (sleep_window blokoval routing po budíku) a skončilo úklidem celé Google Sheets vrstvy. 28 listů → 25, 6 commitů, Apps Script v18 → v21. Score producer (existoval, nikdo ho nečetl) napojený na brain. Tři chybějící dashboard endpointy přidané (Lux/Battery/Morning Timeline). Sensor registry pro adaptabilní budoucí čidla. DeviceInventory producer který nikdy neposílal. Architektonický bug v logEvent lib (default sheet:'EventLog' forsoval všechny event_type events do jednoho listu) odhalený. Číst celý postmortem →

2026-05-02 FEATURE

Dům, který sám sebe pozoruje — nová vrstva vědomí

Přibyly dvě „pozorovatelské" vrstvy. První každou minutu vyhodnocuje, v jakém režimu se domov právě nachází (klidný spánek, noční výlet na záchod, ranní probouzení, někdo odchází…) — a u každého odhadu má skóre jistoty od 0 do 100. Druhá vrstva každých 5 minut kontroluje, že všechny klíčové programy běží, a u jednoznačně-bezpečných problémů je sama opraví. Při kritickém problému pošle push notifikaci na telefon. Číst delší vysvětlení →

2026-05-02 FEATURE

Pohotovostní vypínač — jediný přepínač pro všechno automatické

Nová proměnná sh_kill_switch se dvěma stavy. Když ji přepnu na yes, šest klíčových programů (rozhodovací mozek, noční světla, predikce, ranní rutina, hlídka, vytápění) se při příštím spuštění zastaví na začátku a nic neudělají. Cesta k jistotě, že lidský operátor má vždy poslední slovo.

2026-05-02 FIX

Ranní rutina se nespustila — uživatel vstal před budíkem

V sobotu ráno (budík 5:15) uživatel vstal v 3:08, procházel mezi pokoji, ale rutina nikdy neběžela. Příčina: stará logika čekala buď na budík, nebo na dvojí pohyb v jedné zóně do 3 minut. Při procházení mezi zónami senzory zachytily pohyb v každé jen jednou. Mezitím nezávislý detektor probuzení hlásil „silně ano" ve 4 zónách — ranní rutina ten signál ale neposlouchala. Oprava: třetí spouštěcí cesta — silný multi-zóna signál + 10 minutový kompromis filtruje noční výlety na záchod.

2026-05-02 FIX

LED pásek a stolní lampa svítily celou noc

Příčina: program, který se každou půlhodinu probudí a předvídá co dům potřebuje, neměl podmínku „pokud uživatel spí, nezapínej nic". V 23:00 i v 00:30 napadlo „je tma + někdo doma → noční dotyk světla", a lampa se rozsvítila. Tři řádky kódu — sleep guard přidán do dvou míst (predikce + záchranná logika). Příští noc se nic samo nerozsvítí.

2026-05-02 FEATURE

SNZB-06P openspace + integrace ložnice/koupelna senzorů

Tři radarové senzory přítomnosti (otevřený prostor, ložnice, koupelna) — radar vidí osobu i v klidu, na rozdíl od PIR pohybového. Hlavní z nich přejmenován na Sensore di Presenza SNZB-06P openspace kvůli jasnému rozlišení. Ložnice + koupelna teď přidány do logu zónové aktivity (před tím se logoval jen openspace). Atomický rename: zařízení + mapa + 7 skriptů + záloha před/po. Smoke test prošel.

2026-04-29 FEATURE

Dashboard V7.5 layout editor

Drag-and-drop tile reorder + native CSS resize via corner handle + per-page localStorage persistence. Ctrl+E toggles edit mode. 3 floating buttons (🎨 Edit / 💾 Save / ↻ Reset). MutationObserver chrání proti bounce-back při render cycles.

  • Stable tile identity (id or hash of textContent)
  • Multi-parent aware (handles tiles spread across grid containers)
  • Auto-save on drop (no need to click Save for reordering)
2026-04-29 FIX

Bug E — priority engine ghost auto-cleanup

sh_priority_active='tts' stuck po crashi HomeyScript app během 10s delay v reset flow. Fix: timestamp na claim + stale check > 60s + nový cron SH – Priority – Stale Cleaner. Validator score 94 → 100, Brain Guardian 92 → 97.

2026-04-29 DEPLOY

Brain Guardian deployment

5 scripts + 1 flow + 12 vars deployed. Top-level supervisor: sh_state_validator (drift detection), sh_brain_guardian (orchestrator), sh_release_guard (deploy gate). První live finding: detekoval priority_active=tts ghost (Bug E nahoře).

2026-04-29 FIX

Audio race condition fix — bathroom misroute

Po comfort_suggest TTS se sám spustil bathroom radio i bez user accept. Root cause v sh_tts_resume_exec_v1 fallback bez prev_playing guardu. Fix v1.8 přidal explicit guard. Stuck sh_audio_current_mode='radio_bathroom' reseten.

2026-04-29 FEATURE

Dashboard V7 polish — V7.1 → V7.5.1

8 micro-sprintů: Zones bottom strip, AI grid 2-col, Ložnice tile dedupe, status chips wired, Settings collapse, Burza 2→6 coins, Heating right rail rebuild, AI 4 system cards, layout editor.

2026-04-29 PERF

Memory leak partial mitigation

3 cron flows zpomalené 1 → 2 min (Dashboard Refresh, Wake Scorer, Audio Pipeline WD). Saves 2 160 runs/den. Manual app restart 143 → 99 MB. Watchdog drží <125 MB threshold.

2026-04-29 FIX

Vacuum Giuseppe rename revert

Device name byl omylem změněn na 'ano' (UUID stable). 4 sw consumers silently fail. Revert via API PUT name='Giuseppe'. Reset ghost vars. Live test: router can find device, state stays idle.

2026-04-29 DEPLOY

Morning routine pipeline rebuild

Nový request type morning_open_space_gentle. ON Sektorka1 + Stul Jidelna1 (warm dim 0.4) + OFF Led pasek postel (sleep nightlight deactivace). Motion branch teď symetrická s alarm/fallback. Live test 7/7 PASS.

2026-04-26 FIX

UUID re-pair orphans — silent fail

Door/Window Sensor Jidelna1 dostal nové UUID po výměně baterky. Tři flows osiřely, čistička se nevypínala při otevření okna. Diagnose + bulk swap fix. Memory entry pro budoucnost.

2026-04-21 FIX

Cold-start anti-cycling bug — heating

Kotel sepnul jednou, vypnul, pak nikdy víc. Anti-cycling guard držel hold_off_180s_left forever kvůli NaN propagation. Defensive coding gone wrong, fix v1.2.

2026-04-29 ROADMAP

Release Governance V2 — plánovaná etapa

Canary deploys (1 zóna na 24h před plošným nasazením), auto-rollback při score < 80, sanity checks před PUT (přečíst flow tree, validate DAG, simulate edge cases), drift gates (Brain Guardian musí dovolit). Backlog Q3 2026.

2026-04-29 ROADMAP

Predictive Heating · ML model

Plán pro 2026/2027: anomaly detection na event sequences, predikce occupancy, integrace electricity tariff (NT/VT) do scheduler decision. Aktuálně rule-based scheduler s 3 AI vrstvami (preWake / weather / occupancy bonus).

Long-form posts

Hlubší články

Vybrané build log entries rozepsané do plnohodnotného článku — případové studie, hypothesis ladders, root cause analysis.

SOON

Připravuje se

Brain Guardian V1 — supervisor v ostrém provozu

Jak vznikla meta-vrstva nad celým smart home systémem a co první týden provozu odhalil.

SOON

Připravuje se

Heating Fáze C — AI vrstvy nad topením

preWakeBoost, weatherAdjust, occupancyBonus. Topení, které předvídá a šetří podle obsazenosti místností.