Ankündigung

Einklappen
Keine Ankündigung bisher.

Auslesen von Historischen werten

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

    Auslesen von Historischen werten

    Hallo Zusammen,
    ich stehe gerade etwas auf den Schlauch.
    Ich habe in meiner InfluxDB den Status Regen meiner Wetterstation gespeichert. Jetzt möchte ich diesen per Rule und Stringitem aus der Datenbank auslesen mit den folgenden Werten:
    Wann hat es das letzte mal geregnet und wie lange.
    hat jemand eine Idee wie ich das am einfachsten in einer Rule unterbringe ?

    mfg Frank


    #2
    Hast Du auch den Status "Kein Regen" zur Verfügung? Eine entsprechende Rule sollte ungefähr so aussehen:
    Code:
    rule "Regen"
    when
        Item myRain changed
    then
        if(myRain.state == "Regen") {
            myLastRain.postUpdate(new DateTypeType(now.toString))
        } else {
            myLastRain.postUpdate(myRain.previousState(true,"influxdb").timestamp)
        }
    end
    Die Idee ist also, bei aktivem Regen die aktuelle Zeit anzuzeigen, bei keinem Regen die Zeit anzuzeigen, zu der zuletzt Regen gemeldet wurde (previousState(true) liefert den letzten Status, der ungleich dem aktuellen Status ist).

    Es kann sein, dass die timestamp erst noch nach DateTimeType konvertiert werden muss. Ich habe gerade keinen Zugriff auf mein Testsystem, so dass ich das nicht ausprobieren kann...

    Kommentar


      #3
      Hallo Udo,

      ich habe bei mir das Item so gelegt, dass ich immer sehen wann es Regnet. Ich bekomme also immer die Anzeige wenn es nicht Regnet "Nein" und wenn es Regnet "Ja"
      beides wird per Map von Open und Closed umgewandelt.
      habe deinen Text mal in eine Rule gepackt, zur Zeit zeigt er mir nichts an.

      Kommentar


        #4
        Was für ein Item verwendest Du denn nun? Contact? Switch? String? Wie ist Dein Item definiert?

        Kommentar


          #5
          von der Wetterstation habe ich ein Switch Item. für die Wiedergabe ein String Item.

          Hier sind meine beiden Items:
          Switch Regen "Regen[MAP(regen.map):%s]" <rain> {channel="knx:device:abb:ws:Regen"}
          DateTimeRegen_l"Last Update [%1$ta %1$tR]"<rain>

          Zuletzt geändert von TheDeathAngel; 04.08.2019, 21:07.

          Kommentar


            #6
            Dann lautet die Rule:
            Code:
            rule "Regen"
            when
                Item Regen changed
            then
                if(Regen.state == ON) {
                    Regen_l.postUpdate(new DateTimeType(now.toString))
                } else {
                    Regen_l.postUpdate(Regen.previousState(true,"influxdb").timestamp)
                }
            end
            Sobald es anfängt zu regnen, wird die Rule getriggert (nun ja, sobald der Sensor den Regen meldet...). Da es regnet, wird der Zeitstempel auf die aktuelle Uhrzeit/Datum gesetzt.
            Sobald es aufhört zu regnen, wird der Zeitstempel der letzten ON-Meldung ausgelesen und gesetzt.

            Wenn das System neu gestartet wird, triggert die Rule auch, sobald Regen einen Status erhält. Dann wird der Zeitstempel ebenfalls aus der Datenbank gezogen.
            Zuletzt geändert von udo1toni; 22.08.2019, 12:29.

            Kommentar


              #7
              Hallo Udo,

              das ganze Klappt schonmal ganz gut für einen Wert.
              du hattest nur einen kleinen Textfehler. es müsste doch DateTimeType heißen oder nicht ?

              sobald ich aber die Rule anpasse wird der wert nicht erneut ausgelesen und gespeichert was zur folge hat, dass keine aktuelle zeit mehr in dem Item steht.
              wie kann ich das ändern?

              Kommentar


                #8
                Tippfehler habe ich oben korrigiert.

                Wenn Du die Rules anpasst, sollte das keine Auswirkungen auf die Itemstatus haben. Wenn Du an den Items etwas änderst oder openHAB neu startest, natürlich schon.
                Dann musst Du die Rule auf anderem Weg triggern. Eine Möglichkeit wäre, noch ein
                Code:
                System started or
                nach dem when und vor dem Item Regen changed einzufügen. Dann triggert die Rule zusätzlich beim Systemstart und jedes Mal, wenn die Rules Datei gespeichert wurde. Oder Du baust ein zusätzliches Item dazu, welches Du dann nur über die UI auf ON setzen musst, um die Rule trigern zu lassen (so ein manuelles Trigger Item kannst Du auch in anderen Rules verwenden).

                Allerdings ist hier auch immer Vorsicht geboten. Setzt man den identischen Trigger bei mehr als 5 Rules ein, entsteht beim Trigger unmittelbar ein Stau, da openHAB nur maximal 5 Rules zeitgleich abarbeiten kann, das heißt, die übrigen Rules werden dann erst mit Verzögerung ausgeführt.

                Kommentar


                  #9
                  Hallo Udo,

                  wenn ich das System started hinzufüge bekomme ich folgende Fehlermeldung:

                  2019-08-22 14:36:20.617 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Error during the execution of startup rule 'Regen ein': cannot invoke method public abstract java.util.Date org.eclipse.smarthome.core.persistence.HistoricIte m.getTimestamp() on null

                  Kommentar


                    #10
                    Ich hatte es ja schon befürchtet...

                    Eine andere (vermutlich bessere) Variante wäre, das Item Regen mit restoreOnStartup zu persistieren, dann wird es beim Start automatisch von NULL auf den letzten Status wechseln -> die Rule wird ausgelöst (zu diesem Zeitpunkt ist aber der Persistence Service schon da, sonst hätte das restoreOnStartup ja nicht funktioniert).

                    Kommentar


                      #11
                      habs hinbekommen.

                      kann ich aus der Datenbank auch die Zeit ist stunden holen wie lang der Status Regen ein ist ?
                      Zuletzt geändert von TheDeathAngel; 22.08.2019, 21:49.

                      Kommentar


                        #12
                        Nein, das wird so ohne weiteres nicht gehen, Du brauchst dazu nicht nur den letzten Wechsel sondern auch noch den Wechsel davor.

                        Kommentar


                          #13
                          Ich hab jetzt den Letzten Wechsel auf ein und den letzten Wechsel auf AUS mir aus der DB geholt. Kann ich nicht einfach wenn regen EIN einen Timer starten den ich dann mit Regen AUS stoppe und den wert dann in der persist speicher ?

                          Kommentar


                            #14
                            Natürlich geht das, aber dann musst Du natürlich einen weiteren Wert persistieren, den Du gemessen hast (eben die Zeit). Du hast gefragt, ob Du die "Einschaltdauer" aus der Datenbank holen kannst. Dazu müsstest Du das letzte ein und das letzte Aus holen und zu diesen beiden Ereignissen die Zeitstempel in DateTimeType abspeichern. Dann ziehst Du die kleinere von der größeren Zahl ab und hast Deine Dauer. Dummerweise kannst Du aber das letzte Ein nicht abfragen (schon gar nicht das letzte ein vor dem letzten Aus).

                            Kommentar


                              #15
                              Das macht natürlich dann die Rechnung schwer wenn ein neuer Zeitstempel für das ein in die Datenbank geschrieben wird.

                              daher finde ich es auch sinnvoller einen timer zu erstellen. Den ich aus der db laden kann.

                              Kommentar

                              Lädt...
                              X