Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Gültigkeitsbereiche von Variablen

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    Gültigkeitsbereiche von Variablen

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

      kann leider den Post nicht löschen ......

      BananaJoe 1 Reply Last reply Reply Quote 0
      • BananaJoe
        BananaJoe Most Active @ehome last edited by

        @ehome ich habe den Abonniert und hätte gerne die Lösung gesehen 🙂
        Ich fand es ein etwas wildes Spiel bei der Verwendung von let und const oder eben dem völligen weglassen. Wollte aber den Profis den Vortritt lassen.

        E 1 Reply Last reply Reply Quote 0
        • E
          ehome @BananaJoe last edited by ehome

          @bananajoe

          Ups, sorry .
          Hatte den Post gelöscht, da ich mit meinem Skript ziemlich auf dem Holzweg war - ich glaube da war der Mix aus let und const das geringste Problem .....
          Meine Lektion des Woche: Objekte lassen sich nicht mit ObjektNeu=Objekt kopieren ....

          Momentan verwende ich tsMax noch nicht. Habe es aber erst einmal im code drin gelassen....

          create_states und tolog sind globale Funktionen und stehen daher nicht im code
          Hier der funktionierende Code:

          
          // Skript  zum erfassen der Max Arbeit pro tag
          // die maximal Werte werden in powerMax gesichert
          // und zum Tagesanfang resettet
          
          
          let logging=true
          
          //  Prod
          let sourcePath='alias.0.power'
          let targetPath="0_userdata.0.Auswertungen.maxPowerDaily"
          
          // Test
          //let targetPath="0_userdata.0.test.maxPower"
          //let sourcePath="0_userdata.0.test.aliasPower"
          
          var stateObjects=readLoggingObject(sourcePath+"*") // Liste der datenpunkte mit aktuellem Wert als initial wert
          const stateObjectsKeys=keys = Object.keys(stateObjects);
          //log(stateObjectsKeys)
          
          // beim start sind valMax=val und tsMax=ts 
          // sind target datenpunkte noch nicht vorhanden werden sie mit den aktuellen werten angelegt
          
          for (let key in stateObjects) {
            create_states([[targetPath+"."+getDpShort(key), {'name':getDpShort(key), 'type':'number', 'read':true, 'write':true, 'role': "value", 'unit': "W", 'def':  stateObjects[key].val}]])
          }
          
          // falls es einen restart gegeben hat, werden die letzten aktuellen max werte eingelesen
          
          for (let key in stateObjects) {
            if (stateObjects.hasOwnProperty(key)) {
              stateObjects[key]['tsMax'] = getState(targetPath+"."+getDpShort(key)).ts;
              stateObjects[key]['valMax'] = getState(targetPath+"."+getDpShort(key)).val;
            }
          }
          
          //log(stateObjects)
          
          on({id:stateObjectsKeys, change:'ne'}, function (obj) { 
            stateObjects[obj.id]['val']=obj.state.val
            stateObjects[obj.id]['ts']=obj.state.ts
            if (obj.state.val > stateObjects[obj.id]['valMax']) {
              stateObjects[obj.id]['valMax'] = obj.state.val
              stateObjects[obj.id]['tsMax'] = obj.state.ts
              setState(targetPath+"."+getDpShort(obj.id),obj.state.val,true)
            }
          })
           
          // zu tagesbeginn werden die max-werte zurück gesetzt
          
          schedule("0 0 * * *", function () {
            tolog(logging,"Reset max values in "+targetPath)
            for (let key in stateObjects) {
              if (stateObjects.hasOwnProperty(key)) {
                stateObjects[key]['tsMax'] = stateObjects[key].ts;
                stateObjects[key]['valMax'] = stateObjects[key].val;
                setState(targetPath+"."+getDpShort(key),stateObjects[key].val,true)
              }
            }
          })
          
          // funktion zum erstellen von datenpunkten 
          
          function create_states(statesToCreate) { 
                  createUserStates('0_userdata.0.', false, statesToCreate, function(){
                  tolog(logging,"States der Statistikenfür alle Counter erstellt");
              })
          }
          
          // einlesen der werte
          
          function readLoggingObject(object_datapoints) {
            let loggingObj={}
            $(object_datapoints).each(function (id, i) {
                const state = getState(id);          
                if (state && !isNaN(state.val)) {
                    loggingObj[id] = state
                } else {
                    loggingObj[id].state={};
                }
            })
            return loggingObj
          }
          
          function logDp(obj) {
            for (const key of Object.keys(obj)) {
              tolog(logging,"Key: "+key+" aktuell: "+obj[key]['val']+" Max: "+obj[key]['valMax']+" MaxTS: "+obj[key]['tsMax'])
            }
          }
          
          // erstellen des short names
          
          function getDpShort(str) {
            const parts = str.split('.');
            return parts[parts.length - 1];
          }
          
          1 Reply Last reply Reply Quote 0
          • arteck
            arteck Developer Most Active last edited by arteck

            ich habs mir angeschaut... und wusste nicht wo ich anfangen soll...

            Empfehlung an @ehome setzt dich nochmal mit der Syntax/Semantik von Javascript zusammen (und ich rede nicht von CleanCode)

            @BananaJoe

            eigentlich ist es ganz einfach

            let var1 = true;
            
            if (var1) {
              let var2 = false;
            }
            

            var1 ist allgemein gültig (globale Variable) für den ganzen Programm/Script lauf auch innerhalb der if Abfrage
            var2 ist nur in der if Abfrage gültig ... (lokale Variable) ..das kann man jetzt weiter treiben auf Schleifen oder Trigger

            früher war das Problem von globalen Variablen dass diese (wie jede andere auch) speicher Platz im RAM verbraucht haben.. und dieser sehr knapp war..
            man musste genaustens überlegen wie viel Byte man braucht.. und ob die Variable nur einmal oder mehrere male oder für den ganzen Programmlauf benötigt war
            Devs die vor 40 Jahren Programmiert haben wissen wovon ich rede

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

            Support us

            ioBroker
            Community Adapters
            Donate

            390
            Online

            31.8k
            Users

            80.0k
            Topics

            1.3m
            Posts

            3
            4
            213
            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