mam script, ktery ma neduhu, ze prepisuje cas posledniho vypnuti na zaklade referencniho svetla, coz neni dobre, pokud je tam skupina svetel a nekdo mi zrovna to referencni svetlo vypne --> ostatni pak zustanou svitit. Napadla me nasledujici uprava asi takto: Níže máš přesně „instrukci ke změně“, jen k přechodu **z kontroly jednoho referenčního světla** na **ověření přes pomocný toggle (input_boolean)**. Bez řešení procent, bez lux operátorů, bez přepisování další logiky. --- ## Cíl změny Nahradit nestabilní kontrolu „jednoho světla“ (`light_state_check_entity`) spolehlivou detekcí přes pomocný přepínač (`input_boolean`), který reprezentuje fakt: **automatizace v tomto běhu opravdu provedla rozsvícení**. Toggle slouží **výhradně** pro rozhodnutí: * zda se má zapsat `last_turnoff_helper` (čas posledního zhasnutí) Toggle se **nesmí** použít: * jako podmínka pro zhasnutí světel * jako podmínka pro blokace / režimy * jako náhrada stavu světel --- ## Co se odstraní / nahradí ### 1) Odstranit input `light_state_check_entity` * Smazat z blueprint input sekce: * `light_state_check_entity` (Hlavní světlo pro kontrolu rozsvícení) * Smazat proměnnou: * `light_check_entity: !input light_state_check_entity` * Smazat podmínku na konci: * `- condition: state entity_id: !input light_state_check_entity state: "on"` ### 2) Přidat (nebo zachovat) input `light_turned_on_flag` * Blueprint musí obsahovat input: * `light_turned_on_flag` (entity domain: `input_boolean`) * Pokud tam už je, pouze potvrdit význam v popisu: * „automatizace ho zapíná jen při rozsvícení; používá se jen pro rozhodnutí o zápisu času do last_turnoff_helper“ --- ## Jak se má flag nastavovat ### 3) Nastavit flag na ON pouze v místě, kde se skutečně rozsvěcí V každé větvi, kde je provedené `light.turn_on`, přidat bezprostředně po něm: * `service: input_boolean.turn_on` * `target.entity_id: !input light_turned_on_flag` Tj. vždy: * po rozsvícení v denním režimu (RGB i Kelvin) * po rozsvícení v nočním režimu (RGB i Kelvin) * po rozsvícení ve větvi „skip lux check“ * po rozsvícení ve větvi „recheck lux“ * po rozsvícení při první lux kontrole **Zásada:** Pokud se `light.turn_on` neprovede, flag se na ON nikdy nedá. ### 4) Flag se na začátku neresetuje * Žádné „reset na začátku akce“. * Důvod: nechceme „přepsat historii“ předčasně; flag je jen evidence, že se v tomto běhu rozsvítilo. --- ## Kdy se má flag vypnout ### 5) Flag vypnout jen v jednoznačných koncových stavech Flag se přepne na OFF pouze v těchto situacích: **A) Po doběhnutí sekvence zhasnutí (úplně na konci)** * v casti uložení času **B) Ve větvích, kde je jisté, že se světlo nerozsvítí a běh nemá pokračovat** Typicky: * „špatný režim“ (není aktivní den ani noc / toggly vypnuté / čas mimo režim) * „lux nevyhověl“ a zároveň po všech recheck pokusech nebylo rozsvícení V těchto větvích explicitně provést: * `input_boolean.turn_off` na flag **Poznámka:** Ve větvích, kde automatizace ještě může pokračovat (např. čekání na timeout), se do flagu nesahá. --- ## Jak se má řešit zápis last_turnoff_helper ### 6) Zápis času posledního zhasnutí se provede pouze pokud flag = ON Před službou: * `input_datetime.set_datetime` (last_turnoff_helper) vložit podmínku: * `condition: state` * `entity_id: !input light_turned_on_flag` * `state: "on"` Tím je zajištěno: * když automatizace nikdy nerozsvítila, **nezapíše** čas vypnutí --- ## Jak se má řešit zhasnutí světel ### 7) Zhasnutí světel zůstává nezávislé na flagu * `light.turn_off` zůstane řízené původní logikou (timeout + motion off + manual_override off…) * žádné nové podmínky typu „jen když flag ON“ pro `light.turn_off` * flag slouží jen pro `input_datetime.set_datetime` script ktery potrebuji upravit: blueprint: name: Rozik-motion-lux-day_night-light_control-v4 description: > Automatizace pro pohybové rozsvěcování světel s ohledem na světelnost a čas. Hlavní funkce: - Rozsvěcování při pohybu pouze ve tmě (kontrola lux) - Samostatné nastavení denního a nočního režimu (jas, barva/teplota) - Prodloužený noční režim pro víkendy a svátky - Dočasná blokace automatizace - Inteligentní detekce světla v místnosti s opakovanými kontrolami a případné důvěře této informaci po zadanou dobu (přeskočení kontroly světelnosti) domain: automation input: motion_sensor: name: Pohybový senzor selector: entity: domain: binary_sensor light_target: name: Ovládaná světla (libovolný počet) selector: target: entity: domain: light light_state_check_entity: name: Hlavní světlo (pro kontrolu rozsvícení) description: > Vyber JEDNO světlo z "Ovládaná světla" výše. Používá se pro detekci, zda skutečně došlo k rozsvícení. Pokud ovládáš více světel, vyber to hlavní/největší. selector: entity: domain: light lux_sensor: name: Senzor světelnosti selector: entity: domain: sensor lux_threshold: name: Prah světelnosti (lux) description: > Světla se rozsvítí pouze když naměřená světelnost je POD touto hodnotou. Vyšší hodnota = rozsvítí se i když je větší světlo. Nižší hodnota = rozsvítí se jen ve větší tmě. default: 400 selector: number: min: 0 max: 2000 unit_of_measurement: lx lux_recheck_attempts: name: Počet opětovných kontrol světelnosti (po nevyhovující hodnotě) description: > Kvůli bateriových senzorům (Zigbee), které aktualizují hodnotu jen při pohybu nebo intervalově. Při detekci pohybu proběhne 1 kontrola lux. Pokud nevyhovuje, provede se zadaný počet rechecků: - 1. recheck okamžitě (bez čekání) - každý další recheck po 1 sekundě Příklady: - 0 = žádný recheck (jen 1 povinná kontrola) - 1 = 1 okamžitý recheck - 2 = 1 okamžitý recheck + 1 recheck po 1s (doporučeno) default: 2 selector: number: min: 0 max: 5 step: 1 last_turnoff_helper: name: Helper pro rychlé znovurozsvícení (input_datetime) description: > Ukládá čas posledního zhasnutí. Pokud znovu vejdeš do místnosti krátce po odchodu, světlo se rozsvítí okamžitě bez kontroly luxů (předpokládá se že je stále tma). Řeší problém fade efektu a pomalé aktualizace Zigbee senzorů (např. bateriových). JAK VYTVOŘIT: 1) Nastavení > Zařízení a služby > Pomocníci (Helpers) > Přidat pomocníka 2) Vyber "Datum a čas" (Date and/or time) 3) Název: např. "Chodba - poslední zhasnutí" 4) Zaškrtni "Datum" i "Čas" 5) Ulož a vyber tuto entitu zde selector: entity: domain: input_datetime ignore_lux_after_turnoff: name: Rychlé znovurozsvícení do (HH:MM:SS) description: > Pokud od posledního zhasnutí uplynulo MÉNĚ než tato doba, kontrola luxů se přeskočí a světlo se rozsvítí okamžitě. Užitečné pro místnosti s větší průchodností, kde nechceš aby se při každém průchodu kontrolovala světelnost znovu a odstraňuje problém pomalé aktualizace Zigbee senzorů (např. bateriových). Formát HH:MM:SS. Např: 00:00:30 = 30 sekund, 00:02:00 = 2 minuty, 00:10:00 = 10 minut default: "00:02:00" selector: time: {} timeout: name: Zhasnutí po (sekundách) description: > Čas od POSLEDNÍHO detekovaného pohybu do automatického zhasnutí. Každý nový pohyb resetuje odpočet na začátek. Např: Nastaveno 10s → pohyb v čase 0s → další pohyb v čase 8s → zhasne v čase 18s (10s od posledního pohybu). default: 10 selector: number: min: 0 max: 3600 unit_of_measurement: s # ===== DENNÍ REŽIM ===== day_mode_toggle: name: Aktivace denního režimu description: > Denní režim je aktivní od konce nočního režimu do začátku nočního režimu (bez ohledu na to, zda je noční režim zapnutý). Pokud vypneš denní i noční režim, automatizace nebude vůbec fungovat. default: true selector: boolean: {} day_light_mode: name: Denní režim - typ svícení default: kelvin selector: select: options: - label: Klasické (teplota barvy) value: kelvin - label: RGB value: rgb brightness_day: name: Denní režim - jas (%) default: 100 selector: number: min: 1 max: 100 unit_of_measurement: "%" color_temp_day: name: Denní režim - teplota barvy (Kelvin) description: "2700K = teplá bílá (jako žárovka) | 3500K = neutrální teplá | 4000K = neutrální | 6500K = studená bílá (denní světlo)" default: 3500 selector: number: min: 2000 max: 6535 unit_of_measurement: K color_day: name: Denní režim - RGB barva description: "Ruční zadání přes web: #870303, #AE0202, #9F0202" default: [135, 3, 3] selector: color_rgb: {} # ===== NOČNÍ REŽIM ===== night_mode_toggle: name: Aktivace nočního režimu description: > Noční režim je aktivní od nastaveného začátku do konce (s možností prodloužení pro vybrané dny). Denní režim začíná vždy na konci nočního režimu (bez ohledu na to, zda je noční režim zapnutý). Pokud vypneš denní i noční režim, automatizace nebude vůbec fungovat. default: true selector: boolean: {} night_mode_start: name: Čas začátku nočního režimu description: > Od této doby začíná noční režim a končí denní režim (bez ohledu na to zda je noční režim zapnutý). default: "21:45:00" selector: time: {} night_mode_end: name: Standardní čas konce nočního režimu description: > Do této doby trvá noční režim v běžné dny a zde začíná denní režim (bez ohledu na to zda je noční režim zapnutý). Pro vybrané dny (víkendy/svátky) můžeš nastavit prodloužení níže. default: "06:30:00" selector: time: {} night_mode_end_override: name: Prodloužený čas konce nočního režimu description: > Do této doby trvá noční režim ve VYBRANÉ dny (víkendy/svátky) a zde začíná denní režim pro tyto dny (bez ohledu na to zda je noční režim zapnutý). default: "08:00:00" selector: time: {} weekend_override_days: name: Dny s prodlouženým nočním režimem description: > Vyber dny, kdy chceš prodloužit noční režim (typicky víkend). V tyto dny se použije "Prodloužený čas konce" místo "Standardní čas konce". Pokud zaškrtneš "Dny svátků", automaticky se prodlouží i v české státní svátky (vyžaduje nastavení kalendáře svátků níže). default: ["Sobota", "Neděle", "Dny svátků"] selector: select: multiple: true mode: dropdown options: - Pondělí - Úterý - Středa - Čtvrtek - Pátek - Sobota - Neděle - Dny svátků holiday_calendar: name: Kalendář CZ svátků (volitelné) description: > Pokud chceš automatické prodloužení nočního režimu i ve svátky: 1) Nastavení > Zařízení a služby > Přidat integraci 2) Vyhledej "Holidays" 3) Vyber zemi: Czechia (CZ) 4) Ulož a vyber tuto calendar entitu zde 5) Zaškrtni "Dny svátků" v poli výše Pokud nechceš detekci svátků, nech prázdné. default: "" selector: entity: domain: calendar multiple: false night_light_mode: name: Noční režim - typ svícení default: rgb selector: select: options: - label: Klasické (teplota barvy) value: kelvin - label: RGB value: rgb brightness_night: name: Noční režim - jas (%) default: 4 selector: number: min: 1 max: 100 unit_of_measurement: "%" color_temp_night: name: Noční režim - teplota barvy (Kelvin) description: "2700K = teplá bílá (jako žárovka) | 3500K = neutrální teplá | 4000K = neutrální | 6500K = studená bílá (denní světlo)" default: 3500 selector: number: min: 2000 max: 6535 unit_of_measurement: K color_night: name: Noční režim - RGB barva description: "Ruční zadání přes web: #870303, #AE0202, #9F0202" default: [135, 3, 3] selector: color_rgb: {} # ===== MANUÁLNÍ BLOKACE ===== manual_override_entity: name: Tlačítko blokace automatizace (input_boolean) description: > Dočasně zablokuje automatické rozsvěcování při pohybu. Po nastavené době se automaticky odblokuje. Jak to funguje: - Přepneš na ON → automatizace se zablokuje na dobu "Trvání blokace" - Po uplynutí času se přepínač automaticky vrátí na OFF - Během blokace se světla při pohybu nezapínají/nevypínají JAK VYTVOŘIT: 1) Nastavení > Zařízení a služby > Pomocníci (Helpers) 2) Přidat pomocníka 3) Vyber "Přepínač" (Toggle) 4) Pojmenuj např. "Chodba - blokace automatiky" 5) Ulož a vyber vzniklou entitu zde selector: entity: domain: input_boolean manual_override_duration: name: Trvání blokace (minuty) description: > Jak dlouho bude automatizace zablokovaná po zapnutí blokačního tlačítka. Po uplynutí této doby se tlačítko automaticky vypne. default: 60 selector: number: min: 1 max: 300 unit_of_measurement: min trigger: - platform: state entity_id: !input motion_sensor to: "on" - platform: state entity_id: !input motion_sensor to: "off" - platform: state entity_id: !input manual_override_entity to: "on" variables: day_toggle_var: !input day_mode_toggle night_toggle_var: !input night_mode_toggle night_start: !input night_mode_start night_end_default: !input night_mode_end night_end_override: !input night_mode_end_override override_days: !input weekend_override_days holiday_cal: !input holiday_calendar day_mode_type: !input day_light_mode night_mode_type: !input night_light_mode recheck_attempts: !input lux_recheck_attempts last_turnoff_helper: !input last_turnoff_helper ignore_time_input: !input ignore_lux_after_turnoff light_check_entity: !input light_state_check_entity brightness_day_input: !input brightness_day brightness_night_input: !input brightness_night # === přidané pomocné proměnné pro ">= / <=" logiku luxů (jen kvůli rovnosti) === lux_entity: !input lux_sensor lux_threshold_var: !input lux_threshold # Přepočet jasu z % na 0-255 brightness_day: "{{ (brightness_day_input * 2.55) | int }}" brightness_night: "{{ (brightness_night_input * 2.55) | int }}" today_name: > {{ ["Pondělí", "Úterý", "Středa", "Čtvrtek", "Pátek", "Sobota", "Neděle"][now().weekday()] }} is_holiday: > {% if holiday_cal != "" and "Dny svátků" in override_days %} {{ is_state(holiday_cal, 'on') }} {% else %} false {% endif %} night_end: > {% if today_name in override_days or is_holiday %} {{ night_end_override }} {% else %} {{ night_end_default }} {% endif %} night_active: > {% set start = strptime(night_start, '%H:%M:%S').time() %} {% set end = strptime(night_end, '%H:%M:%S').time() %} {% set nowt = now().time() %} {% if start < end %} {{ start <= nowt < end }} {% else %} {{ nowt >= start or nowt < end }} {% endif %} ignore_seconds: > {% set t = ignore_time_input.split(':') %} {{ (t[0]|int * 3600) + (t[1]|int * 60) + (t[2]|int) }} seconds_since_turnoff: > {% set ts = state_attr(last_turnoff_helper, 'timestamp') %} {% if ts is number %} {{ (as_timestamp(now()) - ts) | int(0) }} {% else %} 999999 {% endif %} skip_lux_check: > {{ seconds_since_turnoff < ignore_seconds }} condition: [] action: - choose: # ===== MANUÁLNÍ BLOKACE ===== - conditions: - condition: state entity_id: !input manual_override_entity state: "on" sequence: - delay: minutes: !input manual_override_duration - service: input_boolean.turn_off target: entity_id: !input manual_override_entity - service: light.turn_off target: !input light_target # ===== DETEKCE POHYBU ===== - conditions: - condition: state entity_id: !input motion_sensor state: "on" - condition: state entity_id: !input manual_override_entity state: "off" - condition: or conditions: - condition: template value_template: "{{ day_toggle_var and not night_active }}" - condition: template value_template: "{{ night_toggle_var and night_active }}" sequence: # ===== SKIP LUX CHECK (krátce po zhasnutí) ===== - choose: - conditions: - condition: template value_template: "{{ skip_lux_check }}" sequence: # Rozsvícení BEZ kontroly luxů - NOČNÍ REŽIM - choose: - conditions: - condition: template value_template: "{{ night_toggle_var and night_active and night_mode_type == 'rgb' }}" sequence: - service: light.turn_on target: !input light_target data: brightness: "{{ brightness_night }}" rgb_color: !input color_night - conditions: - condition: template value_template: "{{ night_toggle_var and night_active and night_mode_type == 'kelvin' }}" sequence: - service: light.turn_on target: !input light_target data: brightness: "{{ brightness_night }}" color_temp_kelvin: !input color_temp_night # Rozsvícení BEZ kontroly luxů - DENNÍ REŽIM - conditions: - condition: template value_template: "{{ day_toggle_var and not night_active and day_mode_type == 'rgb' }}" sequence: - service: light.turn_on target: !input light_target data: brightness: "{{ brightness_day }}" rgb_color: !input color_day - conditions: - condition: template value_template: "{{ day_toggle_var and not night_active and day_mode_type == 'kelvin' }}" sequence: - service: light.turn_on target: !input light_target data: brightness: "{{ brightness_day }}" color_temp_kelvin: !input color_temp_day # ===== KONTROLA LUXŮ - POVINNÁ (1. kontrola) ===== - conditions: - condition: template value_template: "{{ not skip_lux_check }}" sequence: - choose: - conditions: # tma = lux <= práh (řeší rovnost) - condition: template value_template: > {{ (states(lux_entity) | float(999999)) <= (lux_threshold_var | float) }} sequence: # Rozsvícení - NOČNÍ REŽIM - choose: - conditions: - condition: template value_template: "{{ night_toggle_var and night_active and night_mode_type == 'rgb' }}" sequence: - service: light.turn_on target: !input light_target data: brightness: "{{ brightness_night }}" rgb_color: !input color_night - conditions: - condition: template value_template: "{{ night_toggle_var and night_active and night_mode_type == 'kelvin' }}" sequence: - service: light.turn_on target: !input light_target data: brightness: "{{ brightness_night }}" color_temp_kelvin: !input color_temp_night # Rozsvícení - DENNÍ REŽIM - conditions: - condition: template value_template: "{{ day_toggle_var and not night_active and day_mode_type == 'rgb' }}" sequence: - service: light.turn_on target: !input light_target data: brightness: "{{ brightness_day }}" rgb_color: !input color_day - conditions: - condition: template value_template: "{{ day_toggle_var and not night_active and day_mode_type == 'kelvin' }}" sequence: - service: light.turn_on target: !input light_target data: brightness: "{{ brightness_day }}" color_temp_kelvin: !input color_temp_day # ===== LUX NEVYHOVUJE -> RECHECKY (1. okamžitě, další po 1s) ===== - conditions: # světlo = lux > práh (rovnost už jde do "tma") - condition: template value_template: > {{ (states(lux_entity) | float(-999999)) > (lux_threshold_var | float) }} sequence: - repeat: count: "{{ recheck_attempts }}" sequence: # 1. recheck bez čekání, další až po 1s - choose: - conditions: - condition: template value_template: "{{ repeat.index > 1 }}" sequence: - delay: "00:00:01" - choose: - conditions: # tma = lux <= práh (řeší rovnost i při rechecku) - condition: template value_template: > {{ (states(lux_entity) | float(999999)) <= (lux_threshold_var | float) }} sequence: # Rozsvícení po rechecku - NOČNÍ REŽIM - choose: - conditions: - condition: template value_template: "{{ night_toggle_var and night_active and night_mode_type == 'rgb' }}" sequence: - service: light.turn_on target: !input light_target data: brightness: "{{ brightness_night }}" rgb_color: !input color_night - stop: "Světlo rozsvíceno po rechecku luxů" - conditions: - condition: template value_template: "{{ night_toggle_var and night_active and night_mode_type == 'kelvin' }}" sequence: - service: light.turn_on target: !input light_target data: brightness: "{{ brightness_night }}" color_temp_kelvin: !input color_temp_night - stop: "Světlo rozsvíceno po rechecku luxů" # Rozsvícení po rechecku - DENNÍ REŽIM - conditions: - condition: template value_template: "{{ day_toggle_var and not night_active and day_mode_type == 'rgb' }}" sequence: - service: light.turn_on target: !input light_target data: brightness: "{{ brightness_day }}" rgb_color: !input color_day - stop: "Světlo rozsvíceno po rechecku luxů" - conditions: - condition: template value_template: "{{ day_toggle_var and not night_active and day_mode_type == 'kelvin' }}" sequence: - service: light.turn_on target: !input light_target data: brightness: "{{ brightness_day }}" color_temp_kelvin: !input color_temp_day - stop: "Světlo rozsvíceno po rechecku luxů" # ===== ČEKÁNÍ NA TIMEOUT ===== - wait_for_trigger: - platform: state entity_id: !input motion_sensor to: "on" timeout: seconds: !input timeout continue_on_timeout: true - condition: state entity_id: !input motion_sensor state: "off" - condition: state entity_id: !input manual_override_entity state: "off" # ===== KONTROLA ZDA SE ROZSVÍTILO (před uložením času) ===== - condition: state entity_id: !input light_state_check_entity state: "on" # ===== ULOŽENÍ ČASU ZHASNUTÍ ===== - service: input_datetime.set_datetime target: entity_id: !input last_turnoff_helper data: datetime: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}" # ===== ZHASNUTÍ SVĚTEL ===== - service: light.turn_off target: !input light_target mode: restart novy script bude verze 5 --> v5 v sablone. Ma moje zamyslena uprava nejaky neduh? Pokud ne, uprav script podle zadani.