Veröffentlicht: April 2026
Kategorie: Home Assistant · Automationen · Best Practices
Schwierigkeit: Fortgeschritten
Einleitung
Mit Home Assistant 2026.4 hat sich die Art, wie wir Automationen schreiben sollten, grundlegend verändert. Zwei neue Features machen dabei den Unterschied: purpose-specific Trigger und Conditions – also zweckgebundene Auslöser und Bedingungen, die domänenübergreifend und area-basiert funktionieren. Wer seine bestehenden Automationen nicht anpasst, riskiert stille Fehler – wie ein Wohnzimmerlicht, das tagsüber stundenlang brennt, weil eine globale Illuminance-Condition das Ausschalten blockiert.
In diesem Artikel zeige ich drei reale Beispiele aus meiner eigenen Smart-Home-Umgebung: Wohnzimmer, Wintergarten und Treppenhaus. Für jede Automation erkläre ich, was falsch war – und wie die korrigierte Version aussieht.
Was ist neu in HA 2026.4?
Purpose-specific Trigger und Conditions (Labs)
Seit 2026.4 gibt es offiziell native Trigger und Conditions für:
- Occupancy (
occupancy.detected/occupancy.cleared) – Belegung erkannt/frei - Motion (
motion.detected/motion.cleared) – Bewegung erkannt/frei - Door (
door.opened/door.closed) – Tür geöffnet/geschlossen - Illuminance (
illuminance.is_value) – Helligkeitsschwelle über/unter Wert - Temperature, Humidity, Power, Battery, Air Quality – und viele mehr
Das Besondere: Diese Trigger und Conditions funktionieren area-basiert. Statt einzelne Entities anzugeben, zeigt man auf einen Raum – HA findet automatisch alle passenden Sensoren darin.
trigger:
- platform: occupancy.detected
target:
area_id: wohnzimmer
options:
behavior: first # feuert beim ersten Sensor der Bewegung meldet
Wichtig: Das Feature ist aktuell noch über Home Assistant Labs verfügbar.
Aktivieren unter: Einstellungen → System → Labs
Entfernte veraltete Trigger
Im gleichen Release wurden die alten binary_sensor.occupancy_detected und binary_sensor.occupancy_cleared Trigger entfernt. Wer diese noch in Automationen verwendet, muss migrieren.
Der häufigste Fehler: Die globale Condition
Bevor wir in die einzelnen Automationen gehen, der wichtigste Grundsatz:
Eine globale
condition:gilt für ALLE Branches – auch für das Ausschalten.
Wer eine Illuminance-Condition global setzt, blockiert damit nicht nur das Einschalten bei hellem Tag – sondern auch den Ausschalt-Trigger, den Watchdog und den Sensor-Unavailability-Fallback. Das Ergebnis: Das Licht bleibt stundenlang an, weil es tagsüber zu hell ist um die Automation überhaupt auszuführen.
Falsch:
condition:
- condition: illuminance.is_value # blockiert ALLES
target:
area_id: wohnzimmer
options:
threshold:
type: below
value:
number: 100
Richtig: Der Helligkeits-Check gehört nur in den Einschalt-Branch, nicht global.
Automation 1: Wohnzimmer – Lichtsteuerung V7.2
Aufbau
Das Wohnzimmer wird über zwei WLED-Streifen (light.wled_teststreifen + light.wled_1) und einen Bewegungsmelder (binary_sensor.bewegungsmelder_wohnzimmer_presence) gesteuert.
Das Problem in V7.1
Die Illuminance-Condition war global gesetzt:
condition:
- condition: illuminance.is_value
target:
area_id: wohnzimmer
options:
behavior: any
threshold:
type: below
value:
active_choice: number
number: 100
Ergebnis: An einem hellen Apriltag (30.000+ Lux draußen) brannte das Licht über eine Stunde, weil occupancy.cleared zwar feuerte – aber die globale Condition den gesamten Automations-Lauf blockierte.
Die Lösung in V7.2
Illuminance-Check nur im Einschalt-Branch:
alias: Wohnzimmer - Lichtsteuerung - V7.2
description: >
Bewegungsabhängige WLED-Lichtsteuerung. Illuminance-Check NUR beim
Einschalten. Ausschalten, Watchdog und Sensor-Fallback immer aktiv.
variables:
light_entity: light.wled_teststreifen
push_title: "Wohnzimmer – Lichtautomatik"
mode: queued
max: 10
max_exceeded: silent
trigger:
- platform: homeassistant
event: start
id: ha_start
- platform: time_pattern
minutes: "/30"
id: watchdog
- platform: occupancy.detected
target:
area_id: wohnzimmer
options:
behavior: first
id: motion_on
- platform: occupancy.cleared
target:
area_id: wohnzimmer
options:
behavior: last
id: motion_off
- platform: state
entity_id: binary_sensor.bewegungsmelder_wohnzimmer_presence
to: unavailable
id: sensor_unavailable
condition: [] # KEINE globale Condition!
action:
- choose:
- alias: "Bewegung erkannt → Licht einschalten (nur wenn dunkel)"
conditions:
- condition: trigger
id: motion_on
- condition: illuminance.is_value # ← nur hier!
target:
area_id: wohnzimmer
options:
behavior: any
threshold:
type: below
value:
active_choice: number
number: 100
- condition: state
entity_id: light.wled_teststreifen
state:
- "off"
- unavailable
- unknown
sequence:
- action: light.turn_on
target:
entity_id:
- light.wled_teststreifen
- light.wled_1
- alias: "Keine Bewegung → Licht ausschalten (IMMER, unabhängig von Lux)"
conditions:
- condition: trigger
id: motion_off
- condition: state
entity_id: light.wled_teststreifen
state: "on"
sequence:
- action: light.turn_off
target:
entity_id:
- light.wled_teststreifen
- light.wled_1
- alias: "Sensor unavailable → Licht ausschalten (Sicherheit)"
conditions:
- condition: trigger
id: sensor_unavailable
- condition: state
entity_id: light.wled_teststreifen
state: "on"
sequence:
- action: light.turn_off
target:
entity_id:
- light.wled_teststreifen
- light.wled_1
- alias: "Watchdog → Licht an ohne Bewegung seit 30 Min → ausschalten"
conditions:
- condition: trigger
id: watchdog
- condition: state
entity_id: light.wled_teststreifen
state: "on"
- condition: state
entity_id: binary_sensor.bewegungsmelder_wohnzimmer_presence
state: "off"
for: "00:30:00"
sequence:
- action: light.turn_off
target:
entity_id:
- light.wled_teststreifen
- light.wled_1
Automation 2: Wintergarten – Lichtsteuerung V7.1
Besonderheit: Tag/Nacht über externen Lux-Sensor
Der Wintergarten hat keinen eigenen Raumsensor für Illuminance, aber eine Wetterstation mit sensor.gw1100a_solar_lux. Die Logik nutzt daher Template-Variablen statt den neuen illuminance.is_value-Trigger.
Neu: Dreistufige Lux-Logik
| Lux-Wert | Modus | Helligkeit | Farbtemperatur |
|---|---|---|---|
| ≥ 120 Lux | Tagsüber – inaktiv | — | — |
| 20–120 Lux | Normalmodus | 20 % | 2700 K |
| < 20 Lux | Nachtmodus | 5 % | 2200 K |
alias: Wintergarten - Lichtsteuerung - V7.1
variables:
lights:
- light.wintergarten_windlicht_klein
- light.wintergarten_windlicht_gros
lux_sensor: sensor.gw1100a_solar_lux
lux_on: 120 # unter diesem Wert → Automation aktiv
lux_off: 180 # Hysterese für Watchdog
lux_night: 20 # unter diesem Wert → Nachtmodus
on_brightness_pct: 20
on_color_temp: 2700
night_brightness_pct: 5
night_color_temp: 2200
on_transition: 2
off_transition: 3
push_title: "Wintergarten – Lichtautomatik"
is_dark: >
{% set lux = states(lux_sensor) | float(9999) %}
{{ is_state('sun.sun','below_horizon') or lux < lux_on }}
is_night_mode: >
{% set lux = states(lux_sensor) | float(9999) %}
{{ lux < lux_night }}
any_light_on: >
{{ lights | select('is_state', 'on') | list | count > 0 }}
mode: queued
max: 10
max_exceeded: silent
trigger:
- platform: homeassistant
event: start
id: ha_start
- platform: time_pattern
minutes: "/30"
id: watchdog
- platform: motion.detected
target:
area_id: wintergarten
options:
behavior: any
id: motion_on
- platform: motion.cleared
target:
area_id: wintergarten
options:
behavior: last
id: motion_off
- platform: state
entity_id: binary_sensor.wintergarten_bewegungsmelde_occupancy
to: unavailable
id: sensor_unavailable
action:
- choose:
- alias: "Bewegung + Nachtmodus (<20 Lux) → gedimmt warmweiß"
conditions:
- condition: trigger
id: motion_on
- condition: template
value_template: "{{ is_night_mode }}"
- condition: template
value_template: "{{ not any_light_on }}"
sequence:
- action: light.turn_on
target:
entity_id: "{{ lights }}"
data:
brightness_pct: "{{ night_brightness_pct }}"
color_temp_kelvin: "{{ night_color_temp }}"
transition: "{{ on_transition }}"
- alias: "Bewegung + Normalmodus (20–120 Lux) → normal einschalten"
conditions:
- condition: trigger
id: motion_on
- condition: template
value_template: "{{ is_dark }}"
- condition: template
value_template: "{{ not is_night_mode }}"
- condition: template
value_template: "{{ not any_light_on }}"
sequence:
- action: light.turn_on
target:
entity_id: "{{ lights }}"
data:
brightness_pct: "{{ on_brightness_pct }}"
color_temp_kelvin: "{{ on_color_temp }}"
transition: "{{ on_transition }}"
- alias: "Keine Bewegung → Lichter ausschalten"
conditions:
- condition: trigger
id: motion_off
- condition: template
value_template: "{{ any_light_on }}"
sequence:
- action: light.turn_off
target:
entity_id: "{{ lights }}"
data:
transition: "{{ off_transition }}"
Warum hier motion.detected statt occupancy.detected?
Motion und Occupancy sind in HA 2026.4 bewusst getrennt:
motion.detected– reagiert auf jede einzelne Bewegung (gut für Flure, Gärten, kurze Aufenthalte)occupancy.detected– reagiert auf dauerhafte Belegung eines Raumes (gut für Wohnzimmer, Büro)
Der Wintergarten ist ein Durchgangsraum – motion.detected ist hier die richtige Wahl.
Automation 3: Treppenhaus – Lichtsteuerung V7.1
Besonderheit: Timer via mode: restart
Das Treppenhaus wird nicht durch Bewegung, sondern durch Türöffnung getriggert. Das Licht brennt einen festen Timer (3 Min. tagsüber / 5 Min. nachts) und verlängert sich bei erneuter Türöffnung automatisch – das klassische Treppenhaus-Prinzip. Dafür ist mode: restart ideal.
Das Problem in V7.0: Doppelter Trigger mit gleicher ID
Die alte Version hatte zwei Trigger mit derselben ID door_open:
trigger:
# Alter state-Trigger (veraltet)
- platform: state
entity_id:
- binary_sensor.haustur_kontakt_contact
- binary_sensor.etagentur_kontakt_contact
to: "on"
id: door_open # ← ID: door_open
# Neuer 2026.4 Trigger
- platform: door.opened
target:
area_id: treppenhaus
id: door_open # ← GLEICHE ID!
Beim Öffnen einer Tür feuerten beide Trigger gleichzeitig. Da mode: restart aktiv war, hat der zweite Trigger den ersten sofort abgebrochen – und den Timer neu gestartet. De facto lief der Timer nie sauber durch.
Außerdem war ein door_closed-Trigger definiert, wurde aber im action-Block nirgends ausgewertet – toter Code.
Die Lösung in V7.1
alias: Treppenhaus - Lichtsteuerung - V7.1
variables:
light_entity: switch.treppenhaus_licht_switch_1
push_title: "Treppenhaus – Lichtautomatik"
is_night: "{{ now().hour >= 22 or now().hour < 6 }}"
timer_duration: "{{ '00:05:00' if is_night else '00:03:00' }}"
mode: restart
max_exceeded: silent
trigger:
- platform: homeassistant
event: start
id: ha_start
- platform: time_pattern
minutes: "/30"
id: watchdog
- platform: door.opened # ← nur noch dieser, kein state-Trigger mehr
target:
area_id: treppenhaus
options:
behavior: first
id: door_open
- platform: door.closed # ← jetzt sinnvoll genutzt
target:
area_id: treppenhaus
options:
behavior: last
id: door_closed
- platform: state
entity_id:
- binary_sensor.haustur_kontakt_contact
- binary_sensor.etagentur_kontakt_contact
to: unavailable
for: "00:02:00"
id: sensor_unavailable
action:
- choose:
- alias: "Tür geöffnet → wenn dunkel: Timer; wenn hell: Licht aus"
conditions:
- condition: trigger
id: door_open
sequence:
- if:
- condition: or
conditions:
- condition: sun
after: sunset
- condition: sun
before: sunrise
then:
- if:
- condition: state
entity_id: switch.treppenhaus_licht_switch_1
state:
- "off"
- unavailable
- unknown
then:
- action: switch.turn_on
target:
entity_id: "{{ light_entity }}"
- delay: "{{ timer_duration }}"
- if:
- condition: state
entity_id: switch.treppenhaus_licht_switch_1
state: "on"
then:
- action: switch.turn_off
target:
entity_id: "{{ light_entity }}"
else:
- if:
- condition: state
entity_id: switch.treppenhaus_licht_switch_1
state: "on"
then:
- action: switch.turn_off
target:
entity_id: "{{ light_entity }}"
- alias: "Tür geschlossen + hell + Licht an → sofort ausschalten"
conditions:
- condition: trigger
id: door_closed
- condition: state
entity_id: switch.treppenhaus_licht_switch_1
state: "on"
- condition: and
conditions:
- condition: sun
after: sunrise
- condition: sun
before: sunset
sequence:
- action: switch.turn_off
target:
entity_id: "{{ light_entity }}"
- alias: "Watchdog → Licht an, beide Türen seit 30 Min zu → ausschalten"
conditions:
- condition: trigger
id: watchdog
- condition: state
entity_id: switch.treppenhaus_licht_switch_1
state: "on"
for: "00:06:00" # mind. 6 Min an (länger als max. Timer 5 Min)
- condition: state
entity_id: binary_sensor.haustur_kontakt_contact
state: "off"
for: "00:30:00"
- condition: state
entity_id: binary_sensor.etagentur_kontakt_contact
state: "off"
for: "00:30:00"
sequence:
- action: switch.turn_off
target:
entity_id: "{{ light_entity }}"
Warum for: "00:06:00" beim Watchdog?
Der Watchdog feuert alle 30 Minuten. Ohne die for-Bedingung könnte er genau dann triggern, wenn ein laufender 5-Minuten-Timer noch läuft – und das Licht vorzeitig ausschalten. Da der maximale Timer 5 Minuten beträgt, genügen 6 Minuten als Schutz: Wenn das Licht kürzer als 6 Minuten an ist, ist der Timer noch aktiv und der Watchdog bleibt passiv.
Best-Practice-Zusammenfassung
1. Illuminance-Check nie global setzen
# ❌ Falsch – blockiert auch Ausschalten und Watchdog
condition:
- condition: illuminance.is_value
...
# ✅ Richtig – nur im Einschalt-Branch
action:
- choose:
- conditions:
- condition: trigger
id: motion_on
- condition: illuminance.is_value # ← hier
...
2. Trigger-IDs immer eindeutig halten
Nie denselben id-Wert für zwei verschiedene Trigger vergeben – besonders bei mode: restart führt das zu sofortigem Selbstabbruch.
3. Neuen 2026.4 Trigger-Standard nutzen, alte state-Trigger entfernen
Wenn door.opened verwendet wird, den alten state-Trigger auf to: "on" entfernen – nicht beides parallel betreiben.
4. Tote Trigger vermeiden
Wenn ein Trigger (door_closed, motion_off, etc.) definiert ist, muss er im choose-Block auch ausgewertet werden. Andernfalls entfernen.
5. Watchdog mit for-Schutz absichern
- condition: state
entity_id: switch.licht
state: "on"
for: "00:06:00" # schützt laufende Timer vor Watchdog-Frühauslösung
6. Sensor-Unavailability immer als Fallback ergänzen
- platform: state
entity_id: binary_sensor.bewegungsmelder_xyz
to: unavailable
id: sensor_unavailable
Mit einem eigenen Branch der das Licht ausschaltet, falls der Sensor ausfällt und das Licht noch brennt.
7. mode bewusst wählen
| Szenario | Empfohlener Mode |
|---|---|
| Lichtsteuerung mit Mehrfach-Triggern | queued + max: 10 |
| Timer der sich verlängern soll (Treppenhaus) | restart |
| Einmalige Aktion (Hitzeschutz, Rollo) | single |
Fazit
HA 2026.4 bringt mit den purpose-specific Triggern und Conditions einen echten Qualitätssprung für Automationen. Area-basierte Trigger machen den Code kürzer, lesbarer und wartbarer. Gleichzeitig decken reale Tests wie der beschriebene Wohnzimmer-Bug auf, dass die Architektur stimmen muss – ein falsch platzierter Helligkeits-Check kann die gesamte Automation lahmlegen.
Die drei Grundregeln für robuste Lichtautomationen:
- Lux-Check nur beim Einschalten – niemals global
- Immer ein Watchdog – als letztes Sicherheitsnetz
- Sensor-Unavailability immer behandeln – Licht muss auch bei Sensorausfall ausschalten
Wer diese Muster konsequent umsetzt, bekommt Automationen die auch nach dem nächsten HA-Update noch klaglos funktionieren.
Dieser Artikel basiert auf einer realen Smart-Home-Umgebung mit HA 2026.4.1, 3.500+ Entities, Zigbee2MQTT und WLED. Alle YAML-Beispiele sind produktiv getestete Automationen.

Schreibe einen Kommentar