Ankündigung

Einklappen
Keine Ankündigung bisher.

Eval mit Mehrfachbedingung / else-Anweisungen

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

    Eval mit Mehrfachbedingung / else-Anweisungen

    Hallo in die Runde,

    ich bin gerade dabei eine Szene für eine Dachfenster Steuerung zu implementieren, welche eine Logik triggert. Da ich nur mit Impulsen arbeiten kann, gibt es keine andere Möglichkeit.
    Ich habe nun eine Szene erstellt, welche dann meine die Logik (WatchItem) aufruft. Nun möchte ich den Doppelten Aufruf der Szene unterbinden, bzw. die Zeit ggf. erneuern.

    Was mache ich:
    mit dem Item "szenen.s0001.status" möchte ich in der Logik verhindern, dass die Dachfenster mehrfach geöffnet werden.
    Die Sperre (also der Status) soll je nach Szene wieder aufgehoben werden. Dazu möchte ich die Berechnung des Items "szenen.s0001.nummer_zeit" durchführen und an den Autotimer übergeben.

    Ich bekomme aber immer nur die 0 zurück. Was mache ich falsch, bzw. vll. geht das ja auch nicht so. Aber wie dann?

    Code:
    szenen:
        s0001:
            dachfenster:
                type: scene
                enforce_update: true
                knx_dpt: 5
                #knx_listen: 3/2/39
                knx_listen: 2/0/3
            nummer:
                type: num
            nummer_zeit:
                type: num
                eval: 600 if sh.szenen.s0001.dachfenster() == 1 else
                      900 if sh.szenen.s0001.dachfenster() == 2 else
                      1800 if sh.szenen.s0001.dachfenster() == 3 else
                      3600 if sh.szenen.s0001.dachfenster() == 4 else
                      10 if sh.szenen.s0001.dachfenster() == 5 else
                      30 if sh.szenen.s0001.dachfenster() == 6 else 0
            status:
                type: num
                autotimer: sh.szenen.s0001.nummer_zeit(); 0​
    Im Log lese ich foggendes:
    2024-07-05 12:16:33 NOTICE logics.Testlogik Berechneter eval aus nummer_zeit: '0'
    2024-07-05 12:16:33 NOTICE logics.Testlogik Aktueller Status: '0'
    P.S. Forensuche habe ich verwendet, aber keine passende Lösung gefunden.

    Gruß und Danke für die Unterstützung

    #2
    Zitat von MrSetup Beitrag anzeigen
    Ich bekomme aber immer nur die 0 zurück. Was mache ich falsch, bzw. vll. geht das ja auch nicht so. Aber wie dann?
    Das klappt mit dem eval so nicht. Prinziell ist eine else Verkettung schon möglich, wird aber schnell unlesbar.

    Besser wäre eine userfunction, die dann über das eval ausgerufen wird. Oder eine Logic.
    Ich würde das über eine UserFunktion lösen, du entweder mit if-elif-else arbeitest oder eine look-up tabelle verwendest.

    Kommentar


      #3
      Das müsste eher so aussehen:
      Code:
      eval: 600 if sh.szenen.s0001.dachfenster() == 1 else (
                        900 if sh.szenen.s0001.dachfenster() == 2 else (
                        1800 if sh.szenen.s0001.dachfenster() == 3 else (
                        3600 if sh.szenen.s0001.dachfenster() == 4 else (
                        10 if sh.szenen.s0001.dachfenster() == 5 else (
                        30 if sh.szenen.s0001.dachfenster() == 6 else 0)))))
      Der Python Ausdruck sieht im Prinzip so aus, wie Du begonnen hast:
      Code:
      Value1 if condition else Value2
      Du musst nun für die zweite Bedingung statt Value2 einen neuen if-Ausdruck einsetzen, also
      Code:
      Value1 if condition1 else (Value2 if condition2 else Value3)
      Das kannst Du nun weiter schachteln indem Du Value3 wieder durch einen if-Ausdruck ersetzt...
      Zuletzt geändert von Msinn; 05.07.2024, 16:43.
      Viele Grüße
      Martin

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

      Kommentar


        #4
        Danke erst mal für die Tipps und Anregungen. Werde die bei Gelegenheit ausprobieren und das Ergebnis hier posten.

        Gruß

        Michael

        Kommentar

        Lädt...
        X