Ankündigung

Einklappen
Keine Ankündigung bisher.

Item-Wertänderungen zählen

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

    Item-Wertänderungen zählen

    Hallo,

    Kurzfassung: "Wie verhindere ich, dass ein eval_trigger beim Neustart von sh-ng ausgelöst wird?"

    ich habe einen S0 Stromzähler, der von einer Merten Tasterschnittstelle abgefragt wird.
    Diese hat einen Counter, der aber nur bis 65535 zählen kann. Danach fängt er wieder bei 0 an. Gleichzeitig sendet der Aktor einen Überlauf an einer zweiten GA, indem er deren Wert von True auf False ändert -oder umgekehrt.

    Deshalb habe ich folgendes Konstrukt gebaut um einen richtigen Zähler daraus zu machen:
    Code:
            Counter:
                name: Counter
                type: num
                cache: 'yes'
                sqlite: 'yes'
                knx_dpt: 7
                enforce_updates: 'yes'
                knx_listen: 6/7/1
    
            Ueberlauf:
                name: Counter
                type: bool
                sqlite: 'yes'
                knx_dpt: 1
                knx_cache: 6/7/0
    
            BisherigeUeberlaeufe:
                type: num
                eval: sh.Haustechnik.Stromzaehler.BisherigeUeberlaeufe() + 1
                eval_trigger: Haustechnik.Stromzaehler.Ueberlauf
                sqlite: 'yes'
    
            FinalerCounter:
                type: num
                eval: sh.Haustechnik.Stromzaehler.Counter()+65535*sh.Haustechnik.Stromzaehler.BisherigeUeberlaeufe()
                eval_trigger:
                  - Haustechnik.Stromzaehler.Counter
                  - Haustechnik.Stromzaehler.BisherigeUeberlaeufe
                sqlite: 'yes'
    Das funktioniert soweit auch gut.
    Allerdings wird "Bisherige Überläufe" bei jedem Neustart von sh.py um eins hochgezählt. Wie verhindere ich das?

    Gruß,
    Hendrik

    #2
    Was ist, wenn du beim Ueberlauf ein on_change machst anstatt des eval und eval_trigger? Dann würde wirklich nur bei einer Wertänderung hochgezählt werden und nicht bei jedem Trigger..?

    Kommentar


      #3
      Hallo,

      es war mir nicht mehr bewusst, dass es on_change gibt.
      Also so:
      Code:
              Ueberlauf:
                  name: Counter
                  type: bool
                  sqlite: 'yes'
                  knx_dpt: 1
                  knx_cache: 6/7/0
                  on_change: 
                    - ..BisherigeUeberlaeufe(..BisherigeUeberlaeufe()+1)
      richtig?

      Gruß,
      Hendrik

      Kommentar


        #4
        Hi Hendrik,

        das hört sich nach dem gleichen Problem wie hier https://knx-user-forum.de/forum/supp...r-bei-neustart an...

        Auch bei Dir wäre interessant, ob der Trigger auf "BisherigeUeberlaeufe" vom init oder von Ueberlauf kommt. Und ob es wirklich am sqlite-Plugin liegt, könntest Du austesten, indem Du mal sqlite: 'yes' auskommentierst/löschst.

        Wenn der Trigger unabhängig vom Plugin von shNG.py kommt, dann stimmt da was nicht bzw. dann sollte das korrigiert werden.

        Als Workaround fällt mir nur das ein, was ich schon im anderen Thread geschrieben habe: Dein eval durch eine Logik ersetzen, in der Du mit "if trigger['by'] == 'Item'" den init-Trigger überspringst.

        Zitat von Onkelandy Beitrag anzeigen
        Was ist, wenn du beim Ueberlauf ein on_change machst
        Das wird nicht helfen, da er ja kein enforce_updates hat und somit auch der Trigger nur bei einem change auslöst.

        Gruß, Waldemar
        OpenKNX www.openknx.de

        Kommentar


          #5
          Ah - ich hatte Onkelandy anders verstanden - das ist eine gute Idee!

          Du musst aber entweder
          Code:
              on_change:
                  - ..BisherigeUeberlaeufe = sh...BisherigeUeberlaeufe() + 1
          oder
          Code:
              on_change:
                  - sh...BisherigeUeberlaeufe(sh...BisherigeUeberlaeufe() + 1)
          machen.

          on_change/on_update gibt es erst ab shNG 1.4.

          Gruß, Waldemar

          OpenKNX www.openknx.de

          Kommentar


            #6
            Hallo,

            danke für deine Antwort.
            Ich habe sqlite auskommentiert.
            Jetzt ist der Wert natürlich nicht mehr ~200, sondern 1 (nicht 0!)
            Code:
             [TABLE]
             	 		[TR]
             			[TD]Update durch[/TD]
             			[TD]Init[/TD]
             		[/TR]
             		[TR]
             			[TD]Geändert durch[/TD]
             			[TD]Init[/TD]
             		[/TR]
             		[TR]
             			[TD]vorheriger Wert[/TD]
             			[TD]0[/TD]
             		[/TR]
             	 [/TABLE]
            Nächster Test:
            cache: 'yes'

            Wenn ich jetzt mal den Wert im Backend auf 30 setze, wird der Wert weiterhin nur hochgezählt:
            Code:
             [TABLE]
             	 		[TR]
             			[TD]Alter (Änderung)[/TD]
             			[TD]0.00 Sekunden[/TD]
             		[/TR]
             		[TR]
             			[TD]Update durch[/TD]
             			[TD]Backend[/TD]
             		[/TR]
             		[TR]
             			[TD]Geändert durch[/TD]
             			[TD]Backend[/TD]
             		[/TR]
             		[TR]
             			[TD]vorheriger Wert[/TD]
             			[TD]3[/TD]
             		[/TR]
             	 [/TABLE]
            Aber auch mit Cache=yes wird beim Neustart hochgezählt.


            Das wird nicht helfen, da er ja kein enforce_updates hat und somit auch der Trigger nur bei einem change auslöst.
            Aber genau das will ich doch!

            Gruß,
            Hendrik
            Zuletzt geändert von henfri; 07.10.2018, 15:20.

            Kommentar


              #7
              Hi Hendrik,

              da ohne sqlite das Item auch getriggert wird, scheint das wirklich von shNG zu kommen. Warum beim Start scheinbar jedes Item einmal vom Init getriggert wird, kann vielleicht Msinn beantworten. Ich finde das nicht erwartungskonform.

              Zitat von henfri Beitrag anzeigen
              Ich habe sqlite auskommentiert.
              Jetzt ist der Wert natürlich nicht mehr ~200, sondern 1 (nicht 0!)
              Das war natürlich nur zum testen, ich hoffe Du hast es inzwischen wieder drin...

              Zitat von henfri Beitrag anzeigen
              Nächster Test:
              cache: 'yes'
              Wenn Du sqlite bereits hast, macht cache eigentlich keinen Sinn mehr, da ja das Item sowieso von sqlite mit dem letzten Wert initialisiert wird.

              Zitat von henfri Beitrag anzeigen
              Wenn ich jetzt mal den Wert im Backend auf 30 setze, wird der Wert weiterhin nur hochgezählt:
              Das ist klar! Dein eval bestimmt den neuen Wert, der ist immer +1 des alten. Setzen kannst Du da nichts.

              Zitat von henfri Beitrag anzeigen
              Aber genau das will ich doch!
              Wie oben beschrieben, habe ich Onkelandy falsch verstanden - seine Idee ist gut!

              Gruß, Waldemar

              OpenKNX www.openknx.de

              Kommentar


                #8
                Ok, danke.


                Ich habe hier einen Issue aufgemacht.

                Klar, sqlite ist wieder drin. Cache hatte ich als Alternative zu sqlite getestet (um zu testen, ob der Wert einen Neustart überlebt, aber ohne das sqlite plugin).

                Gruß,
                Hendrik

                Kommentar

                Lädt...
                X