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. variabler Variablenzugriff For-Schleife

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    variabler Variablenzugriff For-Schleife

    This topic has been deleted. Only users with topic management privileges can see it.
    • mickym
      mickym Most Active @_R_A_L_F_ last edited by mickym

      @_r_a_l_f_ Warum macht ihr es Euch immer so schwer mit der Codiererei in JS und function Nodes?

      e2b83798-52f6-4bdb-b494-efbb6c55cd4d-image.png

      [
          {
              "id": "e57655daa0bd9ef0",
              "type": "inject",
              "z": "7e6af0015415146d",
              "name": "",
              "props": [
                  {
                      "p": "payload"
                  },
                  {
                      "p": "topic",
                      "vt": "str"
                  }
              ],
              "repeat": "",
              "crontab": "",
              "once": false,
              "onceDelay": 0.1,
              "topic": "msg0",
              "payload": "1",
              "payloadType": "num",
              "x": 1970,
              "y": 3980,
              "wires": [
                  [
                      "98f85018e2a38123"
                  ]
              ]
          },
          {
              "id": "dc34177ec62cce41",
              "type": "inject",
              "z": "7e6af0015415146d",
              "name": "",
              "props": [
                  {
                      "p": "payload"
                  },
                  {
                      "p": "topic",
                      "vt": "str"
                  }
              ],
              "repeat": "",
              "crontab": "",
              "once": false,
              "onceDelay": 0.1,
              "topic": "msg1",
              "payload": "2",
              "payloadType": "num",
              "x": 1970,
              "y": 4020,
              "wires": [
                  [
                      "98f85018e2a38123"
                  ]
              ]
          },
          {
              "id": "254923a83d409954",
              "type": "inject",
              "z": "7e6af0015415146d",
              "name": "",
              "props": [
                  {
                      "p": "payload"
                  },
                  {
                      "p": "topic",
                      "vt": "str"
                  }
              ],
              "repeat": "",
              "crontab": "",
              "once": false,
              "onceDelay": 0.1,
              "topic": "msg2",
              "payload": "3",
              "payloadType": "num",
              "x": 1970,
              "y": 4060,
              "wires": [
                  [
                      "98f85018e2a38123"
                  ]
              ]
          },
          {
              "id": "30ee2f88095e17e3",
              "type": "inject",
              "z": "7e6af0015415146d",
              "name": "",
              "props": [
                  {
                      "p": "payload"
                  },
                  {
                      "p": "topic",
                      "vt": "str"
                  }
              ],
              "repeat": "",
              "crontab": "",
              "once": false,
              "onceDelay": 0.1,
              "topic": "msg3",
              "payload": "0",
              "payloadType": "num",
              "x": 1970,
              "y": 4100,
              "wires": [
                  [
                      "98f85018e2a38123"
                  ]
              ]
          },
          {
              "id": "98f85018e2a38123",
              "type": "join",
              "z": "7e6af0015415146d",
              "name": "",
              "mode": "custom",
              "build": "object",
              "property": "payload",
              "propertyType": "msg",
              "key": "topic",
              "joiner": "\\n",
              "joinerType": "str",
              "accumulate": true,
              "timeout": "",
              "count": "1",
              "reduceRight": false,
              "reduceExp": "",
              "reduceInit": "",
              "reduceInitType": "",
              "reduceFixup": "",
              "x": 2150,
              "y": 4040,
              "wires": [
                  [
                      "e45441109d3778e4",
                      "579e44244bb475b4"
                  ]
              ]
          },
          {
              "id": "e45441109d3778e4",
              "type": "debug",
              "z": "7e6af0015415146d",
              "name": "Objekt",
              "active": true,
              "tosidebar": true,
              "console": false,
              "tostatus": false,
              "complete": "payload",
              "targetType": "msg",
              "statusVal": "",
              "statusType": "auto",
              "x": 2330,
              "y": 3980,
              "wires": []
          },
          {
              "id": "579e44244bb475b4",
              "type": "change",
              "z": "7e6af0015415146d",
              "name": "Durchschnitt",
              "rules": [
                  {
                      "t": "set",
                      "p": "payload",
                      "pt": "msg",
                      "to": "$map(payload.*,function($val){$val != 0 ? $val})~>$average()",
                      "tot": "jsonata"
                  }
              ],
              "action": "",
              "property": "",
              "from": "",
              "to": "",
              "reg": false,
              "x": 2330,
              "y": 4040,
              "wires": [
                  [
                      "ab038a94221abb0b"
                  ]
              ]
          },
          {
              "id": "ab038a94221abb0b",
              "type": "debug",
              "z": "7e6af0015415146d",
              "name": "Durchschnitt",
              "active": true,
              "tosidebar": true,
              "console": false,
              "tostatus": false,
              "complete": "payload",
              "targetType": "msg",
              "statusVal": "",
              "statusType": "auto",
              "x": 2530,
              "y": 4040,
              "wires": []
          }
      ]
      

      Ansonsten hat @OliverIO ja den Code entsprechend geliefert, damit Dir das nicht zu Teiler hinzugezählt wird. im Übrigen hast Du ein gewaltigen Bug in Deinem Code - das ist kein Array, das Du definierst, aber @OliverIO hat es ja schon bereinigt.

      Wenn nur eine 0 im Objekt steht - dann ist halt undefined:

      adb83e1e-e57d-4d18-8f1a-92ad4a77b660-image.png

      Das Ganze in JSONATA ist relativ simpel:

      $map(payload.*,function($val){$val != 0 ? $val})~>$average()
      

      Wenn Du alles in einem Objekt hast via JOIN Node - dann fällt Dir auch das Programmieren in Javascript leichter, wenn Du so ein JS-Fan bist.

      Du bekommst dann ja als payload ein Objekt, dass Du durchiterieren kannst.

      bc28f95a-0d45-4e27-8c20-b5eb6b031980-image.png

      hier mal die function Node . die das gleiche macht, halt mit mehr Code. 😉

      var arr = [];
      for (var key in msg.payload) {
          if (msg.payload[key]) arr.push(msg.payload[key]); 
      }
      
      if (arr.length > 0){
          var sum = 0;
          arr.forEach(val => sum += val);
          msg.payload = sum/arr.length;
          return msg;
      }
      
      _ 1 Reply Last reply Reply Quote 0
      • _
        _R_A_L_F_ @OliverIO last edited by _R_A_L_F_

        @oliverio Danke für die Rückmeldung. Zur ersten Frage: Ja von außen werden diese Werte vorgegeben, hier sollte es nur als Beispiel dienen. Daher die Namen msg0, mgsg1, etc.
        Danke für den Hinweise bzgl. dem Array. Dann muss ich künftig daran denken, dass in ein Array zu packen um so darauf zugreifen zu können.

        Das stimmt bzgl. der 0. Mein Gedanke war der, wenn ich anfange das Array zu befüllen steht noch nicht für jede Variable ein Wert zur Verfügung (Beispiel die ersten 5 Tage haben schon Werte, die anderen 25 Tage noch nicht. Dann bekomme ich ja erst nach 30 Tage solide Werte). Aber stimmt, nach den 30 Tagen wenn ne 0 drin steht, wird dadurch das Ergebnis entsprechend verfälscht.

        1 Reply Last reply Reply Quote 0
        • _
          _R_A_L_F_ @mickym last edited by

          @mickym Danke für die Antwort 🙂 .

          Wie kommt man auf das JSONATA Ergebnis? Gibt es hier ein Nachschlagewerk? Bisher bin ich dazu leider nicht wirklich fündig geworden :(.
          Ich versuche ja eh generell auf JS in Functions zu verzichten aber oftmals fehlt mir das Know How es anders zu lösen. Daher frage ich ja und bin froh um jede Hilfe 😉

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

            @_r_a_l_f_ sagte in variabler Variablenzugriff For-Schleife:

            @mickym Danke für die Antwort 🙂 .

            Wie kommt man auf das JSONATA Ergebnis? Gibt es hier ein Nachschlagewerk? Bisher bin ich dazu leider nicht wirklich fündig geworden :(.
            Ich versuche ja eh generell auf JS in Functions zu verzichten aber oftmals fehlt mir das Know How es anders zu lösen. Daher frage ich ja und bin froh um jede Hilfe 😉

            War ja auch nicht als Vorwurf gemeint, sondern war zugegebenermaßen provokativ. Ich hab ja selbst ewig gebraucht, bis ich dahinter stieg und probiere oft immer noch viel. Also so aus dem Ärmel schüttle ich das auch nicht. Die Doku dürrste du aber kennen und auch das Probierfenster (https://docs.jsonata.org/overview.html).

            Mich selbst beeindruckt immer wieder mit wie wenig Code man zu einem Ergebnis kommt und wenn du Lust hast, dann gehen wir den Code Stück für Stück durch.

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

              Das Ganze geht übrigens noch kürzer. War jetzt mein persönlicher Ehrgeiz. 😉

              $average(payload.*[$!=0])
              

              Kannst du hier ausprobieren und testen: https://try.jsonata.org/czsL_Yhdr

              und jetzt vergleiche mal diesen Ausdruck mit dem JavaScript Code. Ist das nicht genial?
              Bin selbst immer wieder begeistert. In dem JSONATA Fenster siehst du auch sofort das Ergebnis und kannst gleich mit verschiedenen Inputs testen.

              1 Reply Last reply Reply Quote 0
              • _
                _R_A_L_F_ @mickym last edited by

                @mickym Alles gut, ich lerne immer gerne dazu und bin nicht unbedingt ein Fan von fertige Lösungen, da ich ja so nie selbständig werde 😉 Und JSONata ist wirklich mächtig!

                Danke schon mal für die Doku. Da lese ich mich auf jeden Fall ein. Zusätzlich habe ich mich über den Link https://konfuzio.com/de/jsonata/ etwas mehr in das ganze reingelesen was das Grundverständnis anging.

                Ich sag mal so, dieses Beispiel verstehe ich noch recht gut (hoffentlich :D)

                $average(payload.*[$!=0])
                

                Average als JS Funktion
                Gefiltert wird der Payload als Regular Expression der ausschließt die Payloads ungleich 0

                Korrigiere mich gerne, wenn ich falsch liege 😉

                Aber hier oben tue ich mich aktuell noch schwer:

                $map(payload.*,function($val){$val != 0 ? $val})~>$average()
                

                Map => befülle ein Array mit den Werten aus dem Payload welche dem Regular Expression lt. function entsprechen $val != 0 und führe anschließend über das Array hinweg die $average JS Funktion aus oder? Dazu hätte ich folgende Frage. Ist $val ein x beliebiger Variablenname oder hat das einen Hintergrund?
                Sorry wenn ich vielleicht etwas blöd Frage aber nur so denke ich immer, lerne ich wenigstens dazu 😉

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

                  @_r_a_l_f_ sagte in variabler Variablenzugriff For-Schleife:

                  Ich sag mal so, dieses Beispiel verstehe ich noch recht gut (hoffentlich :D)
                  $average(payload.*[$!=0])

                  Average als JS Funktion

                  Nein im Prinzip ist das sogar eine Abkürzung der unteren Funktion und mit Javascript hat das gar nichts zu tun. Javascript hat mit JSONATA 0,0 zu tun.

                  Die $average Funktion ist eine aggregierende Funktion, die den Durchschnitt aus einem Array bildet.

                  https://docs.jsonata.org/aggregation-functions

                  922fc21e-9008-4ef2-977b-7b20111dd85a-image.png

                  Das Array wird aus dem payload Objekt gebildet und zwar aus allen Objekten unabhängig vom Eigenschaftsnamen auf der 1. Ebene also

                  payload.*
                  

                  https://docs.jsonata.org/path-operators

                  78aa10d9-eb6b-453e-931b-7afe5c507dd5-image.png

                  Grundsätzlich arbeitet JSONATA so, dass das Ergebnis entweder ein Einzelwert ist oder wenn das Ergebnis mehrfach ist, dann wird ein Array gebildet.

                  Ich habe Dir ja den Link geschickt in JSONATA try geschickt:

                  0a7248a0-f376-41df-8804-2ba81024d4f4-image.png

                  Wie Du siehtst, wird aus dem payload Objekt mit unterschiedlichen Eigenschaften ein Array.

                  Das nächste ist die FilterFunktion:

                  https://docs.jsonata.org/path-operators

                  a4e14c1e-fb02-43d2-afe5-6698b327f8db-image.png

                  Sprich aus dem Array payload.* filtern wir alle Objekte aus, die ungleich 0 sind.

                  8bf85174-dc01-4c63-bfb8-bece51040f84-image.png

                  und aus diesem Array bilden wir dann den Durchschnitt

                  ba8617c7-5b85-443b-a311-fd225e7b3bf7-image.png

                  Die Funktion habe ich ja oben beschrieben. Die map funktion ist viel umständlicher - man kann sie nutzen, wenn der Filter zum komplex wird.

                  https://docs.jsonata.org/higher-order-functions

                  692479b7-63cd-4b6f-b772-7e80d8f8c104-image.png

                  Hier kannst Du dann selbst Funktionen definieren, wobei Du auf den Wert jedes Arraymitglieds, den Index oder das gesamte Array zugreifen kannst.

                  JSONATA hat mit JavaScript NICHTS zu tun und es wurde auch KEIN regulärer Ausdruck benutzt sondern der Wildcard Path Parameter im JSONATA.

                  _ 1 Reply Last reply Reply Quote 0
                  • OliverIO
                    OliverIO @_R_A_L_F_ last edited by

                    @_r_a_l_f_

                    ja $val ist beliebig.
                    der Grundbefehl ist
                    $map(filter,callbackFunction)

                    der Befehl $map ruft für jedes element, welches über das filterkriterium ermittelt werden konnte die callback funktion auf. die notation nennt sich anonyme funktion
                    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions?retiredLocale=de
                    Beispiel

                    // Expression; the function is anonymous but assigned to a variable
                    const multiply = function (x, y) {
                      return x * y;
                    };
                    

                    Die Bezeichnung der parameter kannst du selber wählen. die anzahl der parameter muss mit der dokumentation des aufrufenden Befehls übereinstimmen.
                    die siehst du hier 1 pflicht-parameter + 2 optionale (mit den spitzen klammern sind sie optional)
                    https://docs.jsonata.org/higher-order-functions#map

                    mickym _ 2 Replies Last reply Reply Quote 0
                    • mickym
                      mickym Most Active @OliverIO last edited by mickym

                      @oliverio Du schmeist in meinen Augen JSONATA mit JavaScript durcheinander, Es gibt auch ein Map Funktion in Javascript, aber in JSONATA gibt es keine Callback Funktionen. Es ist eine Interpretersprache, die immer sequentiell von der Bibliothek abgearbeitet wird. Der Map Befehl in JSONATA iteriert einfach durch das Array, das als Parameter mitgegeben wird.

                      OliverIO 1 Reply Last reply Reply Quote 0
                      • OliverIO
                        OliverIO @mickym last edited by

                        @mickym
                        jsonata ist ebenfalls in javascript geschrieben.
                        der parser setzt nur die argumente in entsprechende javascript aufrufe um.

                        hier der aufruf der callback funktion für den map-befehl
                        https://github.com/jsonata-js/jsonata/blob/1df9fc96d9e476645070184187d6b46e4cd02eb6/src/functions.js#L1485

                        in der doku von jsonata steht das ja ebenfalls so

                        @_R_A_L_F_ diesen post nicht beachten. das bringt dich nur durcheinander und ist nerdiges blamen 🙂

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

                          @oliverio sagte in variabler Variablenzugriff For-Schleife:

                          und ist nerdiges blamen

                          Na gut ich höre schon auf. - Im Gegensatz zum mir, bist du ja ein Entwickler.

                          1 Reply Last reply Reply Quote 1
                          • _
                            _R_A_L_F_ @mickym last edited by

                            @mickym Ok, soweit verstanden und Danke für die Erklärung. Ich muss mich jetzt einfach mal durch die Doku wühlen ;). Trotzdem vielen vielen Dank für die so ausführliche Erklärung 😉

                            1 Reply Last reply Reply Quote 0
                            • _
                              _R_A_L_F_ @OliverIO last edited by

                              @oliverio Japp, soweit habe ich es verstanden. Auch dir vielen lieben Dank für die ausführliche Erklärung 🙂

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

                              Support us

                              ioBroker
                              Community Adapters
                              Donate

                              809
                              Online

                              31.7k
                              Users

                              79.7k
                              Topics

                              1.3m
                              Posts

                              3
                              15
                              573
                              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