NEWS
Flow Optimieren
-
Hallo an Alle
ich bin fasziniert vom Node-Red und begeistert über dieses Drag and Drop verfahren durch diese Grafische Darstellung..
Dennoch komme ich von FHEM und da gab es sowas halt nicht ^^ und jetzt versuche ich meine Flows auch wirklich zu Optimieren um am Ende irgendwann noch durchzusteigen..
Zur Info, ich nutze Alexa, Siri, MAX und die UI und möchte am Ende bei jedem Gerät dann auch die tatsächliche Ausgabe haben.. Dies funktioniert auch super. Aber der FLOW ist Katastrophal
eventuell kann mir jemand nen Tipp geben wie ich es besser lösen kann.. ich habe halt viel Response um die Geräte in sich aktuell zu halten.
Hier mein Flow:
https://www.directupload.net/file/d/5298/w7mt5ril_jpg.htm ~~````
[
{
"id": "a57621dc.1d6ef",
"type": "function",
"z": "6c487d5b.5761f4",
"name": "Wohnzimmer setpoint manual",
"func": "msg.payload = {rf_address:"02a00a", degrees: msg.payload, mode:"1"};\nreturn msg;",
"outputs": 1,
"noerr": 0,
"x": 1580,
"y": 140,
"wires": [
[
"fd1276d1.feec28"
]
]
},
{
"id": "fd1276d1.feec28",
"type": "maxcube in",
"z": "6c487d5b.5761f4",
"server": "cac16036.406e",
"x": 1820,
"y": 190,
"wires": []
},
{
"id": "6a53e5a4.2db39c",
"type": "alexa-home",
"z": "6c487d5b.5761f4",
"conf": "",
"device": "39363",
"acknoledge": true,
"name": "",
"topic": "",
"x": 190,
"y": 140,
"wires": [
[
"1f3839ec.305816"
]
]
},
{
"id": "197a705f.3d4cd",
"type": "function",
"z": "6c487d5b.5761f4",
"name": "Badezimmer setpoint manual",
"func": "msg.payload = {rf_address:"10c706", degrees: msg.payload, mode:"1"};\nreturn msg;",
"outputs": 1,
"noerr": 0,
"x": 1590,
"y": 240,
"wires": [
[
"fd1276d1.feec28"
]
]
},
{
"id": "ddc18845.3636f8",
"type": "alexa-home",
"z": "6c487d5b.5761f4",
"conf": "",
"device": "39377",
"acknoledge": true,
"name": "",
"topic": "",
"x": 190,
"y": 240,
"wires": [
[
"e6e2b4cc.b97918"
]
]
},
{
"id": "d1907b68.f1f228",
"type": "function",
"z": "6c487d5b.5761f4",
"name": "Küche setpoint manual",
"func": "msg.payload = {rf_address:"03c40a", degrees: msg.payload, mode:"1"};\nreturn msg;",
"outputs": 1,
"noerr": 0,
"x": 1610,
"y": 190,
"wires": [
[
"fd1276d1.feec28"
]
]
},
{
"id": "155e0b35.63cf85",
"type": "alexa-home",
"z": "6c487d5b.5761f4",
"conf": "",
"device": "39378",
"acknoledge": true,
"name": "",
"topic": "",
"x": 190,
"y": 190,
"wires": [
[
"2d4f7ed9.0e6192"
]
]
},
{
"id": "73af01ae.567e",
"type": "alexa-home",
"z": "6c487d5b.5761f4",
"conf": "",
"device": "39852",
"acknoledge": true,
"name": "",
"topic": "",
"x": 150,
"y": 300,
"wires": [
[
"c1c72dae.ca35d"
]
]
},
{
"id": "c1c72dae.ca35d",
"type": "function",
"z": "6c487d5b.5761f4",
"name": "An/Aus",
"func": "var msg1 = { payload:"20" };\nvar msg2 = { payload:"4.5" };\n\nif (msg.payload === true) {\n return msg1;\n} else {\n return msg2;\n}",
"outputs": 1,
"noerr": 0,
"x": 690,
"y": 300,
"wires": [
[
"2d4f7ed9.0e6192",
"e6e2b4cc.b97918",
"1f3839ec.305816"
]
]
},
{
"id": "786301ee.13bb4",
"type": "function",
"z": "6c487d5b.5761f4",
"name": "return",
"func": "return {payload: {CurrentTemperature: msg.payload}};",
"outputs": 1,
"noerr": 0,
"x": 680,
"y": 390,
"wires": [
[
"58a6d437.56316c"
]
]
},
{
"id": "90e00688.20ea08",
"type": "function",
"z": "6c487d5b.5761f4",
"name": "func",
"func": "\nvar Heizen = { payload: msg.payload.TargetTemperature };\n\n\n\n return Heizen;\n",
"outputs": 1,
"noerr": 0,
"x": 1220,
"y": 390,
"wires": [
[
"1f3839ec.305816"
]
]
},
{
"id": "20eaff46.684e1",
"type": "function",
"z": "6c487d5b.5761f4",
"name": "func",
"func": "\nvar Heizen = { payload: msg.payload.TargetTemperature };\n\n\n\n return Heizen;\n",
"outputs": 1,
"noerr": 0,
"x": 1230,
"y": 480,
"wires": [
[
"2d4f7ed9.0e6192"
]
]
},
{
"id": "719780d.7ab928",
"type": "function",
"z": "6c487d5b.5761f4",
"name": "func",
"func": "\nvar Heizen = { payload: msg.payload.TargetTemperature };\n\n\n\n return Heizen;\n",
"outputs": 1,
"noerr": 0,
"x": 1230,
"y": 560,
"wires": [
[
"e6e2b4cc.b97918"
]
]
},
{
"id": "2f061e32.4a7b22",
"type": "inject",
"z": "6c487d5b.5761f4",
"name": "GetTemps",
"topic": "",
"payload": "true",
"payloadType": "bool",
"repeat": "300",
"crontab": "",
"once": true,
"onceDelay": "",
"x": 190,
"y": 480,
"wires": [
[
"c2d064b5.403ae8",
"37647186.89acbe",
"dd86eb63.25cea8"
]
]
},
{
"id": "c2d064b5.403ae8",
"type": "ioBroker get",
"z": "6c487d5b.5761f4",
"name": "Wandthermostat 1 temperature",
"topic": "maxcube.0.devices.thermostat_02a00a.temp",
"attrname": "payload",
"payloadType": "value",
"x": 470,
"y": 390,
"wires": [
[
"786301ee.13bb4",
"e57c07ce.887758"
]
]
},
{
"id": "f7c930c0.ad8a7",
"type": "function",
"z": "6c487d5b.5761f4",
"name": "return",
"func": "return {payload: {CurrentTemperature: msg.payload}};",
"outputs": 1,
"noerr": 0,
"x": 680,
"y": 480,
"wires": [
[
"1d29cef2.8e2f41"
]
]
},
{
"id": "d0823b2a.fa8228",
"type": "function",
"z": "6c487d5b.5761f4",
"name": "return",
"func": "return {payload: {CurrentTemperature: msg.payload}};",
"outputs": 1,
"noerr": 0,
"x": 680,
"y": 560,
"wires": [
[
"d8224eac.6dd3c"
]
]
},
{
"id": "37647186.89acbe",
"type": "ioBroker get",
"z": "6c487d5b.5761f4",
"name": "Küch temperature",
"topic": "maxcube.0.devices.thermostat_03c40a.temp",
"attrname": "payload",
"payloadType": "value",
"x": 430,
"y": 480,
"wires": [
[
"f7c930c0.ad8a7",
"74ce215f.5828d"
]
]
},
{
"id": "dd86eb63.25cea8",
"type": "ioBroker get",
"z": "6c487d5b.5761f4",
"name": "Wandthermostat 1 temperature",
"topic": "maxcube.0.devices.thermostat_10c706.temp",
"attrname": "payload",
"payloadType": "value",
"x": 470,
"y": 560,
"wires": [
[
"d0823b2a.fa8228",
"f5fb9161.625dc"
]
]
},
{
"id": "e57c07ce.887758",
"type": "ui_gauge",
"z": "6c487d5b.5761f4",
"name": "",
"group": "56ff2f28.47cab",
"order": 1,
"width": 0,
"height": 0,
"gtype": "donut",
"title": "Heizung",
"label": "Celsius",
"format": "{{value}}",
"min": "5",
"max": "26",
"colors": [
"#0060ff",
"#24e400",
"#ca3838"
],
"seg1": "20",
"seg2": "20",
"x": 690,
"y": 350,
"wires": []
},
{
"id": "58a6d437.56316c",
"type": "homekit-service",
"z": "6c487d5b.5761f4",
"bridge": "1cb3a27f.51967e",
"name": "Wohnzimmer Heizung",
"serviceName": "Thermostat",
"manufacturer": "Default Manufacturer",
"model": "Default Model",
"serialNo": "Default Serial Number",
"characteristicProperties": "{\n "TargetTemperature": {\n "minValue": 4.5,\n "maxValue": 26,\n "minStep": 0.5\n}\n \n}",
"x": 930,
"y": 390,
"wires": [
[
"90e00688.20ea08"
]
]
},
{
"id": "1d29cef2.8e2f41",
"type": "homekit-service",
"z": "6c487d5b.5761f4",
"bridge": "1cb3a27f.51967e",
"name": "Küche Heizung",
"serviceName": "Thermostat",
"manufacturer": "Default Manufacturer",
"model": "Default Model",
"serialNo": "Default Serial Number",
"characteristicProperties": "{\n "TargetTemperature": {\n "minValue": 4.5,\n "maxValue": 26,\n "minStep": 0.5\n}\n \n}",
"x": 950,
"y": 480,
"wires": [
[
"20eaff46.684e1"
]
]
},
{
"id": "d8224eac.6dd3c",
"type": "homekit-service",
"z": "6c487d5b.5761f4",
"bridge": "1cb3a27f.51967e",
"name": "Badezimmer Heizung",
"serviceName": "Thermostat",
"manufacturer": "Default Manufacturer",
"model": "Default Model",
"serialNo": "Default Serial Number",
"characteristicProperties": "{\n "TargetTemperature": {\n "minValue": 4.5,\n "maxValue": 26,\n "minStep": 0.5\n}\n \n}",
"x": 930,
"y": 560,
"wires": [
[
"719780d.7ab928"
]
]
},
{
"id": "74ce215f.5828d",
"type": "ui_gauge",
"z": "6c487d5b.5761f4",
"name": "",
"group": "bfabf323.eac56",
"order": 1,
"width": 0,
"height": 0,
"gtype": "donut",
"title": "Heizung",
"label": "Celsius",
"format": "{{value}}",
"min": "5",
"max": "26",
"colors": [
"#0060ff",
"#24e400",
"#ca3838"
],
"seg1": "20",
"seg2": "20",
"x": 690,
"y": 440,
"wires": []
},
{
"id": "f5fb9161.625dc",
"type": "ui_gauge",
"z": "6c487d5b.5761f4",
"name": "",
"group": "a61eadd2.b64c5",
"order": 1,
"width": 0,
"height": 0,
"gtype": "donut",
"title": "Heizung",
"label": "Celsius",
"format": "{{value}}",
"min": "5",
"max": "26",
"colors": [
"#0060ff",
"#24e400",
"#ca3838"
],
"seg1": "20",
"seg2": "20",
"x": 690,
"y": 520,
"wires": []
},
{
"id": "2d4f7ed9.0e6192",
"type": "ui_numeric",
"z": "6c487d5b.5761f4",
"name": "",
"label": "Temperatur",
"group": "bfabf323.eac56",
"order": 2,
"width": 0,
"height": 0,
"passthru": true,
"topic": "",
"format": "{{value}}",
"min": "4.5",
"max": "26",
"step": "0.5",
"x": 1000,
"y": 190,
"wires": [
[
"d1907b68.f1f228",
"65b661c1.e26ae"
]
]
},
{
"id": "e6e2b4cc.b97918",
"type": "ui_numeric",
"z": "6c487d5b.5761f4",
"name": "",
"label": "Temperatur",
"group": "a61eadd2.b64c5",
"order": 2,
"width": 0,
"height": 0,
"passthru": true,
"topic": "",
"format": "{{value}}",
"min": "4.5",
"max": "26",
"step": "0.5",
"x": 1000,
"y": 240,
"wires": [
[
"197a705f.3d4cd",
"b25bbf0f.8ca07"
]
]
},
{
"id": "1f3839ec.305816",
"type": "ui_numeric",
"z": "6c487d5b.5761f4",
"name": "",
"label": "Temperatur",
"group": "56ff2f28.47cab",
"order": 2,
"width": 0,
"height": 0,
"passthru": true,
"topic": "",
"format": "{{value}}",
"min": "4.5",
"max": "26",
"step": "0.5",
"x": 1000,
"y": 140,
"wires": [
[
"a57621dc.1d6ef",
"18b30ed7.655131"
]
]
},
{
"id": "18b30ed7.655131",
"type": "function",
"z": "6c487d5b.5761f4",
"name": "return",
"func": "var msg1 = {payload: { TargetTemperature: msg.payload, TargetHeatingCoolingState: "0" }};\nvar msg2 = {payload: { TargetTemperature: msg.payload, TargetHeatingCoolingState: "1" }};\n\nif (msg.payload == "4.5") {\n return msg1;\n} else {\n return msg2;\n}\n",
"outputs": 1,
"noerr": 0,
"x": 980,
"y": 350,
"wires": [
[
"58a6d437.56316c"
]
]
},
{
"id": "65b661c1.e26ae",
"type": "function",
"z": "6c487d5b.5761f4",
"name": "return",
"func": "var msg1 = {payload: { TargetTemperature: msg.payload, TargetHeatingCoolingState: "0" }};\nvar msg2 = {payload: { TargetTemperature: msg.payload, TargetHeatingCoolingState: "1" }};\n\nif (msg.payload == "4.5") {\n return msg1;\n} else {\n return msg2;\n}\n",
"outputs": 1,
"noerr": 0,
"x": 980,
"y": 440,
"wires": [
[
"1d29cef2.8e2f41"
]
]
},
{
"id": "b25bbf0f.8ca07",
"type": "function",
"z": "6c487d5b.5761f4",
"name": "return",
"func": "var msg1 = {payload: { TargetTemperature: msg.payload, TargetHeatingCoolingState: "0" }};\nvar msg2 = {payload: { TargetTemperature: msg.payload, TargetHeatingCoolingState: "1" }};\n\nif (msg.payload == "4.5") {\n return msg1;\n} else {\n return msg2;\n}\n",
"outputs": 1,
"noerr": 0,
"x": 980,
"y": 520,
"wires": [
[
"d8224eac.6dd3c"
]
]
},
{
"id": "cac16036.406e",
"type": "maxcube-server",
"z": "",
"host": "1.2.3.110",
"port": "62910"
},
{
"id": "56ff2f28.47cab",
"type": "ui_group",
"z": "",
"name": "Wohnzimmer",
"tab": "4b4e4d6a.678844",
"order": 2,
"disp": true,
"width": "6",
"collapse": true
},
{
"id": "1cb3a27f.51967e",
"type": "homekit-bridge",
"z": "",
"bridgeName": "Plastikjunkies",
"pinCode": "111-11-111",
"port": "",
"manufacturer": "Default Manufacturer",
"model": "Default Model",
"serialNo": "Default Serial Number"
},
{
"id": "bfabf323.eac56",
"type": "ui_group",
"z": "",
"name": "Küche",
"tab": "4b4e4d6a.678844",
"order": 4,
"disp": true,
"width": "6",
"collapse": true
},
{
"id": "a61eadd2.b64c5",
"type": "ui_group",
"z": "",
"name": "Badezimmer",
"tab": "4b4e4d6a.678844",
"order": 3,
"disp": true,
"width": "6",
"collapse": false
},
{
"id": "4b4e4d6a.678844",
"type": "ui_tab",
"z": "",
"name": "Wohnung",
"icon": "dashboard",
"order": 2
}
] -
Was willst du da besser machen
Sieht doch gut aus!
Höchstens, noch ein paar allgemeine Anmerkungen:
Übersichtlichkeit
Kann man ja nicht grad von Unübersichtlichkeit bei deinem Flow sprechen
Aber falls es komplexer wird:
- nutze subflows, wo sich Funktionalitäten sinnvoll zusammenfassen lassen
https://nodered.org/docs/user-guide/edi … e/subflows
-
nutze Link-nodes um die optische Übersichtlichkeit zu erhöhen
-
nutze comment-nodes um den flow zu kommentieren
-
nutze eindeutige Namen für deine nodes, aus denen möglichst die Funktion hervorgeht
-
bei functions-nodes kann ein entsprechender node.status sehr hilfreich sein
Funktionalität
- Wo immer möglich, verwende core-node statt function-node
Meist kann man function-nodes durch switch/change nodes ersetzen.
-
wo das nicht möglich/sinnvoll ist, gehe sparsam mit function-nodes um. Lieber einen function-node mit viel Funktionalität als mehrere mit wenig Funktionalität
-
befasse dich mit JSONata, wenn du mit komplexen JSON-Abfragen/Aufbereitungen zu tun hast (Multi-Line Chart Input, Datenbank In-/Output etc)
JSONata ist äußerst mächtig. Da kann eine Seite JS-Code schon mal zum Einzeiler werden.
Warum sparsam mit function-nodes?:
-
function-nodes laufen pro node in einer sandbox und brauchen deshalb mehr Ressourcen (Speicher und Geschwindigkeit)
-
In function-nodes steht einem (nahezu) die volle Javascript-Power zur Verfügung. Das ist Segen und Fluch! Da kann natürlich auch viel daneben gehen und es widerspricht dem Grundgedanken von node-red (ein node für eine Funktion)
-
i.d.R läuft ein function-nodes synchron als eine Funktion. Das kann den kompletten Flow leicht ausbremsen.
-
Und last but not least: Wenn du intensiv function-nodes einsetzt, wirst du dich bald fragen, warum du den Kram nicht gleich in JS löst. Ich weis wovon ich rede :lol:
Das wir uns nicht falsch verstehen, ich sag nicht, dass man keine function-nodes verwenden soll! Man soll die Teile lediglich nicht leichtfertig einsetzen.
ergänzt 12.12.18
-
Moin Moin,
mega danke für deine Tipps, alleine das Link in-out bringt mir die Übersichtlichkeit die ich haben will
Damit verschwinden schonmal einige Wires
Das war nur der untere Teil meines Flows daher sah es wohl noch "übersichtlich aus"
Hier der Aktuelle Flow:
https://www.directupload.net/file/d/5298/4qqg8nni_jpg.htm ~~Du meintest ich sollte weniger Functions nutzen oder es anders machen.. wie könnte ich denn solche Functions anders einsetzen ?
var msg1 = { payload: {On:1} }; var msg2 = { payload: {On:0} }; if (msg.payload === true) { return msg1; } else { return msg2; }
return {payload: msg.payload.On};
msg.payload = {rf_address:"03c3c6", degrees: msg.payload, mode:"0"}; return msg; ````~~
-
Zum Beispiel so:
! ````
[
{
"id": "2d8e04fd.0126dc",
"type": "inject",
"z": "506e6085.abc5d8",
"name": "true",
"topic": "",
"payload": "true",
"payloadType": "bool",
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"x": 353.5,
"y": 352,
"wires": [
[
"83df29ff.817e48"
]
]
},
{
"id": "3a00e36.c3e061c",
"type": "inject",
"z": "506e6085.abc5d8",
"name": "false",
"topic": "",
"payload": "false",
"payloadType": "bool",
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"x": 352,
"y": 412,
"wires": [
[
"83df29ff.817e48"
]
]
},
{
"id": "83df29ff.817e48",
"type": "change",
"z": "506e6085.abc5d8",
"name": "true/false -> {"on": 1/0}",
"rules": [
{
"t": "change",
"p": "payload",
"pt": "msg",
"from": "true",
"fromt": "bool",
"to": "{"on": 1}",
"tot": "json"
},
{
"t": "change",
"p": "payload",
"pt": "msg",
"from": "false",
"fromt": "bool",
"to": "{"on":0}",
"tot": "json"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 598.5,
"y": 380,
"wires": [
[
"1432e8ed.7c8f3f"
]
]
},
{
"id": "1432e8ed.7c8f3f",
"type": "debug",
"z": "506e6085.abc5d8",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"x": 816.5,
"y": 380,
"wires": []
},
{
"id": "7b14cd00.07db84",
"type": "change",
"z": "506e6085.abc5d8",
"name": "payload -> payload.on ",
"rules": [
{
"t": "move",
"p": "payload",
"pt": "msg",
"to": "payload.on",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 589.5,
"y": 214,
"wires": [
[
"53736dc1.04afb4"
]
]
},
{
"id": "53736dc1.04afb4",
"type": "debug",
"z": "506e6085.abc5d8",
"name": "after change-node",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"x": 847.5,
"y": 215,
"wires": []
},
{
"id": "659e896c.a675d8",
"type": "inject",
"z": "506e6085.abc5d8",
"name": "i am first msg.payload",
"topic": "",
"payload": "i am first msg.payload",
"payloadType": "str",
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"x": 331.5,
"y": 213,
"wires": [
[
"7b14cd00.07db84",
"83b55682.09b688"
]
]
},
{
"id": "83b55682.09b688",
"type": "debug",
"z": "506e6085.abc5d8",
"name": "before change-node",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"x": 612,
"y": 278,
"wires": []
},
{
"id": "cccf27bb.0bee5",
"type": "inject",
"z": "506e6085.abc5d8",
"name": "degrees",
"topic": "",
"payload": "42",
"payloadType": "num",
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"x": 353.5,
"y": 508,
"wires": [
[
"1b42f390.6bf80c"
]
]
},
{
"id": "cfb30221.5b4678",
"type": "debug",
"z": "506e6085.abc5d8",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"x": 971.5,
"y": 507,
"wires": []
},
{
"id": "1b42f390.6bf80c",
"type": "change",
"z": "506e6085.abc5d8",
"name": "{rf_address:"03c3c6", degrees: payload, mode:"0"};",
"rules": [
{
"t": "set",
"p": "temp",
"pt": "flow",
"to": "{"rf_address":"03c3c6","degrees":0,"mode":"0"}",
"tot": "json"
},
{
"t": "set",
"p": "temp.degrees",
"pt": "flow",
"to": "payload",
"tot": "msg"
},
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "temp",
"tot": "flow"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 664.5,
"y": 508,
"wires": [
[
"cfb30221.5b4678"
]
]
}
]` > CODE: ALLES AUSWÄHLEN > > var msg1 = { payload: {On:1} }; > > var msg2 = { payload: {On:0} }; > > if (msg.payload === true) { > > return msg1; > > } else { > > return msg2; > > } `  ` > CODE: ALLES AUSWÄHLEN > > return {payload: msg.payload.On}; `  Nr.3 ist etwas tricky ` > CODE: ALLES AUSWÄHLEN > > msg.payload = {rf_address:"03c3c6", degrees: msg.payload, mode:"0"}; > > return msg; `  Das sind mal nur so die Grundmöglichkeiten von change-node. Die Teile sind weitaus mächtiger. Stichwort JSONata. Gruß
-
Nachtrag,
apropos JSONata. Damit geht dann auch Nr. 3 viel einfacher und ohne temp oder sowas:
! ````
[
{
"id": "a9e5de60.ef41d8",
"type": "change",
"z": "506e6085.abc5d8",
"name": "{rf_address:"03c3c6", degrees: payload, mode:"0"};",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "{\t "rf_address":"03c3c6",\t "degrees":payload,\t "mode":"0"\t}",
"tot": "jsonata"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 671,
"y": 599,
"wires": [
[
"cfb30221.5b4678"
]
]
}
] -
Okay, das ist geil!
Danke dir schonmal
das macht es einem viel einfacher und man versteht auch etwas mehr die Change Function ,-)
-
So jetzt wird das auch was
Erst wollte es nicht so ganz aber den Fehler habe ich dann gefunden..
Bei der " return {payload: msg.payload.On}; " hattest du "on" geschrieben und es war genau verkehrt herum.. da ich aus payload.On -> payload machen muss.. aber halb so schlimm so habe ich selbst etwas gelernt
-
Na wenn das mal nicht super aussieht!
Mit JSONata-Expression im change Node lassen sich die Sachen meist ganz simpel lösen.
z.B.
var msg1 = { payload: {On:1} }; var msg2 = { payload: {On:0} }; if (msg.payload === true) { return msg1; } else { return msg2; }
entspricht dem JSONata Ausdruck:
{ "on": (payload = true) ? 1 : 0 }
Hier das change-node
! ````
[
{
"id": "7cd65079.2609d",
"type": "change",
"z": "506e6085.abc5d8",
"name": "true/false -> {"on": 1/0}",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "{\t"on": (payload = true) ? 1 : 0 \t}",
"tot": "jsonata"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 603,
"y": 384,
"wires": [
[
"1432e8ed.7c8f3f"
]
]
}
] -
Okay dann jetzt noch die letzte Frage
Ich habe einen Hardware Switch, der aber immer nur "On" sendet aber verschiedene Buttonnamen hat..
msg.payload : Object object button: 1002 name: "On" action: "short released" updated: "2018-12-12T00:05:12+01:00"
Ich habe jetzt ein Switch mit 4 Ausgängen mit jeweils diesem Buttons was auch klappt. nun möchte ich aber natürlich wenn man die Taste das 2. mal drückt das er nicht mehr "true" ist sondern "false" wie lese ich denn aus welchen status das gerät in dem moment vor dem schalten hat ? Also die beste Möglichkeit.
[ { "id": "2fc04fbe.765d", "type": "hue-switch", "z": "bfb6a8ba.7c3258", "name": "Schalter_Licht_Wohnzimmer", "bridge": "d1e08b9e.d58a58", "sensorid": "2", "x": 930, "y": 1040, "wires": [ [ "390d7990.439356" ] ] }, { "id": "390d7990.439356", "type": "switch", "z": "bfb6a8ba.7c3258", "name": "", "property": "payload.button", "propertyType": "msg", "rules": [ { "t": "eq", "v": "1002", "vt": "num" }, { "t": "eq", "v": "2002", "vt": "str" }, { "t": "eq", "v": "3002", "vt": "str" }, { "t": "eq", "v": "4002", "vt": "str" } ], "checkall": "true", "repair": false, "outputs": 4, "x": 1130, "y": 1040, "wires": [ [ "f661681.73ed298" ], [ "cb21d42b.a8c7e8" ], [ "119f9629.73467a" ], [ "82afcbbd.8130e8" ] ] }, { "id": "82afcbbd.8130e8", "type": "change", "z": "bfb6a8ba.7c3258", "name": "", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "false", "tot": "bool" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1340, "y": 1080, "wires": [ [] ] }, { "id": "cb21d42b.a8c7e8", "type": "change", "z": "bfb6a8ba.7c3258", "name": "", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "true", "tot": "bool" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1340, "y": 1020, "wires": [ [] ] }, { "id": "119f9629.73467a", "type": "change", "z": "bfb6a8ba.7c3258", "name": "", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "true", "tot": "bool" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1340, "y": 1050, "wires": [ [] ] }, { "id": "f661681.73ed298", "type": "change", "z": "bfb6a8ba.7c3258", "name": "", "rules": [ { "t": "set", "p": "payload", "pt": "msg", "to": "true", "tot": "bool" } ], "action": "", "property": "", "from": "", "to": "", "reg": false, "x": 1340, "y": 990, "wires": [ [] ] }, { "id": "d1e08b9e.d58a58", "type": "hue-bridge", "z": "", "name": "Philips hue", "bridge": "1.2.3.103", "key": "mSUKalbvXcIJRJwvA08GHIMOPUBi7sLANA16XHKK", "interval": "3000" } ]
-
Ich kenne den hue-swich leider nicht;-(
Wie genau sieht den das Objekt aus, was vom switch kommt?
Häng doch mal einen debug node dran um poste das Object
-
Das sind alle Schalter die an der Fernbedienung sind.
Ich möchte halt die Dim up und Dim down gar nicht nutzen sondern die ersten drei schalter sollen Geräte ein und ausschalten und der letzte soll alles direkt ausschalten.. da brauche ich dann nur ein false was ich hinbekommen habe.
Problem ist das Kopf 1 z.b. immer nur name: On sendet.. egal ob er 1x oder 2x gedrückt wird.. es gibt nur die Möglichkeit noch knöpfe lange zu drücken für mehr Funktionen. aber das wollte ich so nicht unbedingt regeln.
{"payload":{"button":1002,"name":"On","action":"short released","updated":"2018-12-12T00:30:23+01:00"},"info":{"id":"2","uniqueId":"00:17:88:01:03:e5:cb:2a-02-fc00","name":"Schalter_Licht_Wohnzimmer","type":"ZLLSwitch","softwareVersion":"5.45.1.17846","battery":100,"model":{"id":"RWL021","manufacturer":"Philips","name":"Hue Wireless Dimmer Switch","type":"ZLLSwitch"}},"_msgid":"c449ffce.82bbb"}
{"payload":{"button":2002,"name":"Dim Up","action":"short released","updated":"2018-12-12T00:30:45+01:00"},"info":{"id":"2","uniqueId":"00:17:88:01:03:e5:cb:2a-02-fc00","name":"Schalter_Licht_Wohnzimmer","type":"ZLLSwitch","softwareVersion":"5.45.1.17846","battery":100,"model":{"id":"RWL021","manufacturer":"Philips","name":"Hue Wireless Dimmer Switch","type":"ZLLSwitch"}},"_msgid":"6691855b.feec5c"}
{"payload":{"button":3002,"name":"Dim Down","action":"short released","updated":"2018-12-12T00:31:01+01:00"},"info":{"id":"2","uniqueId":"00:17:88:01:03:e5:cb:2a-02-fc00","name":"Schalter_Licht_Wohnzimmer","type":"ZLLSwitch","softwareVersion":"5.45.1.17846","battery":100,"model":{"id":"RWL021","manufacturer":"Philips","name":"Hue Wireless Dimmer Switch","type":"ZLLSwitch"}},"_msgid":"4f8554eb.f1c7fc"}
{"payload":{"button":4002,"name":"Off","action":"short released","updated":"2018-12-12T00:31:13+01:00"},"info":{"id":"2","uniqueId":"00:17:88:01:03:e5:cb:2a-02-fc00","name":"Schalter_Licht_Wohnzimmer","type":"ZLLSwitch","softwareVersion":"5.45.1.17846","battery":100,"model":{"id":"RWL021","manufacturer":"Philips","name":"Hue Wireless Dimmer Switch","type":"ZLLSwitch"}},"_msgid":"c0e37caa.779b"}
-
Das muss man Zwischenspeichern z.B. in eine flow-Variable
Hier mal QD
! ````
[{"id":"85a8a545.a93f3","type":"switch","z":"506e6085.abc5d8","name":"","property":"payload.button","propertyType":"msg","rules":[{"t":"eq","v":"1002","vt":"num"},{"t":"eq","v":"2002","vt":"str"},{"t":"eq","v":"3002","vt":"str"},{"t":"eq","v":"4002","vt":"str"}],"checkall":"true","repair":false,"outputs":4,"x":586,"y":371,"wires":[["dace0f09.a2aea8"],[],[],[]]},{"id":"546a53bb.5c21cc","type":"inject","z":"506e6085.abc5d8","name":"button 1002","topic":"","payload":"{"button":1002,"name":"On","action":"short released","updated":"2018-12-12T00:30:23+01:00"}","payloadType":"json","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":379.5,"y":371,"wires":[["85a8a545.a93f3"]]},{"id":"8201a4ac.c4cc","type":"debug","z":"506e6085.abc5d8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":945.5,"y":309,"wires":[]},{"id":"dace0f09.a2aea8","type":"change","z":"506e6085.abc5d8","name":"1002","rules":[{"t":"set","p":"B1002","pt":"flow","to":"$not($flowContext('B1002'))\t\t","tot":"jsonata"},{"t":"set","p":"payload","pt":"msg","to":"B1002","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":787,"y":308,"wires":[["8201a4ac.c4cc"]]}]Das change-node setzt als Erstes die Flow-variable mit ihrem negierten Wert. Dann wird dieser Wert in den payload kopiert. Geht sicher auch noch einfacher, aber das muss ich erst überschlafen;-)
-
Gut, mein Ideengang war ja schonmal richtig, wusste nur nicht wie ich ne Variable Speicher.
Es funktioniert auch erstmal so wie es soll
ob umständlich oder nicht ^^immerhin gab es eine Lösung;-)
Danke dir dafür schonmal
EDIT:
mist jetzt kommt natürlich das Problem
Wenn ich am Switch auf "true" gehe und später das Licht per Handy ausmache.. weis der Lichtschalter das ja mal wieder nicht und würd beim nächsten einschalten "false" senden
arghh
-
Kannst es eigentlich so lassen. Du musst nur aufpassen, dass deine Flow-variablen eindeutig bleiben. Will sagen, kein anderes node auf dem flow sollte die für andere Zwecke verwenden! Flow-Variablen sind ja auf dem kompletten flow global.
Man kann dafür auch einen Subflow machen, dann ist der flow-scope auf den Subflow beschränkt.
-
mist jetzt kommt natürlich das Problem
Wenn ich am Switch auf "true" gehe und später das Licht per Handy ausmache.. weis der Lichtschalter das ja mal wieder nicht und würd beim nächsten einschalten "false" senden
arghh `
Normalerweise wandelt man bei solchen Sachen einen Switch zum Button. Man wertet also nicht mehr aus, ob der true oder false gesendet hat, sondern nur, das er gesendet hat.
Dann ist es egal. Schalten ändert dann immer den Status der Lampe. Egal woher der Schaltimpuls kommt.
Aber wie gesagt, ich kenn die Hue Dinger nicht und hab keine Ahnung, ob man das da so machen könnte.
-
Das ist richtig, nur wenn ich über 4 Geräten schalte möchte ich ja am Ende wissen ob es true oder false ist oder irre ich mich da ?
Ich wollte jetzt vor dem HomeKit reingehen um von da aus meinen Flow zu steuern. Damit am iPhone auch der tatsächliche status steht.
Das klappt ja soweit auch gut. Problem ist halt wenn ich am iPhone sage "Lampe aus" das der Taster immer noch denkt das die Lampe an ist und beim 1. Befehl mir ein "false" sendet.
Schon etwas blöd das man am ende für alles ein Response braucht
Was wäre denn wenn ich den UI schalter der als letztes im Glied ist abfrage ? ob true oder false ?
-
Also könnte ich das Change ersetzen durch etwas anders und setze true oder false im Gegensatz zu dem UI Schalter, denn der sendet ja auch immer nach dem schalten den Status.
-
Also könnte ich das Change ersetzen durch etwas anders und setze true oder false im Gegensatz zu dem UI Schalter, denn der sendet ja auch immer nach dem schalten den Status. `
Das sollte kein Problem sein. Dem 2. change (1002) ist ja schnurz ob im eingehen Payload true oder false drinsteht. Es negiert einfach nur flow.B1002 und kopiert das dann in den payload. Da kannst du natürlich deine eigene Logik zwischenschalten.
Erstmal würde ich genau festlegen, welche Schalter/Taster (inkl. Alexa) gibt es für die bestimmte Lampe und wie soll die auf die Schalter reagieren.
-
Echt schade, das jeder Entwickler verschiedene Argumente benutzt.. Alexa hat "Brightness", Hue hat "brightness", Homekit hat wieder nen anders Kommando
true, false, ON: 1, ON: 2, On:true, On:false…..........
Das alles in eine Reihe geschaltet zu bekommen entwickelt sich zu einem Mysterium mit vielen Switches und Changes
Und nur weil ich gerne die Farbe und Helligkeit dazu schalten wollte.
Bin schon kurz davor alles einzelne zu schalten und jeweils nen Response zu senden, das wird so mega Aufwendig.. hatte mir mit Node-Red eigentlich ne Vereinfachung gewünscht.
Falls du noch einen Tipp dazu hättest wie ich alles mit einander verknüpfen kann gerne her damit. ansonsten ist das Projekt "Helligkeit und Farbe" gestorben
-
> Falls du noch einen Tipp…
Ich glaub, ich kann da nicht mehr viel Erhellendes beitragen ;-( Vlt. solltest du dein spezielles HUE-Anliegen nochmal separat vortragen. Evtl. kann ja ein anderer HUE Nutzer weiterhelfen.Mir ist ehrlich gesagt das ganze Konzept diesbezüglich noch unklar.
Ich hab zwar auch ne ganze Reihe Zigbee Geräte am laufen, aber die steuere ich mit ioBroker und einem CC2231 Stick.
Generell sollte es ja etwa so laufen:
Du hast pro Aktor eine zentrale Instanz, die die aktuellen Werte exakt wiederspiegeln (Ist ja bei Zigbee durch die Rückmeldung eigentlich gewährleistet).
In ioB sind das dann die states des Aktors (An/Aus, Helligkeit usw.)
Ich schalte so eine Lampe mit den verschiedensten Aktoren (Programme (NR/JS), Alexa, mechanische Schalter (Zigbee oder Fremdsysteme) usw.)
Wenn ich die Lampe schalte, frage ich die zentrale Instanz nach dem Istwert und ändere die dann entsprechend. Programmen könne da auch automatisch reagieren, wenn sich der Zustand ändert.
Alle UIs bekommen den dann automatisch mitgeteilt (direkt oder per Abfrage), so dass sie zumindest vor einem Schaltvorgang den Istzustand kennen.
Ein Problem taucht da allenfalls bei mechanischen Schaltern (Kippschaltern) auf, wenn deren Kippstellung mit einem Zustand (An/Aus) gekoppelt sind.
Hier mal ein Bild von einer Testsite wo man das erkennt.
1 - sind nodes, die den aktuellen Status der Steckdosen automatisch aus ioB bekommen.
2 - sind die switches auf der Site. Die repräsentieren einmal den aktuellen Zustand (Eingang) und wenn sie (von Hand) geschaltet werden geben sie den Schaltbefehl an den ioB-State weiter (3)
Damit ist eigentlich immer alles aktuell. Egal ob (und von wo) sonst noch ein Schaltbefehl kommt, er wird durch die Nodes (1) erkannt und weitergereicht.
Aber ich fürchte fast, die prinzipielle Arbeitsweise ist dir längst bekannt und wir reden etwas aneinander vorbei
deshalb ziehe ich mich an dieser Stelle mal zurück.