📖 Příběh · Případová studie

Noční koupelna ve 3 ráno

Vstaneš v noci na záchod. Žádný klasický motion-on-trigger by zde fungoval — plné světlo by tě probudilo, briefing by ti zazpíval do tichého bytu, robot vysavač by se rozeběhl. Místo toho subtilní cesta: dim 0,2, žádný TTS, žádné subsystémy probuzené. Pak zpátky do postele, sleep state intact, pokračuješ v REM cyklu.

12 sTotal interakce
0,2Dim level (z 1.0)
0TTS / audio
5Subsystémů co spí dál

Kontext

Úterý 02:47, sleep state aktivní

Stav: sh_spim='yes' od 22:35. Topení v night slotu (jídelna 18, ložnice 17, koupelna 19, toaleta 16). Všechny lights off. Audio silent. Robot vysavač blokován. Brain Guardian zvýšená motion tolerance. Roleta dolů na 0,1.

Trigger: vstaneš na záchod. Motion v ložnici (Aqara FP2 detekuje), pak motion v koupelně (PIR Z-wave). 3 minuty interakce, pak motion v ložnici zpátky. Žádný hard wake-up — sleep brain detekuje rozdíl mezi „probuzení" a „toaletní cesta".

Co by se NEMĚLO stát: plné světlo (probudilo by zbytek noci), briefing TTS (skript by neměl trigger ale mohl by), heating mode change (zbytečné rušení schedule), robot vysavač spustit (akustický šok), comfort suggest (pochopitelně ne v noci).

Timeline

12 sekund subtilní reakce

Krátké, tiché, žádný hard restart subsystémů.

  1. 02:47:18

    Motion v ložnici (FP2)

    Aqara FP2 detekuje pohyb v ložnici. alarm_motion=true event. Sleep state aktivní → priority engine deny pro většinu akcí, ale flow trigger sh_motion_router_v1 stále běží (logging + minimal logic).

  2. 02:47:20

    Sleep brain heuristic

    Sleep brain check: motion v ložnici + sleep state = active + TOD = night window (22:00–05:00). Heuristics: krátká motion ≤ 3 min = bathroom trip, ne wake-up. sh_sleep_state stays active. NEvolá ensure*WakeMode().

  3. 02:47:24

    Motion v předsíni

    PIR předsíň → way-finding light auto-on, dim 0,2 (night profile, ne default 0,8). Lux check overridden — way-finding má vlastní rules. 60 s timer pro off.

  4. 02:47:28

    Motion v koupelně

    Bathroom router: sleep state aktivní + TOD night → dim profile 0,2 (warm low color temperature 2700 K). NE radio. NE plný light. Stropní Fibaro dimmer setCap dim 0,2.

  5. 02:48–02:50

    3 minuty činnost

    Bathroom motion continuous, dim drží 0,2. Žádné akce kromě kontinuity. Předsíň timeout expiroval (60 s) → off (predsíň nemá motion). Brain Guardian cron 02:50 — state consistent (sleep + bathroom_active = ok).

  6. 02:50:10

    Bathroom motion off

    30 s grace period začíná (motion může mihnout). Po 30 s bathroom router stop: dim 0,2 → fade out 5 s → 0. Žádný hard cut, jemný ramp aby ti oči nešly do šoku.

  7. 02:50:55

    Předsíň motion znovu

    Cesta zpátky → way-finding light znovu dim 0,2. Stejný 60 s timer. FP2 v ložnici přeberá detekci.

  8. 02:51:05

    FP2 ložnice presence

    Vrátil ses do postele. FP2 detect přítomnost, sleep brain stále drží sh_spim='yes' (motion period byla < 5 min, classify jako bathroom trip). Žádné akce — sleep gate nedotčená.

  9. 02:51:55

    Předsíň timeout

    Předsíň motion 60 s back ago → way-finding off. Zpátky úplná tma. Heating schedule pokračuje v night slotu, kotel běží svojí standardní rutinou.

  10. 02:52+

    REM cyklus pokračuje

    Sleep state nikdy neunset. Žádný subsystém nebyl plně rerun. Briefing ve 3:15 se odehraje normálně dle schedule. User si možná ráno ani nevzpomene, že v noci vstal — to je cíl.

Rozdíl

Co by udělal špatně postavený systém

Subtilita = kvalitní user experience. Naivní logika = miserable noc.

Plné světlo

Naivní motion-trigger by spustil koupelnu na dim 1,0 (full bright). 600 lux do očí v 03:00 = REM disruption, hodina spánku zničená. Místo toho 0,2 = ~50 lux warm. Vidíš co děláš, oči nejdou do šoku.

Audio briefing

Pokud by sleep brain interpretoval motion jako wake-up → briefing TTS by spustil. Hlas v tichém bytě v 03:00 = adrenalin spike. Místo toho sleep guard drží audio silent celou noc.

Heating boost

Naivní system by mohl interpretovat motion jako příchod do koupelny ráno → boost preset (23 °C 60 min). V noci zbytečné, kotel by jel hodinu navíc. Místo toho schedule night slot pokračuje.

Robot vysavač

Naivní auto-cleaning trigger by mohl spustit robot na motion v 03:00. Akustický útok. Místo toho robot blokován po celou sleep window (sh_robot_blocked='yes' dokud sleep gate aktivní).

Door-open detection

Otevíráš dveře koupelny → door_contact event. Naivně by mohl interpretovat jako „někdo vstoupil/odchází" → away/home preset. Brain Guardian bypass tohohle: door_contact + sleep_state = active → ignore preset cascade.

Pro tech-savvy

Co se děje pod kapotou

Sleep brain heuristic (bathroom trip vs. wake-up)

Sleep brain rozhoduje, jestli motion v sleep window je „wake" nebo „bathroom":

  • Wake-up signs: motion duration > 5 min, multiple zones, alarm time approaching (< 30 min), explicit unblock signal (Cube tap, button press)
  • Bathroom trip signs: motion 1–4 min, single round-trip path (loznice → predsin → koupelna → predsin → loznice), žádný alarm time proximity, žádný explicit unblock
  • Edge case: motion 4–5 min = uncertain, drží sleep state ale loguje warning

Klasifikace je rule-based, ne ML. ML by potřeboval labeled data (user feedback „bylo to bathroom trip / probuzení") který nemáme. Rules ladí jednou za pár měsíců dle observed patterns.

Bathroom router night profile
// sh_bathroom_router_v1 (excerpt)
function getBathroomProfile() {
  if (sh_spim === 'yes') return 'night';      // dim 0.2 warm, 30s grace
  if (TOD === 'morning') return 'bright';     // dim 1.0, 5min timer
  if (TOD === 'evening') return 'normal';     // dim 0.7, 5min timer
  return 'normal';
}
const profile = getBathroomProfile();
const target = PROFILES[profile];
await stropniDimmer.setCapabilityValue('dim', target.dim);
if (profile === 'night') {
  await fadeOut(5000);  // smooth ramp on motion-off
}

Profile night má dim 0,2 + warm color temperature (kdyby bylo light_temperature capability). Aktuálně jen dim. Plán: přidat light_temperature setCap pokud koupelnová stropní podporuje (Fibaro FGD-212 podporuje, není osazená warm-tunable žárovkou).

Way-finding light (independent path)

Předsíň lights mají vlastní pravidla, separátně od ostatních zón:

  • Bypass sleep guard (sleep_state ignored — způsob jak najít cestu)
  • Bypass privacy guard (předsíň nemá outside view)
  • Vlastní night profile (dim 0,2 warm, 60s timer)
  • Door_contact open trigger plus motion trigger

Bez way-finding by user musel buď nahmatat vypínač u dveří (klasická řešení), nebo používat mobilní svítilnu. Smart home tady přidává hodnotu, kterou by jiná řešení neměla.

Audio bypass for night (kromě critical alerts)

Night audio gate má 4 kategorie:

  • Suppressed: TTS, briefing, comfort suggest, radio. Default sleep state.
  • Whisper bypass (plánováno): kritické info (delay alarm 1h?, weather alert) přečtené tiše do ložnice. Volume 0,2, max 100 chars. Aktuálně neimpl.
  • Critical bypass: anti-freeze, water leak, gas, smoke. Plný volume, kuchyňský speaker (centrální).
  • Emergency siren (plánováno): smoke/gas → siréna na všech speakers, max volume. Alert mode.
Brain Guardian motion tolerance v noci

Brain Guardian má anomaly detection na sleep_state inconsistency:

// daytime tolerance: motion_count > 3 in 5min while spim=yes = wake suspect
// nighttime (sleep window 22:00-05:00) tolerance: > 8 in 5min = wake suspect
const tolerance = isInSleepWindow() ? 8 : 3;
if (motionCount5min > tolerance && sh_spim === 'yes') {
  logEvent({event: 'sleep_anomaly_motion_count', count: motionCount5min});
  // does NOT auto-unset sh_spim — just logs warning
}

Bathroom trip má typicky 4–6 motion events v 5 min okně (vstoupení, používání, odchod). Pod tolerance, žádný alert. Když je motion mnohem víc (8+) a žádný cube/button trigger, něco neobvyklého se děje.