Ankündigung

Einklappen
Keine Ankündigung bisher.

HistoricState gestern / day before

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

    HistoricState gestern / day before

    Hallo!
    Ich persistiere ein Item jeden Tag vor Mitternacht:
    Code:
    Niederschlag_WSK        :   strategy = beforeMidnight
    Wie kann ich heute z.B. den Wert von gestern abrufen?
    Nach kurzem Studium der Persistence Seite gehe ich davon aus, dass es etwas mit ZonedDateTime zu tun hat, aber ich komm nicht dahinter... Internetsuche hat mich leider auch nicht ans Ziel geführt.
    Hat jemand eine Idee? Die Regel, welche den Wert abruft wird, läuft nicht immer zur selben Zeit ab (falls das relevant sein sollte).

    Würde mich über eure Hilfe freuen!
    Mahlzeit inzwischen

    #2
    Code:
    Niederschlag_WSK.historicState(now.minusHours(24)).state
    wäre mein erster Versuch. historicState liefert den Zustand zum angegebenen Zeitpunkt. Sollte die Persistence nicht die default Persistence sein (die kann man in der Main UI setzen), so muss die Persistence mit angegeben werden, z.B.
    Code:
    Niederschlag_WSK.historicState(now.minusHours(24),"influxdb").state
    Wichtig ist noch, dass man .state anhängen muss, denn man kann auch den Zeitstempel erfragen (der persistierte Messwert kann ja zu einem beliebigen Zeitpunkt vor dem erfragten Zeitpunkt persistiert worden sein)
    Zuletzt geändert von udo1toni; 20.04.2022, 19:58.

    Kommentar


      #3
      Danke für die Antwort!
      Zitat von udo1toni Beitrag anzeigen
      Code:

      Niederschlag_WSK.historicState(now.minusHours(24)) .state
      So versucht openHAB aber, den Wert von vor 24 Stunden zu holen, richtig? Das ist freilich ungeschickt, da ich a) den Stand von kurz vor Mitternacht brauche und b) nur um kurz vor Mitternacht (beforeMidnight) persistiere.

      Beispiel:
      Tagx = Tag an dem die Regel läuft
      Tag-1 = "Gestern"
      Tag-2 = "Vorgestern"

      Niederschlag_WSK Tag-2 (ganzer Tag) = 0mm
      Niederschlag_WSK Tag-1 (7 Uhr) = 2mm
      Niederschlag_WSK Tag-1 (23 Uhr) = 10mm

      Wenn ich nun am Tagx now.minusHours(24) um 7 Uhr die Regel per cron abrufe, dann schaut er bei Tag-1 um 7 Uhr rein, findet aber nur den persistierten Wert von Tag-2 kurz vor Mitternacht (0 mm), oder? Wenn ich persistence umschreiben würde auf everyChange würde ich meinem Verständnis nach den Stand vom Tag-1 7 Uhr (2mm) bekommen, allerdings hätte ich gerne den Maximalwert des Tages (und deshalb persistiere ich auch nur kurz vor Mitternacht).

      Kommentar


        #4
        Ja, das war aber auch nur als Beispiel gemeint. Selbstverständlich kannst Du z.B. auch
        Code:
        Niederschlag_WSK.historicState(ZonedDateTime.now().with(LocalTime.MIDNIGHT).minusHours(1)).state
        nehmen, um immer den Messwert des Vortages um 23 Uhr zu erhalten. Das wäre dann der Wert von vor 2 Tagen.
        Code:
        Niederschlag_WSK.historicState(ZonedDateTime.now().with(LocalTime.MIDNIGHT)).state
        wäre der Messwert von gestern, da Du ja kurz vor Mitternacht den Wert persistierst.
        Zuletzt geändert von udo1toni; 21.04.2022, 11:58.

        Kommentar


          #5
          Danke, werds mal so versuchen!

          Kommentar


            #6
            Hatte jetzt endlich mal wieder Zeit mich an den Rechner zu setzen und wollte das mit dem Regen Vortag testen, aber ich bekomms nicht hin.

            Code:
            Niederschlag_WSK_Vortag.postUpdate(Niederschlag_WSK.historicState(ZonedDateTime.now().with(LocalTime.MIDNIGHT), "rrd4j").state)
            bringt diese Fehlermeldung:

            Code:
            [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'various-4' failed: cannot invoke method public abstract org.openhab.core.types.State org.openhab.core.persistence.HistoricItem.getState () on null in various
            habs zuerst ohne den "rrd4j" Zusatz versucht, Fehlermeldung war diesselbe.

            Was mich denn falsch? 😐

            Kommentar


              #7
              Brich die Anweisung in kleinere Teile um und schau, was zwischenzeitlich passiert:
              Code:
              val tMidnight = ZonedDateTime.now().with(LocalTime.MIDNIGHT)
              logInfo("vortag","Zeitpunkt: {}", tMidnight)
              val nOldvalue = Niederschlag_WSK.historicState(tMidnight, "rrd4j").state
              logInfo("vortag","Wert: {}", nOldvalue)
              
              Niederschlag_WSK_Vortag.postUpdate(nOldvalue)
              Zuletzt geändert von udo1toni; 29.05.2022, 17:05.

              Kommentar


                #8
                Code:
                2022-05-29 19:14:01.907 [INFO ] [org.openhab.core.model.script.vortag] - Zeitpunkt: 2022-05-29T00:00+02:00[Europe/Berlin]
                
                2022-05-29 19:14:01.909 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'various-4' failed: cannot invoke method public abstract org.openhab.core.types.State org.openhab.core.persistence.HistoricItem.getState () on null in various

                Kommentar


                  #9
                  Sieht so aus, dass der Zugriff auf die Daten nicht funktioniert, mit hoher Wahrscheinlichkeit, weil der Wert nur einmal am Tag geschrieben wird. rrd4j muss zwingend mit everyMinute befüllt werden.

                  Kommentar


                    #10
                    ok, ich stells mal um und werds morgen wieder versuchen!

                    Kommentar

                    Lädt...
                    X