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
- 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. - 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. - Groß-/Kleinschreibung und Leerzeichen.
payload: ONpasst nicht aufonoderON\n. Normalisieren Sie mitvalue_template: "{{ value | trim | lower }}". - Falsche Wildcard.
#ist nur als letzte Ebene gültig;+passt auf genau eine Ebene. - 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.



