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
peter-pan
Beiträge: 2573
Registriert: 28. Nov 2018 12:03
Answers: 25
Wohnort: Schwäbisch Gmünd

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

Beitrag von peter-pan »

...??? Da muss ich jetzt echt gestehen, da weiss ich nicht, woher diese Daten in deinem Log kommen und wie diese entstehen.

Das was ich dir da in einem Code-Fenster gepostet habe ist eine Regel, die mittels eines Text-Editors erstellt wurde und in einer Textdatei mit der Endung ".rules" im Ordner "/etc/openhab/rules".

Ein Code-Fenster kannst du leicht über das Menü erstellen
codefenster.jpg
oder manuell erzeugen "["code"]" der Text den du in dem Codfenster haben willst "["/code"]". Bitte lass die Gänsefüsschen weg, sonst würde man diese Parameter nicht sehen.
Die Regel (Rule) kannst du aus diesem Codefenster kopieren und mit einem Text-Editor deiner Wahl in dem vorgenannten Ordner speichern.

Wenn die Regel richtig installiert ist wird dies auch in frontail dokumentiert:

Code: Alles auswählen

2022-10-16 17:42:10.304 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'test_zaehler_heizung1.rules' is either empty or cannot be parsed correctly!
2022-10-16 17:42:11.308 [INFO ] [el.core.internal.ModelRepositoryImpl] - Loading model 'test_zaehler_heizung.rules'
Beim Triggern der Regel werden nur die Inhalte aus den "logInfo-Parametern" angezeigt, aber nicht die Rules-Zeilen wie in deinem Screen-Shot. Also genau so:

Code: Alles auswählen

2022-10-15 13:30:41.549 [INFO ] [org.openhab.core.model.script.wpsum ] - Heizung-Tag: gelieferte Differenz ist 1.059
2022-10-15 13:30:41.559 [INFO ] [org.openhab.core.model.script.wpsum ] - Heizung-Woche: gelieferte Differenz ist 9.661
2022-10-15 13:30:41.566 [INFO ] [org.openhab.core.model.script.wpsum ] - Heizung-Monat: gelieferte Differenz ist 24.707
2022-10-15 13:30:41.572 [INFO ] [org.openhab.core.model.script.wpsum ] - Heizung-Jahr: gelieferte Differenz ist 365.550
Wie gesagt, diese Art von Rules (DSL) werden nicht in der Main-UI erstellt, sondern per Text-Editor und Abspeicherung in o.g. Verzeichnis.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian

zinnik
Beiträge: 174
Registriert: 7. Sep 2021 11:28
Answers: 0

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

Beitrag von zinnik »

so jetzt nochmal :

Code: Alles auswählen

2022-10-16 19:54:45.359 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Heizung_Zaehlerstand_errechnet' changed from 532.486200 to 532.487900
2022-10-16 19:54:45.362 [INFO ] [org.openhab.core.model.script.wpsum ] - Heizung-Tag: gelieferte Differenz ist 1.479900
2022-10-16 19:54:45.365 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Heizung_Verbrauch_Tag' changed from 1.478200 to 1.479900
2022-10-16 19:54:45.371 [INFO ] [org.openhab.core.model.script.wpsum ] - Heizung-Woche: gelieferte Differenz ist null
2022-10-16 19:54:45.375 [INFO ] [org.openhab.core.model.script.wpsum ] - Heizung-Monat: gelieferte Differenz ist null
2022-10-16 19:54:45.380 [INFO ] [org.openhab.core.model.script.wpsum ] - Heizung-Jahr: gelieferte Differenz ist null
Screenshot (206).png
Die anderen Logzeilen kannst du ignorieren die kommen von Homematic

Hier die rule:

Code: Alles auswählen

rule "Heizung Verbrauch berechnen"
when
    Item Heizung_Zaehlerstand_errechnet received update
//      Item Dummy_pers_9 changed to ON
then
// Verbrauch Tag
val HeizungverbrauchTag = Heizung_Zaehlerstand_errechnet.deltaSince(ZonedDateTime.now.with(LocalTime.MIDNIGHT),"influxdb")  // meine Standard-Persitence ist "RRD4J" - Du kannst die Peristence-DB weglassen, wenn "influxdb" dein Standard ist
    logInfo("wpsum","Heizung-Tag: gelieferte Differenz ist {}",HeizungverbrauchTag)
    Heizung_Verbrauch_Tag.postUpdate(HeizungverbrauchTag as Number)

// Verbrauch Woche (Montag - aktuell)
val dayOfWeek = (ZonedDateTime.now.with(LocalTime.of(0,0,0,0)).getDayOfWeek.getValue)	
val HeizungverbrauchWoche = Heizung_Zaehlerstand_errechnet.deltaSince(ZonedDateTime.now().with(LocalTime.of(0,0,0,0)).minusDays(dayOfWeek -1)) // Woche
    logInfo("wpsum","Heizung-Woche: gelieferte Differenz ist {}",HeizungverbrauchWoche)
    Heizung_Verbrauch_Woche.postUpdate(HeizungverbrauchWoche as Number)
	
// Verbrauch Monat
val DayOfMonth = now.getDayOfMonth()
val HeizungverbrauchMonat  = Heizung_Zaehlerstand_errechnet.deltaSince(ZonedDateTime.now.minusDays(DayOfMonth-1).with(LocalTime.MIDNIGHT))
    logInfo("wpsum","Heizung-Monat: gelieferte Differenz ist {}",HeizungverbrauchMonat)
    Heizung_Verbrauch_Monat.postUpdate(HeizungverbrauchMonat as Number)
	
// Verbrauch Jahr	
val HeizungverbrauchJahr = Heizung_Zaehlerstand_errechnet.deltaSince(ZonedDateTime.now.with(LocalTime.of(0,0,0,0)).withDayOfYear(1))  // Jahresverbrauch bis aktuell
    logInfo("wpsum","Heizung-Jahr: gelieferte Differenz ist {}",HeizungverbrauchJahr)
    Heizung_Verbrauch_Jahr.postUpdate(HeizungverbrauchJahr as Number)

end
Screenshot (205).png



------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Wenn ich die Rule so schreibe dann funktionieren Tag Monat und Jahr aber nicht Woche dabei muss ich aber explizit angeben An welchen Monatstag (13) also 13.10.22 und an welchen Tag im Jahr (286) also der 286 tag im Jahr die Rule erstellt wurde oder sie zum ersten mal lief.
Das würde ja bedeuten ich müssten die Monat ändern oder ?

Also finde das alles sehr komisch . Bei dir gib es ja auch eine Ausgabe Differenz.

Code: Alles auswählen

rule "Stromverbrauch_Tag_Woche_Monat_Jahr"

when

    Item Heizung_Zaehlerstand_errechnet received update
   
then
    
	val  ZonedDateTime 	zdt = ZonedDateTime.now()

    var  ZonedDateTime 	start_of_day = zdt.toLocalDate().atStartOfDay(zdt.getZone())
    var  ZonedDateTime 	start_of_week = zdt.minusDays()(zdt.getZone())    //------>> Woche funktioniert nicht
    var  ZonedDateTime 	start_of_month = zdt.withDayOfMonth(13).toLocalDate().atStartOfDay(zdt.getZone())
    var  ZonedDateTime 	start_of_year = zdt.withDayOfYear(286).toLocalDate().atStartOfDay(zdt.getZone())

    var strom_Heute = Heizung_Zaehlerstand_errechnet.deltaSince(start_of_day) as Number 
    var strom_Woche = Heizung_Zaehlerstand_errechnet.deltaSince(start_of_week) as Number
    var strom_Monat = Heizung_Zaehlerstand_errechnet.deltaSince(start_of_month) as Number
    var strom_Jahr = Heizung_Zaehlerstand_errechnet.deltaSince(start_of_year) as Number

    postUpdate(Heizung_Verbrauch_Tag, strom_Heute)
    postUpdate(Heizung_Verbrauch_Woche, strom_Woche)
    postUpdate(Heizung_Verbrauch_Monat, strom_Monat)
    postUpdate(Heizung_Verbrauch_Jahr,  strom_Jahr)


end

Obwohl bei mir jedes Item persestiert habe ich jetzt noch mal die explizit angegeben

Code: Alles auswählen

Strategies {
        everyHour : "0 0 * * * ?"
        everyDay  : "0 0 0 * * ?"
	everyMinute : "0 * * * * ?"

        // if no strategy is specified for an Item entry below, the default list will be used
       default = everyChange

}

Items {
group*     : strategy = everyChange, restoreOnStartup 	//persist all direct members of the group 'group'
item       : strategy = everyChange, everyHour 		// persist the item 'item'
otherItem     						// no strategy set, so use default strategy for item 'otherItem'
*          						: strategy = everyChange
EnergiePC_Power						: strategy = everyChange
Badtemp_Temperature					: strategy = everyChange
BMW 530d xDrive						: strategy = everyChange
BMW530dxDrive_Koordinaten				: strategy = everyChange
HausanschlussStrom_Power				: strategy = everyChange
Heizung_Verbrauch_Tag					: strategy = everyChange
Heizung_Verbrauch_Woche					: strategy = everyChange
Heizung_Verbrauch_Monat					: strategy = everyChange
Heizung_Verbrauch_Jahr					: strategy = everyChange


}
Keine Ahnung warum Woche Monat und Jahr nicht geht.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
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

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

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

Beitrag von udo1toni »

Deine Berechnungen der Startzeitpunkte sind verkehrt.

Code: Alles auswählen

rule "Stromverbrauch Tag Woche Monat Jahr"                                                              // Deutscher Zeichensatz zulässig
when
    Item Heizung_Zaehlerstand_errechnet 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
    val ZonedDateTime start_of_year  = start_of_day.withDayOfYear(1)                                    // Erster Tag des Jahres

    val strom_Heute = (Heizung_Zaehlerstand_errechnet.deltaSince(start_of_day)   as Number).floatValue
    val strom_Woche = (Heizung_Zaehlerstand_errechnet.deltaSince(start_of_week)  as Number).floatValue
    val strom_Monat = (Heizung_Zaehlerstand_errechnet.deltaSince(start_of_month) as Number).floatValue
    val strom_Jahr  = (Heizung_Zaehlerstand_errechnet.deltaSince(start_of_year)  as Number).floatValue

      Heizung_Verbrauch_Tag.postUpdate(strom_Heute)
    Heizung_Verbrauch_Woche.postUpdate(strom_Woche)
    Heizung_Verbrauch_Monat.postUpdate(strom_Monat)
     Heizung_Verbrauch_Jahr.postUpdate(strom_Jahr)
end
Voraussetzung ist, dass Daten für den Zeitraum zur Verfügung stehen, versteht sich.
Erklärung der Berechnungen:
ZonedDateTime.now kennt diverse Funktionen.
.with kann Teile des Datums gezielt manipulieren, hier die Zeit auf 0:00:00 Uhr setzen (LocalTime.MIDNIGHT).
.minusDays kann volle Tage vom Datum abziehen. start_of_day ist eine Instanz von zdt um Mitternacht, gerade ausgerechnet. .getDayOfWeek liefert den Wochentag, allerdings als Text. .getValue liefert eine Zahl, wobei Montag 1 ist und Sonntag 7. Wir wollen maximal 6 abziehen (Sonntags, um auf Montag zu kommen). Montag wollen wir nichts abziehen, deshalb das - 1.
.withDayOfMonth manipuliert den Tag und kann auf 1 bis 31 gesetzt werden. Möchte man den Monatsletzten, so ist es das Einfachste, den Ersten des Folgemonats zu berechnen und anschließend einen Tag abzuziehen :) hier geht es um den Monatsersten, also eine 1...
.withDayOfYear ist die gleiche Manipulation, nur auf das komplette Jahr bezogen, .withDayOfYear(1) zeigt also auf den 1. Januar des aktuellen Jahres, man könnte auch .withMonth(1).withDayOfMonth(1) schreiben.

.floatValue stellt sicher, dass ein rein numerischer Wert ohne Einheit geliefert wird, ist eventuell nicht notwendig, schadet aber gewöhnlich auch nicht.

Die Methode Item.postUpdate(Value) ist grundsätzlich der Action postUpdate(Itemname as string,Value as string) vorzuziehen. Nur wenn man den Namen des Items berechnet, ist die Action eine einfache Möglichkeit, auf das Items selbst zuzugreifen.

Erklärung hierzu:
Die Methode kann mit unterschiedlichen Datentypen als Eingangswert umgehen, die Action braucht zwingend String für beide Parameter. Solange man mit Objekten arbeitet, steht .toString als Methode zur Verfügung und openHAB verwendet diese automatisch, um das Objekt passend in einen String zu wandeln. Mit Primitives geht das aber schief.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Benutzeravatar
peter-pan
Beiträge: 2573
Registriert: 28. Nov 2018 12:03
Answers: 25
Wohnort: Schwäbisch Gmünd

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

Beitrag von peter-pan »

Ich bin da im Moment etwas überfragt, was bei dir passiert, wenn "influxdb" die Daten ermittelt. Wie gesagt ich mach das alles mit der Stand-Persistence.

Als Basis liegt ein Item, das den Gesamtwert "X" (Öl, Gas, Wasser, etc) speichert.

Die Regel macht jetzt folgendes, wenn sich dieser Wert ändert:

Tag:

Code: Alles auswählen

// Verbrauch Tag
val HeizungverbrauchTag = Gosund_socket_05_Verb.deltaSince(ZonedDateTime.now.with(LocalTime.MIDNIGHT),"rrd4j")  // meine Standard-Persitence ist "rrd4j" - Du kannst die Peristence-DB weglassen, wenn "influxdb" dein Standard ist
    logInfo("wpsum","Heizung-Tag: gelieferte Differenz ist {}",HeizungverbrauchTag)
    Heizung_Verbrauch_Tag.postUpdate(HeizungverbrauchTag as Number)
Hier wird einfach das Delta zwischen Mitternacht (0 Uhr) und aktuell ermittelt und in Konstante/Variable übertragen. Dieser Wert, wird dann im Item "Heizung_Verbrauch_Tag" gespeichert.

Woche:

Code: Alles auswählen

// Verbrauch Woche (Montag - aktuell)
val dayOfWeek = (ZonedDateTime.now.with(LocalTime.of(0,0,0,0)).getDayOfWeek.getValue)	

val HeizungverbrauchWoche = Gosund_socket_05_Verb.deltaSince(ZonedDateTime.now().with(LocalTime.of(0,0,0,0)).minusDays(dayOfWeek -1)) // Woche
    logInfo("wpsum","Heizung-Woche: gelieferte Differenz ist {}",HeizungverbrauchWoche)
    Heizung_Verbrauch_Woche.postUpdate(HeizungverbrauchWoche as Number)
Hier wird zunächst der Tag der Woche ermittelt und als Wert (numerisch - Montag ist 1 / Dienstag ist 2, etc) in der Konstanten "dayOfWeek" gespeichert. Diesen Wert braucht man um den Wochenanfang(der jeweilige Montag) zu ermitteln.
Als Beispiel kannst du noch diese zwei Codezeilen einfügen der zeigt dir den jeweiligen Wochenanfang an.:

Code: Alles auswählen

val dayResult = ZonedDateTime.now().with(LocalTime.of(0,0,0,0)).minusDays(dayOfWeek -1)
    logInfo("wpsum","Heizung-Woche: Wochenstart ist am {}",dayResult)
Dann wird der Verbrauch zwischen dem aktuellen Verbrauch und dem Verbrauch am 1 Tag der Woche (um Mitternacht) ermittelt. Das bezieht sich also immer auf die laufenden Woche und dem Wochenanfang.

Monat:

Code: Alles auswählen

// Verbrauch Monat
val DayOfMonth = now.getDayOfMonth()
val HeizungverbrauchMonat  = Gosund_socket_05_Verb.deltaSince(ZonedDateTime.now.minusDays(DayOfMonth-1).with(LocalTime.MIDNIGHT))
    logInfo("wpsum","Heizung-Monat: gelieferte Differenz ist {}",HeizungverbrauchMonat)
    Heizung_Verbrauch_Monat.postUpdate(HeizungverbrauchMonat as Number)
Es ist genau wie bei der Woche. Zunächst wir der Monatserste ermittelt (val DayOfMonth = now.getDayOfMonth()) und anschliessend mit mit der entsprechenden Zeitdifferenz, das Delta zwischen aktuellem Datum und dem Monatsersten.

Jahr:

Code: Alles auswählen

// Verbrauch Jahr	
val HeizungverbrauchJahr = Gosund_socket_05_Verb.deltaSince(ZonedDateTime.now.with(LocalTime.of(0,0,0,0)).withDayOfYear(1))  // Jahresverbrauch bis aktuell
    logInfo("wpsum","Heizung-Jahr: gelieferte Differenz ist {}",HeizungverbrauchJahr)
    Heizung_Verbrauch_Jahr.postUpdate(HeizungverbrauchJahr as Number)
Braucht man eigentlich nicht viel dazu sagen. Die Zeitdifferenz lässt sich unmittelbar ermitteln ( .withDayOfYear(1) ).

Wie gesagt, ich kann nicht viel zu den einzelnen Datenbanken sagen, aber ich habe bei "RRD4J" keinerlei Einstellungen vorgenommen.

Edit: Hab gerade gesehen, dass Udo das wieder schön erklärt hat während ich noch mit meinem "Halbwissen" versucht habe einen einigermassen verständlichen "Aufsatz" zu schreiben.
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian

zinnik
Beiträge: 174
Registriert: 7. Sep 2021 11:28
Answers: 0

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

Beitrag von zinnik »

Vielen Dank an Udo1toni und peter-pan,

ich glaube es funktioniert jetzt.

Was ich mich aber immer noch frage warum die .rule von @peter-pan nicht läuft bei mir aber bei ihm schon.

Ich nutze jetzt die von udo1toni

Jedoch habe ich bei Monat den 13.und Jahr den 286 tag eingetragen.

weil das Item "Heizung_Zaehlerstand_errechnet" erst seit dem 13.10.22 erstellt wurde und auch persistiert wurde.

Ansonsten würde ich bei Monat und Jahr eine Differenz von NULL erhalten, vermutlich weil der aktuelle Monat und das aktuelle Jahr noch nicht vorbei ist.
Das kann ich erst dann ändern wenn die jeweiligen Zeiten abgelaufen sind.

Da gibt es ja keine andere Möglichkeit oder?

Code: Alles auswählen

rule "Stromverbrauch Tag Woche Monat Jahr"                                                              // Deutscher Zeichensatz zulässig
when
    Item Heizung_Zaehlerstand_errechnet 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(13)                                   // Erster Tag des Monats (1)
    val ZonedDateTime start_of_year  = start_of_day.withDayOfYear(286)                                    // Erster Tag des Jahres (1)

    val strom_Heute = (Heizung_Zaehlerstand_errechnet.deltaSince(start_of_day)   as Number).floatValue
    val strom_Woche = (Heizung_Zaehlerstand_errechnet.deltaSince(start_of_week)  as Number).floatValue
    val strom_Monat = (Heizung_Zaehlerstand_errechnet.deltaSince(start_of_month) as Number).floatValue
    val strom_Jahr  = (Heizung_Zaehlerstand_errechnet.deltaSince(start_of_year)  as Number).floatValue

    Heizung_Verbrauch_Tag.postUpdate(strom_Heute)
    Heizung_Verbrauch_Woche.postUpdate(strom_Woche)
    Heizung_Verbrauch_Monat.postUpdate(strom_Monat)
    Heizung_Verbrauch_Jahr.postUpdate(strom_Jahr)
end
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

Benutzeravatar
peter-pan
Beiträge: 2573
Registriert: 28. Nov 2018 12:03
Answers: 25
Wohnort: Schwäbisch Gmünd

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

Beitrag von peter-pan »

Da mach dir jetzt mal keinen Kopf, warum etwas geht oder nicht. Auf jeden Fall ist der Ruleaufbau bei Udo schön strukturiert, während bei mir das halt alles etwas wild ist. Ich hab mir den Aufbau von Udo auch gleich als Snippet abgespeichert. Das Ergebnis ist bei beiden Rules das gleiche. Es könnte jedoch sein das die Datenbanken anders ticken oder irgend ein anderer kleiner nicht offensichtlicher Unterschied vorhanden ist.

Code: Alles auswählen

rule "Heizung Verbrauch berechnen"
when
//    Item Heizung_Zaehlerstand_errechnet received update
      Item Dummy_pers_9 changed to ON
then
// Verbrauch Tag
val HeizungverbrauchTag = Gosund_socket_05_Verb.deltaSince(ZonedDateTime.now.with(LocalTime.MIDNIGHT),"rrd4j")  // meine Standard-Persitence ist "rrd4j" - Du kannst die Peristence-DB weglassen, wenn "influxdb" dein Standard ist
    Heizung_Verbrauch_Tag.postUpdate(HeizungverbrauchTag as Number)

// Verbrauch Woche (Montag - aktuell)
val dayOfWeek = (ZonedDateTime.now.with(LocalTime.of(0,0,0,0)).getDayOfWeek.getValue)	
val HeizungverbrauchWoche = Gosund_socket_05_Verb.deltaSince(ZonedDateTime.now().with(LocalTime.of(0,0,0,0)).minusDays(dayOfWeek -1)) // Woche
    Heizung_Verbrauch_Woche.postUpdate(HeizungverbrauchWoche as Number)
	
// Verbrauch Monat
val DayOfMonth = now.getDayOfMonth()
val HeizungverbrauchMonat  = Gosund_socket_05_Verb.deltaSince(ZonedDateTime.now.minusDays(DayOfMonth-1).with(LocalTime.MIDNIGHT))
    Heizung_Verbrauch_Monat.postUpdate(HeizungverbrauchMonat as Number)
	
// Verbrauch Jahr	
val HeizungverbrauchJahr = Gosund_socket_05_Verb.deltaSince(ZonedDateTime.now.with(LocalTime.of(0,0,0,0)).withDayOfYear(1))  // Jahresverbrauch bis aktuell
    Heizung_Verbrauch_Jahr.postUpdate(HeizungverbrauchJahr as Number)
    logInfo("wpsum-Peter","Tag : {} - Woche : {} - Monat {} - Jahr : {} ",HeizungverbrauchTag, HeizungverbrauchWoche, HeizungverbrauchMonat, HeizungverbrauchJahr ) 
end

// "Heizung_Zaehlerstand_errechnet" durch "Gosund_socket_05_Verb" ersetzt für Test

rule "Stromverbrauch Tag Woche Monat Jahr"                                                              // Deutscher Zeichensatz zulässig
when
//    Item Heizung_Zaehlerstand_errechnet changed  
     Item Dummy_pers_9 changed to ON                                                       //
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
    val ZonedDateTime start_of_year  = start_of_day.withDayOfYear(1)                                    // Erster Tag des Jahres

    val strom_Heute = (Gosund_socket_05_Verb.deltaSince(start_of_day)   as Number).floatValue
    val strom_Woche = (Gosund_socket_05_Verb.deltaSince(start_of_week)  as Number).floatValue
    val strom_Monat = (Gosund_socket_05_Verb.deltaSince(start_of_month) as Number).floatValue
    val strom_Jahr  = (Gosund_socket_05_Verb.deltaSince(start_of_year)  as Number).floatValue

      Heizung_Verbrauch_Tag.postUpdate(strom_Heute)
    Heizung_Verbrauch_Woche.postUpdate(strom_Woche)
    Heizung_Verbrauch_Monat.postUpdate(strom_Monat)
     Heizung_Verbrauch_Jahr.postUpdate(strom_Jahr)
    logInfo("wpsum-Udo","Tag : {} - Woche : {} - Monat {} - Jahr : {} ",strom_Heute, strom_Woche, strom_Monat, strom_Jahr ) 
end

Code: Alles auswählen

2022-10-17 20:19:06.664 [INFO ] [penhab.core.model.script.wpsum-Peter] - Tag : 1.168 - Woche : 1.168 - Monat 27.455 - Jahr : 368.298 
2022-10-17 20:19:06.668 [INFO ] [.openhab.core.model.script.wpsum-Udo] - Tag : 1.168 - Woche : 1.168 - Monat 27.455 - Jahr : 368.298 
Es ist natürlich klar, wenn bisher keine Werte perisistiert wurden, auch keine Ergebnisse aus der Datenbank abgerufen werden können, bzw. keine gültigen Werte ermittelt werden können.

Du musst dann halt im nächsten Monat und im nächsten Jahr, die Regel anpassen.


Edit: Wie läuft denn das mit deiner PV-Anlage ? Ich bin momentan auch am überlegen, ob ich mir so was auf's Dach tue. Hast du da evtl. ein paar Eckdaten?
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian

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

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

Beitrag von udo1toni »

zinnik hat geschrieben: 17. Okt 2022 18:44 Jedoch habe ich bei Monat den 13.und Jahr den 286 tag eingetragen.

weil das Item "Heizung_Zaehlerstand_errechnet" erst seit dem 13.10.22 erstellt wurde und auch persistiert wurde.
Ja, das passt dann soweit. Zum 01.11. kannst Du dann den Tag im Monat auf 1 ändern und zum 1.1.2023 den Tag im Jahr ebenso :)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

zinnik
Beiträge: 174
Registriert: 7. Sep 2021 11:28
Answers: 0

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

Beitrag von zinnik »

udo1toni hat geschrieben: 17. Okt 2022 22:33
zinnik hat geschrieben: 17. Okt 2022 18:44 Jedoch habe ich bei Monat den 13.und Jahr den 286 tag eingetragen.

weil das Item "Heizung_Zaehlerstand_errechnet" erst seit dem 13.10.22 erstellt wurde und auch persistiert wurde.
Ja, das passt dann soweit. Zum 01.11. kannst Du dann den Tag im Monat auf 1 ändern und zum 1.1.2023 den Tag im Jahr ebenso :)
ja genau so hatte ich es auch vor.

PS: Kurze Frage noch. Wie macht man es eigentlich richtig?
Wenn man an ein Item die Einheit oder Nachkommastelle anzeigen will.
Unter Item---> State Description----> Pattern
oder
in der Sitemap hinterm Label.

Prima, vielen Dank euch beiden.

@peter-pan bezüglich der PV schreib ich dir noch privat sonst wird's hier bestimmt Zuviel offtopic
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

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

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

Beitrag von udo1toni »

zinnik hat geschrieben: 17. Okt 2022 23:14 Wie macht man es eigentlich richtig?
Wenn man an ein Item die Einheit oder Nachkommastelle anzeigen will.
Na, ganz klar: Es kommt darauf an. :lol:

Nein, im Ernst...

Erst mal muss man zwei unterschiedliche Itemtypen unterscheiden, nämlich die "einfachen" Number Items und die UoM Items, also z.B. Number:Temperature. Bei letzteren sollte die Einheit schon korrekt mitgeliefert werden. Wenn man eine andere Einheit will, trägt man das ein und der Wert wird entsprechend umgerechnet (also z.B. °F statt °C oder auch K).

Bei den einfachen Number Items gibt es keine Einheit und auch keine automatische Umrechnung.

Weiterhin gibt es im System mehrere Stellen, wo man das (besser ein) Label des Items definieren kann. Dabei ist die State Description sozusagen die Grundeinstellung. Hat ein Item keine Konfiguration in der State Description, dann "erbt" es das Label aus dem Channel, gemeinsam mit einer default Anzeige des Status (abhängig vom Channeltyp). Ein String Channel und Item werden z.B. %s als default verwenden.

Innerhalb der Ansichten (ob nun Sitemap, Pages oder auch HABPanel, um die wichtigsten zu nennen) kann man dann nochmals ein Label setzen. Typisches Szenario: Ich habe innerhalb einer Sitemap mehrere Stellen, an denen das selbe Item auftaucht, aber in unterschiedlichem Kontext. z.B. gibt es eine Übersicht aller Rollläden und eine Seite pro Raum. Auf der Übersichtsseite möchte ich die Raumbezeichnung im Label haben. Was nützt mir das Label "Rollladen links", wenn es sechs Mal in der Liste auftaucht, weil es sechs Räume mit zwei Fenstern gibt? Auf der anderen Seite möchte man aber in der Raumansicht nicht die Information haben, zu welchem Raum der Rollladen gehört.

Du siehst also, es kommt tatsächlich ganz darauf an, warum Du das Label setzt. Grundsätzlich ist aber sicher das Label über die State Description sinnvoll, weil Du damit erst mal alle Ansichten erschlägst.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Snatsch
Beiträge: 367
Registriert: 9. Jan 2021 22:55
Answers: 0

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

Beitrag von Snatsch »

Hallo finde eure Sachen sehr interessant :) leider habe ich nicht so viele Ahnung :? ich habe meine Buderus Gastherme über KM200 Binding eingebunden und würde mir auch meinen Tages, Monats und Jahresverbrauch anzeigen lassen. Leider gibt mir das Item nur den Gesamtverbrauch an. Wie müssten die Items aussehen die ich anlegen müsste ? Wie gesagt bis jetzt habe ich nur den Gesamtverbrauch (heatQuellen_consumption)
Vielen Dank für eure Hilfe :)
openhab4.1.2 auf Pi 4 im Docker Portainer /Grafana&InfluxDB auf Pi 3 in Docker Portainer/Pi 3 mit Docker zur Datensicherung

Antworten