Ankündigung

Einklappen
Keine Ankündigung bisher.

Item.Eval bei Init-Vorgang nicht ausführen

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

    Item.Eval bei Init-Vorgang nicht ausführen

    Hallo zusammen,

    ich suche eine Lösung, um die Eval-Logik eines Items während des Init-Vorgangs nicht auszuführen.

    Der Eval-Ausdruck baut auf ein Item, das vom KNX gelesen wird. Während der Initialisierungsphase, in der das KNX-Item noch nicht vom Bus gelesen wurde, darf der Eval-Ausdruck nicht ausgewertet werden. Ansonsten wird ein falscher Wert berechnet.

    Ich möchte ungern den Wert des KNX-Items cachen oder gar in die DB schreiben, nur um während der Initialisierung bereits einen Wert zur Verfügung zu haben. Das Lesen vom Bus wäre eigentlich schnell genug.

    Gibt es eine Möglichkeit, meinen Wunsch mit sh.py umzusetzen?

    [meter]]
    [[gas]]
    type = num
    visu_acl = ro
    knx_dpt = 12
    knx_listen = 5/1/100
    knx_init = 5/1/100
    [[[reading]]]
    type = num
    visu_acl = ro
    eval = (sh.meter.gas() * 0.01) + 1405.95
    eval_trigger = meter.gas
    sqlite = init


    #2
    Hallo CodeRed,

    ich meine das sollte gehen wenn Du sqlite=yes statt sqlite=init verwendest.

    Viele Grüße,

    Jan

    Kommentar


      #3
      Würde auch sagen es funzt mit sqlite = yes.
      Wozu brauchst du hier eigentlich eval_trigger? Kann man das in dem Fall nicht weglassen und die Zeile darüber heißt dann nur eval = (value * 0.01) + 1405.95 ?

      Kommentar


        #4
        Laut Debug-Log scheint das Problem nicht die SQLite zu sein. Zunächst wird der Wert des Items über die SQLite sogar richtig initialisiert. Im Anschluss wird allerdings das eval Statement ausgeführt, wodurch der Wert wieder überschrieben wird.

        Ich verwende die aktuelle Develop-Version. Bei einem Blick auf das SQLite-Plugin habe ich festgestellt, dass es dort die Unterscheidung von sqlite = yes/init gar nicht mehr gibt. Die alten Werte werden immer hergestellt.

        eval_trigger benötige ich, da ich den tatsächlichen Zählerstand bei jeder Aktualisierung des KNX-Items meter.gas neu berechnen muss.

        Kommentar


          #5
          Hi,

          Du kannst so was machen (vor allem, wenn wirklich der korrekte Wert zuerst hergestellt wurde):
          Code:
          [meter]]
          [[gas]]
          type = num
          visu_acl = ro
          knx_dpt = 12
          [B]value = 654321     # irgendein Wert, der im Normalbetrieb nicht vorkommen kann[/B]
          knx_listen = 5/1/100
          knx_init = 5/1/100
          [[[reading]]]
          type = num
          visu_acl = ro
          [B]eval = (sh.meter.gas() * 0.01) + 1405.95 if sh.meter.gas() != 654321 else sh.meter.gas.reading()[/B]
          eval_trigger = meter.gas
          sqlite = init
          Beim init wird gas mit dem "magic value" initialisiert, was dazu führt, dass der eval erstmal den alten Wert behält.

          Gruß, Waldemar
          OpenKNX www.openknx.de

          Kommentar


            #6
            Zitat von CodeRed Beitrag anzeigen
            eval_trigger benötige ich, da ich den tatsächlichen Zählerstand bei jeder Aktualisierung des KNX-Items meter.gas neu berechnen muss.
            Bei mir funktioniert sowas ohne trigger. Rechne auch einen Zählerstand (S0 über Binäreingang) um und sobald das Telegramm gesendet wird erscheint der neue Wert auch sofort in der Visu. eval wird doch ausgeführt sobald sich der Wert des Items ändert.
            Ist zwar jetzt etwas OT und eigentlich auch egal, da offenbar beides klappt. Interessiert mich nur...

            Kommentar


              #7
              +1 für das eval direkt bei meter.gas. Das klappt.

              eval = (value * 0.01) + 1405.95

              Das ist am einfachsten.

              Bis bald

              Marcus

              Kommentar

              Lädt...
              X