NEWS
Node Red Array in ioBroker nutzen
-
Hallo zusammen,
ich habe in node red ein Array mit 17 Variablen erstellt. Ich möchte dieses Array geasmt in ioBroker nutzen. Gibt es eine Möglichkeit, das gesamte Arry zu übertragen?
Danke für die Unterstützung
André
-
hi,
ich bin nicht sicher, ob ich dein Problem richtig verstanden habe, aber wenn du in NR ein Array an einen state übergibst, tut es das auch, auch wenn man es optisch im state nur als string sieht.
Ich hab man einen Minimal-Flow gebastelt.
! ````
[
{
"id": "b4b05430.922da8",
"type": "ioBroker out",
"z": "a9a2a713.60106",
"name": "set node-red_array to iob-State",
"topic": "node-red.0.myArrayState",
"ack": "false",
"autoCreate": "true",
"x": 250,
"y": 160,
"wires": []
},
{
"id": "c33ff31b.e30ac8",
"type": "inject",
"z": "a9a2a713.60106",
"name": "injectetd array",
"topic": "",
"payload": "[1,2,3,4,5]",
"payloadType": "json",
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"x": 190,
"y": 80,
"wires": [
[
"b4b05430.922da8"
]
]
}
]![3999_flow.png](/assets/uploads/files/3999_flow.png) Und hier der state. ![3999_state.png](/assets/uploads/files/3999_state.png)
-
Hallo rewenode,
danke für die Antwort. Ich glaube, dass ich mein Problem nicht komplett beschrieben habe.
Hier einmal komplett beschrieben.
Ich empfange über red node ein CAN Telegramm. Dies setzt sich wie folgt zusammen:
msg.canid (z.B. 0x100)
msg.payload (z.B. 80 04 01) - dies sind die Zustände von Schaltern, die in ioBroker verwendet werden sollen
da ich bis jetzt alles über node red gemacht hatte, habe ich die Telegramme in die einzelnen Bits aufgeteilt, mit der folgenden Struktur:
msg.CANID
msg.IN1
msg.IN2
..
msg.IN32
Jetzt suche ich eine einfache Möglichkeit, die Signale in ioBroker weiter zuverwenden. Hier ist die Variante mit dem Array eine mögliche. Jedoch habe ich es bisher nicht geschafft, ein Array aus der Struktur zu erstellen.
Vielleicht hat jemand eine gute Idee.
Danke
André
-
Was ich da sehe, sind einzelne Properties im msg-Objekt IN1..IN32. Was konkret In1.. sind sehe ich nicht.
Sowas läßt sich ganz simpel mit dem change-node machen.
Damit wir aber nicht wieder aneinander vorbei reden, poste doch einfach mal einen Export deiner originalen Struktur aus dem debug-node.
-
Hallo,
anbei meine Struktur aus Node Red
Ich hoffe, dass es jetzt klarer ist.
André
-
Das ist mal wieder nur ein Bild. Du solltest die Struktur als Text posten, so wie ich es im Bild gezeigt habe, kann man sich die Struktur als ASCII-String in die Zwischenablage kopieren und dann als Text posten.
Jemand der die helfen will, kann diese dann direkt verwenden und außerdem vermeidet man so Fehler. Aber sei's drum…
Nach deinem Bild hast du deine Daten als Properties von msg angelegt. Das sollte in node-red vermieden werden! Dafür ist msg.payload vorgesehen.
Also wo du in deinem functions-node msg.IN0 stehen hast sollte msg.payload.IN0 stehen usw. besser noch als eigenes Object.
msg.payload.myout = {}; let myout = msg.payload.myout; myout.IN0 = was_es_halt_sein_soll; //usw.
Jetzt hast du alle zusammengehörigen Daten in eine Object. Das läßt sich dann ganz simpel mit einem Change-node in ein Array überführen. z.B. so:
! ````
[
{
"id": "4f62b5b4.c33e7c",
"type": "inject",
"z": "98aa089a.d49718",
"name": "",
"topic": "",
"payload": "{"ID":4711,"IN1":0,"IN2":1,"IN3":2}",
"payloadType": "json",
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"x": 130,
"y": 280,
"wires": [
[
"79129325.03cf64",
"7258677a.1ce2b"
]
]
},
{
"id": "79129325.03cf64",
"type": "debug",
"z": "98aa089a.d49718",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"x": 530,
"y": 280,
"wires": []
},
{
"id": "fd2caf0c.32a608",
"type": "debug",
"z": "98aa089a.d49718",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"x": 550,
"y": 360,
"wires": []
},
{
"id": "7258677a.1ce2b",
"type": "change",
"z": "98aa089a.d49718",
"name": "obj.property -> array",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.*[]",
"tot": "jsonata"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 360,
"y": 360,
"wires": [
[
"fd2caf0c.32a608"
]
]
}
]So wie du es gemacht hast, ist es vergleichsweise aufwendig. Aber du könntest es immer noch in reinem Javascript im function-node machen. Etwa so:
//definiere dein array
let myarray = [];
//eigenschaften fommen aus dem payload,
//ist hier aber egal woher sie kommen
//{"ID":4711,"IN1":0,"IN2":1,"IN3":2}//für alle Elemente an, die du willst
myarray.push(msg.payload.ID);
myarray.push(msg.payload.IN1);
myarray.push(msg.payload.IN2);
myarray.push(msg.payload.IN3);//hänge das array an das msg-objekt
msg.payload.myarry=myarray;return msg;
Also wenn du damit auch noch nicht klar kommst, poste nächstes mal unbedingt deinen flow als Export! Und sie dir an, wie du einen low dann importieren kannst, damit du eine evtl. Hilfe auch verwenden kannst.
-
Hallo,
vielen Dank für den Tip. Habe es jetzt mit dem Array hinbekommen.
André