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.