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 Woche
zu jedem Präfix dann die Werte:
VerbrauchVolumen, VerbrauchEnergie, VerbrauchKosten, letzterZählerstand
und die allgemeinen DP:
Gaszählerstand, aktErdgasArbeitspreis, aktErdgasBrennwert, aktErdgasZustandszahl
Das 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:
38bf1f3f-52b6-44f6-82da-cfa385f9121f-image.png
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