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.
📖 Příběh · Případová studie
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.
Kontext
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
Krátké, tiché, žádný hard restart subsystémů.
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).
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().
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.
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.
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).
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.
Cesta zpátky → way-finding light znovu dim 0,2. Stejný 60 s timer. FP2 v ložnici přeberá detekci.
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á.
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.
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
Subtilita = kvalitní user experience. Naivní logika = miserable noc.
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.
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.
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.
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í).
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
Sleep brain rozhoduje, jestli motion v sleep window je „wake" nebo „bathroom":
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.
// 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).
Předsíň lights mají vlastní pravidla, separátně od ostatních zón:
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.
Night audio gate má 4 kategorie:
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.
Související