Seite 2 von 2

Re: SmartMeter in OpenHab

Verfasst: 12. Nov 2023 17:16
von udo1toni
Welche Version von openHAB nutzt Du?
Wenn Du openHAB ab Version 3 nutzt, wäre das hier die saubere Variante:

Code: Alles auswählen

import java.time.temporal.TemporalAdjusters                                            // leider nicht als default dabei...

rule "Stromverbrauch Tag/Woche/Monat/Jahr"
when
    Time cron " 0/5 * * * * ?"                                                         // alle 5 sec.
then
    // Zeitpunkte definieren
    val start_of_day   = now.with(LocalTime.MIDNIGHT)                                  // Mitternacht
    val start_of_week2 = start_of_day.minusDays(7)                                     // Mitternacht vor einer Woche
    val start_of_week  = start_of_day.with(TemporalAdjusters.previousOrSame(MONDAY))   // Mitternacht Wochenbeginn
    val start_of_month = start_of_day.with(TemporalAdjusters.firstDayOfMonth())        // Mitternacht Monatserster
    val start_of_year  = start_of_day.with(TemporalAdjusters.firstDayOfYear())         // Mitternacht 1.1.

    // Delta auslesen
    val strom_Heute  = KEZaehlerTotal.deltaSince(start_of_day,   "rrd4j") as Number
    val strom_Woche  = KEZaehlerTotal.deltaSince(start_of_week,  "rrd4j") as Number
    val strom_Woche2 = KEZaehlerTotal.deltaSince(start_of_week2, "rrd4j") as Number
    val strom_Monat  = KEZaehlerTotal.deltaSince(start_of_month, "rrd4j") as Number
    val strom_Jahr   = KEZaehlerTotal.deltaSince(start_of_year,  "rrd4j") as Number

    // Delta schreiben
    StromVerbrauchHeute.postUpdate(strom_Heute)  
    StromVerbrauchWoche.postUpdate(strom_Woche)  
    StromVerbrauchWoche2.postUpdate(strom_Woche2)
    StromVerbrauchMonat.postUpdate(strom_Monat)  
    StromVerbrauchJahr.postUpdate(strom_Jahr)    

    // Durchschnitt lesen
    var StromL1 = KEZaehlerCL1.averageSince(now.with(LocalTime.MIDNIGHT),"rrd4j")
    var StromL2 = KEZaehlerCL2.averageSince(now.with(LocalTime.MIDNIGHT),"rrd4j")
    var StromL3 = KEZaehlerCL3.averageSince(now.with(LocalTime.MIDNIGHT),"rrd4j")

    // Durchschnitt schreiben
    DurchschnittL1.postUpdate(StromL1)
    DurchschnittL2.postUpdate(StromL2)
    DurchschnittL3.postUpdate(StromL3)
end
Ganz wichtig: der Import muss zuoberst in der Textdatei stehen, in der die Rule liegt (noch vor den eventuell definierten globalen Variablen).
Dafür ist es aber recht komfortabel möglich, auf die Zeitpunkte zuzugreifen.