Shrnutí: - přidá se nový vstup timer helper pro zhasnutí - nový helper bude v šabloně umístěn pod „Rychlé znovurozsvícení do (HH:MM:SS)” - přidá se nová volitelná položka zpoždění zhasnutí, výchozí 3 s - v popisu šablony i u nových inputů se doplní účel a postup vytvoření helperu - odstraní se původní zhasínací logika přes wait_for_trigger - odstraní se light_turned_on_flag jako nadbytečný - položka „Zhasnutí po (sekundách)” se změní na formát času HH:MM:SS, default bude 00:00:10 - u položky „Trvání blokace (minuty)” se do popisu doplní, že jde o dobu od posledního pohybu Nová logika: - trigger motion on - pokud není blokace, běží stávající logika rozsvícení (1. podvětev motion on) - pokud je blokace, běží stávající logika blokace (2. podvětev motion on) - timer se spustí/resetuje jen v místech, kde by ve stávající logice dávalo smysl rozsvítit / pokračovat v auto režimu, ne plošně při každém motion on - trigger timer.finished - pokud je motion = on, nezhasíná se, přepíše se helper s časem (čas posledního zhasnutí) časem now() a timer se znovu spustí na celý timeout - pokud motion není on a blokace není on, přepíše se helper s časem (čas posledního zhasnutí) časem now(), počká se zpoždění zhasnutí a světlo se zhasne - pokud je blokace on, nezhasíná se Smysl změn: - zhasnutí už nebude závislé na dlouhém čekání uvnitř automatiky - odpočet zhasnutí bude řízen timerem - při doběhu timeru se stav vyhodnotí znovu - helper s časem (čas posledního zhasnutí) se nově záměrně používá i jako workaround pro lux bypass v hraničních situacích kolem zhasínání a dlouhého svícení Tohle odpovídá tomu, že budou jen 2 hlavní větve: motion on a timer.finished. -------------------- Upresnenni -------------------- 1) Jen 2 hlavní větve: - motion on - timer.finished 2) Blokace je opravdu součást větve motion on, ne samostatná třetí hlavní větev. 3) Rozsvěcovací logika zůstává téměř beze změny: - aktivní režim - skip lux - validita luxu - lux threshold - rechecky - den / noc / prodloužená noc - RGB / Kelvin - brightness day/night 4) Timer se spouští/resetuje jen po úspěšném rozsvícení nebo ve větvi timer.finished + motion == on. 5) Větve končí explicitně STOPem, aby bylo jasné, kde nic nepokračuje dál. 6) Původní výpočtové proměnné se berou ze starého scriptu, pokud nejsou nadbytečné. --------------- Strom ----------------------- START │ ├─ TRIGGER A: motion_sensor -> on │ │ │ ├─ [A0] Načti / použij stávající proměnné │ │ ├─ day/night výpočty │ │ ├─ prodloužená noc / víkendy / svátky │ │ ├─ skip_lux_check │ │ ├─ brightness_day / brightness_night │ │ └─ další ověřené helper proměnné │ │ │ ├─ [A1] Je manual_override_entity == on ? │ │ │ │ │ ├─ ANO │ │ │ │ │ │ │ ├─ [A1.1] Běží stávající logika blokace │ │ │ │ ├─ blokace trvá po dobu od posledního pohybu │ │ │ │ ├─ pokud má stávající logika vypnout helper blokace → zachovat │ │ │ │ ├─ případné vypnutí světla dle blokovací logiky → zachovat │ │ │ │ └─ timer zhasnutí se nespouští, pokud to stávající logika výslovně nepotřebuje │ │ │ │ │ │ │ └─ KONEC větve A / STOP │ │ │ │ │ └─ NE │ │ │ ├─ [A2] Je aktivní nějaký režim? │ │ │ │ │ ├─ Test: │ │ │ ├─ denní režim aktivní = day_toggle_var AND NOT night_active │ │ │ └─ noční režim aktivní = night_toggle_var AND night_active │ │ │ │ │ ├─ NE │ │ │ ├─ nic nerozsvěcet │ │ │ ├─ timer nespouštět │ │ │ └─ KONEC větve A / STOP │ │ │ │ │ └─ ANO │ │ │ ├─ [A3] skip_lux_check == true ? │ │ │ │ │ ├─ ANO │ │ │ │ │ │ │ ├─ [A3.1] Vyber režim rozsvícení: │ │ │ │ ├─ night_active + night_mode_type == rgb │ │ │ │ │ └─ light.turn_on(brightness_night, rgb_color=color_night) │ │ │ │ │ │ │ │ │ ├─ night_active + night_mode_type == kelvin │ │ │ │ │ └─ light.turn_on(brightness_night, color_temp_kelvin=color_temp_night) │ │ │ │ │ │ │ │ │ ├─ NOT night_active + day_mode_type == rgb │ │ │ │ │ └─ light.turn_on(brightness_day, rgb_color=color_day) │ │ │ │ │ │ │ │ │ └─ NOT night_active + day_mode_type == kelvin │ │ │ │ └─ light.turn_on(brightness_day, color_temp_kelvin=color_temp_day) │ │ │ │ │ │ │ ├─ [A3.2] Po úspěšném rozsvícení: │ │ │ │ └─ timer.start / timer restart na hodnotu timeout (HH:MM:SS) │ │ │ │ │ │ │ └─ KONEC větve A / STOP │ │ │ │ │ └─ NE │ │ │ ├─ [A4] Povinná kontrola luxu │ │ │ │ │ ├─ Je lux validní? │ │ │ ├─ validní = stav NENÍ unknown / unavailable / none / "" │ │ │ └─ jinak nevalidní │ │ │ │ │ ├─ [A4.1] Pokud lux validní AND lux <= threshold │ │ │ │ │ │ │ ├─ vyber správný režim rozsvícení: │ │ │ │ ├─ noční RGB -> light.turn_on(...) │ │ │ │ ├─ noční Kelvin -> light.turn_on(...) │ │ │ │ ├─ denní RGB -> light.turn_on(...) │ │ │ │ └─ denní Kelvin -> light.turn_on(...) │ │ │ │ │ │ │ ├─ po úspěšném rozsvícení: │ │ │ │ └─ timer.start / timer restart na hodnotu timeout │ │ │ │ │ │ │ └─ KONEC větve A / STOP │ │ │ │ │ └─ [A4.2] Pokud lux nevalidní NEBO lux > threshold │ │ │ ├─ [A5] Rechecky luxu │ │ │ │ │ ├─ repeat count = lux_recheck_attempts │ │ │ │ │ ├─ pro každý recheck: │ │ │ │ │ │ │ ├─ pokud repeat.index > 1 │ │ │ │ └─ delay 1 s │ │ │ │ │ │ │ ├─ znovu ověř validitu luxu │ │ │ │ │ │ │ ├─ pokud lux validní AND lux <= threshold │ │ │ │ │ │ │ │ │ ├─ vyber správný režim rozsvícení: │ │ │ │ │ ├─ noční RGB -> light.turn_on(...) │ │ │ │ │ ├─ noční Kelvin -> light.turn_on(...) │ │ │ │ │ ├─ denní RGB -> light.turn_on(...) │ │ │ │ │ └─ denní Kelvin -> light.turn_on(...) │ │ │ │ │ │ │ │ │ ├─ po úspěšném rozsvícení: │ │ │ │ │ └─ timer.start / timer restart na hodnotu timeout │ │ │ │ │ │ │ │ │ └─ KONEC větve A / STOP │ │ │ │ │ │ │ └─ jinak pokračuj dalším recheckem │ │ │ │ │ └─ po vyčerpání všech rechecků bez úspěchu: │ │ ├─ nic nerozsvěcet │ │ ├─ timer nespouštět │ │ └─ KONEC větve A / STOP │ │ │ └─ KONEC větve A │ └─ TRIGGER B: timer.finished │ ├─ [B0] Ověř, že finished event patří vybranému timer helperu │ │ │ ├─ NE │ │ └─ KONEC větve B / STOP │ │ │ └─ ANO │ ├─ [B1] Je motion_sensor == on ? │ │ │ ├─ ANO │ │ │ │ │ ├─ přepsat helper s časem (čas posledního zhasnutí) = now() │ │ ├─ timer.start / timer restart na celý timeout │ │ └─ KONEC větve B / STOP │ │ │ └─ NE │ ├─ [B2] Je manual_override_entity == on ? │ │ │ ├─ ANO │ │ ├─ nezhasínat │ │ └─ KONEC větve B / STOP │ │ │ └─ NE │ ├─ [B3] Proces zhasnutí │ │ │ ├─ přepsat helper s časem (čas posledního zhasnutí) = now() │ ├─ delay = zpoždění zhasnutí │ ├─ light.turn_off(target=light_target) │ └─ KONEC větve B / STOP │ └─ KONEC větve B