Kontext

Pondělí 14:30, návrat z práce

Stav před: sh_rezim_doma='pryc' od 04:10 ráno (po ranní rutině). Topení preset away — všechny zóny 16 °C cíl. Lights blokované přes priority engine. Audio idle. Robot vysavač spustil v 14:00 plánované cleaning, momentálně dokončuje (~70 % progress).

User: cesta z Liberce, 14:25 dorazí na ulici, parkuje, jde k bytu, otevírá dveře. Žádný telefon v ruce, žádné „home" tlačítko, žádný NFC tag. Jen jednoduše přišel. Systém sám rozhodne, kdy a co přepnout.

Cíl pipeline: vědět, že je to skutečně user vrácení domů, ne falešný geofence trigger (sousedi, doručovatel, projíždění kolem). Proto multi-signal — geofence + door + motion v 5 min okně. Single-signal příliš často false positive.

Timeline

30 sekund od vjezdu po sync

Každý milník zaznamenán v EventLog s timestamp.

  1. 14:24:00

    Geofence outside

    Auto na ulici, GPS poloha 200 m od domu. Mobile Homey app reportuje geofence='outside'. sh_rezim_doma='pryc' stále aktivní, všechno tiché. Robot vysavač pokračuje v cleaning.

  2. 14:24:30

    Geofence approaching

    GPS posun do 100 m okruhu kolem domu (radius config: sh_cfg_geofence_radius_m). Mobile app fire geofence_enter event. Homey flow trigger → sh_arrival_pending='yes', čeká na další signály. Multi-signal counter = 1/3.

  3. 14:24:30

    Robot vysavač graceful stop

    Geofence enter event spustí flow „SH – Robot – Pause on arrival" — robot dostane pause command, vrací se do dock. User nepříde do dveří se startujícím vysavačem. Cleaning bude auto-resume večer (po sleep block expiraci).

  4. 14:24:55

    Door contact open

    Door/window contact na vchodových dveřích → alarm_contact='open'. Flow „SH – Door – Front" → sh_arrival_pending stále active, counter = 2/3. Way-finding light v předsíni auto-on (motion + door open + lux pod prahem) na 60 s.

  5. 14:25:02

    Motion v předsíni

    PIR motion v předsíni → alarm_motion=true. Multi-signal counter = 3/3 (geofence + door + motion v 5 min okně). Confirm threshold splněn — toto je skutečné user arrival, ne false positive.

  6. 14:25:02

    Home preset cascade

    sh_rezim_doma='doma' set. Cascade do subsystémů: sh_heating_preset='home', sh_audio_request='idle' (bez auto-radio, ale unblock TTS), sh_priority_active='none' (light router uvolněný).

  7. 14:25:05

    Heating reactive

    Scheduler cron next tick (do 5 min) přepočte targets dle aktuálního schedule slotu (afternoon comfort): jídelna 21 °C, ložnice 19 °C, koupelna 22 °C, toaleta 18 °C. Demand cron spočítá delta z aktuálních (16+ °C protože away) → boiler_request='on'. Kotel rozjede na ~20 min comeback.

  8. 14:25:08

    FP2 presence confirm

    Po pohybu z předsíně do kuchyně se aktivuje FP2 v open space. Lux check (zima, ale denní světlo OK ~250 lux) — nad „off" threshold (400) ne, ale nad „on" threshold (120) ano. Hraniční zóna, hystereze drží lights vypnuté.

  9. 14:25:25

    Optional: Comfort suggest

    AI coordinator vyhodnotí situation = arrival_idle (přišel domů, žádná immediate task). Možnost level 4 suggest: „Ahoj, dnes byl studený den, chceš spustit relax scénu?". TTS čeká 30 s na cube tap accept.

  10. 14:25:30

    Sync hotov

    Všechny subsystémy v home modu. Brain Guardian next cron 14:30 ověří consistency. Energy tracking re-započne (kotel runtime today += 0 počítáno, kotel teď zase běží — runtime se inkrementuje od příštího demand cronu).

  11. 14:55:00

    Topení dosáhl comfort

    Po 30 min topení (jídelna 16 → 21 °C, delta 5 °C, 9 kW kotel) zóna v rámci hystereze. Kotel vypne. Runtime today += ~0,5 h × 9 kW = 4,5 kWh za odpolední comeback (zima venku zhoršuje accuracy estimate).

Co když

Varianty scénáře

Co se stane v edge cases — a co se reálně stalo.

Doručovatel

Geofence enter = 1/3, motion v předsíni = 2/3 (klepá), DOOR_OPEN ne (otevře jen když po 30 s ticho). Multi-signal nesplní → arrival_pending expirace v 5 min → away zůstává. Funguje.

Projíždění kolem

Geofence enter = 1/3, ale GPS opustí okruh za 1–2 min. Geofence_exit event před motion confirm → counter reset, arrival_pending cleared. Žádný false positive.

Návrat z procházky

Bez auta, jen pěšky. Geofence funguje stejně (mobile GPS), door + motion stejně. Pipeline neutrální vůči dopravnímu prostředku — záleží jen na finálním příchodu domů.

Telefon v autě (vybitý)

Žádný geofence signál. Door + motion = 2/3, geofence = 0. Multi-signal nesplní — ale arrival_pending counter má tolerantní pravidlo: 2/3 + door open = arrival high confidence (alternate path).

Návrat za bouřky

GPS noise může způsobit blikání geofence_enter / exit. Pipeline má debounce 5 s na geofence transitions. Vícenásobné re-entries během 1 min se počítají jako 1 event.

Pro tech-savvy

Co se děje pod kapotou

Multi-signal counter (proč 3 signály, ne 1)

Single-signal arrival je nepoužitelný protože:

  • Geofence GPS má rozptyl 30–50 m → kolemjdoucí, sousedi, projíždění kolem = false trigger
  • Door open jen = doručovatel, kontrola plynaře, návštěva
  • Motion jen = robot vysavač, kočka u sousedů (vibrace přes zeď)

Kombinací 3 z 3 signálů během 5 min okna získáme high confidence. Tolerance pravidla:

  • 3/3 → high confidence, immediate cascade
  • 2/3 + door open → medium confidence, cascade po 30 s additional confirm
  • 2/3 bez door → low confidence, pending pokračuje
  • 1/3 → ignored, cleared po 5 min expiraci
Cascade order (proč heating první, robot druhý)

Po home preset confirm subsystémy přepínají v deterministic pořadí:

  1. Heating (priority highest) — má největší inertia, ~30 min na comeback z away
  2. Audio gate — uvolnění TTS pro arrival comfort suggest
  3. Light gate — uvolnění lighting (closed-by-sleep = false)
  4. Robot — pause + return to dock
  5. Brain Guardian — re-evaluate state coherence

Heating první protože nejpomalejší. Když user dorazí, dům je studený (away 16 °C), comfort 21 °C trvá ~30 min. Robot druhý protože méně časově citlivý.

Robot vysavač graceful stop

Bez tohoto by robot pokračoval v cleaning během user arrival → kolize, hlučno, nepříjemné. Implementace:

// flow "SH – Robot – Pause on arrival"
trigger: geofence_enter event
action 1: setCap robot.vacuum_cleaner_state = 'docked'
action 2: log event 'robot_paused_on_arrival'
action 3: schedule resume @ next_evening_after_sleep_off

Pause neznamená cancel — cleaning se obnoví večer po sleep gate release. State pamatuje progress, pokračuje od přerušeného místa.

Heating comeback bez over-shoot

30 min studený dům → 21 °C target = 9 kW non-stop ~30 min. Bez safety:

  • Naivní ohřev: kotel 100 % do dosažení target → over-shoot → swing 21 → 23 → 21 → 19 cyklus 2 h
  • S hysterezí: target 21 °C, hyst_warm 0,1, hyst_cold 0,5. Kotel vypne na 21,1 °C, znovu zapne až 20,5 °C. Po prvním cyklu stabilizace.
  • Plus safety cap: max runtime 4 h v kuse → forced off (kdyby runtime estimate bug → defense in depth).
Reálné EventLog samples

Log z poslední pondělní arrival (před 1 týdnem):

14:24:32 sh_geofence_router_v1 geofence_enter radius=85m
14:24:34 _flow_ robot_paused_on_arrival vacuum_state=docked
14:24:58 sh_door_router_v1 door_open contact=front
14:25:03 sh_motion_router_v1 motion_on zone=predsin
14:25:03 sh_arrival_pipeline_v1 arrival_confirmed signals=3/3
14:25:04 sh_presence_router_v1 mode_change away→home
14:25:05 sh_heating_scheduler_v1 preset_change away→home
14:25:08 sh_open_space_router_v1 presence_on lux_check=hold
14:25:30 sh_brain_guardian_v1 state_consistent score=92