Stromverbrauch für Tag, Woche, Monat, Jahr berechnen
- udo1toni
- Beiträge: 13859
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Stromverbrauch für Tag, Woche, Monat, Jahr berechnen
So wie es da steht. Ich weiß ja nicht, wie Deine Messwerte in openHAB ankommen. Bei mir gibt es z.B. ca. alle 3 Sekunden ein Update, womit eine Regelmäßigkeit automatisch gegeben ist. Wichtig ist dann nur, dass die Datenbank auch mit everyUpdate arbeitet.
Vielleicht kommen Deine Daten aber unregelmäßig, dann wäre eine Option, statt everyChange oder everyUpdate ausschließlich everynnSeconds zu nutzen (wobei nn dann davon abhängt, in welchem Rahmen sich Deine Updates bewegen). Die Startegy musst Du im Zweifel über eine passende <service>.persist Datei anlegen (<service> ist der Name der Persistence, also z.B. rrd4j.persist)
Vielleicht kommen Deine Daten aber unregelmäßig, dann wäre eine Option, statt everyChange oder everyUpdate ausschließlich everynnSeconds zu nutzen (wobei nn dann davon abhängt, in welchem Rahmen sich Deine Updates bewegen). Die Startegy musst Du im Zweifel über eine passende <service>.persist Datei anlegen (<service> ist der Name der Persistence, also z.B. rrd4j.persist)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 343
- Registriert: 9. Jan 2021 22:55
Re: Stromverbrauch für Tag, Woche, Monat, Jahr berechnen
Ohh das ist mir zu hoch ich nutze zur Zeit noch die rrd4j.persist. Muss ich dort einen Ordner anlegen ?
openhab4.1.1 auf Pi 4 im Docker Portainer /Grafana&InfluxDB auf Pi 3 in Docker Portainer
- udo1toni
- Beiträge: 13859
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Stromverbrauch für Tag, Woche, Monat, Jahr berechnen
Also, irgendwie passt Deine Frage nicht zu Deiner Aussage...
rrd4j.persist <- das ist eine Datei. Die befindet sich im Ordner /etc/openhab/persistence/. Oder auch nicht. Du nutzt ja openHAB3, da muss man diese Datei nicht explizit anlegen (leider). openHAB3 nutzt - ohne dass man das installiert - automatisch rrd4j als Persistence Service, mit den Default Einstellungen everyChange, everyMinute für alle Items. Deshalb bekommst Du unter Analyze die hübschen Kurven.
Allerdings ist rrd4j nicht automatisch als Default Persistence gesetzt. Solange keine weitere Persistence installiert ist, spielt das keine Rolle, sobald Du eine weitere Persistence installierst, musst Du auch die Default Persistence setzen.
Aber noch Mal zurück zu Deinen Messwerten: Wie kommt der Zählerstand nach openHAB? Welceh Systeme sind beteilgt, welceh Bindings werden verwendet, wie sieht die Konfiguration aus?
rrd4j.persist <- das ist eine Datei. Die befindet sich im Ordner /etc/openhab/persistence/. Oder auch nicht. Du nutzt ja openHAB3, da muss man diese Datei nicht explizit anlegen (leider). openHAB3 nutzt - ohne dass man das installiert - automatisch rrd4j als Persistence Service, mit den Default Einstellungen everyChange, everyMinute für alle Items. Deshalb bekommst Du unter Analyze die hübschen Kurven.
Allerdings ist rrd4j nicht automatisch als Default Persistence gesetzt. Solange keine weitere Persistence installiert ist, spielt das keine Rolle, sobald Du eine weitere Persistence installierst, musst Du auch die Default Persistence setzen.
Aber noch Mal zurück zu Deinen Messwerten: Wie kommt der Zählerstand nach openHAB? Welceh Systeme sind beteilgt, welceh Bindings werden verwendet, wie sieht die Konfiguration aus?
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 343
- Registriert: 9. Jan 2021 22:55
Re: Stromverbrauch für Tag, Woche, Monat, Jahr berechnen
Habe meine Buderus Gastherme über das KM 200 Binding eingebunden. Das stellt ja verschiedene Points zu Verfügung (z.B. Druck, Vorlauftemperatur, Rücklauftemperatur und vor allen Verbrauch)
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
openhab4.1.1 auf Pi 4 im Docker Portainer /Grafana&InfluxDB auf Pi 3 in Docker Portainer
- udo1toni
- Beiträge: 13859
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Stromverbrauch für Tag, Woche, Monat, Jahr berechnen
Dir ist aber schon bewusst, dass Du in der Rule den NAmen des triggernden Items auf heatQuellen_consumption ändern musst?
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 343
- Registriert: 9. Jan 2021 22:55
Re: Stromverbrauch für Tag, Woche, Monat, Jahr berechnen
ja hatte ich gemacht
Code: Alles auswählen
rule "Gasverbrauch Tag Woche Monat Jahr"
when
Item heatQuellen_consumption changed
then
val kwprol = 0.1522
val Preis = 1.061
val ZonedDateTime zdt = ZonedDateTime.now()
val ZonedDateTime start_of_day = zdt.with(LocalTime.MIDNIGHT)
val ZonedDateTime start_of_week = start_of_day.minusDays(start_of_day.getDayOfWeek.getValue - 1)
val ZonedDateTime start_of_month = start_of_day.withDayOfMonth(1)
val ZonedDateTime start_of_year = start_of_day.withDayOfYear(1)
val Gas_Heute = (heatQuellen_consumption.deltaSince(start_of_day) as Number).floatValue
val Gas_Woche = (heatQuellen_consumption.deltaSince(start_of_week) as Number).floatValue
val Gas_Monat = (heatQuellen_consumption.deltaSince(start_of_month) as Number).floatValue
val Gas_Jahr = (heatQuellen_consumption.deltaSince(start_of_year) as Number).floatValue
val Liter_Heute = Gas_Heute * kwprol
val Liter_Woche = Gas_Woche * kwprol
val Liter_Monat = Gas_Monat * kwprol
val Liter_Jahr = Gas_Jahr * kwprol
val Euro_Heute = String::format("%.2f €",(Liter_Heute * Preis))
val Euro_Woche = String::format("%.2f €",(Liter_Woche * Preis))
val Euro_Monat = String::format("%.2f €",(Liter_Monat * Preis))
val Euro_Jahr = String::format("%.2f €",(Liter_Jahr * Preis))
GasSumme_Heute.postUpdate(Gas_Heute.toString+" kWh/"+ String::format("%.2f",(Liter_Heute)) +" l/" + Euro_Heute)
GasSumme_Woche.postUpdate(Gas_Woche.toString+" kWh/"+ String::format("%.2f",(Liter_Woche)) +" l/" + Euro_Woche)
GasSumme_Monat.postUpdate(Gas_Monat.toString+" kWh/"+ String::format("%.2f",(Liter_Monat)) +" l/" + Euro_Monat)
GasSumme_Jahr.postUpdate(Gas_Jahr.toString+" kWh/"+ String::format("%.2f",(Liter_Jahr)) +" l/" + Euro_Jahr)
end
openhab4.1.1 auf Pi 4 im Docker Portainer /Grafana&InfluxDB auf Pi 3 in Docker Portainer
- udo1toni
- Beiträge: 13859
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Stromverbrauch für Tag, Woche, Monat, Jahr berechnen
Es gibt eigentlich nur drei Möglichkeiten:
1. Der Zähler hat zwischendurch kleinere Werte (Zähler ist nicht monoton wachsend)
2. Beim Berechnen der Zeitpunkte kommen unterschiedliche Werte für den Startzeitpunkt zustande
3. zu 2. alternativ werden Beim Abruf der Persistence falsche Werte aus der Datenbank entnommen.
Drittens könnte im Zusammenhang mit rrd4j tatsächlich vereinzelt auftreten, weil rrd4j mit unterschiedlicher zeitliche Auflösung der Messwerte arbeitet - je länger eine Messung her ist, desto weniger Messwerte werden aufbewahrt, also z.B. ein Messwert pro Minute für die letzten acht Stunden, ein Messwert pro zehn Minuten für die letzten drei Tage, ein Messwert pro Stunde für die letzten zwei Wochen, ein Messwert pro Tag für das letzte Jahr.
Dabei werden die jeweiligen Messwerte meines Wissens arithmetisch gemittelt, bevor die überzähligen Messwerte gelöscht werden. Das könnte dann zu Ungenauigkeiten oder Schwankungen führen, wenn die gelieferte Persistence von einem Messwertsatz in einen anderen Messwertsatz wechselt.
Allerdings ist der beobachtete Bereich (Differenz > 22 Stunden und für den Tag < 24 Stunden) meines Wissens nicht von einem solchen Wechsel betroffen.
Zweitens möchte ich ausschließen, weil die Werte für "Heute" und "Monat" konsistent sind (da Monatserster muss auch die gleiche Differenz angezeigt werden).
Bliebe also Erstens, was bei der Analyse des Zählers allerdings in einem Kurvenverlauf mit teilweise negativer Steigung resultieren müsste. Nun ist die Kurvenansicht im Screenshot nicht sonderlich genau sieht aber auch nicht danach aus,
1. Der Zähler hat zwischendurch kleinere Werte (Zähler ist nicht monoton wachsend)
2. Beim Berechnen der Zeitpunkte kommen unterschiedliche Werte für den Startzeitpunkt zustande
3. zu 2. alternativ werden Beim Abruf der Persistence falsche Werte aus der Datenbank entnommen.
Drittens könnte im Zusammenhang mit rrd4j tatsächlich vereinzelt auftreten, weil rrd4j mit unterschiedlicher zeitliche Auflösung der Messwerte arbeitet - je länger eine Messung her ist, desto weniger Messwerte werden aufbewahrt, also z.B. ein Messwert pro Minute für die letzten acht Stunden, ein Messwert pro zehn Minuten für die letzten drei Tage, ein Messwert pro Stunde für die letzten zwei Wochen, ein Messwert pro Tag für das letzte Jahr.
Dabei werden die jeweiligen Messwerte meines Wissens arithmetisch gemittelt, bevor die überzähligen Messwerte gelöscht werden. Das könnte dann zu Ungenauigkeiten oder Schwankungen führen, wenn die gelieferte Persistence von einem Messwertsatz in einen anderen Messwertsatz wechselt.
Allerdings ist der beobachtete Bereich (Differenz > 22 Stunden und für den Tag < 24 Stunden) meines Wissens nicht von einem solchen Wechsel betroffen.
Zweitens möchte ich ausschließen, weil die Werte für "Heute" und "Monat" konsistent sind (da Monatserster muss auch die gleiche Differenz angezeigt werden).
Bliebe also Erstens, was bei der Analyse des Zählers allerdings in einem Kurvenverlauf mit teilweise negativer Steigung resultieren müsste. Nun ist die Kurvenansicht im Screenshot nicht sonderlich genau sieht aber auch nicht danach aus,
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 343
- Registriert: 9. Jan 2021 22:55
Re: Stromverbrauch für Tag, Woche, Monat, Jahr berechnen
Also so sieht der Verlauf für 24 Stunden aus. Negative Abweichungen gibt es nicht
komisch ist der Zähler schon
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
openhab4.1.1 auf Pi 4 im Docker Portainer /Grafana&InfluxDB auf Pi 3 in Docker Portainer
-
- Beiträge: 173
- Registriert: 7. Sep 2021 11:28
Re: Stromverbrauch für Tag, Woche, Monat, Jahr berechnen
Das sieht ja wirklich sehr komisch aus obwohl er in der letzten logzeile auch wieder steigt
openhab 4.1.0.M Docker (Qnap)
influxDB 1.8.2 Docker (Qnap)
Grafana v8.3.3 Docker (Qnap)
Deconz 2.19.03 Docker (Qnap)
Homematic (Raspberrymatic Pi 3B+)
Grafana, Phoscon, Shelly, Gardena, Tuya
Camera IP Binding mit ffmpeg
Solaredge PV Anlage mit 8kW Speicher (solaredgeBinding)
u.v.m.
Lg zinnik
influxDB 1.8.2 Docker (Qnap)
Grafana v8.3.3 Docker (Qnap)
Deconz 2.19.03 Docker (Qnap)
Homematic (Raspberrymatic Pi 3B+)
Grafana, Phoscon, Shelly, Gardena, Tuya
Camera IP Binding mit ffmpeg
Solaredge PV Anlage mit 8kW Speicher (solaredgeBinding)
u.v.m.
Lg zinnik
-
- Beiträge: 92
- Registriert: 13. Dez 2018 21:02
Re: Stromverbrauch für Tag, Woche, Monat, Jahr berechnen
Ich habe mir mal wieder die Rule von Seite 4 geklaut und meine Items vom Shelly3EM eingesetzt und bekomme folgende Warnung im LOG.
Einzig folgendes habe ich geändert.
Damit habe ich diese Fehlermeldung
Hier meine Rule:
Ab wann bekomme ich Werte in den Items angezeigt? Aktuell zeigen diese alle -1 an.
Als Standardpersistence benutze ich InfluxDB, daher habe ich zusätzlich die rrd4j.persist angelegt.
Oder kann ich im Code, auch auf die InfluxDB verweisen?
Danke
Was muss ich ändern, um diese Warnung weg zubekommen?The expression of type DecimalType is already of type Number
Einzig folgendes habe ich geändert.
Code: Alles auswählen
var Stromverbrauch_Heute = -1.0
var Stromverbrauch_Woche = -1.0
var Stromverbrauch_Monat = -1.0
var Stromverbrauch_Jahr = -1.0
weg bekommen.Type mismatch: cannot convert from float to int
Hier meine Rule:
Code: Alles auswählen
rule "Stromverbrauch Tag Woche Monat Jahr" // Deutscher Zeichensatz zulässig
when
Item SM_DG_ges_Verbrauch changed // changed reicht.
then
val ZonedDateTime zdt = ZonedDateTime.now() // jetzt
val ZonedDateTime start_of_day = zdt.with(LocalTime.MIDNIGHT) // heute, Mitternacht
val ZonedDateTime start_of_week = start_of_day.minusDays(start_of_day.getDayOfWeek.getValue - 1) // Montag
val ZonedDateTime start_of_month = start_of_day.withDayOfMonth(1) // Erster Tag des Monats (1)
val ZonedDateTime start_of_year = start_of_day.withDayOfYear(1) // Erster Tag des Jahres (1)
var Stromverbrauch_Heute = -1.0
var Stromverbrauch_Woche = -1.0
var Stromverbrauch_Monat = -1.0
var Stromverbrauch_Jahr = -1.0
if(SM_DG_ges_Verbrauch.deltaSince(start_of_day) instanceof Number)
Stromverbrauch_Heute = (SM_DG_ges_Verbrauch.deltaSince(start_of_day) as Number).floatValue
if(SM_DG_ges_Verbrauch.deltaSince(start_of_week) instanceof Number)
Stromverbrauch_Woche = (SM_DG_ges_Verbrauch.deltaSince(start_of_week) as Number).floatValue
if(SM_DG_ges_Verbrauch.deltaSince(start_of_month) instanceof Number)
Stromverbrauch_Monat = (SM_DG_ges_Verbrauch.deltaSince(start_of_month) as Number).floatValue
if(SM_DG_ges_Verbrauch.deltaSince(start_of_year) instanceof Number)
Stromverbrauch_Jahr = (SM_DG_ges_Verbrauch.deltaSince(start_of_year) as Number).floatValue
SM_Tag_VerbrauchStrom.postUpdate(Stromverbrauch_Heute)
SM_Woche_VerbrauchStrom.postUpdate(Stromverbrauch_Woche)
SM_Monat_VerbrauchStrom.postUpdate(Stromverbrauch_Monat)
SM_Jahr_VerbrauchStrom.postUpdate(Stromverbrauch_Jahr)
end
Als Standardpersistence benutze ich InfluxDB, daher habe ich zusätzlich die rrd4j.persist angelegt.
Code: Alles auswählen
Strategies {
everyMinute : "0 * * * * ?"
everyHour : "0 0 * * * ?"
everyDay : "0 0 0 * * ?"
default = everyChange
}
Items {
SM_Tag_VerbrauchStrom : strategy = everyChange, everyMinute
SM_Woche_VerbrauchStrom : strategy = everyChange, everyMinute
SM_Monat_VerbrauchStrom : strategy = everyChange, everyMinute
SM_Jahr_VerbrauchStrom : strategy = everyChange, everyMinute
}
Danke
udo1toni hat geschrieben: ↑28. Okt 2022 10:49 Solltest Du für diesen Tag allerdings noch keine Messwerte haben, weil das Item heatQuellen_consumption noch nicht so lange persistiert wird, wird Dir dann kein Wert angezeigt bzw. die Rule bricht mit einer nullPointerException ab. Deshalb hat zinnik an den beiden Stellen keine 1 eingetragen (Stichtag war der 13., deshalb oben 13 für den Monatg und 286 für das Jahr, womit die Rule bei ihm sicher Werte findet).
Die Persistence bietet leider keine Option, herauszufinden, wann der erste Messwert geliefert wurde. Leider ist es auch so, dass die Persistence es nicht mag, wenn die Untergrenze einer Abfrage vor dem ersten persistierten Wert liegt (hab'sch grad ausprobiert...), es gibt also leider keine Lösung, als selbst dafür Sorge zu tragen, dass die Rule sinnvolle Werte abliefert. Einzige mir möglich erscheinende Option:Die lokalen Konstanten werden zu Variablen (var statt val). Sie werden zunächst mit einem offensichtlich unsinnigen Wert belegt (-1)Code: Alles auswählen
rule "Gasverbrauch Tag Woche Monat Jahr" // Deutscher Zeichensatz zulässig when Item heatQuellen_consumption changed // changed reicht. then val ZonedDateTime zdt = ZonedDateTime.now() // jetzt val ZonedDateTime start_of_day = zdt.with(LocalTime.MIDNIGHT) // heute, Mitternacht val ZonedDateTime start_of_week = start_of_day.minusDays(start_of_day.getDayOfWeek.getValue - 1) // Montag val ZonedDateTime start_of_month = start_of_day.withDayOfMonth(1) // Erster Tag des Monats (1) val ZonedDateTime start_of_year = start_of_day.withDayOfYear(1) // Erster Tag des Jahres (1) var Gasverbrauch_Heute = -1 var Gasverbrauch_Woche = -1 var Gasverbrauch_Monat = -1 var Gasverbrauch_Jahr = -1 if(heatQuellen_consumption.deltaSince(start_of_day) instanceof Number) Gasverbrauch_Heute = (heatQuellen_consumption.deltaSince(start_of_day) as Number).floatValue if(heatQuellen_consumption.deltaSince(start_of_week) instanceof Number) Gasverbrauch_Woche = (heatQuellen_consumption.deltaSince(start_of_week) as Number).floatValue if(heatQuellen_consumption.deltaSince(start_of_month) instanceof Number) Gasverbrauch_Monat = (heatQuellen_consumption.deltaSince(start_of_month) as Number).floatValue if(heatQuellen_consumption.deltaSince(start_of_year) instanceof Number) Gasverbrauch_Jahr = (heatQuellen_consumption.deltaSince(start_of_year) as Number).floatValue Gas_Verbrauch_Tag.postUpdate(Gasverbrauch_Heute) Gas_Verbrauch_Woche.postUpdate(Gasverbrauch_Woche) Gas_Verbrauch_Monat.postUpdate(Gasverbrauch_Monat) Gas_Verbrauch_Jahr.postUpdate(Gasverbrauch_Jahr) end
Nun wird der eigentliche Wert hinterlegt, falls es sich um eine gültige Zahl handelt (Prüfung auf instanceof Number)
Generalisiert ist diese Lösung zwar auch nicht hübsch, aber sollte funktionieren, einfacher ist es zweifellos (zumal wir den 28. haben), die Rule so zu lassen, wie sie ist und am 1.11. den Wert in withDayOfMonth() auf 1 zu ändern, sowie an Neujahr withDayOfYear() eine 1 einzutragen.
Und bis zu den Stichtagen mit offensichtlich verkehrten Werten zu leben - man weiß ja, woran es liegt...
openHAB 4.0.4 im Docker@Synology (DSM7)