Node Red Array in ioBroker nutzen

Antworten
andre1000
starter
Beiträge: 10
Registriert: 15.02.2017, 20:51

Node Red Array in ioBroker nutzen

Beitrag von andre1000 » 30.10.2018, 22:19

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é

rewenode
professional
Beiträge: 114
Registriert: 02.11.2017, 02:36

Re: Node Red Array in ioBroker nutzen

Beitrag von rewenode » 31.10.2018, 11:01

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.
Spoiler: Show hidden text

Code: Alles auswählen

[
    {
        "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"
            ]
        ]
    }
]
flow.png
Und hier der state.
state.png

andre1000
starter
Beiträge: 10
Registriert: 15.02.2017, 20:51

Re: Node Red Array in ioBroker nutzen

Beitrag von andre1000 » 01.11.2018, 23:35

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é

rewenode
professional
Beiträge: 114
Registriert: 02.11.2017, 02:36

Re: Node Red Array in ioBroker nutzen

Beitrag von rewenode » 02.11.2018, 01:30

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.
Objekt-Struktur-copy.png

andre1000
starter
Beiträge: 10
Registriert: 15.02.2017, 20:51

Re: Node Red Array in ioBroker nutzen

Beitrag von andre1000 » 03.11.2018, 00:06

Hallo,

anbei meine Struktur aus Node Red
1.jpg
Ich hoffe, dass es jetzt klarer ist.

André

rewenode
professional
Beiträge: 114
Registriert: 02.11.2017, 02:36

Re: Node Red Array in ioBroker nutzen

Beitrag von rewenode » 03.11.2018, 09:16

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.

Code: Alles auswählen

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:
Spoiler: Show hidden text

Code: Alles auswählen

[
    {
        "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:

Code: Alles auswählen

//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.

andre1000
starter
Beiträge: 10
Registriert: 15.02.2017, 20:51

Re: Node Red Array in ioBroker nutzen

Beitrag von andre1000 » 07.11.2018, 22:36

Hallo,

vielen Dank für den Tip. Habe es jetzt mit dem Array hinbekommen.

André

Antworten