Software

Other

Virtual homee-in-homee with Node-RED

Dies ist der dritte Teil unserer homee-Dokumentation. Im ersten Teil haben wir uns die HTTP-Schnittstelle, die sowohl homee als auch Ihre INSTAR-Kamera bietet, angesehen und sie miteinander verbunden. Dies funktioniert mit allen INSTAR-IP-Kameras. Im zweiten Tutorial haben wir Node-RED verwendet, um die homee HTTP-Schnittstelle mit der MQTT-Schnittstelle Ihrer Kamera zu verbinden. Beachten Sie, dass das INSTAR MQTT Interface nur bei INSTAR Full HD-Kameramodellen zur Verfügung steht.

Diesmal wollen wir mit Node-RED ein virtuellen homee erstellen, der direkt mit der MQTT-Schnittstelle unserer Kamera verbunden ist. Dieses virtuelle Gerät wird dann von unserem realen homee gesteuert.

Der vollständige Node-RED Flow kann am Ende dieses Artikels heruntergeladen werden.

Installieren und Einrichten von node-red-contrib-homee

Das klingt komplizierter, als es ist, denn alles, was wir brauchen, wird bereits von node-red-contrib-homee bereitgestellt. Beginnen Sie mit der Installation des homee-Supports über das Menü Palette verwalten:

Homee to INSTAR MQTT Broker

Ziehen Sie zunächst einen homeeAPI-Knoten auf Ihren Arbeitsbereich und fügen Sie die IP-Adresse Ihres realen homee und die Benutzeranmeldung hinzu. Der Knoten sollte sagen, dass er verbunden ist, sobald Sie Ihre Bearbeitung gespeichert haben:

Homee to INSTAR MQTT Broker

Jetzt sind wir in der Lage, ein virtuellen homee mit Hilfe eines homeeDevice-Knotens zu erstellen. Klicken Sie auf Add new virtualHomee, um diesen zu konfigurieren:

Homee to INSTAR MQTT Broker

Geben Sie hier eine eindeutige homee-ID an - Sie können Buchstaben und Zahlen (max. 10 Zeichen) verwenden - und eine Benutzeranmeldung für das virtuelle Gerät:

Homee to INSTAR MQTT Broker

Nun möchte ich ein Gerät hinzufügen, das es mir erlaubt, die Alarmbereiche meiner Kamera an und aus zu schalten. Dafür benötige ich eine eindeutige Node-ID und das OnOffPlug-Profil. Fahren Sie dann fort, indem Sie auf Attribute klicken:

Homee to INSTAR MQTT Broker

Fügen Sie innerhalb des JSON-Editors das folgende Objekt hinzu:

[{
        "id": 100,
        "node_id": 1,
        "instance": 0,
        "minimum": 0,
        "maximum": 1,
        "current_value": 0,
        "target_value": 0,
        "last_value": 0,
        "unit": "",
        "step_value": 1,
        "editable": 1,
        "type": 1,
        "state": 1,
        "last_changed": 12345555,
        "changed_by": 1,
        "changed_by_id": 0,
        "based_on": 1,
        "data": ""
    }]

Das Attribut id muss eindeutig sein, und die node_id ist die ID, die Sie im vorherigen Schritt für das Gerät gewählt haben. Der Type-Wert 1 definiert Ihren Schalter in homee als Schalter -> siehe CAAttributeType.

Homee to INSTAR MQTT Broker

homee-in-homee

Wir sind jetzt bereit, unser virtuellen homee dem realen in unserem Netzwerk hinzuzufügen. Öffnen Sie dazu das Gerätemenü und klicken Sie auf neues WiFi-Gerät hinzufügen:

Homee to INSTAR MQTT Broker

Wählen Sie ein homee in homee Gerät und klicken Sie danach auf Neuen homee hinzufügen:

Homee to INSTAR MQTT Broker

Geben Sie die homee-ID und das Login an, das Sie Ihrem virtuellen homee in Node-RED zugewiesen haben:

Homee to INSTAR MQTT Broker

Ihr virtueller homee sollte nun erscheinen. Klicken Sie auf Send, um ihn als Gerät hinzuzufügen:

Homee to INSTAR MQTT Broker

Sie können jetzt Ihren Schalter ausprobieren, indem Sie ihn in die Stellung Ein schalten:

Homee to INSTAR MQTT Broker

Das Hinzufügen eines Debug-Knotens zu unserem virtuellen hommee zeigt uns, dass wir jetzt ein Status-Update von unseren Schalter erhalten, wenn er umgeschaltet wird:

{
  "attributeId":100,
  "targetValue":1
}
{
  "attributeId":100,
  "targetValue":0
}

Homee to INSTAR MQTT Broker

Verbinden der INSTAR MQTT Schnittstelle

Umschalten von Kamerafunktionen

Wir müssen jetzt diese Meldung in etwas für uns Nützliches umwandeln. Zum Beispiel können wir das targetValue verwenden, um die 4 Alarmbereiche auf unserer Kamera mit dem MQTT-Topics instar/local/alarm/area1/enable/raw bis instar/local/alarm/area4/enable/raw schalten:

Homee to INSTAR MQTT Broker

Diese Nachricht kommt über msg.payload.targetValue in Node-RED an. Wenn wir diesen Wert auf msg.payload setzen, können wir sie direkt in 4 MQTT-Out-Knoten einspeisen, um unsere 4 Bereiche auf 1 oder 0 zu schalten:

Homee to INSTAR MQTT Broker

Vergessen Sie nicht, dass Sie den MQTT-Broker Ihrer Kamera bei jedem MQTT Knoten hinzufügen müssen.

Die Verwendung eines Tools wie MQTT.fx zeigt uns jetzt, dass diese MQTT-Topics bei jeder Verwendung des Schalters aktualisiert werden. Jede Nachricht mit der Nutzlast 1 schaltet alle 4 Bereiche ein, während eine 0 sie deaktiviert:

Homee to INSTAR MQTT Broker

Hinzufügen eines Statuskanals

Die obige Sequenz funktioniert bereits hervorragend. Aber es gibt ein Problem damit. Wenn wir die WebUI unserer Kamera oder eine Smartphone-Anwendung verwenden, um die Alarmbereiche ein- oder auszuschalten, erhalten wir kein Update in homee. Dazu müssen wir den MQTT Statuskanal unserer Kamera als Eingang in unserem virtuellen homee hinzufügen:

Homee to INSTAR MQTT Broker

Wie Sie auf dem Screenshot oben sehen können, verwenden wir die MQTT-Topics, um das Audio unserer Kamera ein- oder auszuschalten. Hinweis: es gibt insgesamt 3 Audio-Topics für alle 3 Video-Streams unserer Kamera - hohe Auflösung, mittlere Auflösung und niedrige Auflösung:

  • instar/local/multimedia/audio/enable/high/raw
  • instar/local/multimedia/audio/enable/mid/raw
  • instar/local/multimedia/audio/enable/low/raw

Um den aktuellen Status der Audio-Einstellungen unserer Kamera zu erhalten, müssen wir MQTT-Eingangsknoten mit dem entsprechenden Status-Topic an den Eingang unseres virtuellen homee's anschließen:

  • instar/local/status/multimedia/audio/enable/high/raw
  • instar/local/status/multimedia/audio/enable/mid/raw
  • instar/local/status/multimedia/audio/enable/low/raw

Um mit dieser Eingabe arbeiten zu können, müssen wir sie zunächst in gültiges JSON umwandeln, indem wir einen JSON-Knoten hinzufügen. Und dann müssen wir die Daten noch mit einem benutzerdefinierten Funktionsknoten umsortieren:

msg.payload = {'id':101, 'value': Number(msg.payload.val)}

return msg;

Der Wert, den wir von der MQTT-Status-Eingabe erhalten, wird entweder {"val": "1"} oder {"val": "0"} sein. Wir extrahieren daher den Wert von val , wandeln ihn in eine Zahl um und fügen die ID unseres virtuellen homee Gerätes hinzu (unser vorheriges Gerät hatte die ID 100, daher verwenden wir jetzt die ID 101 für unser neues Gerät).

Das neue Gerät ist wiederum als Ein-/Ausschalter konfiguriert. Wir können also den vorherigen homee Knoten kopieren - wir müssen nur den Namen Audio, die Geräte-ID 101 und die NodeID 2 ändern, um sie eindeutig zu halten:

Homee to INSTAR MQTT Broker

Zurück in der homee-UI können Sie nun wieder zu dem Menü zurückkehren, in dem wir zuvor unsere virtuelle homee hinzugefügt haben. Anstatt einen neuen homee hinzuzufügen, müssen wir nun nach neuen Geräten suchen. Ich habe das neue Gerät im vorigen Schritt Audio genannt und das wird auch sofort gefunden:

Homee to INSTAR MQTT Broker

Jetzt können Sie es ausprobieren - die Deaktivierung des Audios in der WebUI der Kamera sollte jetzt auch den Schalter in unserer homee-Benutzeroberfläche umschalten:

Homee to INSTAR MQTT Broker

Sie können nun jedes der verfügbaren MQTT-Topics verwenden und die Kontrolle über Ihre Kamera über die homee Benutzeroberfläche zu übernehmen. Und jeder Knopf, Schalter oder Schieberegler, den Sie hinzufügen, steht dann natürlich auch für Automatisierungsskripte zur Verfügung.

Node-RED Flow Export

[{"id":"75393df8.e86824","type":"homeeDevice","z":"5026c83e.b368c8","virtual-homee":"","name":"Alarm_Areas","nodeId":"1","profile":"10","icon":"nodeicon_camera","attributes":"[{\"id\":100,\"node_id\":1,\"instance\":0,\"minimum\":0,\"maximum\":1,\"current_value\":0,\"target_value\":0,\"last_value\":0,\"unit\":\"\",\"step_value\":1,\"editable\":1,\"type\":1,\"state\":1,\"last_changed\":12345555,\"changed_by\":1,\"changed_by_id\":0,\"based_on\":1,\"data\":\"\"}]","x":110,"y":180,"wires":[["9fe0bb5a.f639d8"]]},{"id":"542704b9.3c440c","type":"mqtt out","z":"5026c83e.b368c8","name":"alarm/area1/enable","topic":"instar/local/alarm/area1/enable/raw","qos":"1","retain":"false","broker":"996228fe.ababc8","x":475,"y":121,"wires":[]},{"id":"9fe0bb5a.f639d8","type":"change","z":"5026c83e.b368c8","name":"targetValue","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.targetValue","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":270,"y":180,"wires":[["542704b9.3c440c","ef88a520.e5a8b8","b0746487.26ede8","63750b59.349f54"]]},{"id":"63750b59.349f54","type":"mqtt out","z":"5026c83e.b368c8","name":"alarm/area2/enable","topic":"instar/local/alarm/area2/enable/raw","qos":"1","retain":"false","broker":"996228fe.ababc8","x":475,"y":161,"wires":[]},{"id":"ef88a520.e5a8b8","type":"mqtt out","z":"5026c83e.b368c8","name":"alarm/area3/enable","topic":"instar/local/alarm/area3/enable/raw","qos":"1","retain":"false","broker":"996228fe.ababc8","x":475,"y":201,"wires":[]},{"id":"b0746487.26ede8","type":"mqtt out","z":"5026c83e.b368c8","name":"alarm/area4/enable","topic":"instar/local/alarm/area4/enable/raw","qos":"1","retain":"false","broker":"996228fe.ababc8","x":475,"y":241,"wires":[]},{"id":"fd87a90.65ebe58","type":"homeeDevice","z":"5026c83e.b368c8","virtual-homee":"","name":"Audio","nodeId":"2","profile":"10","icon":"nodeicon_camera","attributes":"[{\"id\":101,\"node_id\":2,\"instance\":0,\"minimum\":0,\"maximum\":1,\"current_value\":0,\"target_value\":0,\"last_value\":0,\"unit\":\"\",\"step_value\":1,\"editable\":1,\"type\":1,\"state\":1,\"last_changed\":12345555,\"changed_by\":1,\"changed_by_id\":0,\"based_on\":1,\"data\":\"\"}]","x":716,"y":320,"wires":[["e45a2b45.bb1778"]]},{"id":"494dca42.c53fd4","type":"mqtt out","z":"5026c83e.b368c8","name":"multimedia/audio/enable/high","topic":"instar/local/multimedia/audio/enable/high/raw","qos":"1","retain":"false","broker":"996228fe.ababc8","x":664,"y":376,"wires":[]},{"id":"e45a2b45.bb1778","type":"change","z":"5026c83e.b368c8","name":"targetValue","rules":[{"t":"set","p":"payload","pt":"msg","to":"payload.targetValue","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":428,"y":376,"wires":[["494dca42.c53fd4","40c78b19.acda34","6342ae78.ee176"]]},{"id":"63e55ead.2a5af","type":"mqtt in","z":"5026c83e.b368c8","name":"status/multimedia/audio/enable/high","topic":"instar/local/status/multimedia/audio/enable/high","qos":"1","datatype":"auto","broker":"996228fe.ababc8","x":160,"y":320,"wires":[["2b0f2fa0.c0d32"]]},{"id":"fc32aaac.edce58","type":"function","z":"5026c83e.b368c8","name":"attributeId/targetValue","func":"msg.payload = {'id':101, 'value': Number(msg.payload.val)}\n\nreturn msg;","outputs":1,"noerr":0,"x":550,"y":320,"wires":[["fd87a90.65ebe58"]]},{"id":"2b0f2fa0.c0d32","type":"json","z":"5026c83e.b368c8","name":"","property":"payload","action":"","pretty":false,"x":385,"y":320,"wires":[["fc32aaac.edce58"]]},{"id":"40c78b19.acda34","type":"mqtt out","z":"5026c83e.b368c8","name":"multimedia/audio/enable/mid","topic":"instar/local/multimedia/audio/enable/mid/raw","qos":"1","retain":"false","broker":"996228fe.ababc8","x":654,"y":409,"wires":[]},{"id":"6342ae78.ee176","type":"mqtt out","z":"5026c83e.b368c8","name":"multimedia/audio/enable/low","topic":"instar/local/multimedia/audio/enable/low/raw","qos":"1","retain":"false","broker":"996228fe.ababc8","x":654,"y":442,"wires":[]},{"id":"296264ec.9473bc","type":"mqtt in","z":"5026c83e.b368c8","name":"status/multimedia/audio/enable/mid","topic":"instar/local/status/multimedia/audio/enable/mid","qos":"1","datatype":"auto","broker":"996228fe.ababc8","x":160,"y":353,"wires":[["2b0f2fa0.c0d32"]]},{"id":"1e5b6840.5de388","type":"mqtt in","z":"5026c83e.b368c8","name":"status/multimedia/audio/enable/low","topic":"instar/local/status/multimedia/audio/enable/low","qos":"1","datatype":"auto","broker":"996228fe.ababc8","x":160,"y":386,"wires":[["2b0f2fa0.c0d32"]]},{"id":"996228fe.ababc8","type":"mqtt-broker","z":"","name":"INSTAR MQTT","broker":"192.168.2.117","port":"1883","clientid":"iored","usetls":false,"compatmode":false,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""}]