Homebridge-Automatisierung mit Node-Red

Meiner Meinung nach ist einer der Hauptnachteile von Homebridge die mangelnde Fähigkeit, erweiterte Skripte zu erstellen. Die gesamte Automatisierung ist dem Home Center zugeordnet, bei dem es sich um ein iPad (zum Aufladen angeschlossen), Apple TV oder einen HomePod handeln kann. Nicht jeder hat diese Geräte, außerdem hat HomeKit eine sehr schlechte Automatisierung. Diese Situation kann mit Node-Red korrigiert werden. Der Artikel richtet sich an Benutzer, auf denen Homebridge bereits installiert und konfiguriert ist .



Kurz gesagt: Node-RED ist ein Tool zum Verbinden von Hardware, APIs und Onlinediensten, indem Verbindungen zwischen verschiedenen Knoten (Blöcken) hergestellt werden.

Definition auf der offiziellen Website:
Node-RED ist ein Programmiertool zum Verkabeln von Hardwaregeräten, APIs und Onlinediensten auf neue und interessante Weise.
Es bietet einen browserbasierten Editor, mit dem Flows mithilfe der Vielzahl von Knoten in der Palette, die mit einem einzigen Klick zur Laufzeit bereitgestellt werden können, einfach miteinander verbunden werden können.


Auf Raspbian ist Folgendes installiert:

sudo apt-get install nodered sudo systemctl enable nodered.service sudo service nodered start 

Standardmäßig wird Node-Red auf Port 1880 ausgeführt.

Es gibt eine riesige Bibliothek von Modulen mit Sätzen von Blöcken verschiedener Funktionen. Nicht verschont und Homebridge. Installieren Sie die Node-Red-Contrib-Homebridge-Automatisierung :

 cd ~/.node-red npm install node-red-contrib-homebridge-automation sudo service nodered restart 

Versuchen wir, die Glühbirne einzuschalten. Ziehen Sie dazu das hb-Steuerelement , den Funktionsblock (dieser Block sendet einen Befehl zum Einschalten) und injizieren Sie (im Rahmen dieses Artikels muss das Skript nur manuell aktiviert werden). Zum ersten Mal müssen Sie für hb-Blöcke eine PIN angeben und die Liste der Geräte aktualisieren. Dann können Sie die erforderlichen Blöcke hinzufügen:



Wenn Sie nun auf die Schaltfläche im Injektionsblock klicken, sollte das Licht aufleuchten. Neben hb-contoll gibt es auch hb-event-, hb-status- und hb-resume- Blöcke. Eine detaillierte Beschreibung der Blöcke finden Sie im offiziellen Repository .

Funktionsblockcode
 var ret_msg={}; ret_msg.payload = {}; ret_msg.payload.On = true; return ret_msg; 


Der Funktionsblock dient zum Bearbeiten von Daten mithilfe von JavaScript-Funktionen. Der Block akzeptiert die Variable msg zusammen mit dem Payload- Parameter. Standardmäßig arbeiten die meisten Blöcke in Node-Red mit dem Payload- Parameter.

Es lohnt sich, über den Debug- Block zu sprechen. Mit ihm können Sie die Ausgabe der Blöcke sehen, damit Sie verstehen, was der Fehler ist, wenn Ihre Idee nicht funktioniert.

Lassen Sie uns nun etwas Interessantes tun, zum Beispiel den Lichtwechselzustand nach dem Drehen des MagicCube um 90 Grad. In einem früheren Artikel habe ich gezeigt, wie man mit Homebridge ZigBee-Geräte für Freunde findet. MagicCube wird wie andere ZigBee-Geräte nach dem Pairing im MQTT-Broker angezeigt.

Node-Red unterstützt das sofort einsatzbereite MQTT-Protokoll. Fügen Sie den MQTT-Block hinzu, geben Sie die Serveradresse und den Themenwürfel an.



Ein Würfel kann folgende Zustände übertragen:
schütteln, aufwachen, fallen, tippen, schieben, flip180, flip90, links drehen und rechts drehen

Fügen Sie einen Schaltblock hinzu , um einen Status von einem anderen zu trennen. Definieren Sie Flip90- , Shake- und Tap- Bedingungen im Schalter . Verbinden Sie den oberen Ausgang mit dem hb-Status , um den aktuellen Status der Lampe zu erhalten. Der hb- Statusblock wird durch Invertieren des Zustands mit dem Invert On Value- Block verbunden, und sein Ausgang wird mit dem hb-Controller verbunden. Wenn der Würfel gedreht wird, ändert die Glühbirne den Ein / Aus-Zustand. Es sollte ungefähr so ​​aussehen:



Bei Wertcode umkehren
 var ret_msg=msg; ret_msg.payload.On = !msg.payload.On; return ret_msg; 


Flow kann von hier importiert werden:

Flow
 [ { "id": "f0f31eb6.22f16", "type": "tab", "label": "Flow 1", "disabled": false, "info": "" }, { "id": "e0f72465.9e4fb8", "type": "mqtt in", "z": "f0f31eb6.22f16", "name": "", "topic": "zigbee2mqtt/0x00158d00010f0528", "qos": "2", "datatype": "auto", "broker": "8ec472b.e73e29", "x": 160, "y": 80, "wires": [ [ "43f74679.730588" ] ] }, { "id": "8539109.d872ff", "type": "debug", "z": "f0f31eb6.22f16", "name": "", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "false", "x": 670, "y": 60, "wires": [] }, { "id": "c5db7c5b.399f4", "type": "hb-status", "z": "f0f31eb6.22f16", "name": "Room1", "Homebridge": "HomeBridge", "Manufacturer": "YeeLight", "Service": "Lightbulb", "device": "HomeBridgeA1:23:AD:E3:CD:32YeeLightRoom100000043", "conf": "7948a496.505c2c", "x": 340, "y": 180, "wires": [ [ "9ef696d9.51a378" ] ] }, { "id": "43f74679.730588", "type": "switch", "z": "f0f31eb6.22f16", "name": "CubeActions", "property": "payload", "propertyType": "msg", "rules": [ { "t": "cont", "v": "flip90", "vt": "str" }, { "t": "cont", "v": "tap", "vt": "str" }, { "t": "cont", "v": "shake", "vt": "str" } ], "checkall": "true", "repair": false, "outputs": 3, "x": 150, "y": 240, "wires": [ [ "c5db7c5b.399f4" ], [], [] ] }, { "id": "f476dcba.a6511", "type": "hb-control", "z": "f0f31eb6.22f16", "name": "Room1", "Homebridge": "HomeBridge", "Manufacturer": "YeeLight", "Service": "Lightbulb", "device": "HomeBridgeA1:23:AD:E3:CD:32YeeLightRoom100000043", "conf": "7948a496.505c2c", "x": 700, "y": 180, "wires": [] }, { "id": "9ef696d9.51a378", "type": "function", "z": "f0f31eb6.22f16", "name": "Invert On Value", "func": "var ret_msg=msg;\nret_msg.payload.On = !msg.payload.On;\nreturn ret_msg;", "outputs": 1, "noerr": 0, "x": 520, "y": 180, "wires": [ [ "f476dcba.a6511" ] ] }, { "id": "8ec472b.e73e29", "type": "mqtt-broker", "z": "", "name": "mosquitto", "broker": "127.0.0.1", "port": "1883", "clientid": "", "usetls": false, "compatmode": true, "keepalive": "60", "cleansession": true, "birthTopic": "", "birthQos": "0", "birthPayload": "", "closeTopic": "", "closeQos": "0", "closePayload": "", "willTopic": "", "willQos": "0", "willPayload": "" }, { "id": "7948a496.505c2c", "type": "hb-conf", "z": "", "username": "111-11-111" } ] 


Somit ist es möglich, komplexe Automatisierungsschemata aus Blöcken zu „formen“. In der Bibliothek finden Sie Module mit Blockgruppen für völlig unterschiedliche Aufgaben, z. B. zum Aufzeichnen von Videoüberwachungskameras oder zum Arbeiten mit Dateien von Kameras.

PS Gedanken laut:
Ich bin von dem Gedanken verfolgt, dass viele, egal wie sich Technologien entwickeln, immer noch sehr weit von der banalen Automatisierung von Arbeits- und Lebensprozessen durch Programmierung entfernt sind. Ich hoffe wirklich, dass mit dem Aufkommen von Tools wie Node-Red oder Blockly die Eintrittsschwelle stark sinken wird. Nachdem die Leute gelernt haben, wie man ein System aus Cubes im selben Node-Red erstellt, werden sie wahrscheinlich zum Funktionsblock gelangen und JS mit Interesse lernen, und dann wird alles von selbst passieren.

Source: https://habr.com/ru/post/de462775/


All Articles