Ankündigung

Einklappen
Keine Ankündigung bisher.

Ausführung von "eval" nur bei "eval_trigger"

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

    Ausführung von "eval" nur bei "eval_trigger"

    Guten Abend,

    ich kämpfe hier mit folgender Problematik. Wenn man Raum an der Zentralsteuerung angemeldet (Schwester Item "Zentralbetrieb" = 1) ist, soll das zentrale "Status.Schlafen" Item den Raum mitnehmen. Das funktioniert soweit auch wunderbar.
    Wenn allerdings der Raum auf Lokalsteuerung steht (Zentralbetrieb = 0) dann soll 1. das Zentralobjekt nicht ausgewertet werden, aber 2. das lokale Status.Schlafen Item natürlich betätigt werden können. Die Log Datei sagt mir, dass eval offensichtlich aber immer ausgelöst wird und auf Grund der Bedingung "else None" dann die lokale Änderung des Zustands verhindert.



    Code:
    [[Buero]]
        [[[Status]]]
                [[[[Schlafen]]]]
                    type = bool
                    visu_acl = rw
                    knx_dpt = 1
                    knx_send = 6/2/32
                    knx_listen = 6/2/32
                    knx_reply = 6/2/32
                    eval = value if sh....Zentralbetrieb() == 1 else None
                    eval_trigger = EG.Zentral.Status.Schlafen
                    cache = on
            [[[Zentralbetrieb]]]
                type = bool
                knx_dpt = 1
                value = 1
                visu_acl = rw
                cache = on
                enforce_updates = on
    Code:
    2017-01-04  23:32:13 DEBUG    Main         192.168.10.131:57655 sent '{"cmd":"item","id":"EG.Buero.Status.Schlafen","val":1}'
    2017-01-04  23:32:13 DEBUG    Main         Triggering EG.Buero.Status.Schlafen-eval - by: Visu source: 192.168.10.131:57655 dest: None value: {'value': 1, 'dest': None, 'caller': 'Vi
    2017-01-04  23:32:13 INFO     EG.Buero.Status.Schlafen-eval Item EG.Buero.Status.Schlafen: evaluating value if sh.EG.Buero.Zentralbetrieb() == 1 else None returns None
    2017-01-04  23:32:13 DEBUG    Main         192.168.10.131:57655 sent '{"cmd":"item","id":"EG.Buero.Status.Schlafen","val":0}'
    2017-01-04  23:32:13 DEBUG    Main         Triggering EG.Buero.Status.Schlafen-eval - by: Visu source: 192.168.10.131:57655 dest: None value: {'value': 0, 'dest': None, 'caller': 'Vi
    2017-01-04  23:32:13 INFO     EG.Buero.Status.Schlafen-eval Item EG.Buero.Status.Schlafen: evaluating value if sh.EG.Buero.Zentralbetrieb() == 1 else None returns None
    2017-01-04  23:32:15 DEBUG    Main         192.168.10.131:57655 sent '{"cmd":"item","id":"EG.Buero.Zentralbetrieb","val":1}'
    2017-01-04  23:32:15 DEBUG    Main         Item EG.Buero.Zentralbetrieb = True via Visu 192.168.10.131:57655 None
    2017-01-04  23:32:19 DEBUG    Main         192.168.10.131:57655 sent '{"cmd":"item","id":"EG.Buero.Status.Schlafen","val":1}'
    2017-01-04  23:32:19 DEBUG    Main         Triggering EG.Buero.Status.Schlafen-eval - by: Visu source: 192.168.10.131:57655 dest: None value: {'value': 1, 'dest': None, 'caller': 'Vi
    2017-01-04  23:32:19 DEBUG    EG.Buero.Status.Schlafen-eval Item EG.Buero.Status.Schlafen = True via Visu 192.168.10.131:57655 None
    2017-01-04  23:32:19 DEBUG    EG.Buero.Status.Schlafen-eval Triggering logic_zentral_schlafen - by: Item source: EG.Buero.Status.Schlafen dest: None value: True
    2017-01-04  23:32:19 DEBUG    EG.Buero.Status.Schlafen-eval Triggering EG.Buero.Rollo.Automatik.Rules - by: Visu source: 192.168.10.131:57655 dest: None value: {'value': True, 'source': 'EG.Buero.Stat
    2017-01-04  23:32:19 DEBUG    logic_zentral_schlafen Item EG.Zentral.Status.Schlafen = True via Logic None None
    Vielleicht kann mir da ja jemand helfen. Danke und Grüße
    Thomas

    #2
    Wie ist denn EG.Zentral.Status.Schlafen definiert?
    Ist dort evtl. enforce_updates gesetzt?
    Viele Grüße
    Martin

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

    Kommentar


      #3
      Hi, mach es doch andersrum:

      Code:
      eval = sh.EG.Zentral.Status.Schlafen()  if sh....Zentralbetrieb() else  value
      Das ist das, was du möchtest, dein eval_trigger sollte auch auf das Zentralbetrieb-Item gehen.

      Gruß Waldemar
      Zuletzt geändert von mumpf; 05.01.2017, 15:13.

      Kommentar


        #4
        Hallo Waldemar,

        super, vielen Dank, genau das hat mir noch gefehlt. (vorne fehlt noch ein "sh.", nur zur Dokumentation)
        Enforce_updates ist nicht gesetzt.

        Gruß Thomas

        Kommentar


          #5
          Hi Thomas,

          Danke für das Feedback, ich habe das sh ergänzt. Und in meiner Anmerkung meinte ich eval_trigger, nicht eval.

          Gruß Waldemar

          Kommentar


            #6
            Ich muss das Thema noch einmal rausholen. Irgendwie führt eval bei mir regelmäßig zu Hirnaushängern

            Gehört quasi zum Beispiel oben, jetzt nur aus Sicht des Zentralobjekts.
            - Zentral.Status.Schlafen überwacht mit eval_trigger alle lokalen Status.Schlafen Objekte
            - Zentral Objekt soll nur mitgenommen werden, wenn das Schwesterobjekt RaumX.Status.Zentralbetrieb des Triggers RaumX.Status.Schlafen = 1 ist. Sonst soll das Zentralitem unverändert bleiben

            Geht das auch mit einem eval und relativer Item Notation oder wird dafür eine Logik fällig?

            Code:
            EG:
            
                Zentral:
            
                    Status:
            
                        Schlafen:
                            type: bool
                            visu_acl: rw
                            knx_dpt: 1
                            knx_send: 0/2/13
                            knx_cache: 0/2/13
                            knx_reply: 0/2/13
                            eval: ???
                            eval_trigger: '*.Schlafen'

            Kommentar


              #7
              Klingt für mich nach einem Kandidaten für die neuen on_change / on_update mit anschließender IF-Abfrage ...
              /tom

              Kommentar


                #8
                Zitat von mumpf Beitrag anzeigen
                Hi, mach es doch andersrum:

                Code:
                eval = sh.EG.Zentral.Status.Schlafen() if sh....Zentralbetrieb() else value
                Das ist das, was du möchtest, dein eval_trigger sollte auch auf das Zentralbetrieb-Item gehen.

                Gruß Waldemar
                Hallo Waldemar,
                lässt sich denn die else Bedingung mit einem "nothing" abfangen? Dein Vorschlag funktioniert wunderbar solange ....Zentralbetrieb = 1 ist. Wenn aber nicht, wird natürlich immer der Wert des Triggeritems gesetzt. Wenn also ein anderer Raum das Zentralobjekt setzt, schlägt dieses trotzdem durch, obwohl Zentralbetrieb = 0 ist.

                Kommentar


                  #9
                  Hi Thomas,

                  ich kann nicht behaupten, dass ich Dein komplettes Problem verstehe, aber zu der unteren Frage kann ich was sagen:

                  Zitat von firefox Beitrag anzeigen
                  lässt sich denn die else Bedingung mit einem "nothing" abfangen?
                  Es muss "None" heißen (ist ja python). Was ich immer bei None unschön finde ist ein Warning, der dann im Log kommt. Stattdessen kann man self() verwenden, wobei ich nicht mehr die genaue Syntax mit self() und relativer Adressierung kenne, die steht aber in der Hilfe, irgendwas mit sh..self() oder so... das findest Du raus.

                  Der Unterschied ist, im None-Fall wird wirklich NICHTS gemacht, im self()-Fall wird nochmal der gleiche Wert des Items zugewiesen. Das macht einen Unterschied, falls das Item ein enforce_updates gesetzt hat.

                  Gruß, Waldemar

                  Kommentar


                    #10
                    Das mit dem Logeintrag bei 'None' sollte eigentlich raus sein, siehe hier.
                    /tom

                    Kommentar


                      #11
                      Hi Tom,

                      ist natürlich eine Verbesserung, aber nicht wenn man immer den DEBUG-Log an hat... Ich fände es besser, wenn das Literal "None" keine Meldung verursacht, wenn aber ein Ausdruck zu einem None evaluiert, dies dann gelogged wird (nur dann ist es interessant für den Verwender). Wenn ich None hinschreibe, weiß ich ja, was das Ergebnis sein soll...

                      Gruß, Waldemar

                      Kommentar

                      Lädt...
                      X