Robuste Lichtautomatisierung (Dämmerung, Bewegung, Timer, Nachtmodus, ...)

Bei der einen oder anderen Gelegenheit habe ich erwähnt, dass ich meine Lichtautomatisierungen mit Hilfe von Timern robuster gestalte.

So wartet die Automatisierung nicht mehr einige Zeit (Minuten, und mehr) auf ein Ereignis (typischerweise das Fehlen von Bewegung/Präsenz).
U.a. dieses Warten macht die Automatisierung fragil, falls HA restartet wird, beginnt das Warten von vorne.
Oder wenn der Sensor mal nicht verfügbar ist, beginnt das Warten ebenfalls von vorne.

Außerdem kann es passieren, dass einige Zeit nach dem Einschalten des Lichts es in dem Raum gar nicht mehr dunkel ist (morgens, während eines Regenschauers, …), so dass das Licht eigentlich ausgeschaltet werden kann.

Unten eine meiner Automatisierungen, die u.a einen persistenten Timer, eine Dämmerungssensor (als Schwellensensor mit Hyterese), einen Anwesenheits-/Bewegungssensor und binary_sensoren für Nachtmodus (typischerweise im Bett liegend) und Nighttime (dann sollten die meisten Automatisierungen nicht mehr anspringen, abhängig von ob Werktag oder Nichtwerktag).

alias: Esszimmerlicht (Timer)
description: >
  Diese Automation steuert das Esszimmerlicht abhängig von Bewegung, Dämmerung,
  Nachtmodus und Lichtstatus.  Erkennt Bewegung bei Dämmerung und schaltet das
  Licht ein,  startet einen Timer bei Bewegung oder manuellem Einschalten, und
  schaltet das Licht wieder aus, wenn der Timer abläuft und es entweder hell
  genug ist oder keine Bewegung erkannt wird.  Der Nachtmodus deaktiviert das
  Licht sofort und bricht den Timer ab.  Die Dämmerung beendet ebenfalls das
  Licht.
triggers:
  - id: bewegung_an
    alias: Trigger – Bewegung erkannt
    entity_id: binary_sensor.bewegung_10z_occupancy
    to: "on"
    trigger: state
  - id: bewegung_aus
    alias: Trigger – Bewegung endet
    entity_id: binary_sensor.bewegung_10z_occupancy
    to: "off"
    trigger: state
  - id: timer_fertig
    alias: Trigger – Timer abgelaufen
    event_type: timer.finished
    event_data:
      entity_id: timer.esszimmer_licht
    trigger: event
  - id: nightmode_aktiviert
    alias: Trigger – Nachtmodus aktiviert
    entity_id: input_boolean.night_mode
    to: "on"
    trigger: state
  - id: licht_eingeschaltet
    alias: Trigger – Licht eingeschaltet
    entity_id: light.licht_eg_esszimmer_decke_gruppe
    to: "on"
    trigger: state
  - id: licht_ausgeschaltet
    alias: Trigger – Licht ausgeschaltet
    entity_id: light.licht_eg_esszimmer_decke_gruppe
    to: "off"
    trigger: state
  - id: daemmerung_zu_ende
    alias: Trigger – Dämmerung beendet
    entity_id: binary_sensor.daemmerung_esszimmer
    to: "off"
    trigger: state
conditions: []
actions:
  - choose:
      - alias: Aktion – Licht einschalten bei Bewegung und Dämmerung
        conditions:
          - condition: trigger
            id: bewegung_an
            alias: Bedingung – Trigger ist Bewegung erkannt
          - condition: template
            value_template: "{{ is_dusk }}"
            alias: Bedingung – Dämmerung ist aktiv
          - condition: state
            entity_id: binary_sensor.is_not_nighttime
            state: "on"
            alias: Bedingung – Es ist nicht Nachtzeit
          - condition: state
            entity_id: input_boolean.night_mode
            state: "off"
            alias: Bedingung – Nachtmodus ist deaktiviert
        sequence:
          - alias: Aktion – Licht einschalten mit Helligkeit und Farbtemperatur
            target:
              entity_id: "{{ light_entity }}"
            data:
              brightness_pct: "{{ licht_brightness_pct }}"
              color_temp: "{{ licht_color_temp }}"
            action: light.turn_on
      - alias: Aktion – Timer starten bei Bewegung
        conditions:
          - condition: trigger
            id: bewegung_an
            alias: Bedingung – Trigger ist Bewegung erkannt
        sequence:
          - alias: Aktion – Timer starten mit definierter Dauer
            target:
              entity_id: "{{ timer_entity }}"
            data:
              duration: "{{ timer_duration }}"
            action: timer.start
      - alias: Aktion – Timer starten bei Bewegungsende wenn Licht an
        conditions:
          - condition: trigger
            id: bewegung_aus
            alias: Bedingung – Trigger ist Bewegung endet
          - condition: template
            value_template: "{{ is_light_on }}"
            alias: Bedingung – Licht ist aktuell eingeschaltet
        sequence:
          - alias: Aktion – Timer starten mit definierter Dauer
            target:
              entity_id: "{{ timer_entity }}"
            data:
              duration: "{{ timer_duration }}"
            action: timer.start
      - alias: Aktion – Timer starten bei manuellem Einschalten des Lichts
        conditions:
          - condition: trigger
            id: licht_eingeschaltet
            alias: Bedingung – Trigger ist Licht eingeschaltet
        sequence:
          - alias: Aktion – Timer starten mit definierter Dauer
            target:
              entity_id: "{{ timer_entity }}"
            data:
              duration: "{{ timer_duration }}"
            action: timer.start
      - alias: Aktion – Licht ausschalten und Timer abbrechen bei Nachtmodus
        conditions:
          - condition: trigger
            id: nightmode_aktiviert
            alias: Bedingung – Trigger ist Nachtmodus aktiviert
        sequence:
          - alias: Aktion – Licht ausschalten mit Übergang
            target:
              entity_id: "{{ light_entity }}"
            data:
              transition: "{{ licht_transition }}"
            action: light.turn_off
          - alias: Aktion – Timer abbrechen
            target:
              entity_id: "{{ timer_entity }}"
            data: {}
            action: timer.cancel
      - alias: >-
          Aktion – Licht ausschalten nach Timerende bei Helligkeit oder keiner
          Bewegung
        conditions:
          - condition: trigger
            id: timer_fertig
            alias: Bedingung – Trigger ist Timer abgelaufen
          - condition: or
            alias: Bedingung – Entweder hell genug oder keine Bewegung
            conditions:
              - condition: template
                value_template: "{{ not is_dusk }}"
                alias: Teilbedingung – Es ist hell genug (nicht Dämmerung)
              - condition: template
                value_template: "{{ not is_occupied }}"
                alias: Teilbedingung – Keine Bewegung erkannt
        sequence:
          - alias: Aktion – Licht ausschalten mit Übergang
            target:
              entity_id: "{{ light_entity }}"
            data:
              transition: "{{ licht_transition }}"
            action: light.turn_off
      - alias: Aktion – Timer abbrechen bei Licht ausschalten
        conditions:
          - condition: trigger
            id: licht_ausgeschaltet
            alias: Bedingung – Trigger ist Licht ausgeschaltet
        sequence:
          - alias: Aktion – Timer abbrechen
            target:
              entity_id: "{{ timer_entity }}"
            data: {}
            action: timer.cancel
      - alias: Aktion – Licht ausschalten bei Ende der Dämmerung
        conditions:
          - condition: trigger
            id: daemmerung_zu_ende
            alias: Bedingung – Trigger ist Dämmerung beendet
        sequence:
          - alias: Aktion – Licht ausschalten mit Übergang
            target:
              entity_id: "{{ light_entity }}"
            data:
              transition: "{{ licht_transition }}"
            action: light.turn_off
variables:
  timer_duration: "00:03:00"
  timer_entity: "timer.esszimmer_licht"
  licht_transition: 10
  licht_brightness_pct: 85
  licht_color_temp: 333
  light_entity: "light.licht_eg_esszimmer_decke_gruppe"
  is_light_on: "{{ is_state(light_entity, 'on') }}"
  occupancy_entity: "binary_sensor.bewegung_10z_occupancy"
  is_occupied: "{{ is_state(occupancy_entity,'on') }}"
  dusk_entity: "binary_sensor.daemmerung_esszimmer"
  is_dusk: "{{ is_state(dusk_entity, 'on') }}"
mode: single
trace:
  stored_traces: 30

bei den Trigger müssen die echten Entitäten verwendet werden, denn HA registriert die Trigger und benötigt dafür die wirklichen Entitäten. Bei den Bedingungen und Aktionen verwende ich Variablen, so dass sich Anpassungen an andere Entitäten insgesamt leicht vornehmen lassen.

4 „Gefällt mir“

Moin,

ich habe vorhin einen älteren Beitrag von dir gelesen. Da ging es auch um das Thema Timer. Fand das sehr interessant und habe zum Testen mal eine einfache Automation erstellt und werde meine bestehenden Automationen wohl darauf umrüsten.

alias: Flurbeleuchtung mit BW-Melder und Timer Helfer
description: ""
triggers:
  - trigger: state
    entity_id:
      - binary_sensor.bewegungsmelder01_occupancy
    from: "off"
    to: "on"
    id: licht_ein
  - trigger: state
    entity_id:
      - timer.timer_flurbeleuchtung
    from: active
    to: idle
    id: licht_aus
conditions: []
actions:
  - if:
      - condition: trigger
        id:
          - licht_ein
    then:
      - action: light.turn_on
        metadata: {}
        data: {}
        target:
          entity_id: light.flur_deckenlicht
      - action: timer.start
        metadata: {}
        data: {}
        target:
          entity_id: timer.timer_flurbeleuchtung
  - if:
      - condition: trigger
        id:
          - licht_aus
    then:
      - action: light.turn_off
        metadata: {}
        data: {}
        target:
          entity_id: light.flur_deckenlicht
mode: single

Echt gute Idee, danke fürs Teilen. Ich bau auch bald Licht Automationen und werde da deine Idee mit aufgreifen. Bis jetzt vertraue ich meist darauf, dass keiner HA neu startet.

1 „Gefällt mir“