smarthome.codes

Zigbee2MQTT Device Health Check mit Node-RED für Smart Home

Zigbee2MQTT + Code

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?

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:

  1. 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.
  2. Device Health Check: Überwacht den Online/Offline-Status der Geräte und speichert diesen im Flow Context.
  3. 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:

  1. Aktualisierungsmodus: Wenn eine Availability-Nachricht eingeht, wird der Status des entsprechenden Geräts im Flow Context aktualisiert.
  2. 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/ oder zigbee2mqtt_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.

Adriana

Schon seit vielen Jahren fasziniert mich alles rund um Technik, besonders wenn es darum geht, das eigene Zuhause smarter und komfortabler zu gestalten. Smart Home bedeutet für mich nicht nur technische Spielerei, sondern vor allem eine echte Verbesserung der Lebensqualität. Begonnen hat alles ganz klein mit einem vernetzten Thermostat, doch aus diesem kleinen Experiment wurde schnell eine große Leidenschaft. Inzwischen umfasst mein Zuhause ein durchdachtes System aus Lichtsteuerung, Heizungsautomatisierung und Sicherheitslösungen, das meinen Alltag spürbar erleichtert. Für mich ist Smart Home viel mehr als Technik: Es bedeutet Komfort, Nachhaltigkeit und eine echte Steigerung der Lebensqualität. Besonders wichtig ist mir dabei, dass Systeme intuitiv bedienbar sind und sich problemlos in jeden Alltag integrieren lassen, unabhängig von Marke oder Hersteller. Meine Vision ist ein Zuhause, das nicht nur auf Befehle reagiert, sondern vorausschauend denkt und handelt. Ich träume von einem smarten Zuhause, das Energie spart, sich individuell auf Bewohner und Umwelt einstellt und dabei stets den Menschen in den Mittelpunkt stellt.

Hier auf meinem Blog teile ich persönliche Erfahrungen, hilfreiche Tipps und interessante Erkenntnisse rund um das Thema Smart Home. Dabei freue ich mich besonders auf den Austausch mit euch, ganz egal, ob du gerade erst mit deinem Smart Home startest oder schon ein echter Profi bist.

Du hast Fragen, Anregungen oder möchtest dich einfach austauschen? Dann schreib mir gerne einen Kommentar.

Add comment

Unterstützung und Spenden

PayPal

Schnell und sicher spenden mit PayPal – keine Anmeldung erforderlich.

Patreon

Werde Mitglied und unterstütze smarthome.codes

Buy Me a Coffee

Unterstütze meine Arbeit mit einem Kaffee und persönlicher Nachricht.