blueprint:
  name: Rozik-motion-lux-day_night-light_control-v5
  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

    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

    light_turned_on_flag:
      name: Flag rozsvícení automatizací (input_boolean)
      description: >
        Pomocný přepínač pro v5.

        Automatizace ho nastaví na ON pouze v místech, kde skutečně provede light.turn_on.
        Používá se výhradně pro rozhodnutí, zda se má zapsat čas do last_turnoff_helper.
        Nesmí se používat jako podmínka pro zhasnutí světel nebo režimy.

        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 - auto rozsvítilo"
        5) Ulož a vyber vzniklou entitu zde
      selector:
        entity:
          domain: input_boolean

    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 tuto 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
  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 }}

  # === Pojistka: zjisti, zda je alespoň jedno cílové světlo ON (kvůli bezpečnému "shození flagu") ===
  light_target_var: !input light_target
  any_light_on: >
    {% if light_target_var.entity_id is defined %}
      {% set ids = light_target_var.entity_id %}
    {% else %}
      {% set ids = [] %}
    {% endif %}
    {% if ids is string %}
      {{ is_state(ids, 'on') }}
    {% else %}
      {% set ns = namespace(on=false) %}
      {% for eid in ids %}
        {% if is_state(eid, 'on') %}
          {% set ns.on = true %}
        {% endif %}
      {% endfor %}
      {{ ns.on }}
    {% endif %}

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
          - service: input_boolean.turn_off
            target:
              entity_id: !input light_turned_on_flag

      # ===== POJISTKA: MIMO REŽIM (DEN/NOC NENÍ AKTIVNÍ) =====
      - conditions:
          - condition: state
            entity_id: !input motion_sensor
            state: "on"
          - condition: state
            entity_id: !input manual_override_entity
            state: "off"
          - condition: template
            value_template: >
              {{ not ((day_toggle_var and not night_active) or (night_toggle_var and night_active)) }}
        sequence:
          - service: input_boolean.turn_off
            target:
              entity_id: !input light_turned_on_flag
          - stop: "Mimo aktivní režimy – pojistně vypínám flag, aby se nepřepsal last_turnoff_helper"

      # ===== 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
                          - service: input_boolean.turn_on
                            target:
                              entity_id: !input light_turned_on_flag
                      - 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
                          - service: input_boolean.turn_on
                            target:
                              entity_id: !input light_turned_on_flag
                      # 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
                          - service: input_boolean.turn_on
                            target:
                              entity_id: !input light_turned_on_flag
                      - 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
                          - service: input_boolean.turn_on
                            target:
                              entity_id: !input light_turned_on_flag

              # ===== 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
                                  - service: input_boolean.turn_on
                                    target:
                                      entity_id: !input light_turned_on_flag
                              - 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
                                  - service: input_boolean.turn_on
                                    target:
                                      entity_id: !input light_turned_on_flag
                              # 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
                                  - service: input_boolean.turn_on
                                    target:
                                      entity_id: !input light_turned_on_flag
                              - 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
                                  - service: input_boolean.turn_on
                                    target:
                                      entity_id: !input light_turned_on_flag

                      # ===== 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:
                          # Pojistka: shodit flag jen pokud jsou cílová světla aktuálně OFF
                          - choose:
                              - conditions:
                                  - condition: template
                                    value_template: "{{ not any_light_on }}"
                                sequence:
                                  - service: input_boolean.turn_off
                                    target:
                                      entity_id: !input light_turned_on_flag

                          - 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
                                                - service: input_boolean.turn_on
                                                  target:
                                                    entity_id: !input light_turned_on_flag
                                            - 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
                                                - service: input_boolean.turn_on
                                                  target:
                                                    entity_id: !input light_turned_on_flag
                                            # 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
                                                - service: input_boolean.turn_on
                                                  target:
                                                    entity_id: !input light_turned_on_flag
                                            - 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
                                                - service: input_boolean.turn_on
                                                  target:
                                                    entity_id: !input light_turned_on_flag

  # ===== Č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"

  # ===== ULOŽENÍ ČASU ZHASNUTÍ (jen pokud automatizace opravdu rozsvítila) =====
  - choose:
      - conditions:
          - condition: state
            entity_id: !input light_turned_on_flag
            state: "on"
        sequence:
          - 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

  # ===== v5: Vypnutí flagu až na konci zhasínací sekvence =====
  - service: input_boolean.turn_off
    target:
      entity_id: !input light_turned_on_flag

mode: restart
