Themabewertung:
  • 4 Bewertung(en) - 5 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Eigener MyGekko-Node für Node-Red
#42
Hallo,

also meine HomeKit-Anbindung habe ich inzwischen ein wenig anders umgesetzt.
Das Problem ist, dass wenn man relativ viele MyGekko Komponenten einbindet, dass dann die Auslastung im MyGekko immer höher wird, da für jede Komponente eine Abfrage an die QueryAPI des Gekkos gesendet wird.
Ab einem gewissen Punkt bekommt man dann keine Antwort mehr von der QueryAPI.

Ich habe das jetzt so gelöst, dass ich über einen "Universal Node" alle Nachrichten jede Sekunde abfrage. Die notwendigen Infos sende ich dann an einen MQTT Server, den ich ebenfalls auf der gleichen VM installiert habe.
Auf dem angehängten Bild ist dies dann der Bereich den ich mit 1 gekennzeichnet habe. Die Werte werden nur an den MQTT Server geschickt, wenn sich diese geändert haben (rbe node).
In den Funktionen "Light 0" sowie "Light 1" muss dann jeweils das richtige "Item" also die richtige Lampe ausgewählt werden.

Im unteren Bereich werte ich dann die Nachrichten aus dem MQTT Server aus.
Da der HomeKit Node ein anderes Format braucht um angesprochen zu werden, braucht man dann wieder Funktionen, die die Nachrichten umwandeln ("Change Var" Node). Diese Funktionen machen aus dem true und false aus der MyGekko Abfrage ein Homekit kompatibles Format: msg.payload = {"On" : true oder false}

Dies kann man dann mit dem HomeKit Node einer Lampe verbinden. (bis hierhin hat man nur den Status der Lampe, also ob diese ein- oder ausgeschaltet ist aus dem Gekko automatisch an HomeKit übergeben)

Step 2 ist dann die Lampe über HomeKit schalten zu können.
Das Problem hierbei ist, dass dieser Node immer eine Ausgabe erzeugt. Also es erfolgt eine Ausgabe, wenn die Lampe über HomeKit eingeschaltet ist und es erfolgt eine Ausgabe, wenn die Lampe über MyGekko geschaltet wird. (das verursacht unterumständen, dass sich die beiden Nodes gegenseitig aufrufen. Also man schaltet die Lampe über MyGekko schnell an und aus. Der HomeKit Node würde die Lampe dann wieder einschalten, da die Verarbeitung länger gedauert hat)


Deshalb muss man die Ausgabe filtern, so dass nur Befehle an MyGekko gesendet werden, die durch den HomeKit Node erzeugt worden sind. Wenn eine Aktion von HomeKit gestartet wird, dann wird ein Objekt mit dem Namen hap.context mit übergeben. Wenn die Aktion durch MyGekko ausgelöst worden ist, dann ist die Ausgabe des HomeKit Nodes ohne dieses hap Objekt (Node "HomeKit Triggered?").

Dies übergebe ich dann schlussendlich an den Node der eine Lampe in MyGekko darstellt.
Diese MyGekko Lampe hängt an einem myGekko Server, mit einem sehr hohem Aktualisierungs-Intervall. Da mich die Ausgabe von diesem Node nicht interessiert, da alle Statuszustände über den Universal Node ermittelt werden. Der Universal Node hat ein Aktualisierungs-Intervall von einer Sekunde. So hat MyGekko eine geringe Auslastung und NodeRed hat quasi in Echtzeit alle Statuswerte.


Da dies meine erste Berührung mit NodeRed war, lässt sich das alles bestimmt eleganter umsetzten aber es funktioniert soweit ganz gut.

Beispiel:
Code:
[{"id":"aca4b72a.6097f8","type":"tab","label":"Flow 2","disabled":false,"info":""},{"id":"c55455be.2116b8","type":"mqtt in","z":"aca4b72a.6097f8","name":"Out light0.state","topic":"light0.state","qos":"2","datatype":"auto","broker":"19b1cf3c.cca461","x":160,"y":260,"wires":[["59bb5972.65de68"]]},{"id":"8a61a674.1639a8","type":"mqtt in","z":"aca4b72a.6097f8","name":"Out light1.state","topic":"light1.state","qos":"2","datatype":"auto","broker":"19b1cf3c.cca461","x":160,"y":300,"wires":[["a6779057.41c76"]]},{"id":"a6779057.41c76","type":"function","z":"aca4b72a.6097f8","name":"Change Var","func":"if (msg.payload === \"false\")\n{\n    msg.payload = {\"On\" : false}\n    return msg;\n}\n\nif (msg.payload === \"true\")\n{\n    msg.payload = {\"On\" : true}\n    return msg;\n}","outputs":1,"noerr":0,"x":350,"y":300,"wires":[["65fff662.3705c8"]]},{"id":"59bb5972.65de68","type":"function","z":"aca4b72a.6097f8","name":"Change Var","func":"if (msg.payload === \"false\")\n{\n    msg.payload = {\"On\" : false}\n    return msg;\n}\n\nif (msg.payload === \"true\")\n{\n    msg.payload = {\"On\" : true}\n    return msg;\n}","outputs":1,"noerr":0,"x":350,"y":260,"wires":[["adb4e242.254cf"]]},{"id":"bb818b47.70e7b8","type":"homekit-service","z":"aca4b72a.6097f8","isParent":true,"bridge":"efa185ba.788f18","accessoryCategory":"OTHER","parentService":"","name":"Wohnzimmer Licht","serviceName":"Lightbulb","topic":"","filter":false,"manufacturer":"Default Manufacturer","model":"Default Model","serialNo":"Default Serial Number","cameraConfigVideoProcessor":"ffmpeg","cameraConfigSource":"","cameraConfigStillImageSource":"","cameraConfigMaxStreams":2,"cameraConfigMaxWidth":1280,"cameraConfigMaxHeight":720,"cameraConfigMaxFPS":10,"cameraConfigMaxBitrate":300,"cameraConfigVideoCodec":"libx264","cameraConfigAudioCodec":"libfdk_aac","cameraConfigAudio":false,"cameraConfigPacketSize":1316,"cameraConfigVerticalFlip":false,"cameraConfigHorizontalFlip":false,"cameraConfigMapVideo":"0:0","cameraConfigMapAudio":"0:1","cameraConfigVideoFilter":"scale=1280:720","cameraConfigAdditionalCommandLine":"-tune zerolatency","cameraConfigDebug":false,"cameraConfigSnapshotOutput":"disabled","characteristicProperties":"{\"On\":true}","x":650,"y":260,"wires":[["79d86c57.814364"],[]]},{"id":"1ab26309.eb668d","type":"function","z":"aca4b72a.6097f8","name":"Homekit2MQTT","func":"return {payload :msg.payload.On};","outputs":1,"noerr":0,"x":1060,"y":300,"wires":[["368e57.dcd0e1aa"]]},{"id":"368e57.dcd0e1aa","type":"mygekko_light","z":"aca4b72a.6097f8","name":"Esszimmer Licht","itemid":"item1","server":"48574e42.32ce6","alexa_home_input":false,"x":1240,"y":300,"wires":[[]]},{"id":"65fff662.3705c8","type":"rbe","z":"aca4b72a.6097f8","name":"","func":"rbe","gap":"","start":"","inout":"out","property":"payload","x":490,"y":300,"wires":[["2d2f2e40.820e62"]]},{"id":"adb4e242.254cf","type":"rbe","z":"aca4b72a.6097f8","name":"","func":"rbe","gap":"","start":"","inout":"out","property":"payload","x":490,"y":260,"wires":[["bb818b47.70e7b8"]]},{"id":"f6ede498.f68518","type":"mygekko_light","z":"aca4b72a.6097f8","name":"Wohnzimmer Licht","itemid":"item0","server":"48574e42.32ce6","alexa_home_input":false,"x":1250,"y":260,"wires":[[]]},{"id":"2d2f2e40.820e62","type":"homekit-service","z":"aca4b72a.6097f8","isParent":true,"bridge":"efa185ba.788f18","accessoryCategory":"OTHER","parentService":"","name":"Esszimmer Licht","serviceName":"Lightbulb","topic":"","filter":false,"manufacturer":"Default Manufacturer","model":"Default Model","serialNo":"Default Serial Number","cameraConfigVideoProcessor":"ffmpeg","cameraConfigSource":"","cameraConfigStillImageSource":"","cameraConfigMaxStreams":2,"cameraConfigMaxWidth":1280,"cameraConfigMaxHeight":720,"cameraConfigMaxFPS":10,"cameraConfigMaxBitrate":300,"cameraConfigVideoCodec":"libx264","cameraConfigAudioCodec":"libfdk_aac","cameraConfigAudio":false,"cameraConfigPacketSize":1316,"cameraConfigVerticalFlip":false,"cameraConfigHorizontalFlip":false,"cameraConfigMapVideo":"0:0","cameraConfigMapAudio":"0:1","cameraConfigVideoFilter":"scale=1280:720","cameraConfigAdditionalCommandLine":"-tune zerolatency","cameraConfigDebug":false,"cameraConfigSnapshotOutput":"disabled","characteristicProperties":"{\"On\":true}","x":640,"y":300,"wires":[["ef06fb7c.aaab98"],[]]},{"id":"79d86c57.814364","type":"switch","z":"aca4b72a.6097f8","name":"HomeKit Triggered?","property":"hap.context","propertyType":"msg","rules":[{"t":"nnull"}],"checkall":"true","repair":false,"outputs":1,"x":860,"y":260,"wires":[["31dda996.595e66"]]},{"id":"31dda996.595e66","type":"function","z":"aca4b72a.6097f8","name":"Homekit2MQTT","func":"return {payload :msg.payload.On};","outputs":1,"noerr":0,"x":1060,"y":260,"wires":[["f6ede498.f68518"]]},{"id":"ef06fb7c.aaab98","type":"switch","z":"aca4b72a.6097f8","name":"HomeKit Triggered?","property":"hap.context","propertyType":"msg","rules":[{"t":"nnull"}],"checkall":"true","repair":false,"outputs":1,"x":860,"y":300,"wires":[["1ab26309.eb668d"]]},{"id":"a281b552.c4e478","type":"function","z":"aca4b72a.6097f8","name":"Light 0","func":"if (msg.payload.queryapi.lights.item0.sumstate.value.split(\";\")[0] === \"1\")\n{\n    msg.payload = true;  \n    return msg;\n}\nelse if (msg.payload.queryapi.lights.item0.sumstate.value.split(\";\")[0] === \"0\")\n{\n    msg.payload = false;   \n    return msg;\n}\n\n\n","outputs":1,"noerr":0,"x":350,"y":100,"wires":[["de6a68ec.9c9e98"]]},{"id":"7e6ed0d6.05933","type":"function","z":"aca4b72a.6097f8","name":"Light 1","func":"if (msg.payload.queryapi.lights.item1.sumstate.value.split(\";\")[0] === \"1\")\n{\n    msg.payload = true;  \n    return msg;\n}\nelse if (msg.payload.queryapi.lights.item1.sumstate.value.split(\";\")[0] === \"0\")\n{\n    msg.payload = false;   \n    return msg;\n}\n\n\n","outputs":1,"noerr":0,"x":350,"y":140,"wires":[["34fc65c8.718b2a"]]},{"id":"34fc65c8.718b2a","type":"rbe","z":"aca4b72a.6097f8","name":"","func":"rbe","gap":"","start":"","inout":"out","property":"payload","x":470,"y":140,"wires":[["9dbb8c01.55fcb"]]},{"id":"de6a68ec.9c9e98","type":"rbe","z":"aca4b72a.6097f8","name":"","func":"rbe","gap":"","start":"","inout":"out","property":"payload","x":470,"y":100,"wires":[["71fc360.4cf7dcc"]]},{"id":"71fc360.4cf7dcc","type":"mqtt out","z":"aca4b72a.6097f8","name":"light0.state","topic":"light0.state","qos":"0","retain":"false","broker":"19b1cf3c.cca461","x":610,"y":100,"wires":[]},{"id":"9dbb8c01.55fcb","type":"mqtt out","z":"aca4b72a.6097f8","name":"light1.state","topic":"light1.state","qos":"0","retain":"false","broker":"19b1cf3c.cca461","x":610,"y":140,"wires":[]},{"id":"e438fcd0.296d9","type":"mygekko_universal","z":"aca4b72a.6097f8","name":"myGekkoMsg","server":"5146f002.c863a","x":150,"y":180,"wires":[["a281b552.c4e478","7e6ed0d6.05933"]]},{"id":"19b1cf3c.cca461","type":"mqtt-broker","z":"","name":"MQTT Broker","broker":"localhost","port":"1883","clientid":"","usetls":false,"compatmode":false,"keepalive":"60","cleansession":true,"birthTopic":"","birthQos":"0","birthPayload":"","closeTopic":"","closeQos":"0","closePayload":"","willTopic":"","willQos":"0","willPayload":""},{"id":"efa185ba.788f18","type":"homekit-bridge","z":"","bridgeName":"NodeRed Bridge","pinCode":"111-11-111","port":"","allowInsecureRequest":false,"manufacturer":"Default Manufacturer","model":"Default Model","serialNo":"Default Serial Number","customMdnsConfig":false,"mdnsMulticast":true,"mdnsInterface":"","mdnsPort":"","mdnsIp":"","mdnsTtl":"","mdnsLoopback":true,"mdnsReuseAddr":true,"allowMessagePassthrough":true},{"id":"48574e42.32ce6","type":"mygekko_server","z":"","active":true,"api":"local","host":"192.168.2.11","interval":"100"},{"id":"5146f002.c863a","type":"mygekko_server","z":"","active":true,"api":"local","host":"192.168.2.11","interval":"1"}]

Viel Spaß damit.
Grüße 
Sascha


P.S.: Vielleicht kann MyGekko irgendwann von sich aus Nachrichten an einen MQTT Server senden, wenn sich der Zustand ändert. Dann würde dies noch ein wenig Auslastung am MyGekko sparen.

Das Beispiel oben müsste aber auch ohne MQTT Server gehen. So kann man die Info aber ggf. noch an einem weiteren Punkt verwenden.


Angehängte Dateien Thumbnail(s)
   


Nachrichten in diesem Thema
RE: Eigener MyGekko-Node für Node-Red - von SaschaD - 26.12.2019, 23:27

Möglicherweise verwandte Themen...
Thema Verfasser Antworten Ansichten Letzter Beitrag
  eMail mit Node Red versenden Tora 1 1.331 14.11.2023, 08:48
Letzter Beitrag: Strabbit
  Jalousie steuern und Temperatur Abfragen über Alexa / Node red OsramBulb 1 1.959 22.01.2023, 23:05
Letzter Beitrag: Strabbit
  Klingel über Node-Red abfragen Matze 6 9.322 01.03.2021, 12:45
Letzter Beitrag: Strabbit
  MyGekko-QueryAPI Anbindung an Node-Red über offizielles Repository Bluescreen 33 44.913 19.01.2021, 17:43
Letzter Beitrag: Strabbit
  Node-RED Befehle auf Gekko ausführen eschy 4 7.052 26.06.2020, 13:42
Letzter Beitrag: eschy

Gehe zu:


Benutzer, die gerade dieses Thema anschauen:
12 Gast/Gäste