homee in Verbindung mit MQTT: homeeToMqtt

Ja, baue die Dashboards mit “node-red-dashboard”. Damit kann ich alles realisieren und wie ich das möchte. Time series gehen bei mir in influxdb. Stichwort Sprüche. Ich habe mir jetzt noch den ConBee besorgt. Der spielt unteranderem auch die Firmware anderer Devices auf und unterstützt unteranderem auch Xiaomi Sensoren und co.

Ich möchte endlich vom dem Polling weg, da ist mit deCONZ und Websocket die perfekte Möglichkeit auf Sensor Events in nahezu Realtime zu reagieren. Hue Bridge und co. benötigt ja Polling… Endlich kann ich dann auch die ESP32 per MQTT mit einbinden :slight_smile:

Zwave habe ich nur für Plugs, die werde ich wohl wie es ausschaut mit Wifi Plugs ersetzen.

1 „Gefällt mir“

Ich schaue mal das ich dir da ne kleine Anleitung baue.
Damit hättest du dann deine Datensätze in iobroker und homee wäre endlich wirklich Smart und keine halbgare Sache wo mal wieder seit Wochen nichts passiert.

2 „Gefällt mir“

Ey das wäre genial- es hört sich so an, als ob du das schon am laufen hast.

Darauf warte ich schon die ganze Zeit … also wenn du da Infos hast wie es geht - wäre ich dir sehr sehr dankbar dafür :wink::+1:

Bitte für alle zugänglich machen :wink:

2 „Gefällt mir“

Hier mal mein minimal Setup um den Xiaomi Vacuum via MQTT mit Hilfe von IOBroker an Node-RED anzubinden. Dieser ist dann wiederum als Wemo Schalter in der homee eingebunden.



und in Node-RED

[
    {
        "id": "69dd22c3.4d38ac",
        "type": "tab",
        "label": "Xiaomi",
        "disabled": false,
        "info": ""
    },
    {
        "id": "de7bb555.cd27e8",
        "type": "inject",
        "z": "69dd22c3.4d38ac",
        "name": "Xiaomi 0 find",
        "topic": "mihome-vacuum/0/control/find/set",
        "payload": "true",
        "payloadType": "str",
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "x": 170,
        "y": 100,
        "wires": [
            [
                "2b14e7e5.e953b8"
            ]
        ]
    },
    {
        "id": "2b14e7e5.e953b8",
        "type": "mqtt out",
        "z": "69dd22c3.4d38ac",
        "name": "",
        "topic": "",
        "qos": "",
        "retain": "",
        "broker": "504010af.ff61a",
        "x": 552.0000190734863,
        "y": 92.3333568572998,
        "wires": []
    },
    {
        "id": "2e8f763.b970e8a",
        "type": "wemo-emulator",
        "z": "69dd22c3.4d38ac",
        "name": "XiaomiVaccum1",
        "friendlyName": "Xiaomi Vacuum Cleaner Basement",
        "serial": "1",
        "port": "40001",
        "onTopic": "mihome-vacuum/0/control/start/set",
        "onPayload": "true",
        "offTopic": "mihome-vacuum/0/control/pause/set",
        "offPayload": "true",
        "x": 200,
        "y": 400,
        "wires": [
            [
                "2b14e7e5.e953b8",
                "56e9b14f.f67bf"
            ]
        ]
    },
    {
        "id": "e0e7b529.a7e238",
        "type": "inject",
        "z": "69dd22c3.4d38ac",
        "name": "Xiaomi 0 fan_control 40",
        "topic": "mihome-vacuum/0/control/fan_power/set",
        "payload": "40",
        "payloadType": "str",
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "x": 200,
        "y": 140,
        "wires": [
            [
                "2b14e7e5.e953b8"
            ]
        ]
    },
    {
        "id": "a7257387.0818c",
        "type": "inject",
        "z": "69dd22c3.4d38ac",
        "name": "Xiaomi 0 home",
        "topic": "mihome-vacuum/0/control/home/set",
        "payload": "true",
        "payloadType": "str",
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "x": 180,
        "y": 180,
        "wires": [
            [
                "2b14e7e5.e953b8"
            ]
        ]
    },
    {
        "id": "665698cc.7caae8",
        "type": "inject",
        "z": "69dd22c3.4d38ac",
        "name": "Xiaomi 0 pause",
        "topic": "mihome-vacuum/0/control/pause/set",
        "payload": "true",
        "payloadType": "str",
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "x": 180,
        "y": 220,
        "wires": [
            [
                "2b14e7e5.e953b8"
            ]
        ]
    },
    {
        "id": "2d8accdf.1e9f94",
        "type": "inject",
        "z": "69dd22c3.4d38ac",
        "name": "Xiaomi 0 start",
        "topic": "mihome-vacuum/0/control/start/set",
        "payload": "true",
        "payloadType": "str",
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "x": 170,
        "y": 260,
        "wires": [
            [
                "2b14e7e5.e953b8"
            ]
        ]
    },
    {
        "id": "56e9b14f.f67bf",
        "type": "debug",
        "z": "69dd22c3.4d38ac",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "x": 540,
        "y": 400,
        "wires": []
    },
    {
        "id": "504010af.ff61a",
        "type": "mqtt-broker",
        "z": "",
        "name": "",
        "broker": "localhost",
        "port": "1883",
        "clientid": "",
        "usetls": false,
        "compatmode": true,
        "keepalive": "60",
        "cleansession": true,
        "willTopic": "",
        "willQos": "0",
        "willPayload": "",
        "birthTopic": "",
        "birthQos": "0",
        "birthPayload": ""
    }
]

Hier homeeToMqtt mit Node-RED:

[
    {
        "id": "d1afdabe.79e0a8",
        "type": "mqtt out",
        "z": "71e613df.12327c",
        "name": "",
        "topic": "",
        "qos": "",
        "retain": "",
        "broker": "504010af.ff61a",
        "x": 710,
        "y": 620,
        "wires": []
    },
    {
        "id": "4ee4a3ad.01fd1c",
        "type": "inject",
        "z": "71e613df.12327c",
        "name": "Büro Gang ein",
        "topic": "homee/devices/set/200/attributes/1051",
        "payload": "1",
        "payloadType": "str",
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": "",
        "x": 470,
        "y": 600,
        "wires": [
            [
                "d1afdabe.79e0a8"
            ]
        ]
    },
    {
        "id": "2beedd77.59c1f2",
        "type": "inject",
        "z": "71e613df.12327c",
        "name": "Büro Gang aus",
        "topic": "homee/devices/set/200/attributes/1051",
        "payload": "0",
        "payloadType": "str",
        "repeat": "",
        "crontab": "",
        "once": false,
        "x": 480,
        "y": 640,
        "wires": [
            [
                "d1afdabe.79e0a8"
            ]
        ]
    },
    {
        "id": "504010af.ff61a",
        "type": "mqtt-broker",
        "z": "",
        "name": "",
        "broker": "localhost",
        "port": "1883",
        "clientid": "",
        "usetls": false,
        "compatmode": true,
        "keepalive": "60",
        "cleansession": true,
        "willTopic": "",
        "willQos": "0",
        "willPayload": "",
        "birthTopic": "",
        "birthQos": "0",
        "birthPayload": ""
    }
]

Hier mal ein Flow zum loggen aller eingehenden MQTT Nachrichten:

[
    {
        "id": "b75d84ce.01e5d8",
        "type": "mqtt in",
        "z": "71e613df.12327c",
        "name": "",
        "topic": "#",
        "qos": "2",
        "broker": "504010af.ff61a",
        "x": 90,
        "y": 100,
        "wires": [
            [
                "b5b3fe30.c209"
            ]
        ]
    },
    {
        "id": "d18c8e56.1bd12",
        "type": "debug",
        "z": "71e613df.12327c",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "x": 588,
        "y": 106,
        "wires": []
    },
    {
        "id": "b5b3fe30.c209",
        "type": "switch",
        "z": "71e613df.12327c",
        "name": "",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "cont",
                "v": "{",
                "vt": "str"
            },
            {
                "t": "else"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 250,
        "y": 100,
        "wires": [
            [
                "e218d27.73bce3"
            ],
            [
                "d18c8e56.1bd12"
            ]
        ]
    },
    {
        "id": "e218d27.73bce3",
        "type": "json",
        "z": "71e613df.12327c",
        "name": "",
        "property": "payload",
        "action": "",
        "pretty": false,
        "x": 410,
        "y": 77,
        "wires": [
            [
                "d18c8e56.1bd12"
            ]
        ]
    },
    {
        "id": "504010af.ff61a",
        "type": "mqtt-broker",
        "z": "",
        "name": "",
        "broker": "localhost",
        "port": "1883",
        "clientid": "",
        "usetls": false,
        "compatmode": true,
        "keepalive": "60",
        "cleansession": true,
        "willTopic": "",
        "willQos": "0",
        "willPayload": "",
        "birthTopic": "",
        "birthQos": "0",
        "birthPayload": ""
    }
]

Und hier alle homeeToMqtt Nachrichten in eine InfluxDB kippen.
InfluxDb: iot; User:iot; Pw:iot;
Der “Switch” filtert alle Temperaturnachrichten und schreibt sie nach Debug.

[
    {
        "id": "5dfc6bb4.e52534",
        "type": "mqtt in",
        "z": "31c0f069.6e0ff",
        "name": "",
        "topic": "homee/devices/status/#",
        "qos": "2",
        "broker": "504010af.ff61a",
        "x": 222,
        "y": 480,
        "wires": [
            [
                "bcb26a10.481348"
            ]
        ]
    },
    {
        "id": "ebe394cd.94d2f8",
        "type": "function",
        "z": "31c0f069.6e0ff",
        "name": "",
        "func": "var tokens = msg.topic.split(\"/\");\nif(!msg.payload.unit) {\n    msg.payload.unit='n/a'\n}\nmsg.url =\"http://ds1515.fritz.box:8086/write?u=iot;p=iot;db=iot\";\nmsg.payload = msg.payload.name.replace(/\\s+/g, '_') + \",type=\" + msg.payload.typeString + \",unit=\" + msg.payload.unit + \" value=\" + msg.payload.data;\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 570,
        "y": 482,
        "wires": [
            [
                "af0c03c1.c3ea6"
            ]
        ]
    },
    {
        "id": "af0c03c1.c3ea6",
        "type": "http request",
        "z": "31c0f069.6e0ff",
        "name": "",
        "method": "POST",
        "ret": "txt",
        "url": "",
        "tls": "",
        "x": 763.9999885559082,
        "y": 482.00002098083496,
        "wires": [
            []
        ]
    },
    {
        "id": "bcb26a10.481348",
        "type": "json",
        "z": "31c0f069.6e0ff",
        "name": "",
        "pretty": "false",
        "x": 409.00000381469727,
        "y": 482,
        "wires": [
            [
                "ea5108c5.9b2c88",
                "ebe394cd.94d2f8"
            ]
        ]
    },
    {
        "id": "645d413.15e80c",
        "type": "debug",
        "z": "31c0f069.6e0ff",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload.name",
        "x": 784.4999923706055,
        "y": 535.9999942779541,
        "wires": []
    },
    {
        "id": "ea5108c5.9b2c88",
        "type": "switch",
        "z": "31c0f069.6e0ff",
        "name": "",
        "property": "payload.type",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "5",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 1,
        "x": 569.519889831543,
        "y": 535.7528324127197,
        "wires": [
            [
                "645d413.15e80c"
            ]
        ]
    },
    {
        "id": "504010af.ff61a",
        "type": "mqtt-broker",
        "z": "",
        "name": "",
        "broker": "localhost",
        "port": "1883",
        "clientid": "",
        "usetls": false,
        "compatmode": true,
        "keepalive": "60",
        "cleansession": true,
        "willTopic": "",
        "willQos": "0",
        "willPayload": "",
        "birthTopic": "",
        "birthQos": "0",
        "birthPayload": ""
    }
]

Na da ist doch schon der Ansatz . Kannst das ganze genau so wie bei dem ersten Beispiel machen dann sind die homee States usw komplett unter iobroker mit mqtt verfügbar.

Ich bin erst morgen wieder am Rechner wenn das nicht reicht kann ich das schnell noch posten

Nein das reicht schon noch die Tage, wenn du Zeit hast…

Das heißt ich brauch das Node red homee Plugin… habe ich das richtig verstanden, oder das mqtt2homee?

Du siehst, So ganz schnall ich das noch nicht :see_no_evil:

Von daher wäre ich dir über ne kleine Anleitung dankbar…

Danke @guido für deinen Post…

Sieht bei meinem Xiaomi Vacuum aber nicht so kompliziert aus, bzw nutze nur Wemo in Verbindung mit homee und Xiaomi.

Das ist zur Zeit alles mit homeeToMqtt gelöst.
Die Idee dahinter ist alle Komponenten im heimischen IOT System (homee, ESP8266 mit Tasmota Firmware, IOBroker,…) pushen irgendwie ihre Stati nach MQTT und ein Service der alle MQTT Nachrichten empfängt (Homebridge, IOBroker, Node-RED, …) kümmert sich um die Verarbeitung.
Da hier jeder Sender und Empfänger sein kann, kann man dann lustige Sachen bauen.
Ein Knoten im Kopf ist dann vorprogrammiert.
Mein IOBroker macht derzeit nur eine Sache, nämlich XIAOMI nach MQTT und umgekehrt zu übersetzen. Gesteuert wir mit Node-RED

Das Ganze läuft derzeit auf einen Nanopi Air mit homeean.
Aber seit gewarnt, da kann man schon Zeit verbraten.
Die breite Unterstützung von irgendwelchen Geräten in Homebridge, IOBroker oder Node-RED macht es dann auch wieder interessant. Beschäftigen muss sich aber damit intensiv und es bestimmt nicht Plug und Play. Es soll ja nur keiner sagen man hätte ihn nicht gewarnt :wink:

Wenn du nur Node-RED an homeean brauchst ist wahrscheinlich @stfnhmplr plugin die bessere Wahl.

CIao
Gido

Moin, bei mir soll allesamt in iobroker zusammenlaufen, sprich ich hätte einfach gerne die States von homee in Iobroker, ob ich dann mit nodred oder blocky etc. weiterarbeite muss man sehen.

Wäre nicht der erste Knoten, den ich im Kopf hätte …:wink:

@gido aber mal eine andere Frage, wieso gehst du für den Xiaomi den Umweg über MQTT in Node Red anstatt über iobroker direkt?

@gido warum schreibst du das gesamte jason object in ein Topic rein ?
Kann man das nicht etwas lesbarer gestalten so das man im ioBroker auch gleich sieht an welchem Gerät man rumschraubt ?

@uvex
Genau das ist das wsd ich möchte, dass unter den Objekten die homee States auftauchen… und das hast du bereits- habe ich das richtig verstanden?

Ja, aber das Problem ist das die mqtt Topics usw. etwas komisch benannt sind und auch die Attribute und States damit suchst du mehr als das du findest


Ein eigener Adapter für homee und iobroker muss glaube ich nicht sein weil mqtt auch alles kann da müßte man nur noch an die Benennung dran.

Ok, prima … dann freu ich mich auf deine Anleitung :wink:

Lass mich erstmal kurz an dem app.js was fummeln ich will mal sehen ob ich da nen pull request machen kann das es einmal die json ausgäbe gibt und evtl. eine die besser in Biobroker zu lesen ist

2 „Gefällt mir“

Keine Eile!!!

Ich habe auch schon über bessere Klartextnamen nachgedacht. Die Informationen sind, wenn man in das JSON schaut ja alle vorhanden.
Für die Attribute ID kann man auch den Wert aus typeString eintragen. Bei der ersten Zahl wird es schwieriger, da böte sich der Devicename an. Dieser ist jedoch im Zweifelsfalle ein halber Satz mit Sonderzeichen und so und würde das Umbenennen von devices in der homee verlangen. Was ich mir vorstellen kann, dass man das Notizfeld missbraucht und dort mit „Mqtt:buero“ den identifier ersetzt wenn vorhanden. Im Moment ist die Struktur eher eine technische Umsetzung der homee API auf MQTT mit sehr wenig Eigenlogik.

Alles gut !
Hast du was dagegen wenn ich mich mal dran versuche ?

2 „Gefällt mir“

@uvex Mitstreiter sind immer willkommen. Wenn du in die aktuelle Version schaust kann die auch schon andere Modi aber noch nicht was ihr wollt.

1 „Gefällt mir“