Zigbee2MQTT Device Health Check mit Node-RED: Automatische Überwachung deiner Smart Home Geräte
Mit diesem Node-RED Flow kannst du den Online-Status deiner Zigbee-Geräte überwachen und erhältst automatische Benachrichtigungen, wenn Geräte offline gehen. Das System protokolliert die Daten der Zigbee-Geräte und speichert den Verbindungsstatus im Flow Context für ein zuverlässiges Smart Home Monitoring.

Inhaltsverzeichnis
- Was ist Zigbee2MQTT und warum brauchen wir einen Health Check?
- Funktionsweise des Device Health Check Systems
- Log-Funktion für Zigbee-Geräte
- Zigbee2MQTT Device Health Check
- Benachrichtigungen mit Pushover
- Einrichtung und Anpassung des Flows
- Der komplette Node-RED Flow
Was ist Zigbee2MQTT und warum brauchen wir einen Health Check?
Zigbee2MQTT ist eine Software, die als Brücke zwischen deinen Zigbee-Geräten und MQTT fungiert. Sie ermöglicht es dir, deine Zigbee-Geräte ohne proprietäre Hubs oder Bridges in dein Smart Home zu integrieren und über das standardisierte MQTT-Protokoll zu steuern.
In einem Smart Home System mit vielen Zigbee-Geräten kann es jedoch vorkommen, dass einzelne Geräte den Kontakt verlieren oder offline gehen. Die Gründe dafür können vielfältig sein: Batterieprobleme, Signalstörungen oder einfach fehlerhafte Geräte. Ohne eine automatische Überwachung bemerkst du diese Probleme möglicherweise erst, wenn du das betroffene Gerät nutzen möchtest.
Ein Device Health Check löst dieses Problem, indem er kontinuierlich den Online-Status aller Geräte überwacht und dich benachrichtigt, sobald ein Gerät nicht mehr erreichbar ist. So kannst du proaktiv handeln, bevor es zu Problemen in deinem Smart Home kommt.
Funktionsweise des Device Health Check Systems
Unser Node-RED Flow für den Zigbee2MQTT Device Health Check besteht aus drei Hauptkomponenten:
- Log-Funktion: Protokolliert alle Daten, die von den Zigbee-Geräten gesendet werden, um die verfügbaren Informationen zu verstehen und auswerten zu können.
- Device Health Check: Überwacht den Online/Offline-Status der Geräte und speichert diesen im Flow Context.
- Pushover-Benachrichtigung: Sendet dir eine Nachricht, wenn Geräte offline gehen oder nicht richtig funktionieren.
Der Flow empfängt Daten über MQTT von deinen Zigbee2MQTT-Installationen, verarbeitet die “availability”-Nachrichten und kann zu festgelegten Zeiten (in unserem Beispiel um 20 Uhr) einen Status-Check durchführen und dich über offline Geräte informieren.
Log-Funktion für Zigbee-Geräte
Bevor wir in den Health Check einsteigen, ist es wichtig zu verstehen, welche Daten unsere Zigbee-Geräte überhaupt liefern. Dafür implementieren wir eine einfache Log-Funktion, die alle MQTT-Nachrichten in eine Datei schreibt.
// Erstelle ein Objekt, das sowohl das Topic als auch den Payload enthält let logEntry = { timestamp: new Date().toISOString(), // Optional: fügt einen Zeitstempel hinzu topic: msg.topic, payload: msg.payload };
// Konvertiere das Objekt in einen JSON-String und füge einen Zeilenumbruch hinzu
msg.payload = JSON.stringify(logEntry) + "\n";
return msg;
Diese Funktion erfasst für jede MQTT-Nachricht das Topic und den Payload, fügt einen Zeitstempel hinzu und speichert alles als JSON-Eintrag in einer Logdatei. So kannst du genau sehen, welche Daten deine Geräte senden und welche davon für den Health Check relevant sind.
Besonders wichtig für den Health Check sind die Nachrichten mit dem Suffix /availability, da sie den Online-Status des jeweiligen Geräts enthalten.
Zigbee2MQTT Device Health Check
Der Kern unseres Systems ist die Device Health Check Funktion. Sie überwacht die Verfügbarkeit der Geräte und speichert deren Status im Flow Context.
// Initialisiere das Geräteobjekt im Flow-Kontext, falls noch nicht vorhanden let devices = flow.get('zigbee2mqtt_devices') || {};
// Funktion zum Extrahieren des Gerätenamens aus dem Topic
function extractDeviceName(topic) {
// Annahme: Topic-Format ist "zigbee2mqtt_X/DeviceName/availability"
let parts = topic.split('/');
return parts;
}
// Funktion zur Überprüfung, ob das Topic einen der erlaubten Präfixe hat
function hasValidPrefix(topic) {
const prefixes = ["zigbee2mqtt_1/", "zigbee2mqtt_2/"];
return prefixes.some(prefix => topic.startsWith(prefix));
}
// Prüfe, ob die Nachricht eine Verfügbarkeitsnachricht ist
if (msg.topic && hasValidPrefix(msg.topic) && msg.topic.endsWith("/availability")) {
// Es handelt sich um eine Verfügbarkeitsnachricht
let deviceName = extractDeviceName(msg.topic);
text
// **Neuer Filter: Ignoriere Geräte, deren Namen mit '0x' beginnen**
if (deviceName.startsWith("0x")) {
// Gerät ignorieren, keine weitere Verarbeitung
return null;
}
let state = msg.payload.state; // Annahme: payload ist ein Objekt mit 'state'
// Aktualisiere das Geräteobjekt
devices[deviceName] = state;
// Speichere das aktualisierte Objekt zurück in den Flow-Kontext
flow.set('zigbee2mqtt_devices', devices);
// Keine Nachricht weiterleiten
return null;
} else {
// Annahme: Es handelt sich um einen Trigger von einem Inject-Node
// Prüfe, ob msg.payload.trigger auf true gesetzt ist
if (msg.payload && msg.payload.trigger === true) {
// Erstelle eine neue Nachricht mit dem aktuellen Gerätezustand
let newMsg = { payload: devices };
text
// Sende die neue Nachricht
return newMsg;
} else {
// Wenn trigger nicht true ist, nichts weiter tun
return null;
}
}
Schauen wir uns die Funktionsweise genauer an:
Speicherung im Flow Context
Die Funktion nutzt den Flow Context von Node-RED, um den Status der Geräte zwischen verschiedenen Aufrufen zu speichern. Bei jedem Start wird der aktuelle Gerätestatus aus dem Context geladen oder ein leeres Objekt initialisiert, wenn noch keine Daten vorhanden sind.

Zwei Betriebsmodi
Die Funktion arbeitet in zwei Modi:
- Aktualisierungsmodus: Wenn eine Availability-Nachricht eingeht, wird der Status des entsprechenden Geräts im Flow Context aktualisiert.
- Abfragemodus: Wird durch einen Trigger aktiviert und gibt den aktuellen Status aller bekannten Geräte zurück.
Intelligente Filterung
Der Code filtert die eingehenden Nachrichten auf verschiedene Weise:
- Es werden nur Nachrichten mit gültigen Präfixen (
zigbee2mqtt_1/
oderzigbee2mqtt_2/
) verarbeitet. - Es werden nur Topics mit dem Suffix
/availability
für das Status-Tracking berücksichtigt. - Geräte mit Namen, die mit
0x
beginnen (typischerweise interne Zigbee-IDs), werden ignoriert.
Benachrichtigungen mit Pushover
Nachdem der Health Check den Status aller Geräte ermittelt hat, kommt die Benachrichtigungsfunktion ins Spiel. Sie analysiert, welche Geräte offline sind, und sendet eine entsprechende Nachricht über Pushover.
// Annahme: msg.payload ist ein Objekt mit Gerätenamen als Schlüssel und Status als Wert let devices = msg.payload; let offlineDevices = [];
// Iteriere über alle Geräte und filtere die, die offline sind oder undefined
for (let device in devices) {
if (devices.hasOwnProperty(device)) {
let status = devices[device];
text
if (status === undefined) {
// Gerät hat keinen definierten Status
offlineDevices.push(`${device} (Status: undefined)`);
} else if (typeof status === 'string' && status.toLowerCase() === "offline") {
// Gerät ist offline
offlineDevices.push(device);
}
}
}
let msgToSend = null;
if (offlineDevices.length > 0) {
// Es gibt mindestens ein Gerät, das offline ist oder keinen definierten Status hat
let message = "Folgende Geräte sind offline oder haben keinen definierten Status:\n" + offlineDevices.join("\n");
msgToSend = { payload: message };
} else {
// Alle Geräte sind online
let message = "Alle Geräte sind online";
msgToSend = { payload: message };
}
// Sende die entsprechende Nachricht
return msgToSend;
Diese Funktion:
- Analysiert den Status aller bekannten Geräte
- Identifiziert Geräte, die offline sind oder einen undefinierten Status haben
- Erstellt eine formatierte Nachricht mit einer Liste der problematischen Geräte
- Wenn alle Geräte online sind, wird eine positive Bestätigungsnachricht gesendet
Die Nachricht wird dann an einen Pushover-Node weitergeleitet, der sie als Push-Benachrichtigung an dein Smartphone sendet. So wirst du sofort informiert, wenn ein Gerät nicht mehr erreichbar ist.

Einrichtung und Anpassung des Flows
Um den Health Check in deinem eigenen Node-RED zu implementieren, musst du einige Anpassungen vornehmen:
MQTT-Konfiguration
Im Beispiel-Flow werden zwei MQTT-Quellen überwacht: zigbee2mqtt_1/#
und zigbee2mqtt_2/#
. Du musst diese an deine Zigbee2MQTT-Installation anpassen. Wenn du nur eine Instanz verwendest, kannst du einen der MQTT-Nodes entfernen.
Pushover-Einrichtung
Für die Benachrichtigungen benötigst du einen Pushover-Account und musst den entsprechenden Node in Node-RED konfigurieren. Trage deine API-Schlüssel ein und passe den Titel der Benachrichtigung an.
Zeitplanung anpassen
Der Flow ist so konfiguriert, dass er jeden Tag um 20 Uhr einen Status-Check durchführt. Du kannst diese Zeit in den Einstellungen des Inject-Nodes anpassen oder weitere Zeitpunkte hinzufügen. Für eine regelmäßige Überprüfung mehrmals am Tag kann es sinnvoll sein, mehrere Inject-Nodes mit unterschiedlichen Zeitplänen zu verwenden.
Log-Datei Path
Im Beispiel wird die Log-Datei unter /data/zigbee2mqtt.log
gespeichert. Passe diesen Pfad entsprechend deiner Node-RED-Installation an und stelle sicher, dass der Benutzer, unter dem Node-RED läuft, Schreibrechte für dieses Verzeichnis hat.
Der komplette Node-RED Flow
Hier ist der vollständige Node-RED Flow zum Importieren. Kopiere den folgenden Code und importiere ihn in deine Node-RED-Instanz über das Menü (Importieren → Zwischenablage).
[{"id":"b54a32a9e33f104d","type":"inject","z":"f48cf010.9333b","name":"Trigger 20 Uhr","props":[{"p":"payload.trigger","v":"true","vt":"bool"}],"repeat":"","crontab":"00 20 * * *","once":false,"onceDelay":0.1,"topic":"","x":800,"y":1020,"wires":[["db54f60627a316cf"]]},{"id":"309cd5f00343ef33","type":"mqtt in","z":"f48cf010.9333b","name":"","topic":"zigbee2mqtt_1/#","qos":"2","datatype":"auto-detect","broker":"a898461e.979668","nl":false,"rap":true,"rh":0,"inputs":0,"x":780,"y":800,"wires":[["ada861d5855e07f1","db54f60627a316cf"]]},{"id":"39880180350e465a","type":"mqtt in","z":"f48cf010.9333b","name":"","topic":"zigbee2mqtt_2/#","qos":"2","datatype":"auto-detect","broker":"a898461e.979668","nl":false,"rap":true,"rh":0,"inputs":0,"x":780,"y":840,"wires":[["ada861d5855e07f1","db54f60627a316cf"]]},{"id":"ada861d5855e07f1","type":"function","z":"f48cf010.9333b","name":"logs","func":"// Erstelle ein Objekt, das sowohl das Topic als auch den Payload enthält\nlet logEntry = {\n timestamp: new Date().toISOString(), // Optional: fügt einen Zeitstempel hinzu\n topic: msg.topic,\n payload: msg.payload\n};\n\n// Konvertiere das Objekt in einen JSON-String und füge einen Zeilenumbruch hinzu\nmsg.payload = JSON.stringify(logEntry) + \"\\n\";\nreturn msg;\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":990,"y":840,"wires":[["d4bea2321993faba"]]},{"id":"d4bea2321993faba","type":"file","z":"f48cf010.9333b","name":"zigbee2mqtt log","filename":"/data/zigbee2mqtt.log","filenameType":"str","appendNewline":true,"createDir":false,"overwriteFile":"false","encoding":"none","x":1160,"y":840,"wires":[[]]},{"id":"db54f60627a316cf","type":"function","z":"f48cf010.9333b","name":"Zigbee2MQTT Device Health Check","func":"// Initialisiere das Geräteobjekt im Flow-Kontext, falls noch nicht vorhanden\nlet devices = flow.get('zigbee2mqtt_devices') || {};\n\n// Funktion zum Extrahieren des Gerätenamens aus dem Topic\nfunction extractDeviceName(topic) {\n // Annahme: Topic-Format ist \"zigbee2mqtt_X/DeviceName/availability\"\n let parts = topic.split('/');\n return parts;\n}\n\n// Funktion zur Überprüfung, ob das Topic einen der erlaubten Präfixe hat\nfunction hasValidPrefix(topic) {\n const prefixes = [\"zigbee2mqtt_1/\", \"zigbee2mqtt_2/\"];\n return prefixes.some(prefix => topic.startsWith(prefix));\n}\n\n// Prüfe, ob die Nachricht eine Verfügbarkeitsnachricht ist\nif (msg.topic && hasValidPrefix(msg.topic) && msg.topic.endsWith(\"/availability\")) {\n // Es handelt sich um eine Verfügbarkeitsnachricht\n let deviceName = extractDeviceName(msg.topic);\n\n // **Neuer Filter: Ignoriere Geräte, deren Namen mit '0x' beginnen**\n if (deviceName.startsWith(\"0x\")) {\n // Gerät ignorieren, keine weitere Verarbeitung\n return null;\n }\n\n let state = msg.payload.state; // Annahme: payload ist ein Objekt mit 'state'\n\n // Aktualisiere das Geräteobjekt\n devices[deviceName] = state;\n\n // Speichere das aktualisierte Objekt zurück in den Flow-Kontext\n flow.set('zigbee2mqtt_devices', devices);\n\n // Keine Nachricht weiterleiten\n return null;\n} else {\n // Annahme: Es handelt sich um einen Trigger von einem Inject-Node\n // Prüfe, ob msg.payload.trigger auf true gesetzt ist\n if (msg.payload && msg.payload.trigger === true) {\n // Erstelle eine neue Nachricht mit dem aktuellen Gerätezustand\n let newMsg = { payload: devices };\n\n // Sende die neue Nachricht\n return newMsg;\n } else {\n // Wenn trigger nicht true ist, nichts weiter tun\n return null;\n }\n}\n","outputs":1,"timeout":"","noerr":0,"initialize":"","finalize":"","libs":[],"x":1090,"y":1020,"wires":[["57fb9007e3bf4b6d","0fbe7d51e75713d2"]]},{"id":"0fbe7d51e75713d2","type":"function","z":"f48cf010.9333b","name":"Pushover","func":"// Annahme: msg.payload ist ein Objekt mit Gerätenamen als Schlüssel und Status als Wert\nlet devices = msg.payload;\nlet offlineDevices = [];\n\n// Iteriere über alle Geräte und filtere die, die offline sind oder undefined\nfor (let device in devices) {\n if (devices.hasOwnProperty(device)) {\n let status = devices[device];\n \n if (status === undefined) {\n // Gerät hat keinen definierten Status\n offlineDevices.push(`${device} (Status: undefined)`);\n } else if (typeof status === 'string' && status.toLowerCase() === \"offline\") {\n // Gerät ist offline\n offlineDevices.push(device);\n }\n }\n}\n\nlet msgToSend = null;\n\nif (offlineDevices.length > 0) {\n // Es gibt mindestens ein Gerät, das offline ist oder keinen definierten Status hat\n let message = \"Folgende Geräte sind offline oder haben keinen definierten Status:\\n\" + offlineDevices.join(\"\\n\");\n msgToSend = { payload: message };\n} else {\n // Alle Geräte sind online\n let message = \"Alle Geräte sind online\";\n msgToSend = { payload: message };\n}\n\n// Sende die entsprechende Nachricht\nreturn msgToSend;\n","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1340,"y":1020,"wires":[["04ccd4c344465c6e","dbd1c76a73ae9e1e"]]},{"id":"57fb9007e3bf4b6d","type":"debug","z":"f48cf010.9333b","name":"Debug Output","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":1360,"y":980,"wires":[]},{"id":"dbd1c76a73ae9e1e","type":"pushover api","z":"f48cf010.9333b","keys":"c1da56b8.1433f8","title":"zigbee2mqtt #1 + #2 - Geräte Healthcheck","name":"","x":1500,"y":1020,"wires":[]},{"id":"04ccd4c344465c6e","type":"debug","z":"f48cf010.9333b","name":"debug 18","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1500,"y":1060,"wires":[]},{"id":"a898461e.979668","type":"mqtt-broker","name":"mqtt-server (fhem-main-ext - docker)","broker":"172.18.0.6","port":"1883","clientid":"","autoConnect":true,"usetls":false,"protocolVersion":"5","keepalive":"60","cleansession":true,"autoUnsubscribe":true,"birthTopic":"","birthQos":"0","birthPayload":"","birthMsg":{},"closeTopic":"","closeQos":"0","closePayload":"","closeMsg":{},"willTopic":"","willQos":"0","willPayload":"","willMsg":{},"userProps":"","sessionExpiry":""},{"id":"c1da56b8.1433f8","type":"pushover-keys","name":"Reinhards Pushover"}]
Nach dem Import musst du noch die MQTT- und Pushover-Konfigurationen an deine Umgebung anpassen. Klicke dafür doppelt auf die entsprechenden Nodes und aktualisiere die Verbindungsdetails.
Mit diesem Flow hast du eine zuverlässige Überwachung deiner Zigbee-Geräte eingerichtet. Das System informiert dich automatisch über Probleme, sodass du schnell reagieren kannst, wenn ein Gerät offline geht. Die Logging-Funktion hilft dir außerdem, die Kommunikation deiner Geräte besser zu verstehen und bei Bedarf weitere Automatisierungen zu entwickeln.
Der große Vorteil dieses Systems liegt in der Speicherung der Gerätezustände im Flow Context. So gehen keine Informationen verloren, selbst wenn Node-RED neu gestartet wird, und du behältst stets einen Überblick über den aktuellen Status deiner Smart Home Umgebung.
Add comment