Ankündigung

Einklappen
Keine Ankündigung bisher.

Höchster bisher gemessene Temperatur des aktuellen Tages

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

    Höchster bisher gemessene Temperatur des aktuellen Tages

    Hallo zusammen,

    ich versuchte gerade ein Item zu erstellen, dass die höchste gemessene Temperatur des akteullen Tages enthält. Immer zu einer bestimmten Uhrzeit (z.B. 3 Uhr Nachts) soll der Wert wieder auf die aktuelle Temperatur zurückgesetzt werden.

    Das geht sicher über eine Logik. Das würde ich vermutlich auch irgendwie hinbekommen. Aber ich kann mir vorstellen, dass das auch mit einem einfachen eval und mit Hilfe des database plugins einfacher gehen müsste.

    Mein Item sieht bisher in etwa so aus:
    Code:
    Wetterstation:
        Temperatur:
            Aktuell:
                type: num
                visu_acl: ro
                database: 'yes'
            Maximum_Heute:
                type: num
                visu_acl: ro
                eval_trigger: ..Aktuell
                eval: value if value > sh...Aktuell() else sh...Aktuell()
    Der Code ist bisher noch nicht getestet, da ich nicht weiss, wie ich das mit dem Zurücksetzen zu einer bestimmten Uhrzeit hinbkomme.
    Kann mir da jemand einen Tipp geben?

    Gruß Kex

    #2
    Check mal crontab in der Doku

    Kommentar


      #3
      OK, crontab war das richtige Stichwort. Ich dachte bisher immer, dass das nur für das Triggern von logiken funktioniert, aber jetzt hab ich gelernt, dass das wohl auch die Auswertung von Items triggert.

      Jetzt stehe ich vor dem nächsten Problem: Das Item wie ich es in meinem vorherigen Post beschrieben hatte funktioniert leider nicht.
      Anscheinend enthält value im eval Ausdruck den Wert von Wetterstation.Temperatur.Aktuell und nicht mehr den alten Wert von Wetterstation.Temperatur.Maximum_Heute

      deshalb hab ich das Item wie folgt angepasst (Zugriff auf den letzen Wert des Items Maximum_Heute über die Property last_value:

      Code:
      Wetterstation:
          Temperatur:
              Aktuell:
                  type: num
                  knx_dpt: 9
                  visu_acl: ro
                  knx_init: 1/2/3
                  database: 'yes'
              Maximum_Heute:
                  type: num
                  visu_acl: ro
                  # 99.9 wird als "Magic Number" für den Reset verwendet. Diese Temperatur sollte in der Praxis nie vorkommen.
                  eval: sh...Aktuell() if value == 99.9 or float(sh..self.property.last_value()) < sh...Aktuell() else float(sh..self.property.last_value())
                  eval_trigger: ..Aktuell
                  crontab:
                   - 0 3 * * = 99.9
                   - init = 99.9
      Beim Starten von smarthome steht dann aber folgende Fehlermeldung im Log

      Code:
      2020-05-20  17:24:39 WARNING  lib.item            Item Wetterstation.Temperatur.Maximum_Heute: problem evaluating sh.Wetterstation.Temperatur.Aktuell() if value == 99.0 or float(sh.Wetterstation.Temperatur.Maximum_Heute.property.last_value()) < sh.Garten.Wetterstation.Temperatur.Aktuell() else float(sh..self.property.last_value()): 'int' object is not callable
      Ich hab gedacht es ist vielleicht ein cast problem, da ja laut Doku last_value vom Typ string ist. Deshalb hab ich mal den cast nach float drum rum gebaut. Aber das Ändert gar nichts.
      Eine Internetrecherche hat ergeben, dass Bei Fehlern der Art 'int' object is not callable in der Regel eine methode den selben Namen hat wie eine Variable. Aber leider reichen meine Python-Skills nicht aus, um dahinterzusteigen was ich falsch mache.
      Zuletzt geändert von kex; 20.05.2020, 17:08.
      Gruß Kex

      Kommentar


        #4
        Value enthält zur eval Auswertung bereits den neuen Eingangs-Wert, damit man mit ihm rechnen kann um den Wert der in das Item geschrieben werden soll zu berechnen.

        Über Property greifst Du auf die Werte des Items vor der Veränderung zu. property.last_value sollte also den vorletzten Wert enthalten. Du müsstest also eigentlich property.value nutzen oder stattdessen den Wert des Items selbst abfragen: sh..()

        property.last_value musst Du wie alle Properties ohne anschließende Klammern aufrufen!
        Viele Grüße
        Martin

        There is no cloud. It's only someone else's computer.

        Kommentar


          #5
          Das mit dem Aufruf ohne Klammer hat auf jeden Fall schonmal geholfen.
          Aber Python und ich werden enfach nicht Warm miteinander.

          Mein Item sieht jetzt so aus:

          Code:
          Wetterstation:
              Temperatur:
                  Aktuell:
                      type: num
                      knx_dpt: 9
                      visu_acl: ro
                      knx_init: 1/2/3
                      database: 'yes'
                  Maximum_Heute:
                      type: num
                      visu_acl: ro
                      eval: sh...Aktuell() if value == 99.9 or float(sh..self.property.value) < sh...Aktuell() else sh..self.property.value
                      eval_trigger: ..Aktuell
                      crontab:
                       - 0 3 * * = 99.9
                       - init = 99.9
          Jetzt kommt eine "invalid syntax" Fehlermeldung im Log
          Code:
          2020-05-20  19:19:33 WARNING  lib.item            Item Wetterstation.Temperatur.Maximum_Heute: problem evaluating sh.Wetterstation.Temperatur.Aktuell() if value == 99.9 or float(sh.Wetterstation.Temperatur.Maximum_Heute.property.value) < sh...Aktuell() else sh.Wetterstation.Temperatur.Maximum_Heute.property.value: invalid syntax (<string>, line 1)
          Wenn ich float(sh.Wetterstation.Temperatur.Maximum_Heute.pr operty.value) durch einen Konstanten Wert ersetze (z.B. 42.0) kommt der Fehler nicht. Ich hab es auch schon ohne den Cast nach Float versucht. Dann kommt allerdings der selbe Fehler.

          Kann mir noch jemand einen Tipp geben wo mein Fehler liegen könnte?
          Gruß Kex

          Kommentar


            #6
            Um solche Ausdrücke zu testen kann man im Admin Interface unter Dienste den Eval Syntax Prüfer nutzen oder das Executor Plugin. Dann muß man nicht immer neu starten.

            Kommentar


              #7
              Ist das Absicht, dass im eval-String jetzt nicht mehr last_value sondern value steht?

              Kommentar


                #8
                Zitat von kex Beitrag anzeigen
                Das mit dem Aufruf ohne Klammer hat auf jeden Fall schonmal geholfen.
                Aber Python und ich werden enfach nicht Warm miteinander.
                Mit Klammern rufst Du eine Funktion auf. Properties sind jedoch keine Funktionen sondern eher wie Variablen zu sehen. Man kann sie nur nicht beliebig lesen und schreiben. Je nach Property ist es r/w, r/o oder evtl. sogar w/o.

                Zitat von kex Beitrag anzeigen
                Kann mir noch jemand einen Tipp geben wo mein Fehler liegen könnte?
                Auf die Schnelle nicht, ausser, dass ich sh...Aktuell() auch in float gcastet hätte. Aber hast Du schon mal

                Code:
                    eval: sh...Aktuell() if value == 99.9 or float(sh..self()) < float(sh...Aktuell()) else sh..self.property.value
                bzw.
                Code:
                    eval: sh...Aktuell() if value == 99.9 or float(sh..()) < float(sh...Aktuell()) else sh..self.property.value
                probiert wie ich oben vorgeschlagen habe?

                Zitat von Morg Beitrag anzeigen
                Ist das Absicht, dass im eval-String jetzt nicht mehr last_value sondern value steht?
                Morg Hast Du meinen Post von 18:45 Uhr gelesen?
                Viele Grüße
                Martin

                There is no cloud. It's only someone else's computer.

                Kommentar


                  #9
                  Zitat von Msinn Beitrag anzeigen
                  Morg Hast Du meinen Post von 18:45 Uhr gelesen?
                  Ja, aber ... nöö Der letzte Satz hat mich so beeindruckt, dass ich den Rest davor wohl überlesen habe

                  Das erklärt aber auch, wieso einige meiner eval-Versuche nicht so getan haben, wie ich das wollte

                  Kommentar


                    #10
                    Danke euch allen! Jetzt funktionierts!

                    So sieht mein Item jetzt aus (Weills so schön funktioniert hab ich das Minumum gelich dazu gemacht):
                    Code:
                    Wetterstation:
                        Temperatur:
                            Aktuell:
                                type: num
                                knx_dpt: 9
                                visu_acl: ro
                                knx_init: 1/2/3
                                database: 'yes'
                            Maximum_Heute:
                                type: num
                                visu_acl: ro
                                eval: sh...Aktuell() if value == 99.9 or float(sh..self()) < sh...Aktuell() else sh..self.property.value
                                eval_trigger: ..Aktuell
                                crontab:
                                 - 0 3 * * = 99.9
                                 - init = 99.9
                    Den Hinweis von Msinn, dass ich es mal mit sh..self() versuchen soll, hab ich überlesen. Irgendwie war ich von der Info, dass ich besser property.value statt property.last_value verwenden soll, so abgelenkt, dass ich das nicht gesehen hatte. ;-)

                    Auch der Tipp von BMX mit dem Eval Checker hat mir wieder die Augen geöffnet, dass ich vielleicht mal wusste, dass es den gibt, ich aber total vergessen hatte. Hier hab ich allerdings festgestellt dass "value" im Eval-Cecker nicht bekannt ist. Das musste ich durch eine Konstante ersetzen um den Ausdruck prüfen zu können.

                    Gruß Kex

                    Kommentar


                      #11
                      Schön das es funktioniert. Das wäre glatt einen Blogpost wert. Bestimmt haben diese Aufgabenstellung noch andere...

                      Kommentar


                        #12
                        Blogpost hört sich gut an. Wer kann denn alles Blogbeiträge schreiben? Sofern ich die nötigen Nutzerrechte hätte würde ich das gerne übernehmen. Natürlich kann ich auch einfach den Text liefern. Allerdings würde ich das item noch eine Weile testen und beobachten und wenn möglich noch gegen Ausreißer absichern: Ich habe nach dem selben Prinzip auch ein Item angelegt, das sich den kleinsten Messwert des Tages merkt und hier steht aktuell der Wert „0“ drin. Obwohl es sicher heute noch nicht so kalt war.
                        Gruß Kex

                        Kommentar


                          #13
                          Nähere Infos findest Du hier: https://www.smarthomeng.de/registrieren-und-bloggen
                          Viele Grüße
                          Martin

                          There is no cloud. It's only someone else's computer.

                          Kommentar

                          Lädt...
                          X