⚡Ereignisfluss: vom Taster zum Licht

Ein kurzer Druck auf den Flur-Taster schaltet das Wohnzimmerlicht. Dazwischen liegen elf Schritte durch Integration, State Machine, Event Bus, Automation und Action-Registry. Die Werte stammen aus einem echten Durchlauf der nachgebauten Engine (Tasten ← →).

Schritt 1 / 12 · Tasten ← →
GeräteTaster · LampeZigbee-StickFunkIntegration ZHAPlattformenState MachineStatesEvent Busstate_changed …AutomationTrigger · ConditionAction-Registrylight.toggleRecorderLogbuch · VerlaufMusterhaus jetzt:💡 Wohnzimmer: off🔢 Taster-Drücke: 0🔘 event.flur_taster: unknown
Schritt 1 von 12

Ausgangslage

Das Wohnzimmerlicht ist aus. Die Automation „Flur-Taster schaltet Wohnzimmerlicht“ (mode: single) hat sich beim Start beim Event Bus angemeldet und wartet auf Zustandsänderungen von event.flur_taster.

automations.yaml (Ausschnitt)
{
"alias": "Flur-Taster schaltet Wohnzimmerlicht",
"mode": "single",
"triggers": [
{
"trigger": "state",
"entity_id": "event.flur_taster"
}
],
"conditions": [
{
"condition": "template",
"value_template": "{{ trigger.to_state.attributes.event_type == 'single' }}"
}
],
"actions": [
{
"action": "light.toggle",
"target": {
"entity_id": "light.wohnzimmer_decke"
}
},
{
"action": "counter.increment",
"target": {
"entity_id": "counter.taster_druecke"
}
}
]
}

🔗Warum der Context so wichtig ist

💡 Ursache nachvollziehen
Logbuch und Traces zeigen „ausgelöst durch …“, weil jeder State und jedes Event einen Context trägt. Eine Automation erzeugt einen neuen Context, dessen parent_id auf den auslösenden Context zeigt.
✅ Mensch oder Maschine?
Schaltet jemand im Dashboard, steht dessen user_id im Context. In Templates lässt sich so unterscheiden: trigger.to_state.context.user_id is not none → manuell geschaltet.
⚠️ Schleifen vermeiden
Eine Automation, die auf einen State reagiert, den sie selbst ändert, triggert sich erneut. Mit dem Context (parent_id) oder einer Condition lässt sich das erkennen – der Modus single verhindert nur Überlappung.

🧾Die Automation dazu

# automations.yaml
- id: taster_wohnzimmer
  alias: Flur-Taster schaltet Wohnzimmerlicht
  mode: single
  triggers:
    - trigger: state
      entity_id: event.flur_taster
  conditions:
    - condition: template
      value_template: "{{ trigger.to_state.attributes.event_type == 'single' }}"
  actions:
    - action: light.toggle
      target:
        entity_id: light.wohnzimmer_decke
    - action: counter.increment
      target:
        entity_id: counter.taster_druecke

Event-Entitäten

Taster und Fernbedienungen werden in neueren Integrationen als Event-Entität (Domain event) abgebildet: Der Zustand ist der Zeitstempel des letzten Ereignisses, das Attribut event_type sagt, was passiert ist (single, double, long_press – die Werte liefert die Integration in event_types).

Weil sich der Zeitstempel bei jedem Druck ändert, feuert ein State-Trigger ohne to: zuverlässig – auch wenn zweimal hintereinander „single“ kommt.

Vereinfachung: Die Zigbee-Rahmen in Schritt 1 und 8 sind schematisch; echte ZHA-Geräte können je nach Modell andere Cluster/Befehle nutzen.