Seite 2 von 13

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

Verfasst: 14. Okt 2022 16:47
von zinnik
Danke @Peter Pan

Aber ich habe keine Ahnung wie ich diese denn jetzt in mein Script integrieren muss.
Ich ahbe leider gar keine Programmierkenntnisse.

Es geht schon los das ich nit weiss was der Unterschied zwischen "var" und "val".

Kannst du mir helfen?

Habe es jetzt mal so eingefügt wie ich denke

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(4)(zdt.getZone())    //------>> siehe Beschreibung unten** 
    //var  ZonedDateTime 	start_of_week = zdt.withDayOfWeek().toLocalDate().atStartOfDay(zdt.getZone())
    val dayOfWeek = (ZonedDateTime.now.with(LocalTime.of(0,0,0,0)).getDayOfWeek.getValue)
    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
    val strom_Woche = Heizung_Zaehlerstand_errechnet.deltaSince(ZonedDateTime.now().with(LocalTime.of(0,0,0,0)).minusDays(dayOfWeek -1))  // Woche
    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

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

Verfasst: 14. Okt 2022 19:12
von peter-pan
Ich bin auch kein Programmierer, aber so ein bisschen habe ich mir das ein oder andere angelesen und eben herum experimentiert.

"val" bedeutet Konstante (value). D.h. ein nach der Deklaration im Programm nicht mehr veränderbarer Wert.
"var" bedeutet Variable. Dieser Wert kann sich im Laufe des Programmes, also auch nach de Deklaration, ändern. Z.B. das Ergebnis einer Berechnung.

Es ist in deinem Falle egal, ob du val oder var benutzt. In beiden Fällen, werden die Ergebnisse nach der Deklaration nicht mehr verändert.

So wie du die Regel angelegt hast sollte nun auch der Wochenwert ermittelt werden. Es ist dabei jedoch zu berücksichtigen, dass hierbei keine "gleitende Woche", also immer sieben Tage, sondern die Tageswerte kumulieren sich immer von Montag bis Sonntag, Tag für Tag.

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

Verfasst: 15. Okt 2022 10:15
von zinnik
Leider läuft die Rule überhaupt nicht.

Ich habe diese hier für den Tagesverbrauch, die auch gut läuft aber ich nicht weiss wie ich weiter machen muss um den Wochen und Mpnats und jahresverbrauch zu berechnen.

Code: Alles auswählen

rule "Heizung Verbrauch Tag berechnen"
when
    Item Heizung_Zaehlerstand_errechnet received update
then
val diff = Heizung_Zaehlerstand_errechnet.deltaSince(ZonedDateTime.now.with(LocalTime.MIDNIGHT),"influxdb")
    logInfo("wpsum","Heizung: gelieferte Differenz ist {}",diff)
    Heizung_Verbrauch_Tag.postUpdate(diff as Number)
end
Wenn ich die andere vom vorletztem Post starte und diese stoppe geht gar nichts mehr sehe auh nicht mehr im log von frontail

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

Verfasst: 15. Okt 2022 11:12
von peter-pan
Sollte sich eigentlich aus dem Regelbeispiel weiter vorne ablesen lassen.
Muss gerade Einkaufen.
Melde mich später noch mal mit einer Erweiterung der Regel.

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

Verfasst: 15. Okt 2022 13:39
von peter-pan
So jetzt habe ich nochmal versucht eine Regel mit deinen Vorgaben zu "basteln".

Das sieht dann so aus:

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
    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 = 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)
	
// 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)
	
// 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)

end

// "Heizung_Zaehlerstand_errechnet" durch "Gosund_socket_05_Verb" ersetzt für Test
Den Item-Namen Gosund_socket_05_Verb musst du halt noch mit deinem Heizung_Zaehlerstand_errechnet ersetzen.

Wenn deine Standard-Persistence "influxdb" (Main-UI/Einstellungen/Persistence) ist, brauchst du das auch nicht extra angeben. Ich habe das mal beispielhaft im "Tagesverbrauch" eingesetzt (musst du auch noch ändern, oder weglassen)

Das Ergebnis im Log sieht dann so aus:

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
Alles natürlich wie immer ohne Gewe(ä)hr. ;) . Vielleicht kann ja ein Persistence-Profi mal auf die SQL-Statments in Verbindung mit den Datumsangaben prüfen, ob da die richtigen Zeitabgrenzungen vorhanden sind.

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

Verfasst: 15. Okt 2022 15:09
von zinnik
Hallo Peter Vielen dank für deine Hilfe,

ich habe das jetzt so übernommen von dir und meine Item eingesetzt. Jedoch erhalte ich als Differenzwert immer Null. Muss ich diese Regel jetzt auch erst bis nach "Mitternacht" laufen lassen?

Hier mein log:

Code: Alles auswählen

2022-10-15 15:02:29.795 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Heizung_Zaehlerstand_errechnet' changed from 530.909300 to 530.907500
val HeizungverbrauchTag = Heizung_Zaehlerstand_errechnet.deltaSince(ZonedDateTime.now.with(LocalTime.MIDNIGHT))  // meine Standard-Persitence ist "RRD4J" - Du kannst die Peristence-DB weglassen, wenn "influxdb" dein Standard ist
    logInfo("wpsum","Heizung-Tag: gelieferte Differenz ist null",HeizungverbrauchTag)
    Heizung_Verbrauch_Tag.postUpdate(HeizungverbrauchTag as Number)
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 null",HeizungverbrauchWoche)
    Heizung_Verbrauch_Woche.postUpdate(HeizungverbrauchWoche as Number)
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)
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)
// "Heizung_Zaehlerstand_errechnet" durch "Gosund_socket_05_Verb" ersetzt für Test

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

Verfasst: 15. Okt 2022 17:37
von peter-pan
Das ist aber nicht ganz meine Regel und irgendwie ist da Log und Regel durcheinander
Das steht mit Sicherheit nicht in der Regel bzw. im Log:

Code: Alles auswählen

logInfo("wpsum","Heizung-Tag: gelieferte Differenz ist null",HeizungverbrauchTag)
Also nochmal:

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
So sollte es eigentlich passen.

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

Verfasst: 15. Okt 2022 17:57
von zinnik
Ich kann dir dann mal ein Screeshot von meinem Log schicken.
So wie ich es vorhin als Code gepostet habe. Alsodie Differenz ist gleich Null ist ja dann die Ausgabe.

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

Verfasst: 15. Okt 2022 23:26
von peter-pan
Das sollte eigentlich auch ohne Screenshot gehen, d. h. über "frontail" in einem Codefenster. Wenn nicht, dann Screeshot. Vielleicht lässt sich daraus auch etwas ableiten.

Wie hast du denn deine Items angelegt ? In einem Textfile oder über die UI ?

Kannst du feststellen, welche Werte gerade in den Items enthalten sind ? Zum Beispiel über die MainUI oder über die Karaf-Konsole:

Code: Alles auswählen

openhab> items list |grep -i Heizung_Verbrauch_
Heizung_Verbrauch_Tag (Type=NumberItem, State=1.113, Label=Verbrauch Tag, Category=null)
Heizung_Verbrauch_Woche (Type=NumberItem, State=9.715, Label=Verbrauch Woche, Category=null)
Heizung_Verbrauch_Monat (Type=NumberItem, State=24.761, Label=Verbrauch Monat, Category=null)
Heizung_Verbrauch_Jahr (Type=NumberItem, State=365.604, Label=Verbrauch Jahr, Category=null)
openhab>

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

Verfasst: 16. Okt 2022 15:29
von zinnik
Hallo Peter,

ich habe mal den Frontail log angehangen.

Meine Items sind über UI als Number angelegt.