Ankündigung

Einklappen
Keine Ankündigung bisher.

Verbrauch pro Tag/Woche/Monat/Jahr - "null" verhindern und Maxi-Wert pro Zeiteinheit

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Verbrauch pro Tag/Woche/Monat/Jahr - "null" verhindern und Maxi-Wert pro Zeiteinheit

    Wie bereits im anderen Thread("Welche Werte speichern, um später schöne Plots zu haben?") vermutet habe ich Probleme mit der Rule.

    1. Bekomme ich bei den meisten Berechnungen noch "null", weil vermutlich noch keine Werte für den Zeitraum vorhanden sind. Kann man da evtl. herausfinden wann der 1ste Wert eingetragen wurde und dies als start_of_day/week/month/year setzen?

    2. Der jeweilige Maximumwert müsste ja immer kurz vor 24 Uhr und nur 1mal pro Zeiteinheit(z.B. für die Woche Sonntag Abend 23:59:59) gespeichert werden, wie bekomme ich das hin so das pro Tag/Woche/Monat/Jahr immer nur eine Wert gespeichert wird? Oder lassen sich Werte per rule löschen?

    Code:
    import java.time.temporal.TemporalAdjusters                                            // leider nicht als default dabei...
    
    rule "heatpump consumption"
    
    when
        Item hp_counter_kwh received update
    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  = hp_counter_kwh.deltaSince(start_of_day) as Number
        val strom_Woche  = hp_counter_kwh.deltaSince(start_of_week) as Number
        val strom_Woche2 = hp_counter_kwh.deltaSince(start_of_week2) as Number
        val strom_Monat  = hp_counter_kwh.deltaSince(start_of_month) as Number
        val strom_Jahr   = hp_counter_kwh.deltaSince(start_of_year) as Number
    
        // Delta schreiben
        hp_c_day_kwh.postUpdate(strom_Heute)  
        hp_c_kalenderwoche_kwh.postUpdate(strom_Woche)  
        hp_c_week_kwh.postUpdate(strom_Woche2)
        hp_c_month_kwh.postUpdate(strom_Monat)  
        hp_c_year_kwh.postUpdate(strom_Jahr)
    
        // Maximumwert nur 1 mal pro Zeiteinheit ???
        hp_c_max_day_kwh.postUpdate(hp_c_day_kwh.maximumSince(now.with(LocalTime.MIDNIGHT)).state as Number)
        // Maximumwert nach obigem Beispiel für Woche, Monat, Jahr
        // hp_c_max_week_kwh
        // hp_c_max_month_kwh
        // hp_c_max_year_kwh
    
    end
    cu Yfkt5A
    DALI(ABB DG/S1.1), KODI Odroid, TrueNAS, Zehnder ComfoAir 200 L Luxe
    microk8s-Cluster: HomeAssistant, MusicAssistant, mosquitto, TVHeadend, jellyfin

    #2
    Zu 1.: Du kannst prüfen, ob der geliefert Wert null ist und dann gezielt reagieren. Es gibt meines Wissens aber keine Möglichkeit hier z.B. "Ersatzzeiträume" zu definieren, dann müsste die Funktion ja zusätzlich melden, ob es sich um den gesuchten Zeitraum handelt, oder dieser angepasst wurde. Die einfachste Lösung ist also, geduldig zu warten, bis genügend Werte vorhanden sind

    Zu 2.: Wie meinst Du das? Wenn Du die Maximalwerte pro Tag haben willst, musst Du halt die betreffende Auswertung um 23:59:59 ausführen.

    Kommentar


      #3
      1. Falls jemand eine Lösung dafür hat... immer her damit... am besten natürlich als Code(beispiel)

      2. Genau, immer nur den Maximalwert... das ist für vergangene Zeiträume auch völlig OK, also z.B. für gestern. Für heute bekomme ich den Wert allerdings erst um 23:59:59, ausser man könnte in der rule den vorhergehenden Wert löschen und dann nur den letzten vor 00:00 Uhr behalten. So könnte man auch schon den aktuellen(heutigen) Wert darstellen natürlich immer bezogen auf das Balkendiagram in der smartVISU siehe "Welche Werte speichern, um später schöne Plots zu haben?"

      Um die Maximalwerte zu schreiben habe ich mal zum Test noch einen stündlichen in dieselbe Datei unterhalb der anderen Rule hinzugefügt:
      Code:
      rule "heatpump max hourly"
      
      when
          Time cron " 59 59 * ? * * *"
      then
          val ruleName = "heatpump max hourly"
      
          // Zeitpunkte definieren
          val start_of_day   = now.with(LocalTime.MIDNIGHT)                                  // Mitternacht
          val start_of_hour  = start_of_day.plusHours(now.getHour() )                        // aktuelle Stunde
      
          // Delta auslesen
          val strom_Stunde  = hp_counter_wh.deltaSince(start_of_hour) as Number
      
          // Delta schreiben
          hp_c_max_stunde_wh.postUpdate(strom_Stunde)
      
      end​
      Wie mache ich das am besten jetzt für die anderen Zeiträume?
      Code:
      59 59 23 ? * * *    // Tag
      59 59 23 ? * SUN *  // Woche
      59 59 23 L * ? *"   // Monat
      59 59 23 L DEC ? *" // Jahr​
      Jeweils eine eigene Rule nach obigem Beispiel? oder gehts einfacher?


      Natürlich wäre es viel schöner wenn openHAB hier sich wie die anderen Backends verhalten würde, wie von wvhn hier(Welche Werte speichern, um später schöne Plots zu haben?) unter 2. beschrieben.
      Zitat von wvhn Beitrag anzeigen
      2. Jemand baut in openHAB die Datenbank-Modi nach, die auch smarthomeNG und fhem verwenden. Das geht mittels SQL-Abfragen. Darin werden alle Werte in Intervallen gruppiert, die von der Gesamtlänge des Plots geteilt durch die Anzahl der Punkte („count“) definiert werden. Auf diese Gruppen können dann per SQL die Aggregatsfunktionen wie min, max, avg … angewendet werden. Dann muss die Auswahl der Modi auf Seite von openHAB auf der Schnittstelle bereitgestellt werden.





      cu Yfkt5A
      DALI(ABB DG/S1.1), KODI Odroid, TrueNAS, Zehnder ComfoAir 200 L Luxe
      microk8s-Cluster: HomeAssistant, MusicAssistant, mosquitto, TVHeadend, jellyfin

      Kommentar


        #4
        Zitat von Yfkt5A Beitrag anzeigen
        ausser man könnte in der rule den vorhergehenden Wert löschen
        Nein, das geht nicht.
        Du musst Dich schon entscheiden, ob Du den Maximalwert schon während des Messzeitraums sehen willst, oder ob Du nur einen Messwert pro Messzeitraum haben willst.
        Wenn Du beides brauchst, wirst Du nicht darum herum kommen, dafür ein eigenes Item zu definieren. Du musst dann halt von Fall zu Fall entscheiden, auf welches Item Du zugreifst (das mit einem Messwert pro Zeiteinheit oder das mit dem immer aktuellen Maximalwert)

        Bitte nicht vergessen, openHAB ist nicht in erster Linie ein Backend für Fremdsoftweare, sondern eine vollständige Smarthome Lösung.
        Das heißt, openHAB orientiert sich nicht daran, was andere machen, oder ob andere es möglichst bequem haben, openHAB hat sein eigenes Datenmodell, welches für openHAB optimiert ist.
        Wenn Du von einer Visu auf die Daten aus openHAB zugreifen willst, dann nutze am besten eine externe SQL Datenbank.
        In openHAB nutzt Du dann den jdbc Persistence Service, aus der externen Visu greifst Du direkt auf die SQL Datenbank zu, dann kannst Du die gewünschten Werte einfach per SQL Statement anfordern.

        Kommentar

        Lädt...
        X