IoT-Automatisierung

Home Assistant MQTT-Automatisierung: Trigger, Templates und Publish-Aktionen

Lösen Sie Home-Assistant-Automatisierungen über rohe MQTT-Nachrichten aus, filtern Sie sie mit Templates und Wildcards und senden Sie mit der Aktion mqtt.publish Befehle zurück an Geräte.

Ablauf einer Home-Assistant-MQTT-Automatisierung mit MQTT-Trigger, Template-Bedingung und Publish-Aktion an ein Gerät
Probieren Sie es auf Ihrem eigenen MQTT-Broker ausHolen Sie sich im Free-Tarif einen privaten, verwalteten MQTT-Broker und starten Sie mit fertigen Codebeispielen.
Kostenlos testen Codebeispiele Keine Kreditkarte erforderlich

Eine Home-Assistant-MQTT-Automatisierung reagiert auf Nachrichten auf einem Broker-Topic und kann selbst Nachrichten zurücksenden. So automatisieren Sie Geräte und Skripte, die nie als Entitäten erscheinen. In diesem Tutorial verbinden Sie Home Assistant mit einem Broker, schreiben Automatisierungen mit MQTT-Triggern, filtern auf JSON-Payloads und Wildcard-Topics, veröffentlichen Befehle mit mqtt.publish und vermeiden die Schleifen und Race Conditions, über die die meisten stolpern.

Entitäten oder rohe Topics?

Home Assistant bietet zwei Wege, MQTT zu nutzen. Der erste sind Entitäten: MQTT-Sensoren, -Schalter und -Leuchten, in YAML definiert oder per Discovery erstellt. Automatisierungen verwenden dann gewöhnliche Zustands-Trigger. Der zweite ist der MQTT-Trigger, der direkt bei einer Nachricht auslöst, ohne dass eine Entität dazwischen steht.

Entität und Zustands-Trigger verwenden, wenn MQTT-Trigger verwenden, wenn
Sie Verlauf, Diagramme und eine Dashboard-Kachel möchten Die Nachricht ein Ereignis ist, kein Zustand (Tastendruck, Alarm, RFID-Scan)
Der Wert langlebig ist (Temperatur, Schalterzustand) Payloads unterschiedlich aufgebaut sind oder mehrere Felder enthalten
Andere Automatisierungen denselben Wert wiederverwenden Eine Automatisierung per Wildcard viele Geräte abdecken soll

Beide Ansätze ergänzen sich. Ein typisches Setup nutzt Entitäten für Zustände und MQTT-Trigger für Ereignisse. Falls Sie noch keine Entitäten definiert haben, beginnen Sie mit Home Assistant MQTT und dem Leitfaden zu MQTT Discovery.

Home Assistant mit dem Broker verbinden

Öffnen Sie Einstellungen > Geräte & Dienste > Integration hinzufügen > MQTT und geben Sie den Broker ein. Für einen Testlauf können Sie den öffentlichen MQTT-Broker unter broker.connectmq.com nutzen, der anonyme Verbindungen akzeptiert und für Tests und Prototypen gedacht ist:

Feld Testwert Produktivwert
Broker broker.connectmq.com broker.connectmq.com
Port 1883 8883
Benutzername / Passwort leer YOUR_USERNAME / YOUR_PASSWORD
Client ID (erweitert) ha-<random> YOUR_CLIENT_ID
Validierung des Broker-Zertifikats (erweitert) aus Auto

Die erweiterten Optionen erscheinen nur, wenn in Ihrem Benutzerprofil der Erweiterte Modus aktiviert ist. Der öffentliche MQTT-Broker wird geteilt und ist für jeden lesbar; verwenden Sie daher ein eindeutiges Präfix wie connectmq/demo/k9p4z7/ und senden Sie dort niemals etwas Sensibles. Die vollständige Anleitung für den Produktivbetrieb finden Sie unter Home Assistant mit einem externen MQTT-Broker verbinden.

Ihre erste Home-Assistant-MQTT-Automatisierung

Die folgende Automatisierung schaltet eine Leuchte ein, wenn ein Funktaster pressed veröffentlicht. Sie nutzt die aktuelle Automatisierungssyntax (triggers:, trigger: mqtt, actions:).

alias: Greenhouse button turns on grow light
triggers:
  - trigger: mqtt
    topic: connectmq/demo/k9p4z7/greenhouse/button
    payload: pressed
actions:
  - action: light.turn_on
    target:
      entity_id: light.grow_light
mode: single

Testen Sie sie im Terminal:

mosquitto_pub -h broker.connectmq.com -p 1883 -i btn-k9p4z7 \
  -t 'connectmq/demo/k9p4z7/greenhouse/button' -m 'pressed'

Der Filter payload vergleicht den rohen String exakt. Sendet das Gerät JSON, extrahieren Sie zuerst mit value_template ein Feld; der Wert von payload wird dann mit dem Ergebnis des Templates verglichen.

triggers:
  - trigger: mqtt
    topic: connectmq/demo/k9p4z7/greenhouse/button
    value_template: "{{ value_json.action }}"
    payload: double

Trigger-Daten in Templates verwenden

Innerhalb der Automatisierung enthält die Variable trigger alles über die Nachricht: trigger.topic, trigger.payload, trigger.payload_json (falls die Payload als JSON geparst werden kann), trigger.qos und trigger.retain. Damit wird eine einzelne Automatisierung zu einem flexiblen Handler.

alias: Notify on soil moisture alert
triggers:
  - trigger: mqtt
    topic: connectmq/demo/k9p4z7/garden/+/alert
conditions:
  - condition: template
    value_template: "{{ trigger.payload_json.moisture | float(100) < 25 }}"
actions:
  - action: notify.mobile_app_phone
    data:
      title: "Dry soil"
      message: >
        Bed {{ trigger.topic.split('/')[4] }} is at
        {{ trigger.payload_json.moisture }}% moisture.
mode: queued
max: 10

Die Wildcard + passt auf genau eine Ebene, sodass eine Automatisierung jedes Beet abdeckt. trigger.topic.split('/')[4] extrahiert den Beetnamen aus connectmq/demo/k9p4z7/garden/<bed>/alert. float(100) liefert einen sicheren Standardwert, falls das Feld fehlt, sodass eine fehlerhafte Nachricht keinen Fehler auslöst. mode: queued stellt sicher, dass gleichzeitig eintreffende Alarme mehrerer Beete alle verarbeitet werden. Sensoren für Bodenfeuchte, die solche Nachrichten veröffentlichen, zeigt das Tutorial Bodenfeuchtesensor mit MQTT.

MQTT aus Automatisierungen veröffentlichen

Die Aktion mqtt.publish sendet beliebige Payloads an beliebige Topics. Hier sendet eine zeitgesteuerte Automatisierung einen Bewässerungsbefehl an eine Ventilsteuerung, und eine Zustandsänderung veröffentlicht eine Statusübersicht:

alias: Morning watering command
triggers:
  - trigger: time
    at: "06:30:00"
conditions:
  - condition: numeric_state
    entity_id: sensor.rain_last_24h
    below: 2
actions:
  - action: mqtt.publish
    data:
      topic: connectmq/demo/k9p4z7/garden/valve/zone1/set
      payload: '{"state":"open","duration_s":600}'
      qos: 1
      retain: false
mode: single
alias: Publish alarm state for other systems
triggers:
  - trigger: state
    entity_id: alarm_control_panel.home
actions:
  - action: mqtt.publish
    data:
      topic: connectmq/demo/k9p4z7/home/alarm/state
      payload: "{{ trigger.to_state.state }}"
      retain: true

Zwei Faustregeln. Befehle sollten normalerweise nicht retained sein, sonst spielt ein Gerät, das sich morgen neu verbindet, den Befehl von gestern erneut ab. Zustände, die andere Systeme beim Start lesen, sollten retained sein, damit ein neuer Subscriber sofort den aktuellen Wert erhält. QoS 1 ist den zusätzlichen Roundtrip für solche Befehle wert, denn eine verlorene Nachricht bedeutet ein Beet, das trocken bleibt.

Muster aus Anfrage und Bestätigung

Bei allem, was Wasser, Wärme oder Türen bewegt, sollten Sie nicht davon ausgehen, dass ein veröffentlichter Befehl erfolgreich war. Warten Sie auf die Bestätigung des Geräts:

alias: Open zone 1 and verify
triggers:
  - trigger: state
    entity_id: input_boolean.water_zone1
    to: "on"
actions:
  - action: mqtt.publish
    data:
      topic: connectmq/demo/k9p4z7/garden/valve/zone1/set
      payload: open
  - wait_for_trigger:
      - trigger: mqtt
        topic: connectmq/demo/k9p4z7/garden/valve/zone1/state
        payload: open
    timeout: "00:00:15"
    continue_on_timeout: true
  - if:
      - condition: template
        value_template: "{{ wait.trigger is none }}"
    then:
      - action: notify.mobile_app_phone
        data:
          message: "Valve zone 1 did not confirm within 15 seconds."
mode: restart

wait.trigger ist none, wenn das Timeout abgelaufen ist; daran erkennt die Automatisierung, dass das Ventil nie geantwortet hat.

Häufige Stolperfallen

  1. Automatisierungsschleifen. Eine Automatisierung, die auf ein Topic veröffentlicht, auf das sie auch triggert, feuert endlos. Halten Sie Befehls-Topics (/set) und Zustands-Topics (/state) getrennt.
  2. Retained Messages lösen Trigger aus. Wenn Home Assistant neu startet und erneut abonniert, werden retained Messages erneut zugestellt und MQTT-Trigger feuern. Fügen Sie eine Bedingung wie {{ not trigger.retain }} hinzu, wenn das unerwünscht ist.
  3. Groß-/Kleinschreibung und Leerzeichen. payload: ON passt nicht auf on oder ON\n. Normalisieren Sie mit value_template: "{{ value | trim | lower }}".
  4. Falsche Wildcard. # ist nur als letzte Ebene gültig; + passt auf genau eine Ebene.
  5. Stille Template-Fehler. Prüfen Sie Einstellungen > System > Protokolle und den Trace der Automatisierung; Traces zeigen die Trigger-Payload, und das ist der schnellste Weg zur Fehlersuche.

Fehlersuche mit einer Live-Topic-Ansicht

Bevor Sie der Automatisierung die Schuld geben, prüfen Sie, ob die Nachricht wirklich ankommt. Unter Einstellungen > Geräte & Dienste > MQTT > Konfigurieren gibt es ein Abhörwerkzeug, das jedes Topic abonnieren kann. Außerhalb von Home Assistant zeigen ein Desktop-MQTT-Explorer oder der Web-Client des Brokers denselben Datenverkehr. Die Brokerseite zu beobachten ist nützlich, weil Sie so erkennen, ob ein Problem im Gerät, in der Broker-Verbindung oder in der Automatisierung liegt.

Automatisierungen mit brokerseitigen Alarmen kombinieren

Home-Assistant-Automatisierungen laufen nur, solange Home Assistant läuft. Verliert der Raspberry Pi, auf dem es läuft, den Strom, erfährt niemand, dass das Gewächshaus überhitzt. Ein nützliches Sicherheitsnetz ist ein zweiter, unabhängiger Alarmpfad am Broker. Im ConnectMQ-Portal können Sie Schwellwert-Alarmregeln auf ein Topic definieren, etwa eine Temperatur über 35, und ausgelöste Alarme im Alarmprotokoll sehen, auch wenn Ihr Heimserver ausgefallen ist. Halten Sie die raffinierte Logik in Home Assistant und nutzen Sie die brokerseitigen Regeln nur für einige wenige kritische Grenzwerte.

Dieselbe Überlegung gilt für die Gerätelogik. Eine Ventilsteuerung sollte sich nach einer maximalen Laufzeit selbst schließen, auch wenn der Schließbefehl nie ankommt, denn eine Automatisierung, die open veröffentlicht und dann abstürzt, darf nicht den Garten fluten.

Umstieg auf den Produktivbetrieb

Automatisierungen, die Wasser oder Wärme steuern, sollten nicht von einem öffentlichen MQTT-Broker abhängen, auf dem jeder auf Ihre Topics veröffentlichen kann. Erstellen Sie einen privaten Broker, stellen Sie die MQTT-Integration auf Port 8883 mit Zugangsdaten um und ändern Sie die Topic-Präfixe von connectmq/demo/... auf eigene, etwa home/ oder site1/. Ein verwalteter MQTT-Broker ermöglicht außerdem, dass entfernte Sensoren, ein Ferienhaus oder eine zweite Home-Assistant-Instanz auf dieselben Topics veröffentlichen, ohne Ports an Ihrem Router zu öffnen. Die übergreifende Architektur aus Geräten, Broker und Logik beschreibt der Leitfaden zur IoT-Automatisierung.

Home Assistant mit ConnectMQ automatisieren

ConnectMQ bietet einen privaten MQTT-Broker mit TLS, generierten Zugangsdaten, einem Live-Topic-Explorer und einem MQTT-Client im Browser, sodass Sie Testnachrichten an Ihre Automatisierungen senden können, ohne den Browser zu verlassen. Erstellen Sie unter app.connectmq.com einen kostenlosen Serverless-Broker, ohne Kreditkarte, und richten Sie die MQTT-Integration von Home Assistant darauf aus.

Häufig gestellte Fragen

Kann ein MQTT-Trigger in Home Assistant Wildcards verwenden?

Ja. Sowohl + als auch # funktionieren im Trigger-Topic, und trigger.topic verrät Ihnen, welches konkrete Topic gepasst hat.

Wie lese ich ein JSON-Feld aus einem MQTT-Trigger?

Verwenden Sie trigger.payload_json.field in Templates oder value_template: "{{ value_json.field }}" direkt im Trigger, um auf dieses Feld zu filtern.

Warum löst meine Automatisierung beim Neustart von Home Assistant aus?

Retained Messages werden beim erneuten Abonnieren wieder zugestellt. Prüfen Sie trigger.retain in einer Bedingung, oder veröffentlichen Sie das Topic nicht mehr mit Retain-Flag, wenn es eigentlich ein Ereignis ist.

Sollten mqtt.publish-Befehle retained sein?

In der Regel nicht. Retained Befehle werden Geräten beim Wiederverbinden erneut zugestellt und können so lange nach dem eigentlichen Ereignis ein Ventil öffnen oder ein Relais schalten.

Verwandte Artikel

Zigbee2MQTT einrichten: Vom Koordinator bis zum Dashboard

Installieren Sie Zigbee2MQTT mit Docker, konfigurieren Sie Koordinator und MQTT-Verbindung, lernen Sie Geräte an und benennen Sie sie um, steuern Sie sie per MQTT und zeigen Sie ihre Zustände auf einem Dashboard an, zuerst getestet auf einem kostenlosen öffentlichen MQTT-Broker.

8 Min. Lesezeit

Alle Artikel →

Ihr privater MQTT-Broker ist nur wenige Klicks entfernt

Konto anlegen, Broker-Zugangsdaten erhalten und das erste Gerät verbinden — ohne Server, die installiert, gepatcht oder skaliert werden müssen.