Home Assistant 2026.4: Lichtautomationen richtig bauen – der neue Standard

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-WertModusHelligkeitFarbtemperatur
≥ 120 LuxTagsüber – inaktiv
20–120 LuxNormalmodus20 %2700 K
< 20 LuxNachtmodus5 %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_closedmotion_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

SzenarioEmpfohlener Mode
Lichtsteuerung mit Mehrfach-Triggernqueued + 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:

  1. Lux-Check nur beim Einschalten – niemals global
  2. Immer ein Watchdog – als letztes Sicherheitsnetz
  3. 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.


Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert