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