blueprint:
  name: Rozik-motion-lux-day_night-light_control-v3
  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 svetla v mistnosti s opakovanými kontrolami a případné důvěře této informaci po zadanou dobu (přeskočení kontroly světelnosti)
    
    Denní režim: Vždy 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ý).
    Noční režim: Od nastaveného začátku do konce (s možností prodloužení o víkendech/svátcích).
  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ěcí se i když je světlejší. Nižší hodnota = rozsvěcí se jen ve větší tmě.
        Typické hodnoty: 100-200 lx (tmavá místnost), 300-500 lx (šero), 700+ lx (jasno).
      default: 400
      selector:
        number:
          min: 0
          max: 2000
          unit_of_measurement: lx

    lux_recheck_attempts:
      name: Počet opakovaných kontrol světelnosti (0–5)
      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ě
        
        Doporučeno: 2 (= 1 kontrola + 1 okamžitý recheck + 1 recheck po 1s)
      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ů.
        
        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.
        
        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 (konec denního režimu, 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 (začátek denního režimu, 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).
        Začátek denního režimu 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"]
      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í
        
        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ř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:
                          - condition: numeric_state
                            entity_id: !input lux_sensor
                            below: !input lux_threshold
                        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:
                          - condition: numeric_state
                            entity_id: !input lux_sensor
                            above: !input lux_threshold
                        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:
                                        - condition: numeric_state
                                          entity_id: !input lux_sensor
                                          below: !input lux_threshold
                                      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
