Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Node-Red
  5. variabler Variablenzugriff For-Schleife

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    16
    1
    1.9k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    908

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

variabler Variablenzugriff For-Schleife

Geplant Angeheftet Gesperrt Verschoben Node-Red
15 Beiträge 3 Kommentatoren 1.1k Aufrufe 3 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • _ Offline
    _ Offline
    _R_A_L_F_
    schrieb am zuletzt editiert von
    #1

    Hallo,

    ich möchte den Durchschnittswert aus 4 Variablen berechnen. Krux ist an dem ganzen: Es kann auch mal vorkommen, dass in einer oder mehreren/allen Variablen eine 0 drin steht.
    Das verändert natürlich am Ende das Durchschnittsergebnis, da der Teiler dann nicht mehr stimmt.
    Bsp. 1+2+3 = Durschnitt 2, 1+0+3 = 2 und nicht 1,33.

    Dazu habe ich folgende Function Node geschrieben:

    var msg0 = { payload: 1, topic: "Msg0" };
    var msg1 = { payload: 2, topic: "Msg1" };
    var msg2 = { payload: 3, topic: "Msg2" };
    var msg3 = { payload: 0, topic: "Msg3" };
    var Teiler = 1;
    var Summe = 0;
    
    // Aktuelle Werte ermitteln. Wenn 0 dann nicht zum Teiler addieren
    for (let i = 0; i < 3; i++) {
    
        if (msg.payload.msg[i] != 0) {
           Teiler = Teiler + 1; 
           Summe = Summe + msg.payload.msg[i];
        }
    }
    
    // Durchschnitt bilden
    msg.payload = Summe / Teiler;
    
    return msg;
    

    Problem ist hierbei aktuell der variable Zugriff über die For Schleife. Hier bekomme ich aktuell die Fehlermeldung "TypeError: Cannot read properties of undefined (reading '0')"

    Das ich hier was falsch mache ist mir bewusst, nur finde ich im Netz dazu keine wirkliche Lösung um einen variablen Variablenzugriff in der Function Node zu realisieren.

    Vielleicht weiß ja jemand wie das klappt ;)

    VG

    OliverIOO mickymM 2 Antworten Letzte Antwort
    0
    • _ _R_A_L_F_

      Hallo,

      ich möchte den Durchschnittswert aus 4 Variablen berechnen. Krux ist an dem ganzen: Es kann auch mal vorkommen, dass in einer oder mehreren/allen Variablen eine 0 drin steht.
      Das verändert natürlich am Ende das Durchschnittsergebnis, da der Teiler dann nicht mehr stimmt.
      Bsp. 1+2+3 = Durschnitt 2, 1+0+3 = 2 und nicht 1,33.

      Dazu habe ich folgende Function Node geschrieben:

      var msg0 = { payload: 1, topic: "Msg0" };
      var msg1 = { payload: 2, topic: "Msg1" };
      var msg2 = { payload: 3, topic: "Msg2" };
      var msg3 = { payload: 0, topic: "Msg3" };
      var Teiler = 1;
      var Summe = 0;
      
      // Aktuelle Werte ermitteln. Wenn 0 dann nicht zum Teiler addieren
      for (let i = 0; i < 3; i++) {
      
          if (msg.payload.msg[i] != 0) {
             Teiler = Teiler + 1; 
             Summe = Summe + msg.payload.msg[i];
          }
      }
      
      // Durchschnitt bilden
      msg.payload = Summe / Teiler;
      
      return msg;
      

      Problem ist hierbei aktuell der variable Zugriff über die For Schleife. Hier bekomme ich aktuell die Fehlermeldung "TypeError: Cannot read properties of undefined (reading '0')"

      Das ich hier was falsch mache ist mir bewusst, nur finde ich im Netz dazu keine wirkliche Lösung um einen variablen Variablenzugriff in der Function Node zu realisieren.

      Vielleicht weiß ja jemand wie das klappt ;)

      VG

      OliverIOO Offline
      OliverIOO Offline
      OliverIO
      schrieb am zuletzt editiert von OliverIO
      #2

      @_r_a_l_f_

      und was steht im array da so drin.
      den inhalt sieht man hier nicht.
      oder hat es was mit deinen variablen msg0,msg1,... zu tun?
      dann ist die variable adressierung nicht richtig.
      dann eher so

      var msg = [
      { payload: 1, topic: "Msg0" },
      { payload: 2, topic: "Msg1" },
      { payload: 3, topic: "Msg2" },
      { payload: 0, topic: "Msg3" }
      ];
      var Teiler = 1;
      var Summe = 0;
       
      // Aktuelle Werte ermitteln. Wenn 0 dann nicht zum Teiler addieren
      for (let i = 0; i < msg.length; i++) {
       
          if (msg[i].payload != 0) {
             Teiler = Teiler + 1; 
             Summe = Summe + msg[i].payload;
          }
      }
       
      // Durchschnitt bilden
      msg.payload = Summe / Teiler; //<<-- da weiß ich nicht was du willst, das überschreibt dir dein msg objekt von oben
       
      return msg;
      
      

      das msg-objekt ist ein array of objects

      warum stört eine 0 den durchschnitt? 0 ist ja auch eine wertaussage und dein durchschnitt kann nie unter 1 fallen,
      auch wenn die letzten paar werte immer 0 gemeldet wurden

      Meine Adapter und Widgets
      TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
      Links im Profil

      _ 1 Antwort Letzte Antwort
      1
      • _ _R_A_L_F_

        Hallo,

        ich möchte den Durchschnittswert aus 4 Variablen berechnen. Krux ist an dem ganzen: Es kann auch mal vorkommen, dass in einer oder mehreren/allen Variablen eine 0 drin steht.
        Das verändert natürlich am Ende das Durchschnittsergebnis, da der Teiler dann nicht mehr stimmt.
        Bsp. 1+2+3 = Durschnitt 2, 1+0+3 = 2 und nicht 1,33.

        Dazu habe ich folgende Function Node geschrieben:

        var msg0 = { payload: 1, topic: "Msg0" };
        var msg1 = { payload: 2, topic: "Msg1" };
        var msg2 = { payload: 3, topic: "Msg2" };
        var msg3 = { payload: 0, topic: "Msg3" };
        var Teiler = 1;
        var Summe = 0;
        
        // Aktuelle Werte ermitteln. Wenn 0 dann nicht zum Teiler addieren
        for (let i = 0; i < 3; i++) {
        
            if (msg.payload.msg[i] != 0) {
               Teiler = Teiler + 1; 
               Summe = Summe + msg.payload.msg[i];
            }
        }
        
        // Durchschnitt bilden
        msg.payload = Summe / Teiler;
        
        return msg;
        

        Problem ist hierbei aktuell der variable Zugriff über die For Schleife. Hier bekomme ich aktuell die Fehlermeldung "TypeError: Cannot read properties of undefined (reading '0')"

        Das ich hier was falsch mache ist mir bewusst, nur finde ich im Netz dazu keine wirkliche Lösung um einen variablen Variablenzugriff in der Function Node zu realisieren.

        Vielleicht weiß ja jemand wie das klappt ;)

        VG

        mickymM Online
        mickymM Online
        mickym
        Most Active
        schrieb am zuletzt editiert von mickym
        #3

        @_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;
        }
        

        Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

        _ 1 Antwort Letzte Antwort
        0
        • OliverIOO OliverIO

          @_r_a_l_f_

          und was steht im array da so drin.
          den inhalt sieht man hier nicht.
          oder hat es was mit deinen variablen msg0,msg1,... zu tun?
          dann ist die variable adressierung nicht richtig.
          dann eher so

          var msg = [
          { payload: 1, topic: "Msg0" },
          { payload: 2, topic: "Msg1" },
          { payload: 3, topic: "Msg2" },
          { payload: 0, topic: "Msg3" }
          ];
          var Teiler = 1;
          var Summe = 0;
           
          // Aktuelle Werte ermitteln. Wenn 0 dann nicht zum Teiler addieren
          for (let i = 0; i < msg.length; i++) {
           
              if (msg[i].payload != 0) {
                 Teiler = Teiler + 1; 
                 Summe = Summe + msg[i].payload;
              }
          }
           
          // Durchschnitt bilden
          msg.payload = Summe / Teiler; //<<-- da weiß ich nicht was du willst, das überschreibt dir dein msg objekt von oben
           
          return msg;
          
          

          das msg-objekt ist ein array of objects

          warum stört eine 0 den durchschnitt? 0 ist ja auch eine wertaussage und dein durchschnitt kann nie unter 1 fallen,
          auch wenn die letzten paar werte immer 0 gemeldet wurden

          _ Offline
          _ Offline
          _R_A_L_F_
          schrieb am zuletzt editiert von _R_A_L_F_
          #4

          @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 Antwort Letzte Antwort
          0
          • mickymM 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;
            }
            
            _ Offline
            _ Offline
            _R_A_L_F_
            schrieb am zuletzt editiert von
            #5

            @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 ;)

            mickymM 1 Antwort Letzte Antwort
            0
            • _ _R_A_L_F_

              @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 ;)

              mickymM Online
              mickymM Online
              mickym
              Most Active
              schrieb am zuletzt editiert von
              #6

              @_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.

              Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

              _ 1 Antwort Letzte Antwort
              0
              • mickymM Online
                mickymM Online
                mickym
                Most Active
                schrieb am zuletzt editiert von mickym
                #7

                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.

                Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

                1 Antwort Letzte Antwort
                0
                • mickymM mickym

                  @_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.

                  _ Offline
                  _ Offline
                  _R_A_L_F_
                  schrieb am zuletzt editiert von
                  #8

                  @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 ;)

                  OliverIOO 1 Antwort Letzte Antwort
                  0
                  • mickymM Online
                    mickymM Online
                    mickym
                    Most Active
                    schrieb am zuletzt editiert von mickym
                    #9

                    @_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.

                    Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

                    _ 1 Antwort Letzte Antwort
                    0
                    • _ _R_A_L_F_

                      @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 ;)

                      OliverIOO Offline
                      OliverIOO Offline
                      OliverIO
                      schrieb am zuletzt editiert von
                      #10

                      @_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

                      Meine Adapter und Widgets
                      TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                      Links im Profil

                      mickymM _ 2 Antworten Letzte Antwort
                      0
                      • OliverIOO OliverIO

                        @_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

                        mickymM Online
                        mickymM Online
                        mickym
                        Most Active
                        schrieb am zuletzt editiert von mickym
                        #11

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

                        Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

                        OliverIOO 1 Antwort Letzte Antwort
                        0
                        • mickymM 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.

                          OliverIOO Offline
                          OliverIOO Offline
                          OliverIO
                          schrieb am zuletzt editiert von
                          #12

                          @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 :)

                          Meine Adapter und Widgets
                          TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                          Links im Profil

                          mickymM 1 Antwort Letzte Antwort
                          0
                          • OliverIOO OliverIO

                            @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 :)

                            mickymM Online
                            mickymM Online
                            mickym
                            Most Active
                            schrieb am zuletzt editiert von
                            #13

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

                            Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

                            1 Antwort Letzte Antwort
                            1
                            • mickymM 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.

                              _ Offline
                              _ Offline
                              _R_A_L_F_
                              schrieb am zuletzt editiert von
                              #14

                              @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 Antwort Letzte Antwort
                              0
                              • OliverIOO OliverIO

                                @_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

                                _ Offline
                                _ Offline
                                _R_A_L_F_
                                schrieb am zuletzt editiert von
                                #15

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

                                1 Antwort Letzte Antwort
                                0
                                Antworten
                                • In einem neuen Thema antworten
                                Anmelden zum Antworten
                                • Älteste zuerst
                                • Neuste zuerst
                                • Meiste Stimmen


                                Support us

                                ioBroker
                                Community Adapters
                                Donate

                                745

                                Online

                                32.6k

                                Benutzer

                                82.2k

                                Themen

                                1.3m

                                Beiträge
                                Community
                                Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                ioBroker Community 2014-2025
                                logo
                                • Anmelden

                                • Du hast noch kein Konto? Registrieren

                                • Anmelden oder registrieren, um zu suchen
                                • Erster Beitrag
                                  Letzter Beitrag
                                0
                                • Home
                                • Aktuell
                                • Tags
                                • Ungelesen 0
                                • Kategorien
                                • Unreplied
                                • Beliebt
                                • GitHub
                                • Docu
                                • Hilfe