Stromausfall erkannt

Hallo zusammen,

Ich habe eine Szene erstellt, die einige von euch interessieren könnte: Erkennung eines Stromausfalls zu Hause und Benachrichtigung über Telegram.

Szenenniveau: Fortgeschritten

Dieses Szenario verwendet Funktionen, die in Gladys noch nicht vorhanden sind. Um dies zu umgehen, habe ich Node-Red verwendet, das auf demselben Raspberry Pi installiert ist.

:play_button: Offizielle Gladys-Dokumentation zum Thema: Intégrer Node-RED avec Gladys Assistant en MQTT | Gladys Assistant

Voraussetzungen

Ich nutze zu Hause 100% Zigbee. Für diese Szene verwende ich zwei Komponenten, von denen eine nicht verbunden ist:

Hier ist ein Schema, das (in dieser Reihenfolge) darstellt: die verbundene Steckdose, die USV, das Mehrfachsteckbrett (für die Fiberbox) und der Raspberry Pi mit Gladys und Node Red.

Warum eine USV?

Dies ermöglicht es, im Falle eines Stromausfalls im Haus, Gladys weiterhin mit Strom zu versorgen.

Wie erkennt man einen Stromausfall?

Die Idee ist sehr einfach, es gibt einen Stromausfall, wenn:

  • meine verbundene Steckdose keinen Strom mehr verbraucht (Achtung, wenn sie ausgeschaltet ist, wird dies auch erkannt)
  • meine Steckdose keine Daten mehr sendet für mehr als eine Minute

Dieser zweite Punkt wird (soweit ich weiß) von Gladys zum Zeitpunkt des Schreibens dieser Zeilen noch nicht verwaltet.

Node Red Konfiguration

Man muss Node Red installieren und die Verbindung mit Zigbee2MQTT konfigurieren (bereits von einer großen Anzahl von Tutorials abgedeckt).

Allgemeines Schema

Wie geht das?

  1. Zuerst speichere ich den letzten von der verbundenen Steckdose zurückgegebenen Wert in einer Datei.




    Ich füge den Baustein « Get Complete State » hinzu, um sicherzustellen, dass ich alle Daten der Steckdose habe. Dann ermöglicht mir « Add timestamp » das Hinzufügen des Datums des Datenempfangs, das ich schließlich in einer Datei mit dem willkürlichen Namen « prise_nous2_last_data.txt » speichere.



  2. Dann lese ich diese Datei jede Minute und vergleiche das darin enthaltene Datum mit der aktuellen Zeit minus einer Minute.





    Der Baustein « Parse JSON » ist notwendig, um die in der Datei gespeicherten Daten korrekt zu verwenden.


    Dann berechne ich mit einem Funktionsblock die aktuelle Zeit minus einer Minute:


    Schließlich führe ich zwei Tests mit den beiden « switch mode » Bausteinen durch: wenn die Steckdose weniger als 5W verbraucht oder wenn das Datum 1 Minute überschritten hat:


    .png)
    >
    Zum Abschluss erstelle ich eine Nachricht, die in Telegra gesendet werden soll, mit dem letzten Block « JSON »:

Export JSON Node Red
[
    {
        "id": "877e6dde4f64094e",
        "type": "tab",
        "label": "Stromausfall",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "2d047039d3727cc5",
        "type": "zigbee2mqtt-in",
        "z": "877e6dde4f64094e",
        "name": "SteckdoseWir2 (USV)",
        "server": "6dda341ee7a029cb",
        "friendly_name": "SteckdoseWir2",
        "device_id": "REDACTED",
        "state": "0",
        "outputAtStartup": true,
        "x": 140,
        "y": 160,
        "wires": [
            [
                "9cc8b65f8ce767af"
            ]
        ]
    },
    {
        "id": "c57fa22873f8262e",
        "type": "file",
        "z": "877e6dde4f64094e",
        "name": "Datei schreiben",
        "filename": "steckdose_wir2_last_data.txt",
        "filenameType": "str",
        "appendNewline": false,
        "createDir": false,
        "overwriteFile": "true",
        "encoding": "none",
        "x": 740,
        "y": 160,
        "wires": [
            []
        ]
    },
    {
        "id": "3c9969810f1b7d9c",
        "type": "file in",
        "z": "877e6dde4f64094e",
        "name": "Datei lesen",
        "filename": "steckdose_wir2_last_data.txt",
        "filenameType": "str",
        "format": "utf8",
        "chunk": false,
        "sendError": false,
        "encoding": "none",
        "allProps": false,
        "x": 300,
        "y": 320,
        "wires": [
            [
                "393212bfa20c5210"
            ]
        ]
    },
    {
        "id": "4f2d7369b4194a31",
        "type": "inject",
        "z": "877e6dde4f64094e",
        "name": "Alle Minuten",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "10",
        "crontab": "",
        "once": false,
        "onceDelay": "60",
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 140,
        "y": 320,
        "wires": [
            [
                "3c9969810f1b7d9c"
            ]
        ]
    },
    {
        "id": "21bca9ada5443cb1",
        "type": "change",
        "z": "877e6dde4f64094e",
        "name": "Zeitstempel hinzufügen",
        "rules": [
            {
                "t": "set",
                "p": "payload.timestamp",
                "pt": "msg",
                "to": "",
                "tot": "date"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 580,
        "y": 160,
        "wires": [
            [
                "c57fa22873f8262e"
            ]
        ]
    },
    {
        "id": "d32f71ec6761bdda",
        "type": "switch",
        "z": "877e6dde4f64094e",
        "name": "Zeitstempel testen",
        "property": "payload.timestamp",
        "propertyType": "msg",
        "rules": [
            {
                "t": "lt",
                "v": "payload.lastminutetimestamp",
                "vt": "msg"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 1,
        "x": 880,
        "y": 320,
        "wires": [
            [
                "cabbc5db0e4652b6",
                "e803e70cdfe1f77a"
            ]
        ]
    },
    {
        "id": "09bee4816c7b6a4b",
        "type": "function",
        "z": "877e6dde4f64094e",
        "name": "Letzten 1-Minuten-Zeitstempel abrufen",
        "func": "var oneMinInMs = 60000;\nvar lastminute = Date.now() - oneMinInMs;\nmsg.payload.lastminutetimestamp = lastminute;\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 660,
        "y": 320,
        "wires": [
            [
                "d32f71ec6761bdda"
            ]
        ]
    },
    {
        "id": "cabbc5db0e4652b6",
        "type": "debug",
        "z": "877e6dde4f64094e",
        "name": "STROMAUSFALL",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 910,
        "y": 280,
        "wires": []
    },
    {
        "id": "393212bfa20c5210",
        "type": "json",
        "z": "877e6dde4f64094e",
        "name": "JSON parsieren",
        "property": "payload",
        "action": "",
        "pretty": false,
        "x": 450,
        "y": 320,
        "wires": [
            [
                "09bee4816c7b6a4b",
                "af16ab7a64e96d55"
            ]
        ]
    },
    {
        "id": "1868c1c355f975cf",
        "type": "telegram sender",
        "z": "877e6dde4f64094e",
        "name": "Telegram",
        "bot": "REDACTED",
        "haserroroutput": false,
        "outputs": 1,
        "x": 1500,
        "y": 320,
        "wires": [
            []
        ]
    },
    {
        "id": "dfaa974da87838fe",
        "type": "function",
        "z": "877e6dde4f64094e",
        "name": "JSON TELEGRAM",
        "func": "msg.payload = {\n    chatId: REDACTED,\n    type: 'message',\n    content: '⚡‼️ Stromausfall im Haus festgestellt'\n}\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 1330,
        "y": 320,
        "wires": [
            [
                "1868c1c355f975cf"
            ]
        ]
    },
    {
        "id": "e803e70cdfe1f77a",
        "type": "switch",
        "z": "877e6dde4f64094e",
        "name": "Test Strom > 5W",
        "property": "payload.power",
        "propertyType": "msg",
        "rules": [
            {
                "t": "lt",
                "v": "5",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 1,
        "x": 1110,
        "y": 320,
        "wires": [
            [
                "dfaa974da87838fe"
            ]
        ]
    },
    {
        "id": "af16ab7a64e96d55",
        "type": "debug",
        "z": "877e6dde4f64094e",
        "name": "DATEI LESEN",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 450,
        "y": 360,
        "wires": []
    },
    {
        "id": "9cc8b65f8ce767af",
        "type": "zigbee2mqtt-get",
        "z": "877e6dde4f64094e",
        "name": "Vollständigen Zustand abrufen",
        "server": "6dda341ee7a029cb",
        "friendly_name": "SteckdoseWir2",
        "device_id": "REDACTED",
        "state": "0",
        "x": 370,
        "y": 160,
        "wires": [
            [
                "21bca9ada5443cb1"
            ]
        ]
    },
    {
        "id": "6dda341ee7a029cb",
        "type": "zigbee2mqtt-server",
        "name": "Zigbee2MQTT",
        "host": "127.0.0.1",
        "mqtt_port": "1884",
        "mqtt_username": "z2m",
        "mqtt_password": "REDACTED",
        "tls": "",
        "usetls": false,
        "base_topic": "zigbee2mqtt"
    },
    {
        "id": "1008fcc5ae346779",
        "type": "telegram bot",
        "botname": "Node Red Gladys Ermont",
        "usernames": "",
        "chatids": "REDACTED",
        "baseapiurl": "",
        "updatemode": "polling",
        "pollinterval": "300",
        "usesocks": false,
        "sockshost": "",
        "socksport": "6667",
        "socksusername": "anonymous",
        "sockspassword": "",
        "bothost": "",
        "botpath": "",
        "localbotport": "8443",
        "publicbotport": "8443",
        "privatekey": "",
        "certificate": "",
        "useselfsignedcertificate": false,
        "sslterminated": false,
        "verboselogging": false
    }
]

Fazit

Falls mein Wechselrichter keinen Strom mehr verbraucht, bedeutet das, dass es im Haus keinen Strom mehr gibt. In diesem Fall wird die Steckdose, an die der Wechselrichter angeschlossen ist, keinen Strom mehr verbrauchen oder Daten senden.
Node Red ermöglicht es mir, dies tatsächlich relativ einfach umzusetzen.

Zögern Sie nicht, mir Ihr Feedback zu geben, falls bestimmte Teile noch genauer erklärt werden müssen!

Super Tutorial!

Ich werde es vielleicht bei mir zu Hause umsetzen, da ich bereits mit einem USV und einer Smart-Steckdose ausgestattet bin.
Bisher basiere ich auf den Benachrichtigungen meines NAS, die mir anzeigen, wenn es auf die USV umgeschaltet hat… Eine in Gladys integrierte Lösung wäre super!

Übrigens denke ich, dass ich irgendwann einen speziellen USV für Gladys auf meinem Pi verwenden oder erstellen werde, dann hätte ich eine SEHR lange Autonomie im Falle eines Stromausfalls und würde meine Überwachungs- / Alarmszenarien für das Haus nicht verlieren :+1:

Danke für diesen super vollständigen Tutorial @lmilcent! Ich habe den Domadoo-Link mit einem Affiliate-Link bearbeitet, wie gewünscht :wink:

Danke :blush:
Und ja, warum auch nicht, damit alle davon profitieren (Tutorial und Affiliate-Link!).

Ich finde es interessant, solche Szenenpräsentationen zu haben, das kann Ideen geben.