Hallo Udo,
es hat sich jetzt herausgestellt, dass die Verbräuche relativ ungenau sind. Problem sind schwanken Verbraucher. Zum Beispiel wenn der Fernseher läuft, so schwankt der IST Verbrauch zwischen 150 Watt und 200 Watt. Da wir per Rule nur jede Minute die Summierung machen, nimmt er den derzeit vorliegenden Verbrauch.
Ich habe bei Shellys 2 Verbrauchs Topics
1. Load = Der aktuelle Verbrauch in Watt (Der derzeit Verwendete Topic mit der Gruppe gVerbrauch)
2. Energie = Zeigt die Verbrauchte Summe in Watt-Minuten zeit dem einstecken des Shellys. (Hier wird exakt aufsummiert auch wenn der Verbrauch schwankt)
Beide Topics updaten minütlich.
Meine Idee wäre jetzt um genauere Werte zu bekommen, die Differenz des Energie Topics zur vorherigen Minute zu Berechnen und diese aufzusummieren. Hierdurch hätten würden die Schwankungen keine rolle spielen. Die Differenz wäre auch wichtig, da die Gesamtsumme des Topics Energie bei Stromausfall oder neu einstecken des Shellys bei 0 startet, keine Probleme mit den Dummizählern zu bekommen.
Weiterer Vorteil der Differenz wäre, ich kann eine 2te Rule für Tasmota Geräte erstellen und das Topic Verbrauch Heute nutzen. Muss hier allerdings beachten, dass ein update des Topics nur alle 4 Minuten gesendet wird (anders Umrechnen).
Ein paar Beiträge weiter oben hattest du einen Vorschlag einer Rule mit Differenz gemacht. Hier ist mein Problem aktuell, dass diese Rule auf ein definiertes Item bezogen ist. Ich möchte aber meinen Namesspilt der letzten Rule beibehalten, um meherere Items der Gruppe gLoad entsprechend upzudaten.
Ich habe mal versucht hier die Rule zusammenzubasteln, bin mir aber sicher, dass diese Fehlerhaft ist.
Wo und Wie kann ich die Differenzberechnung einbauen, sodass nur die Differenz von aktuell zu letzter Minute aufsummiert wird?
Danke und Gruß
Tom
Code: Alles auswählen
rule "Test mit Differenz"
when
Time cron "5 * * * * ?" // jede Minute in der 5. Sekunde
then
gVerbrauch.members.forEach[i|
// nLoad gegen nDelta ersetzt und die Formel angepasst
val Number nDelta = ((0) /60000) // Die berechnung scheint mir falsch zu sein. An welcher stelle rechne ich nun von Watt in kWh um?
val myItemTag = gLoad.members.filter[ f |
f.name.split("_").get(1) == i.name.split("_").get(1) &&
f.name.contains("Tag")
].head // passendes Item
val myItemWoche = gLoad.members.filter[ f |
f.name.split("_").get(1) == i.name.split("_").get(1) &&
f.name.contains("Woche")
].head // passendes Item
val myItemMonat = gLoad.members.filter[ f |
f.name.split("_").get(1) == i.name.split("_").get(1) &&
f.name.contains("Monat")
].head // passendes Item
val myItemKostenTag = gLoad.members.filter[ f |
f.name.split("_").get(1) == i.name.split("_").get(1) &&
f.name.contains("KostenTag")
].head // passendes Item
val myItemKostenWoche = gLoad.members.filter[ f |
f.name.split("_").get(1) == i.name.split("_").get(1) &&
f.name.contains("KostenWoche")
].head // passendes Item
val myItemKostenMonat = gLoad.members.filter[ f |
f.name.split("_").get(1) == i.name.split("_").get(1) &&
f.name.contains("KostenMonat")
].head // passendes Item
// Neu eingefügt
if(i.deltaSince(now.minusMinutes(1)) instanceof Number) nDelta = i.deltaSince(now.minusMinutes(1)) as Number
if(nDelta > 0) {
// nLoad gegen nDelta ersetzt
myItemTag.postUpdate(nDelta + if(myItemTag.state instanceof Number) (myItemTag.state as Number) else 0)
myItemWoche.postUpdate(nDelta + if(myItemWoche.state instanceof Number) (myItemWoche.state as Number) else 0)
myItemMonat.postUpdate(nDelta + if(myItemMonat.state instanceof Number) (myItemMonat.state as Number) else 0)
myItemKostenTag.postUpdate(nDelta * 0.3 + if(myItemKostenTag.state instanceof Number) (myItemKostenTag.state as Number) else 0)
myItemKostenWoche.postUpdate(nDelta * 0.3 + if(myItemKostenWoche.state instanceof Number) (myItemKostenWoche.state as Number) else 0)
myItemKostenMonat.postUpdate(nDelta * 0.3 + if(myItemKostenMonat.state instanceof Number) (myItemKostenMonat.state as Number) else 0)
]
end