Na so:
Code: Alles auswählen
rule "Solarertrag_aktueller_Monat"
when
Time cron "0 0/15 * ? * *" //alle 15 Minuten
// S M H T M W (J)
then
val start_of_month = now.with(LocalTime.MIDNIGHT).withDayOfMonth(1)
val start_of_prev_month = now.minusDays(now.getDayOfMonth).with(LocalTime.MIDNIGHT).withDayOfMonth(1)
val strom_Monat = (Solarlmodul_Gesamtverbrauch.deltaSince(start_of_month) as Number).floatValue
val strom_Vormonat = (Solarlmodul_Gesamtverbrauch.deltaSince(start_of_prev_month) as Number).floatValue - strom_Monat
Solarertrag_aktueller_Monat.postUpdate(strom_Monat)
Solarertrag_Vormonat.postUpdate(strom_Vormonat)
end
Beachte bitte auch, dass Du im Time cron Ausdruck einen Fehler hast. Die erste Stelle ist die Sekunde. Wenn da ein Stern steht, wird die Rule alle 15 Minuten jede Sekunde der aktuellen Minute getriggert, das willst Du eher nicht. Das Jahr ist optional, der letzte Stern kann also einfach entfallen.
Wenn man viele Rule hat, die per Time cron triggern, bietet es sich an, diese nicht alle zur selben Sekunde aufzurufen, sondern gestaffelt, um die Systmlast von vornherein zu streuen. Du könntest Die Rule allerdings auch einfach auf
Item Solarlmodul_Gesamtverbrauch changed triggern lassen, damit hast Du im Zweifel tagsüber eine genauere Anzeige und Nachts wird die Rule gar nicht ausgelöst, sondern erst, wenn die Anlage die ersten Tropfen Solarstrom einspeist.
now.minusDays(now.getDayOfMonth) verweist auf den Monatsletzten des Vormonats. Die Variablen und Konstanten können einfach als void definiert werden, openHAB weiß in den meisten Fällen sehr gut, was es verwenden muss. Es gibt natürlich auch Ausnahmen, hier sollte es aber ohne explizite Definition als
ZonedDateTime funktionieren.