Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Node-Red
    5. [Erledigt] change-node mit variablen Datenpunkten

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [Erledigt] change-node mit variablen Datenpunkten

    This topic has been deleted. Only users with topic management privileges can see it.
    • C
      ChristophH last edited by ChristophH

      Hallo zusammen,

      gleich vorweg - ich habe keine Ahnung, ob das was ich vorhabe überhaupt in Node-Red geht.

      Ist es möglich, Variablen-Namen in einem Array zu speichern und diese dann in einer change-Node zu verwenden.

      Beispiel:

      Variablen:
      msg.test1
      msg.test2
      msg.test3

      Das Array würde dann wie folgt aussehen:

      msg.VarNamen = ["test1","test2","test3"]

      in der change-Node dann wie folgt z.B.:

      setze msg. msg.VarNamen[1]
      statt
      setze msg. msg.test2

      Dann könnte man, wenn man bei vielen Variablen die gleichen Operationen anwenden will, dieses in einer Schleife über das Array msg.VarNamen machen und müßte nicht für jede einzelne Variable den Flow kopieren, was bei vielen Variablen Zeit- und Wartungsaufwendig ist.

      Vielen Dank schonmal im voraus für eure Gedanken und Hilfe dazu.

      Christoph

      mickym 1 Reply Last reply Reply Quote 0
      • mickym
        mickym Most Active @ChristophH last edited by mickym

        @christophh sagte in change-node mit variablen Datenpunkten:

        msg.VarNamen = ["test1","test2","test3"]

        Also ich habe keine Ahnung was Du machen willst - mit einer ChangeNode alleine wird das nicht gehen - allerdings wenn Du das ganze in einem Objekt machst - dann ggf. schon. Ansonsten kann man ja über das topic viele Variablen auslesen oder schreiben - dazu brauche ich keine Variablen. Wenn Du also ein Array mit 3 Elementen in einem Objekt haben willst mit den definierten Eigenschaften eines anderen Arrays - dann ist das ebenfalls möglich. Wie gesagt - es ist wichtig vorher alle Werte in einem oder Array zu sammeln.

        Du musst das ja nicht auf Root Ebene machen - sondern die variablen Eigenschaften (variablennamen) als Eigenschaft der payload:

        2fffd1b0-7009-4c2e-90b5-7f42e0a47922-image.png

        [
           {
               "id": "54912e92b3459984",
               "type": "inject",
               "z": "517cd16e4d7e6ae4",
               "name": "",
               "props": [
                   {
                       "p": "payload"
                   }
               ],
               "repeat": "",
               "crontab": "",
               "once": false,
               "onceDelay": 0.1,
               "topic": "",
               "payload": "[\"Wert1\",\"Wert2\",\"Wert3\"]",
               "payloadType": "json",
               "x": 350,
               "y": 1980,
               "wires": [
                   [
                       "08dfc5cb62b79a4e",
                       "9a1406b6a7a894e5"
                   ]
               ]
           },
           {
               "id": "08dfc5cb62b79a4e",
               "type": "debug",
               "z": "517cd16e4d7e6ae4",
               "name": "ein Array. ",
               "active": true,
               "tosidebar": true,
               "console": false,
               "tostatus": false,
               "complete": "payload",
               "targetType": "msg",
               "statusVal": "",
               "statusType": "auto",
               "x": 540,
               "y": 2040,
               "wires": []
           },
           {
               "id": "9a1406b6a7a894e5",
               "type": "change",
               "z": "517cd16e4d7e6ae4",
               "name": "",
               "rules": [
                   {
                       "t": "set",
                       "p": "varNames",
                       "pt": "msg",
                       "to": "[\"test1\",\"test2\",\"test3\"]",
                       "tot": "json"
                   }
               ],
               "action": "",
               "property": "",
               "from": "",
               "to": "",
               "reg": false,
               "x": 580,
               "y": 1980,
               "wires": [
                   [
                       "0c71e19f5f04613f"
                   ]
               ]
           },
           {
               "id": "0c71e19f5f04613f",
               "type": "change",
               "z": "517cd16e4d7e6ae4",
               "name": "erstelle Objekt",
               "rules": [
                   {
                       "t": "set",
                       "p": "payload",
                       "pt": "msg",
                       "to": "$zip(varNames, payload){$[0]:$[1]}",
                       "tot": "jsonata"
                   }
               ],
               "action": "",
               "property": "",
               "from": "",
               "to": "",
               "reg": false,
               "x": 800,
               "y": 1980,
               "wires": [
                   [
                       "62b9d6921380fcf7"
                   ]
               ]
           },
           {
               "id": "62b9d6921380fcf7",
               "type": "debug",
               "z": "517cd16e4d7e6ae4",
               "name": "Objekt mit variablen Eigenschaften",
               "active": true,
               "tosidebar": true,
               "console": false,
               "tostatus": false,
               "complete": "payload",
               "targetType": "msg",
               "statusVal": "",
               "statusType": "auto",
               "x": 1080,
               "y": 1980,
               "wires": []
           }
        ]
        

        Das kannst ja nun mit einer split Node in payloads mit unterschiedlichem topic nutzen und so unterschiedliche Werte in mqtt oder in den iobroker schreiben.

        Sammeln kannst Du Nachrichten entweder im Flow Kontext oder in einer Join oder functionNode

        Wie gesagt Du kannst alles innerhalb der payload machen - aber Du wirst über eine ChangeNode nicht das Wurzelobjekt der Nachricht erreichen, das kannst ggf. mit einer function dann machen.

        Wie gesagt man kann die payload auch ins Root des Nachrichtenobjektes verschieben - bringt in meinen Augen allerdings keine Vorteile - dafür musst Du eine funktion Node nutzen und ein neues Nachrichtenobjekte erstellen, ist aber in super einfach.

        276514ed-b2aa-4f7d-8b8b-4bcd6743161f-image.png

        Die function Node macht nichts weiter als die payload alleine zum Nachrichtenobjekt zu erklären:

        var newMsg = msg.payload;
        return newMsg;
        

        Das Problem ist also nicht das variable Erstellen, sondern das sammeln. Aber wie gesagt solange man nicht die wirkliche Anwendung kennt, erschließt sich mir der Sinn nicht.

        1 Reply Last reply Reply Quote 0
        • mickym
          mickym Most Active last edited by mickym

          Eine andere Möglichkeit einer durch Komma getrennte Werteliste verschiedenen Eigenschaften zuzuordnen ist ggf. eine CSV Node.

          a80acee5-990b-435f-ae66-9e63850ffc3c-image.png

          So was geht auch easy mit einer ChangeNode.

          Wie gesagt der Sinn erschließt sich mir nicht. Eine konkrete Anwendung wäre sicher einfacher.

          1 Reply Last reply Reply Quote 0
          • mickym
            mickym Most Active last edited by

            Um es mal konkret zu machen - schau Dir dieses Modbusbeispiel mal an: https://forum.iobroker.net/post/1007750

            Wenn man die Flows intelligent macht - braucht man keine variablen Variablennamen. Schau Dir mal aus dem Post aus dem Modbus Thread wie Du aus dem gelben Kasten mit etwas Überlegung den grünen Kasten machen kannst:

            6d29d19c-b97d-465a-899a-76454b6fc6de-image.png

            Die grüne Gruppe macht exakt das Gleiche wie der gelbe Kasten.

            1 Reply Last reply Reply Quote 0
            • C
              ChristophH last edited by

              Zuerst einmal sorry, dass ich mich nicht mehr gemeldet hatte.
              Ich musste beruflich für ein paar Tage weg und war Abends so erledigt, dass ich nur noch ins Bett gefallen bin.
              Zurück gekommen bin ich erst gestern Abend 😠

              Vielen Dank für eure ganzen Antworten.

              Ich habe das Ganze jetzt so gelöst, dass ich, anstatt einzelne Variablen zu nutzen, alles in eine Objekt-Struktur gepackt habe.

              Mal sehen, obs damit einfacher geht.

              Hier kann jetzt erstmal geschlossen werden.

              1 Reply Last reply Reply Quote 0
              • First post
                Last post

              Support us

              ioBroker
              Community Adapters
              Donate

              1.2k
              Online

              31.7k
              Users

              79.7k
              Topics

              1.3m
              Posts

              2
              5
              456
              Loading More Posts
              • Oldest to Newest
              • Newest to Oldest
              • Most Votes
              Reply
              • Reply as topic
              Log in to reply
              Community
              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
              The ioBroker Community 2014-2023
              logo