NEWS
Zwischenschalter Dauer errechnen
-
"to.Fixed(2)" erzeugt bei mir eigenartige Zahlen (10.10.21 kWh) `
.toFixed(2) müsste funktionieren. -
Ich habe mich nur im Beitrag verschrieben nicht im Script. @toFixed(2).
Er macht da wahrlich falsche Zahlen. Wenn der Wert 10 schon da ist und einer neuer Wert 5 kommt, dann addiert er nicht sondern hängt den Wert an.
z.B. 10.00.5.00
var p = 1.500; // Leistung in kW on({id: "hm-rpc.0.LEQ0475825.1.STATE", val: false}, function(dp) { // setState("Verbrauch_Adrian", 0); var ton = dp.newState.lc - dp.oldState.lc; var en = p * ton / 3600; // aktueller Verbrauch in kWh var eu = en * 0.25; var em = getState("Verbrauch_Adrian").val + eu; var e = em.toFixed(2); setState("Verbrauch_Adrian", getState("Verbrauch_Adrian").val + e); // kumulierter Verbrauch in kWh });
-
Hallo,
schreib doch einach eine Logausgabe hinter jede Zeile und sieh dir die Werte an.
var p = 1.500; // Leistung in kW on({id: "hm-rpc.0.LEQ0475825.1.STATE", val: false}, function(dp) { // setState("Verbrauch_Adrian", 0); var ton = dp.newState.lc - dp.oldState.lc; log(ton + ' ' + typeof ton); var en = p * ton / 3600; // aktueller Verbrauch in kWh log(en + ' ' + typeof en); var eu = en * 0.25; log(eu + ' ' + typeof eu); var em = getState("Verbrauch_Adrian").val + eu; log(em + ' ' + typeof em); var e = em.toFixed(2); log(e + ' ' + typeof e); setState("Verbrauch_Adrian", getState("Verbrauch_Adrian").val + e); // kumulierter Verbrauch in kWh log(getState('Verbrauch_Adrian').val); });
Gruß
Pix
-
Versuche es mal so:
var p = 1.500; // Leistung in kW on({id: "hm-rpc.0.LEQ0475825.1.STATE", val: false}, function(dp) { // setState("Verbrauch_Adrian", 0); var ton = dp.newState.lc - dp.oldState.lc; var en = p * ton / 3600; // aktueller Verbrauch in kWh var eu = en * 0.25; var em = parseFloat(getState("Verbrauch_Adrian").val) + eu; // kumulierter Verbrauch in Euro setState("Verbrauch_Adrian", em.toFixed(2)); });
Anmerkung: .toFixed(n) erzeugt einen String, denn eine feste Zahl an Nachkommastellen läßt sich nur für einen String vorgeben. parseFloat(string) macht daraus wieder eine Zahl (number).
-
Hallo,
seit einiger Zeit funktioniert meine Berechnung nicht mehr. Vielleicht hat sich im JavaScript was geändert oder in der Homematic Firmware. Vielleicht kann mir einer einen Ratschlag geben.
var p = 1.500; // Leistung in kW on({id: "hm-rpc.0.LEQ0475825.1.STATE", val: false}, function(dp) { // setState("Verbrauch_Adrian", 0); var ton = dp.newState.lc - dp.oldState.lc; var en = p * ton / 3600; // aktueller Verbrauch in kWh var eu = en * 0.25; var em = parseFloat(getState("Verbrauch_Adrian").val) + eu; // kumulierter Verbrauch in Euro setState("Verbrauch_Adrian", em.toFixed(2)); });
LOG:
javascript.0 2016-11-02 09:38:00.870 warn Wrong type of javascript.0.Verbrauch_gesamt: "string". Please fix, while deprecated and will not work in next versions. javascript.0 2016-11-02 09:37:50.800 warn Wrong type of javascript.0.Verbrauch_Stube: "string". Please fix, while deprecated and will not work in next versions.
Die Scripte ergeben Verbräuche jenseits von gut und böse. Mal 3000€ pro Heizung pro Tag usw.
Gruß Marco
-
Hallo,
also irgendwie passt das Log was du gepostet hast nicht zu dem (Stückchen) Skript was du gepostet hast…
Davon abgesehen - ich denke dass du hier ein Problem mit vermischten Datentypen hast. Welchen Datentyp hat denn die Variable "Verbrauch_Adrian"? Ich denke mal "String(bzw. Zeichenfolge)". Kann es sein, dass bei:
(parseFloat(getState("Verbrauch_Adrian").val) + eu).toFixed(2)
irgendwo zwischendurch das Komma bzw. der Punkt "abhanden kommt" und deshalb zum Schluss zwei Nullen zuviel am Wert hängen. LAss Dir doch bitte mal die einzelnen Zwischenwerte (ton, en, eu, em) ins Log schreiben. DAnn sollte man vielleicht schon mal was sehen können wo ein falscher Wert auftaucht.
Eigentlich wäre es ja IMO der "sauberere" Weg die Variable "Verbrauch_Adrian" gleich vom Typ "Zahl" zu definieren. Sollen ja schließlich Zahlenwerte drin gespeichert werden - oder?
-
Hallo,
Eigentlich wäre es ja IMO der "sauberere" Weg die Variable "Verbrauch_Adrian" gleich vom Typ "Zahl" zu definieren. Sollen ja schließlich Zahlenwerte drin gespeichert werden - oder? ` Das denke ich auch. Zur Anzeige in VIS kann immer noch in val number Widget verwendet werden, das sich auf zwei Dezimalstellen einstellen lässt.
Können wir mal ganzen Code sehen? Auch den Teil, wo die States angelegt werden?
Gruß
Pix
-
Die Datenpunkte "javascript.0.Verbrauch_xy" müssen vom Typ "string" sein, denn toFixed(2) wandelt in einen String.
Deshalb wird der Wert des Datenpunktes mittels parseFloat() zur Berechnung des kumulativen Wertes in eine Zahl gewandelt.
Will man Datenpunkte vom Typ "number" verwenden, muss man die Rundung auf 2 Nachkommastellen anders vornehmen:
var em = getState("Verbrauch_Adrian").val + eu; // kumulierter Verbrauch in Euro setState("Verbrauch_Adrian", 0.01 * Math.round(100 * em));
-
Ja, natürlich muss man dann anders Runden.
Trotzdem ist es auf jeden Fall die bessere Lösung die Datenpunkte als "number" zu definieren und somit nicht jedesmal von "String"->"number"->"String" zu konvertieren!
[Edit] hier war ich mit den Posts durcheinander geraten…
-
Die Scripte ergeben Verbräuche jenseits von gut und böse. Mal 3000€ pro Heizung pro Tag usw. `
Die Zeitstempel sind nicht mehr in Sekunden, sondern (ab js-controller Version 0.9.0) in Millisekunden:var p = 1.500; // Leistung in kW on({id: "hm-rpc.0.LEQ0475825.1.STATE", val: false}, function(dp) { var ton = dp.newState.lc - dp.oldState.lc; var en = p * ton / 3600000; // aktueller Verbrauch in kWh var eu = en * 0.25; var em = getState("Verbrauch_Adrian").val + eu; // kumulierter Verbrauch in Euro setState("Verbrauch_Adrian", 0.01 * Math.round(100 * em)); });
Mit Datenpunkt "Verbrauch_Adrian" vom Typ "number".
-
Vielen Dank. Es scheint wieder richtig zu funktionieren.
Viele Grüße
Marco
-
Das war der entscheidende Hinweis von @paul53 dass der Zeitstempel jetzt in Millisekunden ist. Hatte ich nicht mehr dran gedacht, ist ja nun wirklich auch schon seeeeehr, sehr lange her von Version 0.9.0 auf 3.1.0