NEWS
Gültigkeitsbereiche von Variablen
-
kann leider den Post nicht löschen ......
-
@ehome ich habe den Abonniert und hätte gerne die Lösung gesehen
Ich fand es ein etwas wildes Spiel bei der Verwendung vonlet
undconst
oder eben dem völligen weglassen. Wollte aber den Profis den Vortritt lassen. -
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]; }
-
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)
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 Triggerfrü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