NEWS
Abfrage Fensterstatus - wie geht es besser?
-
Hallo,
komme von der Fhem Gemeinde und bin ziemlich neu in Node-RED.
Angefangen habe ich mit folgender Aufgabe:
Ich will alle meine Fenster (HmIP-SWDO Fensterkontakte über Raspimatic) abfragen im Dashboard (ev. VIS) visualisieren und darüber in einer 2. Ausbaustufe die Gebäudehülle scharf/unscharf schalten.Umgesetzt habe ich mein Vorhaben (im Beispiel exemplarisch bei 2 Fenstern) wie folgt, denke aber es sollte da noch einen einfacheren/besseren Weg geben.
Fensterstatus
Ich will den Fensterstatus, nach einer Programmänderung oder Neustart immer sofort angezeigt bekommen und nicht erst nach einigen Minuten, wenn sich die Kontakte zyklisch bei der Zentrale melden, deshalb die Lösung mit den "Starttrigger" Node.
Gibt es eigentlich eine Möglichkeit, die Zustände von Aktoren in der Raspimatic direkt über JS abzufragen (und nich den Umweg über Nodes nehmen zu müssen)?
Im Anhang meine Lösung als json Import:
[ { "id": "71b67e01.be25e8", "type": "tab", "label": "Fensterstatus Test", "disabled": false, "info": "" }, { "id": "f68d7565.acc2b8", "type": "function", "z": "71b67e01.be25e8", "name": "Fensterstatus", "func": "// Deklarieren der globalen Variablen\nvar Fensterstatus_Haus = global.get(\"false\");\n\n// Deklarieren del context Variablen\nvar OG_TKE1_Haustuere = context.get(\"offen\");\nvar OG_FK1_Sportzimmer = context.get(\"offen\");\n\n// Fensterkontakte im Obergeschoß\nif (msg.topic == \"hm-rpc/1/0000D5691A485D/1/STATE\") {\n\tcontext.set(\"OG_TKE1_Haustuere\", msg.payload)\n}\nif (msg.topic == \"hm-rpc/1/0000D539D4C98B/1/STATE\") {\n\tcontext.set(\"OG_FK1_Sportzimmer\", msg.payload)\n}\n\n// Abfrage, ob irgend ein Fenster geöffnet ist\nif (context.get(\"OG_TKE1_Haustuere\") === \"1\" || \n context.get(\"OG_FK1_Sportzimmer\") === \"1\") {\n global.set(\"Fensterstatus_Haus\", false)\n} else {\n global.set(\"Fensterstatus_Haus\", true)\n}\nreturn {payload: global.get(\"Fensterstatus_Haus\")};", "outputs": 1, "noerr": 0, "x": 760, "y": 140, "wires": [ [ "b3fa26d0.acd478", "5ea82d84.0108ac" ] ] }, { "id": "e9325326.5f73f", "type": "link out", "z": "71b67e01.be25e8", "name": "Haustüre Flur OG", "links": [ "6b920ef.966437" ], "x": 615, "y": 100, "wires": [] }, { "id": "8260922f.9c67f8", "type": "ui_switch", "z": "71b67e01.be25e8", "name": "", "label": "Haustuere Flur OG", "tooltip": "", "group": "c45938aa.47374", "order": 1, "width": 0, "height": 0, "passthru": false, "decouple": "true", "topic": "", "style": "", "onvalue": "0", "onvalueType": "str", "onicon": "fa-lock fa-3x", "oncolor": "green", "offvalue": "1", "offvalueType": "str", "officon": "fa-unlock fa-3x", "offcolor": "red", "x": 1330, "y": 100, "wires": [ [] ] }, { "id": "6b920ef.966437", "type": "link in", "z": "71b67e01.be25e8", "name": "Haustüre Flur OG", "links": [ "e9325326.5f73f" ], "x": 1195, "y": 100, "wires": [ [ "8260922f.9c67f8" ] ] }, { "id": "9bcae400.af953", "type": "link out", "z": "71b67e01.be25e8", "name": "Fenster Sportzimmer OG", "links": [ "3d2d92a5.3d4eb6" ], "x": 615, "y": 180, "wires": [] }, { "id": "db282ed2.0ac26", "type": "ui_switch", "z": "71b67e01.be25e8", "name": "", "label": "Fenster Sportzimmer OG", "tooltip": "", "group": "c45938aa.47374", "order": 2, "width": 0, "height": 0, "passthru": false, "decouple": "true", "topic": "", "style": "", "onvalue": "0", "onvalueType": "str", "onicon": "fa-lock fa-3x", "oncolor": "green", "offvalue": "1", "offvalueType": "str", "officon": "fa-unlock fa-3x", "offcolor": "red", "x": 1350, "y": 180, "wires": [ [] ] }, { "id": "3d2d92a5.3d4eb6", "type": "link in", "z": "71b67e01.be25e8", "name": "Fenster Sportzimmer OG", "links": [ "9bcae400.af953" ], "x": 1195, "y": 180, "wires": [ [ "db282ed2.0ac26" ] ] }, { "id": "b3fa26d0.acd478", "type": "ui_switch", "z": "71b67e01.be25e8", "name": "", "label": "Heizung", "tooltip": "", "group": "49fd07ec.814a68", "order": 2, "width": 0, "height": 0, "passthru": false, "decouple": "true", "topic": "", "style": "", "onvalue": "true", "onvalueType": "bool", "onicon": "fa-thermometer-full fa-5x", "oncolor": "red", "offvalue": "false", "offvalueType": "bool", "officon": "fa-snowflake-o fa-5x", "offcolor": "blue", "x": 980, "y": 140, "wires": [ [] ] }, { "id": "8c49808a.3cf67", "type": "ui_text", "z": "71b67e01.be25e8", "group": "49fd07ec.814a68", "order": 3, "width": 0, "height": 0, "name": "Heizungsstatus", "label": "", "format": "{{msg.payload}}", "layout": "row-center", "x": 1000, "y": 300, "wires": [] }, { "id": "5ea82d84.0108ac", "type": "change", "z": "71b67e01.be25e8", "name": "BOOL To String", "rules": [ { "t": "change", "p": "payload", "pt": "msg", "from": "true", "fromt": "bool", "to": "Fenster geschlossen", "tot": "str" }, { "t": "change", "p": "payload", "pt": "msg", "from": "false", "fromt": "bool", "to": "Fenster geöffnet", "tot": "str" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1000, "y": 220, "wires": [ [ "8c49808a.3cf67" ] ] }, { "id": "45dca1fa.2601d", "type": "ioBroker get", "z": "71b67e01.be25e8", "name": "OG_TKE1_Haustuere", "topic": "hm-rpc.1.0000D5691A485D.1.STATE", "attrname": "payload", "payloadType": "value", "x": 480, "y": 100, "wires": [ [ "e9325326.5f73f", "f68d7565.acc2b8" ] ] }, { "id": "1332859.d5fe37a", "type": "ioBroker get", "z": "71b67e01.be25e8", "name": "OG_FK1_Sportzimmer", "topic": "hm-rpc.1.0000D539D4C98B.1.STATE", "attrname": "payload", "payloadType": "value", "x": 480, "y": 180, "wires": [ [ "9bcae400.af953", "f68d7565.acc2b8" ] ] }, { "id": "8d4d9f44.a4d318", "type": "ioBroker in", "z": "71b67e01.be25e8", "name": "OG_FK1_Sportzimmer", "topic": "hm-rpc.1.0000D539D4C98B.1.STATE", "payloadType": "value", "onlyack": "", "func": "all", "gap": "", "x": 140, "y": 180, "wires": [ [ "1332859.d5fe37a" ] ] }, { "id": "11120174.79da97", "type": "ioBroker in", "z": "71b67e01.be25e8", "name": "OG_TKE1_Haustuere", "topic": "hm-rpc.1.0000D5691A485D.1.STATE", "payloadType": "value", "onlyack": "", "func": "all", "gap": "", "x": 140, "y": 100, "wires": [ [ "45dca1fa.2601d" ] ] }, { "id": "4d4bde28.bd59d8", "type": "inject", "z": "71b67e01.be25e8", "name": "Starttrigger", "topic": "hm-rpc/1/0000D5691A485D/1/STATE", "payload": "1", "payloadType": "str", "repeat": "", "crontab": "", "once": true, "onceDelay": 0.1, "x": 250, "y": 60, "wires": [ [ "45dca1fa.2601d" ] ] }, { "id": "b360e366.c91718", "type": "inject", "z": "71b67e01.be25e8", "name": "Starttrigger", "topic": "hm-rpc/1/0000D539D4C98B/1/STATE", "payload": "1", "payloadType": "str", "repeat": "", "crontab": "", "once": true, "onceDelay": 0.1, "x": 250, "y": 140, "wires": [ [ "1332859.d5fe37a" ] ] }, { "id": "c45938aa.47374", "type": "ui_group", "z": "", "name": "Fensterstatus OG", "tab": "47088c24.44c5bc", "order": 2, "disp": true, "width": "6", "collapse": false }, { "id": "49fd07ec.814a68", "type": "ui_group", "z": "", "name": "Fenster Haus", "tab": "47088c24.44c5bc", "order": 1, "disp": true, "width": "6", "collapse": false }, { "id": "47088c24.44c5bc", "type": "ui_tab", "z": "", "name": "Fenster", "icon": "dashboard", "order": 3, "disabled": false, "hidden": false } ]
Bei 2 Fenstern ist das ja noch ganz überschaubar, aber bei über 13 Fenstern wird der Flow schon sehr unübersichtlich.
Sicher bin ich nicht der Einzige, welcher so eine Aufgabe in Node-Red gelöst hat und es gibt auch einfachere und bessere Lösungen, dieses Ziel zu erreichen.
Es wäre nett, wenn Ihr mir hierzu noch einige Tipps geben könntet, als Anfänger fehlt einem einfach der Überblick und wahrscheinlich denkt man sehr umständlich.
Habt ihr noch einige Links für mich, wo einige Beispiele in Node-RED zu finden sind und welche einem Einsteiger helfen könnten.Vielen Dank für eure Tipps
Gruß Reinhard -
Bin zwar auch Anfänger aber als hoffentlich hilfreichen Tip...
Ich frage die HMIP Fenstersensoren mit Blockly ab, was ja meines eingeschränkten Wissens ja auch "nur" JS ist. Zumindest kann man zwischen Blockly und JS umschalten!
Und da gleich noch ein Hinweis, die Sensoren senden 0 und 1 für geschlossen und offen... -
@Rewe2000 sagte in Abfrage Fensterstatus - wie geht es besser?:
Ich will den Fensterstatus, nach einer Programmänderung oder Neustart immer sofort angezeigt bekommen und nicht erst nach einigen Minuten, wenn sich die Kontakte zyklisch bei der Zentrale melden, deshalb die Lösung mit den "Starttrigger" Node.
Der Startup-Trigger holt den Status (in deinen Beispiel) automatisch beim Start des Flows, was beim Start von Node-Red(Adapter) oder beim Deploy passiert.
Voraussetzung dafür ist natürlich, das dein Startup-Trigger richtig eingestellt ist.
Eine ganz andere Frage ist allerdings, ob der aktuelle Status auch angezeigt wird, wenn du das Browserfenster öffnest.
Das geschieht nämlich NUR, wenn ein neuer Status gelesen wird.
Entweder weil ein aktueller Status (der sich nicht ändern muss) gelesen wird, oder eben erstmalig durch den Startup-Trigger).
Verlässt du zwischendurch dein Browser-Fenster und ruft es neu auf, führt das ja nicht dazu, dass dein Startup-Trigger neu gefeuert wird. Das Dashboard-Fenster kann eine Änderung nicht anzeigen, die erfolgte während es geschlossen war.Du kannst das nur umschiffen, wenn du einen Trigger nutzt, der feuert, wenn das Browserfenster aufgerufen wird. Wie man das macht hab ich hier mal gezeigt: https://forum.iobroker.net/topic/26605/node-red-visualisierung-nach-startup/3