Ankündigung

Einklappen
Keine Ankündigung bisher.

Tag/Nacht-Objekt mit externer Zeit realisieren

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

    #46
    Hallo nochmal,

    nachdem es zunächst funktioniert hat, bekomme ich jetzt wieder ein Fehlermeldung im Log und kein Tagobjekt auf den Bus. Ich kann mich nicht erinnern, irgendetwas geändert zu haben, mit Ausnahme der Uhrzeiten. Hier die Meldung:

    HTML-Code:
    2018-10-23  00:01:12 ERROR    logics.tagobjekt Logic: logics.tagobjekt, File: /usr/local/smarthome/logics/tagobjekt.py, Line: 6, Method: <module>, Exception: name 'false' is not defined
    Traceback (most recent call last):
      File "/usr/local/smarthome/lib/scheduler.py", line 425, in _task
        exec(obj.bytecode)
      File "/usr/local/smarthome/logics/tagobjekt.py", line 6, in <module>
        sh.zeit.tagobjekt(false)
    NameError: name 'false' is not defined
    Zur Erinnerung: die tagobjekt.py ist:

    HTML-Code:
    if sh.zeit.uhrzeit() is not None:
        if sh.zeit.uhrzeit() > datetime.time(6, 30) and sh.zeit.uhrzeit() < datetime.time(19, 30):
            sh.zeit.tagobjekt(true)
        else:
            sh.zeit.tagobjekt(false)
    Die Logik wird aufgerufen, aber offenbar ist "false" nicht definiert. Aber wie kann das nicht definiert sein bei bool?

    Sieht jemand den Fehler?
    Cheers
    Art Mooney

    Kommentar


      #47
      Ah OK. "False" wird offenbar groß geschrieben...
      Cheers
      Art Mooney

      Kommentar


        #48
        Hi, wichtig:

        True auch. Gross meine ich.

        Gruß Waldemar
        OpenKNX www.openknx.de

        Kommentar


          #49
          Ja, ich falle da auch immer wieder rein - das ist in Python schon speziell.

          Kommentar


            #50
            Wieso, auch andere Sprachen sind Case sensitiv (z.B. Javascript)
            Viele Grüße
            Martin

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

            Kommentar


              #51
              Zitat von Msinn Beitrag anzeigen
              Wieso, auch andere Sprachen sind Case sensitiv (z.B. Javascript)
              Das ist nicht das spezielle - sondern dass True und False mit Grossbuchstaben starten. Mir fällt keine andere Sprache ein, wo dies so ist.

              Kommentar


                #52
                Das finde ich nicht so speziell. Jede Sprache hat halt ihren eigenen Syntax und an den muss man sich halten wenn man die Sprache nutzt.
                Viele Grüße
                Martin

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

                Kommentar


                  #53
                  Hi,

                  ich nehme immer 0 und 1, da kann man sich nicht vertun...

                  Gruß, Waldemar
                  OpenKNX www.openknx.de

                  Kommentar


                    #54
                    Zitat von mumpf Beitrag anzeigen
                    ich nehme immer 0 und 1, da kann man sich nicht vertun
                    Hat schon was. Im Gegensatz zu anderen Sprachen bewirkt das in Python nicht mal ein hässliches implizites Casting, weil bool eine Subklasse von int ist:
                    Zitat von https://docs.python.org/release/3.0.1/library/functions.html#bool
                    bool is also a class, which is a subclass of int.

                    Kommentar


                      #55
                      Zitat von smai Beitrag anzeigen
                      weil bool eine Subklasse von int ist
                      War mir ehrlich gesagt nicht klar, ist aber noch ein weiteres Argument dafür, es zu machen.
                      Grundsätzlich bin ich auch für Typsicherheit und gegen implizite Casts, da sie normalerweise Performace kosten und Feher verschleiern. Da mein Server aber bei weitem nicht ausgelastet ist, sehe ich den Performaceaspekt hier als vernachlässigbar und in diesem speziellen Fall (int für bool) führt es eben zu deutlich weniger Fehlern, da man sich hier nicht vertippen kann.

                      Ich müsste mal suchen, aber ich glaube, ich habe kein einziges True/False bei mir verwendet

                      Gruß, Waldemar
                      OpenKNX www.openknx.de

                      Kommentar


                        #56
                        Noch etwas für Art Mooney:

                        Du hättest Dein Problem vermeiden können, wenn Du Dir klar machst, das jede Bedingung hinter einem If ein bool liefert.
                        Code:
                        if sh.zeit.uhrzeit() is not None:
                            if sh.zeit.uhrzeit() > datetime.time(6, 30) and sh.zeit.uhrzeit() < datetime.time(19, 30):
                                sh.zeit.tagobjekt(True)
                            else:
                                sh.zeit.tagobjekt(False)
                        Du sagst somit:
                        • if True dann setze sh.zeit.tagobjekt auf True
                        • if False dann setze sh.zeit.tagobjekt auf False
                        Es ist exakt das selbe, wenn Du das Ergebnis der Bedingung setzt:
                        Code:
                        bedingung = sh.zeit.uhrzeit() > datetime.time(6, 30) and sh.zeit.uhrzeit() < datetime.time(19, 30)
                        sh.zeit.tagobjekt(bedingung)
                        oder noch kompakter:
                        Code:
                        sh.zeit.tagobjekt(sh.zeit.uhrzeit() > datetime.time(6, 30) and sh.zeit.uhrzeit() < datetime.time(19, 30))
                        Nur so als Hinweis, da man häufig hier im Forum solche überflüssigen IFs sieht, vor allem auch in eval-Ausdrücken.

                        Gruß, Waldemar
                        OpenKNX www.openknx.de

                        Kommentar


                          #57
                          Danke für die Erläuterungen. Ich habe mir ein Python-Buch besorgt und fange jetzt mal mit den Grundlagen an.
                          Cheers
                          Art Mooney

                          Kommentar


                            #58
                            Ich krame hier mal einen alten Thread raus, weil es zu meinem Thema passt. Mir ist nicht ganz klar, wie ich in den items die aktuelle Uhrzeit verwenden kann, ohne das über den KNX-Bus zu machen. In der YAML-Dokumentation finde ich darüber nichts und hier im Forum wenigstens ein paar Fragmente. Wenn ich es richtig verstanden habe gibt mir:

                            Code:
                            datetime.time(Stunde, Minute, Sekunde)
                            .. meine formatierte Uhrzeit aus. Wobei Sekunde und Minute wohl optional sind.

                            Wie ermittele ich aber die aktuelle Uhrzeit? Geht das in YAML überhaupt?

                            Kommentar


                              #59
                              Wozu willst in yaml die Uhrzeit wissen? Nee, das geht natürlich nicht. Yaml ist nur eine Art wie Daten repräsentiert werden. Du kannst aber eine Python Funktion verwenden um das zu ermitteln oder auch direkt shtime von SmartHomeNG nutzen.

                              Kommentar


                                #60
                                Hi Cannon,

                                ist so nicht ganz richtig. Die aktuelle Zeit steht in sh.now(). Da sh in python programmiert ist, verwendet es auch python Datenstrukturen, so das die Zeit in sh.now() ein für Menschen nicht lesbares datetime-Objekt ist. Um nun mit für uns verständlichen Zeiten wie 12:20 Uhr vergleichen zu können, müssen wir aus 12:20 Uhr ein datetime-Objekt machen. Das bekommt man durch datetime.time(12,20). Dann kann man Vergleiche machen wie sh.now() > datetime.time(12,20), und weiß dann, dass später als 12:20 Uhr ist. Die zugrundegelegte Zeit ist die Zeit des Rechners, auf dem sh.py läuft, nicht die Zeit, die auf dem Bus ist.

                                Das Ganze hat aber nichts mit yaml zu tun, deswegen bin ich nicht sicher, ob ich Deine Frage richtig verstehe.

                                Gruß, Waldemar
                                OpenKNX www.openknx.de

                                Kommentar

                                Lädt...
                                X