Stromverbrauch für Tag, Woche, Monat, Jahr berechnen

Für welche Projekte verwendet Ihr OpenHAB? Was habt Ihr automatisiert? Stellt eure Projekte hier vor.

Moderatoren: Cyrelian, seppy

Antworten
Benutzeravatar
udo1toni
Beiträge: 13859
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Stromverbrauch für Tag, Woche, Monat, Jahr berechnen

Beitrag von udo1toni »

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)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Snatsch
Beiträge: 343
Registriert: 9. Jan 2021 22:55

Re: Stromverbrauch für Tag, Woche, Monat, Jahr berechnen

Beitrag von Snatsch »

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

Benutzeravatar
udo1toni
Beiträge: 13859
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Stromverbrauch für Tag, Woche, Monat, Jahr berechnen

Beitrag von udo1toni »

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?
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Snatsch
Beiträge: 343
Registriert: 9. Jan 2021 22:55

Re: Stromverbrauch für Tag, Woche, Monat, Jahr berechnen

Beitrag von Snatsch »

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)
Screenshot (60).png
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

Benutzeravatar
udo1toni
Beiträge: 13859
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Stromverbrauch für Tag, Woche, Monat, Jahr berechnen

Beitrag von udo1toni »

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

Snatsch
Beiträge: 343
Registriert: 9. Jan 2021 22:55

Re: Stromverbrauch für Tag, Woche, Monat, Jahr berechnen

Beitrag von Snatsch »

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

Benutzeravatar
udo1toni
Beiträge: 13859
Registriert: 11. Apr 2018 18:05
Answers: 222
Wohnort: Darmstadt

Re: Stromverbrauch für Tag, Woche, Monat, Jahr berechnen

Beitrag von udo1toni »

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,
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Snatsch
Beiträge: 343
Registriert: 9. Jan 2021 22:55

Re: Stromverbrauch für Tag, Woche, Monat, Jahr berechnen

Beitrag von Snatsch »

Also so sieht der Verlauf für 24 Stunden aus. Negative Abweichungen gibt es nicht
Screenshot (62).png
komisch ist der Zähler schon
Screenshot (63).png
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

zinnik
Beiträge: 173
Registriert: 7. Sep 2021 11:28

Re: Stromverbrauch für Tag, Woche, Monat, Jahr berechnen

Beitrag von zinnik »

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

EMaster
Beiträge: 92
Registriert: 13. Dez 2018 21:02
Answers: 2

Re: Stromverbrauch für Tag, Woche, Monat, Jahr berechnen

Beitrag von EMaster »

Ich habe mir mal wieder die Rule von Seite 4 geklaut und meine Items vom Shelly3EM eingesetzt und bekomme folgende Warnung im LOG.
The expression of type DecimalType is already of type Number
Was muss ich ändern, um diese Warnung weg zubekommen?

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
    
Damit habe ich diese Fehlermeldung
Type mismatch: cannot convert from float to int
weg bekommen.

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
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.

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     
 }       
Oder kann ich im Code, auch auf die InfluxDB verweisen?

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:

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
Die lokalen Konstanten werden zu Variablen (var statt val). Sie werden zunächst mit einem offensichtlich unsinnigen Wert belegt (-1)
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)

Antworten