blueprint:
  name: Rozik-motion-lux-day_night-light_control-v6
  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
    - Rychlé znovurozsvícení bez kontroly luxu krátce po zhasnutí
    - Zhasínání řízené pomocí timer helperu

    Poznámka:
    Helper "čas posledního zhasnutí" se používá primárně pro rychlé znovurozsvícení
    a bypass kontroly luxu v hraničních stavech kolem zhasínání a dlouhého svícení.

  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ým 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: 10
      selector:
        number:
          min: 0
          max: 20
          step: 1

    last_turnoff_helper:
      name: Helper pro rychlé znovurozsvícení (input_datetime)
      description: >
        Ukládá čas posledního zhasnutí a používá se pro rychlé znovurozsvícení
        bez kontroly luxu v hraničních situacích.

        Pokud znovu vejdeš do místnosti krátce po odchodu,
        světlo se rozsvítí okamžitě bez kontroly luxů.
        Ř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í a pro odstranění problému
        pomalé aktualizace Zigbee senzorů.

        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: {}

    off_timer:
      name: Timer helper pro zhasnutí
      description: >
        Timer helper používaný pro odpočet zhasnutí.

        Automatizace ho sama spouští a resetuje podle nastaveného času "Zhasnutí po".

        JAK VYTVOŘIT:
        1) Nastavení > Zařízení a služby > Pomocníci (Helpers)
        2) Přidat pomocníka
        3) Vyber "Časovač" (Timer)
        4) Pojmenuj např. "Chodba - timer zhasnutí"
        5) Ulož a vyber vzniklou entitu zde
      selector:
        entity:
          domain: timer

    turn_off_delay:
      name: Zpoždění zhasnutí (HH:MM:SS)
      description: >
        Volitelné zpoždění mezi doběhnutím timeru a samotným zhasnutím.
        Pomáhá zmírnit hraniční stavy při vstupu do místnosti přesně v okamžiku zhasínání.

        Formát HH:MM:SS.
      default: "00:00:03"
      selector:
        time: {}

    timeout:
      name: Zhasnutí po (HH:MM:SS)
      description: >
        Čas od POSLEDNÍHO detekovaného pohybu do automatického zhasnutí.
        Každý nový relevantní pohyb resetuje odpočet na začátek.

        Formát HH:MM:SS.
        Např: 00:00:10 = 10 sekund, 00:02:00 = 2 minuty
      default: "00:00:10"
      selector:
        time: {}

    # ===== 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á | 3500K = neutrální teplá | 4000K = neutrální | 6500K = studená bílá"
      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).

        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.
      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.
        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).
      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.

        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á | 3500K = neutrální teplá | 4000K = neutrální | 6500K = studená bílá"
      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.

        Jak to funguje:
        - Přepneš na ON → automatizace se zablokuje
        - Po uplynutí nastavené doby od POSLEDNÍHO pohybu se tlačítko 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 tuto entitu zde
      selector:
        entity:
          domain: input_boolean

    manual_override_duration:
      name: Trvání blokace (minuty)
      description: >
        Jak dlouho bude automatizace zablokovaná od POSLEDNÍHO pohybu
        při zapnutém blokačním tlačítku.
        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: event
    event_type: timer.finished
    event_data:
      entity_id: !input off_timer

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_var: !input last_turnoff_helper
  ignore_time_input: !input ignore_lux_after_turnoff
  brightness_day_input: !input brightness_day
  brightness_night_input: !input brightness_night
  lux_entity: !input lux_sensor
  lux_threshold_var: !input lux_threshold
  off_timer_entity: !input off_timer

  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_var, '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:
      # ===== VĚTEV 1: MOTION ON =====
      - conditions:
          - condition: template
            value_template: "{{ trigger.platform == 'state' }}"
        sequence:
          - choose:
              # ===== 1A: BLOKACE ZAPNUTÁ =====
              - 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

              # ===== 1B: MIMO REŽIM =====
              - conditions:
                  - condition: template
                    value_template: >
                      {{ not ((day_toggle_var and not night_active) or (night_toggle_var and night_active)) }}
                sequence:
                  - stop: "Mimo aktivní režimy"

              # ===== 1C: SKIP LUX CHECK =====
              - conditions:
                  - condition: template
                    value_template: "{{ skip_lux_check }}"
                sequence:
                  - 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: timer.start
                            target:
                              entity_id: !input off_timer
                            data:
                              duration: !input timeout

                      - 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: timer.start
                            target:
                              entity_id: !input off_timer
                            data:
                              duration: !input timeout

                      - 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: timer.start
                            target:
                              entity_id: !input off_timer
                            data:
                              duration: !input timeout

                      - 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: timer.start
                            target:
                              entity_id: !input off_timer
                            data:
                              duration: !input timeout

              # ===== 1D: POVINNÁ KONTROLA LUXŮ =====
              - conditions:
                  - condition: template
                    value_template: "{{ not skip_lux_check }}"
                sequence:
                  - choose:
                      # Lux validní a tma
                      - conditions:
                          - condition: template
                            value_template: >
                              {{ states(lux_entity) not in ['unknown', 'unavailable', 'none', 'None', ''] and
                                 (states(lux_entity) | float) <= (lux_threshold_var | float) }}
                        sequence:
                          - 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: timer.start
                                    target:
                                      entity_id: !input off_timer
                                    data:
                                      duration: !input timeout

                              - 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: timer.start
                                    target:
                                      entity_id: !input off_timer
                                    data:
                                      duration: !input timeout

                              - 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: timer.start
                                    target:
                                      entity_id: !input off_timer
                                    data:
                                      duration: !input timeout

                              - 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: timer.start
                                    target:
                                      entity_id: !input off_timer
                                    data:
                                      duration: !input timeout

                      # Lux nevyhovuje nebo je nevalidní -> rechecky
                      - conditions:
                          - condition: template
                            value_template: >
                              {{ states(lux_entity) in ['unknown', 'unavailable', 'none', 'None', ''] or
                                 (states(lux_entity) | float(999999)) > (lux_threshold_var | float) }}
                        sequence:
                          - repeat:
                              count: "{{ recheck_attempts }}"
                              sequence:
                                - choose:
                                    - conditions:
                                        - condition: template
                                          value_template: "{{ repeat.index > 1 }}"
                                      sequence:
                                        - delay: "00:00:01"

                                - choose:
                                    - conditions:
                                        - condition: template
                                          value_template: >
                                            {{ states(lux_entity) not in ['unknown', 'unavailable', 'none', 'None', ''] and
                                               (states(lux_entity) | float) <= (lux_threshold_var | float) }}
                                      sequence:
                                        - 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: timer.start
                                                  target:
                                                    entity_id: !input off_timer
                                                  data:
                                                    duration: !input timeout
                                                - stop: "Rozsvíceno po rechecku"

                                            - 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: timer.start
                                                  target:
                                                    entity_id: !input off_timer
                                                  data:
                                                    duration: !input timeout
                                                - stop: "Rozsvíceno po rechecku"

                                            - 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: timer.start
                                                  target:
                                                    entity_id: !input off_timer
                                                  data:
                                                    duration: !input timeout
                                                - stop: "Rozsvíceno po rechecku"

                                            - 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: timer.start
                                                  target:
                                                    entity_id: !input off_timer
                                                  data:
                                                    duration: !input timeout
                                                - stop: "Rozsvíceno po rechecku"

      # ===== VĚTEV 2: TIMER.FINISHED =====
      - conditions:
          - condition: template
            value_template: "{{ trigger.platform == 'event' }}"
        sequence:
          - choose:
              # 2A: Motion stále ON -> prodluž
              - conditions:
                  - condition: state
                    entity_id: !input motion_sensor
                    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') }}"
                  - service: timer.start
                    target:
                      entity_id: !input off_timer
                    data:
                      duration: !input timeout

              # 2B: Motion není ON a blokace není ON -> zhasni
              - conditions:
                  - condition: not
                    conditions:
                      - condition: state
                        entity_id: !input motion_sensor
                        state: "on"
                  - condition: state
                    entity_id: !input manual_override_entity
                    state: "off"
                sequence:
                  - service: input_datetime.set_datetime
                    target:
                      entity_id: !input last_turnoff_helper
                    data:
                      datetime: "{{ now().strftime('%Y-%m-%d %H:%M:%S') }}"
                  - delay: !input turn_off_delay
                  - service: light.turn_off
                    target: !input light_target

              # 2C: Blokace ON -> nezhasínej
              - conditions:
                  - condition: state
                    entity_id: !input manual_override_entity
                    state: "on"
                sequence:
                  - stop: "Blokace zapnutá - nezhasínám"

mode: restart
