Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem mit "on_change" und timer()

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

    Problem mit "on_change" und timer()

    Hallo an alle,

    nachdem ich selber nun nicht mehr weiter weiß:

    Ich benutzte das letzte PI-Image mit Buster und wollte ein Item verzögert schalten lassen.
    Im Wiki hab ich auch dazu was gefunden und umgesetzt:

    Code:
    wozi:
        fensterkontakte:
            erkertuer:
                name: Erkertür Wohnzimmer
                struct: knx_bool
                knx_cache: 0/3/10
                enforce_updates: true
    
                on_change: sh..t_on.timer(120,1) if value else sh..t_on.timer(0,0)
    
                t_on:
                    type: bool
    Im Struct "knx_bool" ist noch hinterlegt, dass es ein boolscher Wert ist und der Datentyp.

    Im Log entsteht dann folgender Fehler:

    Item wozi.fensterkontakte.erkertuer: 'On_Change' item-value='False' problem evaluating sh.wozi.fensterkontakte.erkertuer.t_on.timer(120,1 ) if value else sh.wozi.fensterkontakte.erkertuer.t_on.timer(0,0, caller='On_Change', source='wozi.fensterkontakte.erkertuer'): timer() got an unexpected keyword argument 'caller'

    Das sieht so aus, als fehlt die zweite Klammer bei "timer(0,0)"

    Wo ist mein Fehler?

    Grüße
    Pierre
    Zuletzt geändert von Pigaro; 07.01.2022, 20:20.

    #2
    Diese Syntax ist von on_change nicht unterstützt. Aktuell zumindest.
    Fixen kannst du es vorerst selbst einfach, indem du im lib/item/item.py bei def timer (Zeile 1560 oder so?) ein caller=None mit in die Klammer setzt.
    Alternativ müsstest du dir mit Hilfsitems helfen, zB ein Item mit eval_trigger: wozi.fensterkontakte.erkertuer und eval mit dem Timer auf das andere Item

    Kommentar


      #3
      Danke für die schnelle Antwort.

      Ist so aber beschrieben:
      "https://www.smarthomeng.de/user/beispiele/eval.html" unter "Item mit verzögertem Status".

      Ich werde es mit Hilfsitems versuchen.

      Danke, mal sehen ob es klappt.

      Kommentar


        #4
        So funktioniert es. Danke

        Code:
                
                fenster:
                    name: Fenster Wohnzimmer
                    struct: knx_bool
                    knx_cache: 0/3/12
                    enforce_updates: true
        
                    on_change: sh..t_on.timer(60,1) if sh..() else sh..t_on(0)
                    t_on:
                        type: bool
                        eval: value if sh...() else 0

        Kommentar


          #5
          Zitat von Onkelandy Beitrag anzeigen
          Diese Syntax ist von on_change nicht unterstützt. Aktuell zumindest.
          Fixen kannst du es vorerst selbst einfach, indem du im lib/item/item.py bei def timer (Zeile 1560 oder so?) ein caller=None mit in die Klammer setzt.
          Alternativ müsstest du dir mit Hilfsitems helfen, zB ein Item mit eval_trigger: wozi.fensterkontakte.erkertuer und eval mit dem Timer auf das andere Item
          bin auch in den "Fehler" wie im Wiki beschrieben reingerannt, danke für die Lösung.

          Kommentar


            #6
            Ist im develop inzwischen gefixt, siehe Zeile 1648 https://github.com/smarthomeNG/smart...b/item/item.py

            Beim Release 1.9.1, das sicher nicht mehr ewig auf sich warten lässt, wird das dann also out of the box klappen.

            Kommentar


              #7
              In dem Zusammenhang ist mir noch was im Verhalten von "enforce_updates" zusammen mit "on_change" aufgefallen.

              Hat ein Item "enforce_updates = yes" dann wird auch OHNE Wertänderung "on_change" getriggert.

              Das sollte meiner Meinung nach aber nicht passieren, denn dafür gibt es ja "enforce_change".

              Ich hab das bei mir in der "item.py" gefixt (Zeile 1495):

              Code:
                          # ms: call run_on_change() from here - after eval is run
              #            self.__run_on_change(value)                                    # PGA
                          if _changed or self._type == 'scene':                           # PGA neu hinzu
                          self.__run_on_change(value)                                      # PGA
              Vielleicht kann das im nächsten Release integriert werden?

              Kommentar


                #8
                Das wird hier im letzten Satz auch so beschrieben: https://www.smarthomeng.de/user/refe...nforce_updates
                Das ist vermutlich Ansichtssache.. enforce_change ist eigentlich bisschen anders, siehe hier: https://www.smarthomeng.de/user/refe...enforce_change

                Da geht es also nicht darum, dass ein on_change forciert wird, sondern das Item selbst so verändert wird, dass es eben als Change erkannt wird.

                Du müsstest das Problem daher wohl eher über eine eval expression im on_change "fixen", im Sinne, wenn der Wert anders ist als zuvor, soll das andere Item was machen und sonst eben nicht.

                So hab das zumindest ich verstanden..

                Kommentar


                  #9
                  Aber genau der Unterschied bei enforce_change, "changed_by etc werden geschrieben" passiert eben ohne meine Änderung auch bei enforce_updates.
                  Es besteht kein Unterschied (steht so im Code )

                  Kommentar


                    #10
                    Doch, der Unterschied bezieht sich aber nur aufs Item selbst und nicht auf on_update oder on_change.
                    Es geht um diese Zeile in item.py: if value != self._value or self._enforce_change

                    Kommentar


                      #11
                      Ok, dass meinte ich ja auch gar nicht.

                      Mir ging es um die beiden Item-Methoden "on_update" und "on_change":

                      Die unterscheiden sich eben nicht, sondern werden immer gemeinsam getriggert (Funktionen "__run_on_change" und "__run_on_update")
                      sobald "enforce_updates" ODER "enforce_change" aktiv sind.

                      Ist für mich nicht ganz klar getrennt, deshalb meine Änderung.

                      Ist aber "meckern auf hohem Niveau" .

                      Die Projekte SmartHomeNG und SmartVisu sind echt mega!
                      Danke dafür.

                      Grüße

                      Kommentar


                        #12
                        Wir drehen uns im Kreis..
                        Ja, on_update oder on_change werden identisch von enforce_updates und enforce_change beeinflusst. Das war wohl eine bewusste Entscheidung vor einiger Zeit. Der Unterschied zwischen den beiden wirkt sich eben nur auf das Item selbst, das geändert wurde, aus.

                        Ich hatte übrigens vor einiger Zeit die gleiche Ansicht wie du. Essenz der Diskussion war, dass es so bleiben sollte wie es jetzt ist. Ich würde daher nicht auf deine Änderung bauen, da du die dann bei jedem Update zerschießt. Ich würde eher auf einen eval Ausdruck setzen, der unterscheidet, ob das Item den gleichen Wert wie vorher hat (update) oder nicht (change).

                        Kommentar


                          #13
                          Na gut.
                          Dann werde ich das mal noch ändern.
                          Wie müsste das dann aussehen?

                          ... if value != last_value() else None
                          oder so ähnlich?

                          Ist das dann mit weiteren Conditions mit AND verknüpfbar?
                          Hab nämlich schon in dem "on_change" eine if- Condition.
                          Zuletzt geändert von Pigaro; 13.02.2022, 12:22.

                          Kommentar


                            #14
                            Klar, kannst du verknüpfen mit (..and ..) else..
                            if value not sh..self.property.last_value müsste gehen.
                            Gerne Ergebnis hier kurz melden.

                            Kommentar


                              #15
                              Werde es probieren, dauert aber (Urlaub)

                              Kommentar

                              Lädt...
                              X