NEWS
Zugriff auf andere ioBroker Objekte im Flow?
-
Ich würde gerne innerhalb eines Flows, der z.B. durch das Außenthermometer getriggert wird, auf die Werte von anderen Homematic Sensoren innerhalb eines Function Nodes zugreifen - bin aber nicht sicher ob - und wie - es gehen könnte.
Die einzige Lösung, die mir in den Sinn gekommen ist: Den Topic "*" abonnieren und einfach alles in ein context.global.state Objekt in node-red zu schreiben. Gibt's noch einen besseren Weg?
-
Die Frage hatte ich auch einmal gestellt und sie wurde negativ beantwortet (nicht möglich), mit der Erklärung warum:
-
Danke, das dachte ich mir schon. Dann will ich hier zumindest meinen Workaround veröffentlichen.
Ich nehme alle Nachrichten von einem bestimmten Zweig aus dem IOBroker und schreibe die in eine globale Variable in node-red:
context.global.state=context.global.state || {}; var topics = msg.topic.split("/"); var obj=context.global.state[topics[2]] || {}; obj[topics[4]]=msg.payload; context.global.state[topics[2]]=obj; msg.payload=context.global.state; return msg;
Damit baut sich in node-red eine Kopie des Status auf, der in jedem anderen Knoten ausgelesen werden kann.
Hier der gesamte Flow:
[{"id":"4cd83049.b327d","type":"function","name":"HM Status","func":"context.global.state=context.global.state || {};\nvar topics = msg.topic.split(\"/\");\nvar obj=context.global.state[topics[2]] || {};\nobj[topics[4]]=msg.payload;\ncontext.global.state[topics[2]]=obj;\nmsg.payload=context.global.state;\nreturn msg;","outputs":1,"noerr":0,"x":307,"y":43,"z":"88669efa.77996","wires":[["45440a29.babbf4"]]},{"id":"45440a29.babbf4","type":"debug","name":"","active":true,"console":"false","complete":"false","x":529,"y":43,"z":"88669efa.77996","wires":[]},{"id":"3f5d8b2c.c0a274","type":"http in","name":"","url":"/state","method":"get","swaggerDoc":"","x":94,"y":155,"z":"88669efa.77996","wires":[["bef86295.4107a"]]},{"id":"cbe3f0f4.341c1","type":"http response","name":"","x":450,"y":155,"z":"88669efa.77996","wires":[]},{"id":"bef86295.4107a","type":"function","name":"","func":"msg.payload=context.global.state || {};\nreturn msg;","outputs":1,"noerr":0,"x":269,"y":155,"z":"88669efa.77996","wires":[["cbe3f0f4.341c1"]]},{"id":"4e385fd6.b1c7a","type":"ioBroker in","name":"","topic":"hm-rpc.0.*","payloadType":"object","x":100,"y":43,"z":"88669efa.77996","wires":[["4cd83049.b327d"]]}]
Im Flow gibt es auch einen http Knoten, um sich den Zustand im Browser anzusehen: http://raspi2:1880/state.
Beispiel Ausgabe im Browser:
{ "JEQ015XXXX": { "BRIGHTNESS": { "val": 49, "ack": true, "ts": 1438836131, "from": "system.adapter.hm-rpc.0", "lc": 1438836131 }, "ERROR": { "val": 0, "ack": true, "ts": 1438836131, "from": "system.adapter.hm-rpc.0", "lc": 1437798650 } }, "LEQ053XXXX": { "BOOT": { "val": true, "ack": true, "ts": 1438836140, "from": "system.adapter.hm-rpc.0", "lc": 1437798621 }, "ENERGY_COUNTER": { "val": 4.8, "ack": true, "ts": 1438836140, "from": "system.adapter.hm-rpc.0", "lc": 1438799077 }, "POWER": { "val": 0, "ack": true, "ts": 1438836140, "from": "system.adapter.hm-rpc.0", "lc": 1438799086 }, ... }
-
Danke für die Info! Da hast Du in der Tat eine Lösung gefunden