Ankündigung

Einklappen
Keine Ankündigung bisher.

Datum/Zeit vergleichen

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

    Datum/Zeit vergleichen

    Ich habe mehrere Items, wo ich die Zeit mittels sh.now() einspeichere. Beispiel:

    Code:
        schalten:
            type: bool
            knx_dpt: 1
            visu_acl: rw
            on_update:
                - .Dauer = 0 if not value else None
                - .wannAktiv = sh.now() if value else None
            # Beregnungsdauer in Minuten
            Dauer:
                type: num
                knx_dpt: 5
                enforce_updates: yes
                visu_acl: rw
            wannAktiv:
                type: foo
                visu_acl: rw
                database: init
    In einer logik will ich das wannAktiv abfragen und vergleichen. Dazu möchte ich es in ein timestamp umwandeln. Das funktioniert aber irgendwie nicht. Vielleicht ist der Weg auch völlig falsch. Die Frage deshalb, wie man einfach in einer Logik vergleichen kann ob ein Datum/Zeit-Objekt größer oder kleiner als das andere ist?

    #2
    Zitat von Cannon Beitrag anzeigen
    Dazu möchte ich es in ein timestamp umwandeln. Das funktioniert aber irgendwie nicht.
    Wie versuchst Du das denn?

    So globalgalaktisch wie Du fragst, kann ich auch nur antworten. Das geht z.B. so:
    Code:
            if type(dt1) is datetime.datetime and type(dt2) is datetime.datetime:
                delta = dt2 - dt1
                if delta.days < 0:
                    delta = dt1 - dt2
    Mit der if Bedingung aus Schutz ob man auch den richtigen Datentyp hat. Je nach Typ Deines Items müsstest Du den vorher wandeln.
    Viele Grüße
    Martin

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

    Kommentar


      #3
      Ich machs so:

      Code:
      letztes_Mal_aktiv_NordwestI = datetime(sh.Aussen.Garten.Bewaesserung.NordwestI.schalten.wannAktiv()).strftime("%s")
      letzter_Regen = sh.Zentral.Wetter.Wetterstation.Regen.property.last_change.strftime("%s")
      if letzter_Regen > letztes_Mal_aktiv_NordwestI:
          .....
      Ich bekomme immer eine Meldung, dass ein String nicht zuässig sei oder so. Anscheinend ist das Item vom Typ string, was ich nicht verstehe, weil sh.now() doch eine Datum/Zeit-Objekt ist oder?

      Und ich habe bewusst nicht geschrieben, wie ichs versucht habe, weil ich gehofft habe einen besseren Weg empfohlen zu bekommen. Deshalb war mein Ansatz gar nicht relevant. ;-)

      Aber auch nach der Variante gehts nicht, weil eben das Item (wannAktiv) nicht datetime ist:

      Code:
      # Wenn es regnete erkennt das der Bodensensor in der Hecke nicht, weil er zu tief liegt, deshalb den Rasensensor verwenden.
      # Die Prüfung folgt bei NordwestI und NordwestII.
      deltaNordwestI = sh.Zentral.Wetter.Wetterstation.Regen.property.last_change - sh.Aussen.Garten.Bewaesserung.NordwestI.schalten.wannAktiv()
      deltaNordwestII = sh.Zentral.Wetter.Wetterstation.Regen.property.last_change - sh.Aussen.Garten.Bewaesserung.NordwestII.schalten.wannAktiv()
      if deltaNordwestI > 0 or deltaNordwestI > 0:
          Hecke_Feuchte = sh.Aussen.Garten.Boden.Feuchte.Rasen_Nordwest()
      Dann wäre die Frage, wie ich das umwandeln kann. Mit strftime?

      Kommentar


        #4
        Zitat von Cannon Beitrag anzeigen
        if letzter_Regen > letztes_Mal_aktiv_NordwestI
        Damit vergleichst Du die Stringdarstellungen zweier Datumswerte. Sinnvoll wäre die Datumswerte zu vergleichen.

        Zitat von Cannon Beitrag anzeigen
        ein String nicht zuässig sei oder so
        Mit oder so kann ich nichts anfangen. Wenn Du Hilfe haben willst, musst Du schon exakte Angaben machen.

        Zitat von Cannon Beitrag anzeigen
        Anscheinend ist das Item vom Typ strin
        Kannst Du Dich auch festlegen? "Anscheinend" ist schon wieder etwas relatives worauf ich keine Hilfestellung aufbauen kann.

        Zitat von Cannon Beitrag anzeigen
        was ich nicht verstehe,
        Dann schau doch erstmal nach, ob Dein "Anschein" überhaupt stimmt.

        Zitat von Cannon Beitrag anzeigen
        Aber auch nach der Variante gehts nicht
        Nach welcher Variante?

        Zitat von Cannon Beitrag anzeigen
        if deltaNordwestI > 0 or deltaNordwestI > 0:
        Das hat nicht damit zu tun was ich geschrieben hatte!!!
        Siehe:
        Code:
        if type(dt1) is datetime.datetime and type(dt2) is datetime.datetime:
        Falls Du einen String hast, wandele ihn doch vorher in ein datetime Objekt um.
        Viele Grüße
        Martin

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

        Kommentar


          #5
          Zitat von Cannon Beitrag anzeigen
          Und ich habe bewusst nicht geschrieben, wie ichs versucht habe, weil ich gehofft habe einen besseren Weg empfohlen zu bekommen. Deshalb war mein Ansatz gar nicht relevant. ;-)
          Aber das, was du getan hast, und die (genaue!) Reaktion darauf, kann sehr wohl notwendig sein, um zu verstehen, was schief läuft. Aus deinen jetzt gemachten Angaben lassen sich keine Ursachen, nichtmal die genauen Fehler ermitteln.

          Am Besten arbeitest du auch nur mit copy und paste, denn wenn beim Abtippen Tippfehler auftreten, weiß hier auch keiner, ob du dich vertippt hast oder das möglicherweise eine Fehlerursache ist.

          Kommentar


            #6
            Mein Ansatz war ein anderer. Eigentlich bezieht sich meine Frage auf das Vergleichen von 2 Daten. Da wollte ich nicht auf Fehlersuche gehen, sondern eine Lösung haben, wie man das macht. Denn das, was ich da probiere ist wirklich nur probieren, weil ich schlichtweg keine Ahnung habe, wie ich das anstellen soll.

            Dennoch jetzt sind wir ja bei der Auswetung:

            Das Item ist von type: "<class 'str'>". Ich dachte die Frage konnte hier schon jemand beantworten. Das heißt SmartHomeNG liefert mit "sh.now() " kein DateTime, sondern einen String (typ im Item ist aber foo), während das property des Items ein DateTime iefert. Und deshalb ist jetzt die Frage, wie mache ich aus dem string ein datetime? Und wie vergleiche ich die DateTime-Objekte dann miteinander? Also nicht, wie oben von msinn geschrieben nur die Tage, sondern ich will wirklich wissen, welche Datum+Uhrzeit später bzw. früher, als die andere ist.

            Kommentar


              #7
              sh.now() liefert schon ein datetime. Du vergleichst aber gegen ein Item und beim abspeichern nicht durch SmartHomeNG unterstützter Datentypen in ein Item wird der Wert in einen String gewandelt. Vor dem Vergleich musst Du ihn also zurück wandeln.

              Eine andere Alternative wäre beide datetime Werte (wie Du es oben gemacht hast) via strftime in einen String der die Sekunden enthält umzuwandeln. Du solltest das Item allerdings nicht als foo (unbestimmer Datentyp) anlegen. Zum Vergleich musst Du dann natürlich die Strings noch in Zahlen wandeln.
              Viele Grüße
              Martin

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

              Kommentar


                #8
                Zitat von Msinn Beitrag anzeigen
                Eine andere Alternative wäre beide datetime Werte (wie Du es oben gemacht hast) via strftime in einen String der die Sekunden enthält umzuwandeln. Du solltest das Item allerdings nicht als foo (unbestimmer Datentyp) anlegen. Zum Vergleich musst Du dann natürlich die Strings noch in Zahlen wandeln.
                Als was sollte ich das Item dann anlegen? Als str?

                Das mit strftime kriege ich nicht hin. Sorry ich stelle mich da zu blöd an:

                Code:
                logger.info('{}'.format(datetime(sh.Aussen.Garten.Bewaesserung.NordwestI.schalten.wannAktiv()).strftime("%s")))
                Fehlermeldung: TypeError: an integer is required (got type str)

                Daraus folgt, dass das wandeln aus einem String gar nicht so geht.

                Kommentar


                  #9
                  Probier doch mal Schritt für Schritt, du machst ja auch gleich drei Wandlungen auf einmal...

                  Code:
                  logger.info('item {} is typ {}'.format(sh.Aussen.Garten.Bewaesserung.NordwestI.schalten.wannAktiv(), type(sh.Aussen.Garten.Bewaesserung.NordwestI.schalten.wannAktiv()))
                  Damit bekommst du Inhalt und Typ angezeigt.

                  Dann Schritt für Schritt weitergehen.

                  Kommentar


                    #10
                    Zitat von Morg Beitrag anzeigen
                    Damit bekommst du Inhalt und Typ angezeigt.
                    Ja entschuldige bitte ich bin da ungeduldig, weil ich das gelöst haben will. ;-)

                    Ich kenne ja den Inhalt. Ich brauche mir den nicht anzeigen lassen. Ich will den lediglich wandeln. Der Inhalt ergibt sich ja aus sh.now() und ich sehe den auch im Admin-Interface.

                    Kommentar


                      #11
                      Zitat von Cannon Beitrag anzeigen
                      Das mit strftime kriege ich nicht hin. Sorry ich stelle mich da zu blöd an:
                      Code:

                      logger.info('{}'.format(datetime(sh.Aussen.Garten. Bewaesserung.NordwestI.schalten.wannAktiv()).strft ime("%s")))
                      Fehlermeldung: TypeError: an integer is required (got type str)
                      Das mit dem strftime bekommst Du schon hin. strftime kannst Du aber nur auf datetime Werte anwenden. Du hast aber einen String sh.Aussen.Garten.Bewaesserung.NordwestI.schalten.w annAktiv(). Den kannst Du aber nicht so wie Du möchtest in einen datetime Wert umwandeln. Herauszufinden wie das geht, ist einfach: https://lmgtfy.com/?q=python+convert+string+to+datetime

                      Mit einem datetime wie sh.now() funktioniert das bestens mit sh.now().strftime("%s")
                      Viele Grüße
                      Martin

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

                      Kommentar


                        #12
                        Das habe ich auch schon probiert. Ich habe ja auch Google. ;-)

                        Das geht aber schon nicht, weil da noch die Milliskunden drin sind und ich die nicht loswerde und anscheinend auch noch die Zeitzone. Sprich mein Datum/Zeit-String sieht im Item so aus:

                        2020-05-22 21:41:53.948823+02:00

                        Und der Format-String sähe dann so aus:

                        Code:
                        '%Y-%m-%d %H:%M:%S.%f'
                        Geht aber auch nicht, weil die Zeitzone wohl noch irgendwi untergebracht werden muss. Ein anhängen von einem simplen "%z" bringt auch nichts.

                        Ohne %z kommt die Meldung:

                        Code:
                        File "/usr/lib/python3.5/_strptime.py", line 510, in _strptime_datetime
                        > tt, fraction = _strptime(data_string, format)
                        > File "/usr/lib/python3.5/_strptime.py", line 346, in _strptime
                        > data_string[found.end():])
                        Mit angehangenen %z so:

                        Code:
                        > File "/usr/lib/python3.5/_strptime.py", line 510, in _strptime_datetime
                        > tt, fraction = _strptime(data_string, format)
                        > File "/usr/lib/python3.5/_strptime.py", line 343, in _strptime
                        > (data_string, format))

                        Kommentar


                          #13
                          Die Python Doku ist da Dein Freund.
                          Viele Grüße
                          Martin

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

                          Kommentar


                            #14
                            Cannon

                            Schau mal in der Doku hier unter dem Punkt "Berechnung einer Zeitdauer in Sekunden von beliebigen datetime bis jetzt"

                            Kommentar


                              #15
                              Zitat von Sisamiwe Beitrag anzeigen
                              Schau mal in der Doku hier unter dem Punkt "Berechnung einer Zeitdauer in Sekunden von beliebigen datetime bis jetzt"
                              Genau nach der Methode habe ich es auch probiert. Geht aber nicht, weil der Datumsstring ein anderes Format hat. Mein Datum sieht so aus:

                              Code:
                              2020-05-22 21:41:53.948823+02:00
                              Meine Code dafür sieht so aus:

                              Code:
                              datum = datetime.strptime(sh.Aussen.Garten.Bewaesserung.NordwestI.schalten.wannAktiv(), '%Y-%m-%d %H:%M:%S.%f%z')
                              Und der Fehler kommt:

                              Code:
                              ValueError: time data '2020-05-22 21:41:53.948823+02:00' does not match format '%Y-%m-%d %H:%M:%S.%f%z'
                              Geht nicht, weil die Zeitzone hier im String falsch ist. %z sollte eigentlich nur funktionieren, wenn der String so ist: %z UTC offset in the form +HHMM or -HHMM (empty string if the object is naive). (empty), +0000, -0400, +1030 ... da stört der Doppelpunkt.

                              Das sollte erst ab einer späteren Version von Python geht. Und ich habe nur 3.5.3.

                              Code:
                              datum = datetime.fromisoformat(sh.Aussen.Garten.Bewaesserung.NordwestI.schalten.wannAktiv())

                              Kommentar

                              Lädt...
                              X