Grundsätzlich müssen die Ausdrücke zum Berechnen der Startzeitpunkte so aussehen:
Code: Alles auswählen
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)
Der kleine, aber feine Unterschied liegt in den letzten zwei Zeilen im Absolutwert 1. Der Monat fängt am 1. an, genau wie das Jahr am 1. Tag anfängt.
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...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet