Mini-Tutorial: Steuerung eines nicht von Gladys unterstützten Zigbee2Mqtt-Geräts über Node-RED

Dieses Mini-Tutorial zeigt, wie man ein Gerät verbindet, das in zigbee2mqtt erkannt wird, aber dessen Integration in Gladys noch nicht existiert, indem man Node-red als Zwischenstufe verwendet! Keine Ausreden mehr :slight_smile: Gladys nicht zu verwenden!

Dazu erstellen wir ein virtuelles Gerät (oder Virtual Device) in der MQTT-Integration von Gladys und einen Node-red-Flow, den man einfach importieren muss. Man muss ihn nur entsprechend dem zu steuernden Gerät und Ihren Parametern konfigurieren (IP Ihrer Gladys-Instanz, MQTT-Passwort, Zigbee2Mqtt-Passwort).

Los geht’s:

Gehen Sie zum Menü « Integrationen »

Klicken Sie auf das Symbol der Integration « MQTT »

In Gerät klicken Sie auf die Schaltfläche « Neu + »

image

Erstellen Sie ein virtuelles Gerät wie folgt

Sie werden dann ein Gerät haben, das wie folgt aussehen sollte

Der Teil der Geräteerstellung ist abgeschlossen. Es bleibt nur noch, dieses Gerät mit diesen 2 Funktionen im Gladys-Dashboard anzuzeigen.

Es gibt drei Parameter, die wir später wiederverwenden werden, nämlich die Topics von « MQTT-Topic zum Veröffentlichen » und « MQTT-Topic zum Abhören ».

Gehen Sie zu Node-red und klicken Sie auf « Importieren »

Kopieren Sie den folgenden Flow unten, fügen Sie ihn ein und klicken Sie dann auf « Importieren »

Code des Flows
[
    {
        "id": "064a844a10f278d0",
        "type": "tab",
        "label": "Gladys <=> Z2M",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "2bee4d2d30957c22",
        "type": "group",
        "z": "064a844a10f278d0",
        "style": {
            "stroke": "#999999",
            "stroke-opacity": "1",
            "fill": "none",
            "fill-opacity": "1",
            "label": true,
            "label-position": "nw",
            "color": "#a4a4a4"
        },
        "nodes": [
            "55b5362bb2f1081f",
            "e5974b74c4f0523d",
            "896b379f92909116",
            "267f8ce1755e49ee",
            "79f42f08d633eba1",
            "86df5045936db7d1",
            "350d4cab9b6ddfc6",
            "eba51d83ac887a1c",
            "3ad8cd81b2da503b",
            "1908d429c1d0cf06",
            "9b850e5047f189e9",
            "5faacded48aa4cc7"
        ],
        "x": 74,
        "y": 99,
        "w": 1112,
        "h": 222
    },
    {
        "id": "0cf88844315f110d",
        "type": "group",
        "z": "064a844a10f278d0",
        "style": {
            "stroke": "#999999",
            "stroke-opacity": "1",
            "fill": "none",
            "fill-opacity": "1",
            "label": true,
            "label-position": "nw",
            "color": "#a4a4a4"
        },
        "nodes": [
            "07dec9a2ad2f07cd",
            "780c7da37c4cc4bf",
            "7e369026c5674540",
            "f17aadce56f60a2f",
            "73cdf2a53b73da8f",
            "79365e2791c55807",
            "a7ad027dd87ce30b",
            "32c7a028d4dba351",
            "b0717d9927c1b6d8",
            "fceca8e194e04524"
        ],
        "x": 74,
        "y": 399,
        "w": 1062,
        "h": 182
    },
    {
        "id": "e5974b74c4f0523d",
        "type": "mqtt in",
        "z": "064a844a10f278d0",
        "g": "2bee4d2d30957c22",
        "name": "IP Gladys:1883",
        "topic": "#",
        "qos": "2",
        "datatype": "auto",
        "broker": "f4ab211ed11dc81c",
        "nl": false,
        "rap": true,
        "rh": 0,
        "inputs": 0,
        "x": 180,
        "y": 180,
        "wires": [
            [
                "896b379f92909116",
                "55b5362bb2f1081f"
            ]
        ]
    },
    {
        "id": "896b379f92909116",
        "type": "debug",
        "z": "064a844a10f278d0",
        "g": "2bee4d2d30957c22",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 370,
        "y": 220,
        "wires": []
    },
    {
        "id": "267f8ce1755e49ee",
        "type": "debug",
        "z": "064a844a10f278d0",
        "g": "2bee4d2d30957c22",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 1050,
        "y": 280,
        "wires": []
    },
    {
        "id": "79f42f08d633eba1",
        "type": "change",
        "z": "064a844a10f278d0",
        "g": "2bee4d2d30957c22",
        "name": "Test AUS",
        "rules": [
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "zigbee2mqtt/NOUS-5/set/state",
                "tot": "str"
            },
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "AUS",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 800,
        "y": 240,
        "wires": [
            [
                "267f8ce1755e49ee",
                "350d4cab9b6ddfc6"
            ]
        ]
    },
    {
        "id": "86df5045936db7d1",
        "type": "inject",
        "z": "064a844a10f278d0",
        "g": "2bee4d2d30957c22",
        "name": "AUS",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "AUS",
        "payload": "gladys/device/mqtt:Z2M-NOUS-5/feature/mqtt:Z2M-NOUS-5-state/state",
        "payloadType": "str",
        "x": 550,
        "y": 240,
        "wires": [
            [
                "79f42f08d633eba1"
            ]
        ]
    },
    {
        "id": "07dec9a2ad2f07cd",
        "type": "mqtt in",
        "z": "064a844a10f278d0",
        "g": "0cf88844315f110d",
        "name": "IP Zigbee2Mqtt:1884",
        "topic": "zigbee2mqtt/NOUS-5",
        "qos": "2",
        "datatype": "auto",
        "broker": "16ae73273064273e",
        "nl": false,
        "rap": true,
        "rh": 0,
        "inputs": 0,
        "x": 190,
        "y": 480,
        "wires": [
            [
                "780c7da37c4cc4bf",
                "b0717d9927c1b6d8"
            ]
        ]
    },
    {
        "id": "780c7da37c4cc4bf",
        "type": "debug",
        "z": "064a844a10f278d0",
        "g": "0cf88844315f110d",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 370,
        "y": 540,
        "wires": []
    },
    {
        "id": "350d4cab9b6ddfc6",
        "type": "mqtt out",
        "z": "064a844a10f278d0",
        "g": "2bee4d2d30957c22",
        "name": "IP Zigbee2Mqtt:1884",
        "topic": "",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "16ae73273064273e",
        "x": 1060,
        "y": 180,
        "wires": []
    },
    {
        "id": "eba51d83ac887a1c",
        "type": "inject",
        "z": "064a844a10f278d0",
        "g": "2bee4d2d30957c22",
        "name": "AN",n        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "AN",
        "payload": "gladys/device/mqtt:Z2M-NOUS-5/feature/mqtt:Z2M-NOUS-5-state/state",
        "payloadType": "str",
        "x": 550,
        "y": 280,
        "wires": [
            [
                "3ad8cd81b2da503b"
            ]
        ]
    },
    {
        "id": "3ad8cd81b2da503b",
        "type": "change",
        "z": "064a844a10f278d0",
        "g": "2bee4d2d30957c22",
        "name": "Test AN",
        "rules": [
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "zigbee2mqtt/NOUS-5/set/state",
                "tot": "str"
            },
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "AN",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 800,
        "y": 280,
        "wires": [
            [
                "350d4cab9b6ddfc6",
                "267f8ce1755e49ee"
            ]
        ]
    },
    {
        "id": "1908d429c1d0cf06",
        "type": "debug",
        "z": "064a844a10f278d0",
        "g": "2bee4d2d30957c22",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 790,
        "y": 140,
        "wires": []
    },
    {
        "id": "7e369026c5674540",
        "type": "mqtt out",
        "z": "064a844a10f278d0",
        "g": "0cf88844315f110d",
        "name": "IP Gladys:1883",
        "topic": "",
        "qos": "",
        "retain": "",
        "respTopic": "",
        "contentType": "",
        "userProps": "",
        "correl": "",
        "expiry": "",
        "broker": "f4ab211ed11dc81c",
        "x": 1030,
        "y": 480,
        "wires": []
    },
    {
        "id": "f17aadce56f60a2f",
        "type": "inject",
        "z": "064a844a10f278d0",
        "g": "0cf88844315f110d",
        "name": "AN",n        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "AN",
        "payload": "gladys/master/device/mqtt:Heiman-On/feature/mqtt:Heiman-On/state",
        "payloadType": "str",
        "x": 540,
        "y": 540,
        "wires": [
            [
                "73cdf2a53b73da8f"
            ]
        ]
    },
    {
        "id": "73cdf2a53b73da8f",
        "type": "change",
        "z": "064a844a10f278d0",
        "g": "0cf88844315f110d",
        "name": "Testwert 66",
        "rules": [
            {
                "t": "set",
                "p": "topic",
                "pt": "msg",
                "to": "gladys/master/device/mqtt:Z2M-NOUS-5/feature/mqtt:Z2M-NOUS-5-power/text",
                "tot": "str"
            },
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "66",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 810,
        "y": 540,
        "wires": [
            [
                "7e369026c5674540",
                "79365e2791c55807"
            ]
        ]
    },
    {
        "id": "79365e2791c55807",
        "type": "debug",
        "z": "064a844a10f278d0",
        "g": "0cf88844315f110d",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 1000,
        "y": 540,
        "wires": []
    },
    {
        "id": "a7ad027dd87ce30b",
        "type": "comment",
        "z": "064a844a10f278d0",
        "g": "0cf88844315f110d",
        "name": "Empfang von Zigbee2Mqtt",
        "info": "",
        "x": 210,
        "y": 440,
        "wires": []
    },
    {
        "id": "32c7a028d4dba351",
        "type": "comment",
        "z": "064a844a10f278d0",
        "g": "0cf88844315f110d",
        "name": "Senden an Gladys",
        "info": "",
        "x": 1030,
        "y": 440,
        "wires": []
    },
    {
        "id": "9b850e5047f189e9",
        "type": "comment",
        "z": "064a844a10f278d0",
        "g": "2bee4d2d30957c22",
        "name": "Empfang von Gladys",
        "info": "",
        "x": 200,
        "y": 140,
        "wires": []
    },
    {
        "id": "5faacded48aa4cc7",
        "type": "comment",
        "z": "064a844a10f278d0",
        "g": "2bee4d2d30957c22",
        "name": "Senden an Zigbee2Mqtt",
        "info": "",
        "x": 1050,
        "y": 140,
        "wires": []
    },
    {
        "id": "55b5362bb2f1081f",
        "type": "function",
        "z": "064a844a10f278d0",
        "g": "2bee4d2d30957c22",
        "name": "Gladys => zigbee2mqtt",
        "func": "var inputTopic = msg.topic;\nvar inputPayload = msg.payload;\n\n// Logik zur Änderung des Topics und der Nutzlast in Abhängigkeit sowohl vom Topic als auch von der Nutzlast\n\nif (inputTopic === \"gladys/device/mqtt:Z2M-NOUS-5/feature/mqtt:Z2M-NOUS-5-state/state\" && inputPayload === \"0\") {\n  // Anpassung des Topics und der Nutzlast von Gladys an zigbee2mqtt \n  msg.topic = \"zigbee2mqtt/NOUS-5/set/state\"; msg.payload = \"OFF\";\n} \n\nif (inputTopic === \"gladys/device/mqtt:Z2M-NOUS-5/feature/mqtt:Z2M-NOUS-5-state/state\" && inputPayload === \"1\") {\n  // Anpassung des Topics und der Nutzlast von Gladys an zigbee2mqtt \n  msg.topic = \"zigbee2mqtt/NOUS-5/set/state\"; msg.payload = \"ON\";\n}\n\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 590,
        "y": 180,
        "wires": [
            [
                "1908d429c1d0cf06",
                "350d4cab9b6ddfc6"
            ]
        ]
    },
    {
        "id": "b0717d9927c1b6d8",
        "type": "function",
        "z": "064a844a10f278d0",
        "g": "0cf88844315f110d",
        "name": " zigbee2mqtt => Gladys",
        "func": "var inputTopic = msg.topic;\nvar inputPayload = JSON.parse(msg.payload);\n\n// Logik zur Änderung des Topics und der Nutzlast in Abhängigkeit sowohl vom Topic als auch von der Nutzlast\nif (msg.topic === \"zigbee2mqtt/NOUS-5\") {\n    \n    \n    // wenn der Wert \"state\" im JSON in der Nutzlast von zigbee2mqtt vorhanden ist\n    if (inputPayload.hasOwnProperty('state')) {\n        // Anpassung des Topics von Gladys an zigbee2mqtt \n        msg.topic = \"gladys/device/mqtt:Z2M-NOUS-5/feature/mqtt:Z2M-NOUS-5-state/state\";\n        // Anpassung der Nutzlast von zigbee2mqtt an Gladys \n        var payloadValue = inputPayload.state;\n        msg.payload = payloadValue;\n    } else {\n        // Wenn der Schlüssel 'power' nicht vorhanden ist, wird die Ausgabe auf \"defaut\" gesetzt\n        msg.payload = \"defaut\";\n    }\n    \n    // wenn der Wert \"power\" im JSON in der Nutzlast von zigbee2mqtt vorhanden ist\n    if (inputPayload.hasOwnProperty('power')) {\n        // Anpassung des Topics von Gladys an zigbee2mqtt \n        msg.topic = \"gladys/master/device/mqtt:Z2M-NOUS-5/feature/mqtt:Z2M-NOUS-5-power/text\";\n        // Anpassung der Nutzlast von zigbee2mqtt an Gladys \n        var payloadValue = inputPayload.power;\n        msg.payload = payloadValue;\n    } else {\n        // Wenn der Schlüssel 'power' nicht vorhanden ist, wird die Ausgabe auf \"defaut\" gesetzt\n        msg.payload = \"defaut\";\n    }\n}\n\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 580,
        "y": 480,
        "wires": [
            [
                "7e369026c5674540",
                "fceca8e194e04524"
            ]
        ]
    },
    {
        "id": "fceca8e194e04524",
        "type": "debug",
        "z": "064a844a10f278d0",
        "g": "0cf88844315f110d",
        "name": "",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 780,
        "y": 440,
        "wires": []
    },
    {
        "id": "f4ab211ed11dc81c",
        "type": "mqtt-broker",
        "name": "192.168.0.125:1883",
        "broker": "192.168.0.125",
        "port": "1883",
        "clientid": "",
        "autoConnect": true,
        "usetls": false,
        "protocolVersion": "4",
        "keepalive": "60",
        "cleansession": true,
        "autoUnsubscribe": true,
        "birthTopic": "",
        "birthQos": "0",
        "birthPayload": "",
        "birthMsg": {},
        "closeTopic": "",
        "closeQos": "0",
        "closePayload": "",
        "closeMsg": {},
        "willTopic": "",
        "willQos": "0",
        "willPayload": "",
        "willMsg": {},
        "userProps": "",
        "sessionExpiry": ""
    },
    {
        "id": "16ae73273064273e",
        "type": "mqtt-broker",
        "name": "",
        "broker": "192.168.0.125",
        "port": "1884",
        "clientid": "",
        "autoConnect": true,
        "usetls": false,
        "protocolVersion": "4",
        "keepalive": "60",
        "cleansession": true,
        "autoUnsubscribe": true,
        "birthTopic": "",
        "birthQos": "0",
        "birthRetain": "false",
        "birthPayload": "",
        "birthMsg": {},
        "closeTopic": "",
        "closeQos": "0",
        "closeRetain": "false",
        "closePayload": "",
        "closeMsg": {},
        "willTopic": "",
        "willQos": "0",
        "willRetain": "false",
        "willPayload": "",
        "willMsg": {},
        "userProps": "",
        "sessionExpiry": ""
    }
]

PS: Code aktualisiert am 07/11/2023

Sie erhalten einen solchen Datenstrom

Melden Sie sich bei der URL der Zigbee2mqtt-Seite des Docker an

Sie gelangen zur Seite des Zigbee2Mqtt-Brokers

Wählen Sie das zu steuernde Zigbee2mqtt-Gerät aus, im Beispiel ist es eine NOUS A1Z-Steckdose (ein Gerät, das bereits von Gladys gesteuert wird, aber nur als Beispiel :zwinker:) Sie trägt den Namen « NOUS-5 »

Wenn Sie auf der Parameterseite sind, gehen Sie zum Reiter Zustand, der den zwischen Zigbee2mqtt und der Außenwelt ausgetauschten JSON zeigt. Hier werden wir für das Beispiel zwei Werte verwenden:

  • einen (in-out), der zum Ein- oder Ausschalten der Steckdose dient: state
  • einen anderen (out), der die verbrauchte Leistung der Steckdose sendet: power

    Dieser JSON muss in den Code des Flusses kopiert werden, falls eine Anpassung für andere Hardware erforderlich ist

Jetzt gehen wir zurück zu Node-RED, wo wir zwei Code-Bereiche finden

Der erste betrifft die Übersetzung des Topics und der Payload von Gladys in das Topic und die Payload, die von Zigbee2Mqtt erwartet werden

image

Der zweite betrifft die Übersetzung des Topics und der Payload von Zigbee2Mqtt in das Topic und die Payload, die von Gladys erwartet werden

image

In beiden Fällen sind die Werte, die je nach MQTT-Virtualgerät und zu steuernder Zigbee2Mqtt-Hardware geändert werden müssen, rot markiert

Die Einstellungen der « mqtt »-Nodes (Port 1883 für Mqtt, 1884 für Zigbee2Mqtt) erfordern zwingend die IP-Adresse Ihrer Gladys in den MQTT-Nodes, damit die Frames aus den Containern herausgehen!

Für den Port 1883 finden Sie den Benutzernamen und das Passwort in Gladys

Für den Port 1884 (Zigbee2Mqtt) finden Sie den Benutzernamen und das Passwort in der Datei « configuration.yaml », die sich im Verzeichnis « var/lib/gladysassistant/zigbee2mqtt/z2m » im Abschnitt « mqtt: » befindet
(es wäre schön, wenn man dies in der Zigbee2Mqtt-Integration visualisieren könnte :woozy_face: wie man es für Mqtt und Node-RED sieht :blush:)

Wenn die Werte korrekt sind, erscheinen die « mqtt »-Nodes « verbunden » in Grün

Das war’s, im Gladys-Dashboard können Sie die Steckdose « Nous-5 » mit der virtuellen Steckdose « Z2M-NOUS-5 » umschalten

und ihren Verbrauch sehen

Falls es Vorschläge, Verbesserungen oder Fehler gibt, zögern Sie nicht… :zwinker:

PS: Dank der Informationen, die ich im Forum gefunden habe, insbesondere für das Zigbee2mqtt-Passwort (@vonox in einer Diskussion] (@Will_71 für das virtuelle Gerät in seinem Somfy-Tutorial) konnte ich dieses Mini-Tutorial erstellen

7 „Gefällt mir“