NEWS
Zähleränderungen pro Tag berechnen?
-
@rushmed
Danke, schaue ich mir dann auch mal an. -
@homoran sagte in Zähleränderungen pro Tag berechnen?:
DP "alter Zählerstand" anlegen.
abends um 23:59:45
Zählerstand-alterZähletstand berechnen und danach den DP mit aktuellem Zählerstand befüllen.Ich habe das jetzt gerade mal versucht mit:
// Tages-Stromverbrauch messen on({id: [].concat(compareTime("23:50", "null", "==")), val: true}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; ZaehlerVerbrauchGestern = getState("0_userdata.0.AlterVerbauchsZaehlerStand").val; ZaehlerVerbrauchHeute = getState("0_userdata.0.Verbrauchszaehler_SHM").val; DeltaTagesVerbrauch = parseFloat(ZaehlerVerbrauchHeute) - ZaehlerVerbrauchGestern; setState("0_userdata.0.TagesStromVerbrauch"/*TagesStromVerbrauch*/, DeltaTagesVerbrauch, true); setState("0_userdata.0.AlterVerbauchsZaehlerStand"/*AlterVerbauchsZaehlerStand*/, ZaehlerVerbrauchHeute, true); console.log(('TagesStromverbrauch: ' + String(('' + getState("0_userdata.0.TagesStromVerbrauch").val)))); });
Leider bekomme ich da einen Fehler, den ich nicht verstehe:
script.js.Verbrauchszählung Error by subscription: empty ID defined. All states matched.
Mir ist nicht klar, was da eine "empty ID" ist.
-
@bertderkleine sagte in Zähleränderungen pro Tag berechnen?:
mal versucht mit:
ist das ein Blockly, dann bitte zeigen!
-
@bertderkleine sagte in Zähleränderungen pro Tag berechnen?:
String(('' + getState("0
fehlt da etwas zwischen
'..'
-
@homoran sagte in Zähleränderungen pro Tag berechnen?:
@bertderkleine sagte in Zähleränderungen pro Tag berechnen?:
mal versucht mit:
ist das ein Blockly, dann bitte zeigen!
So sieht es aus:
-
@bertderkleine sagte in Zähleränderungen pro Tag berechnen?:
So sieht es aus:
dann ist klar!
der Trigger triggert auf keine IDDas ist für deine Aufgabe auch der falsche Triggerblock.
Du brauchst den CRON Trigger -
@homoran sagte in Zähleränderungen pro Tag berechnen?:
@bertderkleine sagte in Zähleränderungen pro Tag berechnen?:
So sieht es aus:
dann ist klar!
der Trigger triggert auf keine IDKannst Du das für Aussenstehende übersetzen?
"Falls aktuelle zeit = x ist wahr" klingt für mich erstmal schlüssig als Auslöser und die Blöcke docken problemlos aneinander. Keine Ahnung was mit "ID" hier gemeint ist.Das ist für deine Aufgabe auch der falsche Triggerblock.
Du brauchst den CRON TriggerIch habe jetzt mal nach anderem gesucht. Ist dieser "Zeitplan"-Baustein das, was Du meinst?
Damit gibts jedenfalls keinen sofortigen Fehler.Da gibts auch andere Bausteine, die "CRON" drinhaben.
-
@bertderkleine sagte in Zähleränderungen pro Tag berechnen?:
Falls aktuelle zeit = x ist wahr" klingt für mich erstmal schlüssig
istces auch, aber es ist keine ID (Datenpunkt)
und nur diese dürfen dahin@bertderkleine sagte in Zähleränderungen pro Tag berechnen?:
Da gibts auch andere Bausteine, die "CRON" drinhaben.
dann nimm die anderen
der von dir gewählte kann buggy sein!
nimm einen eifachen CRON -
@homoran sagte in Zähleränderungen pro Tag berechnen?:
dann nimm die anderen
der von dir gewählte kann buggy sein!
nimm einen eifachen CRONDer reine "CRON" ist aber so ein Puzzlestück. Wo stopfe ich den denn rein?
M.a.W. welchen Trigger benutze ich als Klammer? -
-
@homoran
Genau den Zeitplan benutze ich jetzt. Morgen weiss ich ob's geklappt hat. -
Hi Leute, darf ich mich hier mal anschließen?
Meine Umsetzung hilft vielleicht auch dem TE. Sie ist leider noch nicht perfekt, dazu am Ende mehr. Sie ist für Gas, kann aber neben dem Verbrauch auch gleich die Kosten mitberechnen und lässt sich einfach auf Strom anpassen.
Ich lese mit Aqara die Gaszählerimpulse und habe einen DP Gaszählerstand, der auch zuverlässig in Schritten von 0,1m³ aktualsisiert wird. So weit so gut. Mit dem Blockly zur Verbrauchsberechnung hängt es aber noch ein wenig und ich weiß nicht, warum. Folgende User-Datenpunkte gibt es...
Präfixe:
h_ / d_ / w_ als Präfix für Stunde, Tag und Wochezu jedem Präfix dann die Werte:
VerbrauchVolumen, VerbrauchEnergie, VerbrauchKosten, letzterZählerstandund die allgemeinen DP:
Gaszählerstand, aktErdgasArbeitspreis, aktErdgasBrennwert, aktErdgasZustandszahlDas Blockly läuft stündlich und aktualisiert die Stundenwerte, prüft ob Mitternach ist und aktualisiert die Tageswerte, prüft dabei ob Montag ist und aktualisiert die Wochenwerte.
Hier das Blockly als Quellcode:
schedule("0 * * * *", async function () { // Aufruf stündlich, immer vorherige Stunde berechnen setState("0_userdata.0.Gaszähler.Stunde.h_VerbrauchVolumen"/*h_VerbrauchVolumen*/, Math.round((parseFloat(getState("0_userdata.0.Gaszähler.Gaszählerstand").val) - getState("0_userdata.0.Gaszähler.Stunde.h_letzter_Zählerstand").val)*10)/10, true); setState("0_userdata.0.Gaszähler.Stunde.h_VerbrauchEnergie"/*h_VerbrauchEnergie*/, Math.round((parseFloat(getState("0_userdata.0.Gaszähler.Stunde.h_VerbrauchVolumen").val) * parseFloat(getState("0_userdata.0.Gaszähler.aktErdgasZustandszahl").val) * getState("0_userdata.0.Gaszähler.aktErdgasBrennwert").val)*100)/100, true); setState("0_userdata.0.Gaszähler.Stunde.h_VerbrauchKosten"/*h_VerbrauchKosten*/, Math.round((parseFloat(getState("0_userdata.0.Gaszähler.Stunde.h_VerbrauchEnergie").val) * getState("0_userdata.0.Gaszähler.aktErdgasArbeitspreis").val)*100)/100, true); setState("0_userdata.0.Gaszähler.Stunde.h_letzter_Zählerstand"/*h_letzter Zählerstand*/, getState("0_userdata.0.Gaszähler.Gaszählerstand").val, true); // Wenn Stunde gleich 0 dann Vortag berechnen if ((new Date().getHours()) == 0) { setState("0_userdata.0.Gaszähler.Tag.d_VerbrauchVolumen"/*d_VerbrauchVolumen*/, Math.round((parseFloat(getState("0_userdata.0.Gaszähler.Gaszählerstand").val) - getState("0_userdata.0.Gaszähler.Tag.d_letzterZählerstand").val)*10)/10, true); setState("0_userdata.0.Gaszähler.Tag.d_VerbrauchEnergie"/*d_VerbrauchEnergie*/, Math.round((parseFloat(getState("0_userdata.0.Gaszähler.Tag.d_VerbrauchVolumen").val) * parseFloat(getState("0_userdata.0.Gaszähler.aktErdgasZustandszahl").val) * getState("0_userdata.0.Gaszähler.aktErdgasBrennwert").val)*100)/100, true); setState("0_userdata.0.Gaszähler.Tag.d_VerbrauchKosten"/*d_VerbrauchKosten*/, Math.round((parseFloat((parseFloat(getState("0_userdata.0.Gaszähler.Tag.d_VerbrauchEnergie").val) * getState("0_userdata.0.Gaszähler.aktErdgasArbeitspreis").val)) / 100)*100)/100, true); setState("0_userdata.0.Gaszähler.Tag.d_letzterZählerstand"/*d_letzterZählerstand*/, getState("0_userdata.0.Gaszähler.Gaszählerstand").val, true); // Wenn Wochentag gleich 1 (Montag) dann Vorwoche berechnen if ((new Date().getDay() === 0 ? 7 : new Date().getDay()) == 1) { setState("0_userdata.0.Gaszähler.Woche.w_VerbrauchVolumen"/*w_VerbrauchVolumen*/, Math.round((parseFloat(getState("0_userdata.0.Gaszähler.Gaszählerstand").val) - getState("0_userdata.0.Gaszähler.Woche.w_letzterZählerstand").val)*10)/10, true); setState("0_userdata.0.Gaszähler.Woche.w_VerbrauchEnergie"/*w_VerbrauchEnergie*/, Math.round((parseFloat(getState("0_userdata.0.Gaszähler.Woche.w_VerbrauchVolumen").val) * parseFloat(getState("0_userdata.0.Gaszähler.aktErdgasZustandszahl").val) * getState("0_userdata.0.Gaszähler.aktErdgasBrennwert").val)*100)/100, true); setState("0_userdata.0.Gaszähler.Woche.w_VerbrauchKosten"/*w_VerbrauchKosten*/, Math.round((parseFloat((parseFloat(getState("0_userdata.0.Gaszähler.Woche.w_VerbrauchEnergie").val) * getState("0_userdata.0.Gaszähler.aktErdgasArbeitspreis").val)) / 100)*100)/100, true); setState("0_userdata.0.Gaszähler.Woche.w_letzterZählerstand"/*w_letzterZählerstand*/, getState("0_userdata.0.Gaszähler.Gaszählerstand").val, true); } } });
und hier in der Grafik:
In den allermeisten Fällen läuft es zuverlässig jede Stunde und aktualisiert alle Werte die zu dem jeweiligen Zeitpunkt fällig sind. Manchmal jedoch wird je Sektion nur der letzte Punkt ausgeführt, also nur der letzte Zählerstand von Stunde, Tag oder Woche mit dem aktuellen Zählerstand aktualisiert. Die Berechnungen werden in den seltenen Fällen nicht ausgeführt oder nicht geschrieben.
Hat jemand eine Idee, warum das manchmal passieren könnte? Oder was ich zum Debuggen unternehmen kann? In der Console unter dem Script erscheinen keine Fehler, im Protokoll auch nicht. Da bin ich ein wenig ratlos.
Viele Grüße,
Peter