Ankündigung

Einklappen
Keine Ankündigung bisher.

eval löst falsch auf?

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

    eval löst falsch auf?

    Hallo zusammen,
    manchmal sieht man ja seine eigenen Fehle rnicht, aber vielleicht kann mal jemand rüber schauen:

    Code:
    OG:
    Bad:
        Dose:
                Heizstab_Handtuch:
                    schalten:
                        type: bool
                        knx_dpt: 1
                        knx_send: 1/0/33
                        knx_cache: 1/2/32
                        enforce_updates: yes
                        visu_acl: rw
                        Automatik:
                            type: bool
                            cycle: 60
                            eval: True sh.Zentral.Energie.Ueberschuss.vorhanden_mehr_als_3500() and not sh.Zentral.Heizung.Modus_heizen() and not sh...self() and sh...self.property.last_change_age > 60*60*2 else False if sh....self() and sh...self.property.last_change_age > 60*10 else None
                            on_change: ..self = value
    Folgendes Problem. Im Interface bei den Items sieht das EVAL so aus:

    Code:
    True sh.Zentral.Energie.Ueberschuss.vorhanden_mehr_als_3500() and not sh.Zentral.Heizung.Modus_heizen() and not sh.OG.Bad.Dose.Heizstab_Handtuch.schalten() and sh.OG.Bad.Dose.Heizstab_Handtuch.schalten.property.last_change_age > 60*60*2 else False if sh.OG.Bad.Dose.Heizstab_Handtuch.schalten() and sh.OG.Bad.Dose.Heizstab_Handtuch.schalten.property.last_change_age > 60*10 else None
    So soll das auch aussehen, aber nur deshalb, weil ich oben in der item-Definition geschummelt habe. Denn ich habe bei dem sh einen Punkt mehr gemacht, als es sein sollte. Richtig sollte es so sein:

    Code:
     .... False if sh...self() ....
    Dann kommt aber als Ergebnis:

    Code:
    True sh.Zentral.Energie.Ueberschuss.vorhanden_mehr_als_3500() and not sh.Zentral.Heizung.Modus_heizen() and not sh.OG.Bad.Dose.Heizstab_Handtuch.schalten() and sh.OG.Bad.Dose.Heizstab_Handtuch.schalten.property.last_change_age > 60*60*2 else False if sh.OG.Bad.Dose.Heizstab_Handtuch.schalten[B].Automatik[/B]() and sh.OG.Bad.Dose.Heizstab_Handtuch.schalten.property.last_change_age > 60*10 else None
    Warum muss ich da einen Punkt mehr machen, als bei allen anderen Item-Angaben?

    #2
    Fehlt dazwischen nicht ein if?
    Code:
    True sh.Zentral.Energie.Ueberschuss....
    Viele Grüße
    Martin

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

    Kommentar


      #3
      Zitat von Msinn Beitrag anzeigen
      Fehlt dazwischen nicht ein if?
      DANKE!!!! Löst das Problem allerdings immer noch nicht.

      ... habe noch mal geschaut. Die Multiplikation mit den Sekunden führt zu diesem merkwürdigen Verhalten. Ich habe jetzt die Sekunden direkt eingetragen und es geht. Dennoch merkwürdig, warum das dann so raus kommt.

      Könnte man evtl. noch als Anregung für spätere Versionen auch in dem Python-Code der Items die Minuten und Stunden direkt angeben? Also eben statt 7200 eben 2h?

      Kommentar


        #4
        Zitat von Cannon Beitrag anzeigen
        Könnte man evtl. noch als Anregung für spätere Versionen auch in dem Python-Code der Items die Minuten und Stunden direkt angeben? Also eben statt 7200 eben 2h?
        In welchen Attributen meinst Du?
        Viele Grüße
        Martin

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

        Kommentar


          #5
          Zitat von Msinn Beitrag anzeigen
          In welchen Attributen meinst Du?
          Im eval. Zum Beispiel so:

          Code:
          True if sh.OG.Bad.Dose.Heizstab_Handtuch.schalten.property.last_change_age > 2h else False

          Kommentar


            #6
            Das wird so nicht gehen, da ein eval Ausdruck ein gültiger Python ausdruck sein muss und 2h keinen gültigen Python Ausdruck darstellt.

            Das einzige was ginge wäre es, eine Funktion zu schreiben, die in eval Ausdrücken aufgerufen werden kann. Eine Funktion „to_sec()“ könnte die Umwandlung vornehmen. Als Parameter würdest Du dann den String ‚2h‘ angeben.
            Viele Grüße
            Martin

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

            Kommentar


              #7
              Die Funktion könnte in lib.sthime platziert werden und die selben Strings auflösen, die in Release 1.10 für die Attribute autotimer und cycle gültig sind. Dann kann man z.B. so etwas angeben: 2h30m
              Viele Grüße
              Martin

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

              Kommentar

              Lädt...
              X