NEWS
[gelöst] 1. Schritte mit Javascript: Prob mit setInterval?
-
Guten Tag, bin nun dabei, meinen ioBroker für mein zukünftiges SmartHome anzupassen und probiere 1. Schritte mit Javascript:
Dies ist mein allererstes Script, was ich mir aus einem iobroker-Javascript-Tutorial zusammengezimmert habe:
// Datenpunkt-ID var idStromverbrauch = '0_userdata.0.Zuhause.Stromverbrauch'; var idSolarprod = 'fritzdect.0.DECT_116570452148.power'; var idStromsaldo = 'sonoff.0.Hichi-SGM-1._Verbrauch_Aktuell'; // Variablendeklaration var nStrSal = getState(idStromsaldo).val; var nSolProd = getState(idSolarprod).val; // Berechnung des eigentlichen Stromverbrauchs im Haus ohne BKW function Stromverbrauch() { var nStrVer = nStrSal + nSolProd; setState(idStromverbrauch, nStrVer, true); } setInterval(Stromverbrauch, 5000);
Mit einem Node Red Tutorial gibt es jetzt auch schon eine grafisch langweilige Übersicht der 3 verwendeten Werte:
Wie man sieht, haut der Saldo aber nicht hin. Und wenn ich es richtig sehe, wird mein eigenes Objekt "Stromverbrauch" eben nicht alle 5000 Millisekunden aktualisiert.
Aber ist setInterval nicht genau dafür da?
PS: Alle Werte als Ganzzahl zu formatieren, ist der nächste Schritt. ^^
-
@shai0hulud
Du rechnest alle 5 Sekunden mit den selben Zahlen// Datenpunkt-ID var idStromverbrauch = '0_userdata.0.Zuhause.Stromverbrauch'; var idSolarprod = 'fritzdect.0.DECT_116570452148.power'; var idStromsaldo = 'sonoff.0.Hichi-SGM-1._Verbrauch_Aktuell'; // Berechnung des eigentlichen Stromverbrauchs im Haus ohne BKW function Stromverbrauch() { var nStrVer = getState(idStromsaldo).val + getState(idSolarprod).val; setState(idStromverbrauch, nStrVer, true); } setInterval(Stromverbrauch, 5000); // alternativ geht auch schedule('*/5 * * * * *', Stromverbrauch) // jede Sekunde die durch 5 ohne Rest teilbar ist
PS: Alle Werte als Ganzzahl zu formatieren, ist der nächste Schritt. ^^
nStrVer = Math.round(nStrVer)
Ich würde sie aber vorm rechnen ganzzahlig machen sonst stimmt das Ergebnis wieder nicht.
-
@ticaki said in 1. Schritte mit Javascript: Prob mit setInterval?:
@shai0hulud
Du rechnest alle 5 Sekunden mit den selben ZahlenOops, stimmt ja. Wenn die definierten Variablen außerhalb der Funktion gefüttert werden ^^
// Datenpunkt-ID var idStromsaldo = 'sonoff.0.Hichi-SGM-1._Verbrauch_Aktuell'; var idSolarprod = '0_userdata.0.Zuhause.SolarproduktionGZ'; var idStromverbrauch = '0_userdata.0.Zuhause.Stromverbrauch'; // Variablendeklaration // Berechnung des eigentlichen Stromverbrauchs im Haus ohne BKW function Stromverbrauch() { var nStrSal = getState(idStromsaldo).val; var nSolProd = getState(idSolarprod).val; var nStrVer = nStrSal + nSolProd; setState(idStromverbrauch, nStrVer, true); } setInterval(Stromverbrauch, 5000);
So passt es jetzt, muss nur die Solarproduktion vorher ganzzahlig machen, da der Hichi Lesekopf den Stromverbrauch bereits als Ganzzahl ausgibt.
Merci!
-
@shai0hulud
Noch eine kleinigkeit die mich vor Jahren nerven gekostet hat.function eins(){ var a = 'test' let b = 'test' } function zwei() { log(a) // test log(b) // error } eins() zwei()
Daher benutze let wenns nicht global sein soll
-
@ticaki said in 1. Schritte mit Javascript: Prob mit setInterval?:
@shai0hulud
Noch eine kleinigkeit die mich vor Jahren nerven gekostet hat.function eins(){ var a = 'test' let b = 'test' } function zwei() { log(a) // test log(b) // error } eins() zwei()
Daher benutze let wenns nicht global sein soll
Ich bin ja JS Noob, aber wenn ich die Googleergebnisse richtig interpretiere, ist var "global" gültig, let nur innerhalb des Funktions-Blocks.
Und das die Meinungen da sehr auseinandergehen, was man standardmäßig nutzen sollte ^^
Danke nochmal!
-
@ticaki sagte: Daher benutze let wenns nicht global sein soll
Wenn eine Variable innerhalb einer Funktion deklariert wird - egal, ob mit var oder let - ist sie lokal. log(a) in Funktion zwei() liefert
ReferenceError: a is not defined
-
@paul53
Recht hast du... und wann hat sich das geändert? Das war mal anders -
@ticaki sagte: Das war mal anders
Daran kann ich mich nicht erinnern.
-
Dann sorry für die falsche Info und Danke für die Berichtigung.
-
@paul53 sagte: Daher benutze let wenns nicht global sein soll
Das trifft auf Verbundanweisungen zu - nicht auf Funktionen:
var a = 1; let b = 2; if(true) { var a = 3; let b = 4; } log(a); // 3 log(b); // 2