Ankündigung

Einklappen
Keine Ankündigung bisher.

on_change

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

    on_change

    Hi,

    Ich hätte gerne, dass folgendes Item nur dann getriggert wird wenn sich der Wert auch wirklich ändert. (0 auf 1 oder 1 auf 0)
    Wie muss hier die das Attribut "on_change" genau eingesetzt werden?

    Code:
    WS:
        KWL0:
            type: bool
            eval: 1 if ((sh.LWZ.roomTempRC() - sh.WS.Temperatur()) < 1) else 0
            eval_trigger:
              - LWZ.roomTempRC
              - WS.Temperatur
            enforce_updates: 'true'
            cache: 'True'
            on_change: ????
    Hab SHNG 1.5.1 im Einsatz.

    #2
    Guckst Du Doku.
    /tom

    Kommentar


      #3
      die hab ich schon gelesen und ich denke dass "on_change" der falsche Einsatzzweck ist.
      Ich denke ich werde ein Hilfsitem dafür verwenden.
      Kann das so klappen um das Hilfsitem "Active" nur dann zu aktualisieren wenn sich das KWL0 Item von 0 auf 1 oder umgekehrt ändert?

      vorallem bei "= value" bin ich mir unsicher.....

      Code:
      WS:
          KWL0:
              type: bool
              eval: 1 if ((sh.LWZ.roomTempRC() - sh.WS.Temperatur()) < 1) else 0
              eval_trigger:
                - LWZ.roomTempRC
                - WS.Temperatur
              enforce_updates: 'true'
              cache: 'True'
              on_change: WS.KWL0.Active = value
              Active:
                  type: bool
                  cache: 'True'
                  enforce_updates: 'true'

      Kommentar


        #4
        Hi,

        mir ist nicht wirklich klar, was Du willst. Mit:
        Code:
        WS:
            KWL0:
                type: bool
                eval: 1 if ((sh.LWZ.roomTempRC() - sh.WS.Temperatur()) < 1) else 0
                eval_trigger:
                  - LWZ.roomTempRC
                  - WS.Temperatur
                cache: 'True'
        nimmt KWL0 die Werte true und false an und triggert abhängige Items nur, wenn sich der Wert ändert. Insofern brauchst Du kein on_change.
        Wenn Du bei dem Wechsel ein anderes Item noch aktualisieren möchtest, dann kannst Du bei dem Zielitem ein eval_trigger: WS.KWL0 machen oder ein on_change auf das Zielitem. Die von Dir genutzte Syntax sollte so stimmen. Im Zweifelsfall: Probier es einfach aus...

        Gruß, Waldemar

        OpenKNX www.openknx.de

        Kommentar


          #5
          Zitat von mumpf Beitrag anzeigen
          Hi,

          mir ist nicht wirklich klar, was Du willst.
          KWL0 berechnet ein Temperatur Delta und wird daher durch zwei Tempwerte getriggert. Dadurch wird KWL0 auch regelmässig getriggert obwohl sich der Wert zb. gar nicht von 0 auf 1 ändert.
          Mit dem Hilfsitem und dem Attribut "on_change" sollte doch genau das unterbunden werden. Es sollte dann auch nur dann aktualisiert werden wenn sich der Wert des Items auch wirklich ändert und von 0 auf 1 oder 1 auf 0 springt.
          Sollte dann nicht auch das Alter von "Active" deutlich höher sein als das von "KWL0"?

          Oder bin ich hier komplett auf dem Holzweg?

          P.S.: Eigentlich müsste in diesem Fall "enforce_updates: 'true'" raus aus dem Item, oder?
          Zuletzt geändert von fuxl66; 16.08.2018, 08:13.

          Kommentar


            #6
            Hi,

            wenn es Dir auf das Alter von KWL0 ankommt, müsstest Du einfach nur last_change() auswerten. Das beinhaltet das Alter seit der letzten Änderung. In Deinem Fall würden sich dann last_change() und last_update() von KWL0 und Active unterscheiden. Worauf kommt es Dir an bzw. was willst Du erreichen?

            Gruß, Waldemar
            OpenKNX www.openknx.de

            Kommentar


              #7
              Zitat von mumpf Beitrag anzeigen
              was willst Du erreichen?
              Ich will das "Active" Item nutzen um eine Logik zu triggern. Das Item soll sich nur dann aktualisiert werden wenn sich der Wert auch wirklich von 0 auf 1 oder umgekehrt ändert.

              aktuell verwende ich dafür das KWL0 item welches regelmässig von den beiden Temp items getriggert wird und dadurch meine Logik triggern und telegram messages pushen obwohl sich der Wert nicht von 0 auf 1 oder umgekehrt geändert hat.

              gibt es dafür eine Lösung?

              Kommentar


                #8
                Zitat von fuxl66 Beitrag anzeigen
                gibt es dafür eine Lösung?
                Ja, kein enforce_updates!

                Gruß, Waldemar
                OpenKNX www.openknx.de

                Kommentar


                  #9
                  Ich versuche on_change nun in einem anderen Item zu verwenden:

                  Code:
                  LWZ:
                      KWLTimeNight:
                          name: KWL Programm Tag 5 - 18 Uhr
                          type: bool
                          knx_dpt: 1
                          visu_acl: rw
                          enforce_updates: 'true'
                          cache: 'True'
                          eval: 0 if sh.hour.since.midnight() > 4 and sh.hour.since.midnight() < 18 else 1
                          eval_trigger: hour.since.midnight
                          on_change:
                              - LWZ.p08FanStageNight() = LWZ.p07FanStageDay() if LWZ.KWLTimeNight() == 1 else LWZ.p07FanStageDay() = LWZ.p08FanStageNight()
                              - LWZ.p07FanStageDay() = 0 if LWZ.KWLTimeNight() == 1 else LWZ.p08FanStageNight() = 0
                  Dazu bekomme ich folgenden Eintrag im LOG:
                  Code:
                  2018-09-03  10:25:33 INFO     LWZ.KWLTimeNight Item LWZ.KWLTimeNight: 'on_change' evaluating LWZ.p08FanStageNight() = LWZ.p07FanStageDay() if LWZ.KWLTimeNight() == 1 else LWZ.p07FanStageDay() = LWZ.p08FanStageNight()
                  2018-09-03  10:25:33 WARNING  LWZ.KWLTimeNight Item LWZ.KWLTimeNight: 'on_change' item-value='False' problem evaluating LWZ.p07FanStageDay() if LWZ.KWLTimeNight() == 1 else LWZ.p07FanStageDay() = LWZ.p08FanStageNight(): invalid syntax (<string>, line 1)
                  2018-09-03  10:25:33 INFO     LWZ.KWLTimeNight Item LWZ.KWLTimeNight: 'on_change' evaluating LWZ.p07FanStageDay() = 0 if LWZ.KWLTimeNight() == 1 else LWZ.p08FanStageNight() = 0
                  2018-09-03  10:25:33 WARNING  LWZ.KWLTimeNight Item LWZ.KWLTimeNight: 'on_change' item-value='False' problem evaluating 0 if LWZ.KWLTimeNight() == 1 else LWZ.p08FanStageNight() = 0: invalid syntax (<string>, line 1)
                  hatte es auch schon mit sh. vor den items versucht. gleiches Ergebnis.
                  Wo liegt der Fehler?

                  Kommentar


                    #10
                    Zitat von fuxl66 Beitrag anzeigen
                    Wo liegt der Fehler?
                    Hi,

                    an der Syntax und daran, wie Du es machen willst! Du hast nicht verstanden, wie on_change und eval funktionieren, der Ausdruck geht so logisch nicht!

                    Erstmal on_change: Der Teil vor dem Gleichzeichen gibt ein Item an, dass den Wert rechts vom Gleichzeichen zugewiesen bekommt. Da braucht es dann kein sh. (korrekt) und keine Klammern (inkorrekt), es ist ja durch die Syntax spezifiziert, dass es ein Item ist.

                    Jetzt zum eval: Alles hinter dem Gleichzeichen muss durch ein eval auszuwerten sein. Hier muss also ein Ausdruck stehen, der einen Wert ergibt. Bei Deinem ersten Eintrag
                    Code:
                        - LWZ.p08FanStageNight = LWZ.p07FanStageDay() if LWZ.KWLTimeNight() == 1 else LWZ.p07FanStageDay() = LWZ.p08FanStageNight()
                    ist dies nicht der Fall, denn der Teil rechts vom Gleichzeichen kann nicht ausgewertet werden (abgesehen davon, dass da die sh. fehlen):
                    Code:
                        [COLOR=#FF0000]sh.[/COLOR]LWZ.p07FanStageDay() if [COLOR=#FF0000]sh.[/COLOR]LWZ.KWLTimeNight() == 1 else [COLOR=#FF0000]sh.LWZ.p07FanStageDay() = sh.LWZ.p08FanStageNight()[/COLOR]
                    Das if, dass Du hier verwendest, repräsentiert eine Funktion! Es muss immer einen Wert liefern! Einfaches Beispiel
                    Code:
                        5 if sh.LWZ.KWLTimeNight() == 1 else 2
                    liefert eine 5 wenn LWZ.KWLTimeNight() den Wert 1 hat, sonst liefert es eine 2. Egal ob 5 oder 2 geliefert werden, das Ergebnis wird dem Item links vom Gleichzeichen zugewiesen. Wenn Du statt der 5 oder der 2 ein Item schreiben willst, dann kannst Du das in der Form sh.<itemname>(), immer mit sh. vorweg und mit () am Ende. Eine Zuweisung hinter dem else ist aber auf keinen Fall möglich.

                    Jetzt kommt noch das logische Problem (wenn man betrachtet, was Du eigentlich möchtest), dass der else-Fall in der ersten Zeile Sinnlos ist, da die Zuweisung in der 2. Zeile gleich überschrieben wird. Aber so, wie ich das verstehe, willst Du
                    • LWZ.p08FanStageNight auf den Wert von LWZ.p07FanStageDay setzen, wenn es Nacht ist, sonst auf 0
                    • LWZ.p07FanStageDay auf den Wert 0 setzen, wenn es Nacht ist
                    Syntaktisch korrekt wäre das dann folgendermaßen:
                    Code:
                        - LWZ.p08FanStageNight = sh.LWZ.p07FanStageDay() if sh.LWZ.KWLTimeNight() == 1 else 0
                        - LWZ.p07FanStageDay = 0 if sh.LWZ.KWLTimeNight() == 1 else sh.LWZ.p07FanStageDay()
                    Hoffe, die Erklärung hilft Dir, das gewünschte zu realisieren.

                    Gruß, Waldemar
                    OpenKNX www.openknx.de

                    Kommentar


                      #11
                      Zitat von mumpf Beitrag anzeigen

                      Hoffe, die Erklärung hilft Dir, das gewünschte zu realisieren.
                      Vielen Dank für deine detailierte Antwort. Klappt nun soweit.

                      Kommentar


                        #12
                        Freut mich!

                        Gruß, Waldemar
                        OpenKNX www.openknx.de

                        Kommentar

                        Lädt...
                        X