Ankündigung

Einklappen
Keine Ankündigung bisher.

Wie kann ich einem Item per autotimer zyklisch den gleichen Wert wieder zuweisen?

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

    Wie kann ich einem Item per autotimer zyklisch den gleichen Wert wieder zuweisen?

    Hallo,

    ich möchte einem boolschen Item zyklisch den gleichen Wert wieder zuweisen. Damit möchte ich zyklisch den Status des Items in die sql Datenbank eintragen.
    Meine Idee ist folgende:

    Code:
    [onewire]
        [[test]]
            type = bool
            eval = sh.onewire.test.value()
            autotimer = 1m
            enforce_updates = yes
            [[[teststunden]]]
                type = num
                visu = yes
                visu_acl = ro
                sqlite = yes
                eval = sh.onewire.test.teststunden() + int(sh.onewire.test.prev_value()) * sh.onewire.test.prev_age()
                eval_trigger = onewire.test
    Dabei ist Test das Item, dessen Wert zyklisch wieder zugewiesen werden soll (später kommt hier noch die eigentliche KNX-Adresse hinzu). Die Teststunden werten dann die Einschaltdauer aus.

    Leider klappt die zyklische Zuweisung des gleichen Wertes nicht.
    Wer kann helfen?
    DANKE

    #2
    Hallo,

    reicht das nicht, wenn du am Test-Item statt "autotimer" "cycle = 60" dranschreibst. Durch das "enforce-updates" müsste doch dann das Item bei jedem Aufruf geschrieben werden. Habs jetzt nicht ausprobiert...

    Kommentar


      #3
      Autotimer tut per Definition nicht, was Du errichen willst. Du müsstest cycle verwenden. Die Verwendung und der Syntax sind im Wiki beschrieben: https://github.com/smarthomeNG/smart...attribut-cycle
      Viele Grüße
      Martin

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

      Kommentar


        #4
        Vielleicht cycle =1 und eval= not sh.onewire.test.teststunden

        Kommentar


          #5
          Msinn
          Bonze

          Ok, danke. Ich habe das nun in meine Testumgebung ausgelagert und mit cylce versucht. Der Code sieht so aus:
          Code:
          [test]    
              [[impuls]]
                  type = bool
                  enforce_updates = true
              [[zyklus]]
                  type = bool
                  eval = int(sh.test.impuls())
                  eval_trigger = test.impuls
                  cycle = 10s
                  enforce_updates = true
                  [[[teststunden]]]
                      type = num
                      cache = yes
                      eval = sh.test.zyklus.teststunden() + int(sh.test.zyklus.prev_value()) * sh.test.zyklus.prev_age()
                      eval_trigger = test.zyklus
          test.zyklus soll also bei Änderung von test.impuls (eval_trigger) und zyklisch alle 10s (cycle = 10s) berechnet werden. Aus dem Alter und dem Wert von test.zyklus wird dann die Einschaltzeit berechnet.

          Das zyklische Aufrufen des Eval durch cycle funktioniert leider nicht. (werde in meiner Testumgebung shng 1.4 noch in meiner Produktivumgebung shng 1.2).
          Kann jemand noch helfen?

          Hab nochmal im debug-modus geschaut. Da steht:
          Code:
          2017-06-03  10:06:21 DEBUG    test.zyklus  Triggering test.zyklus-eval - by: Scheduler source: None dest: None value: {'dest': None, 'value': '', 'caller': 'S
          ​​​​​​​Was bedeutet das?
          Zuletzt geändert von Sisamiwe; 03.06.2017, 09:08.

          Kommentar


            #6
            Einfach im Wiki lesen. Geht ohne ecel nur mit cycle.
            Viele Grüße
            Martin

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

            Kommentar


              #7
              Msinn
              ​​​​​​​Das Wiki habe ich mehrfach gelesen, werden aber nicht zwingend schlau daraus.
              Gehört das cycle dann in das Eltern item?
              Code:
              [test]    
                  [[impuls]]
                      type = bool
                      cycle = 10
                      enforce_updates = true
                  [[zyklus]]
                      type = bool
                      eval = sh.test.impuls() * 1
                      eval_trigger = test.impuls
                      enforce_updates = true
                      [[[teststunden]]]
                          type = num
                          cache = yes
                          eval = sh.test.zyklus.teststunden() + int(sh.test.zyklus.prev_value()) * sh.test.zyklus.prev_age()
                          eval_trigger = test.zyklus

              Kommentar


                #8
                Zitat aus dem Wiki:

                Code:
                [item]
                    type = num
                    cycle = 10 = 0
                #    enforce_updates = true
                setzt alle 10 Sekunden den Wert des Items auf 0. Wenn mit diesem Item Logiken und/oder Eval-Funktionen verknüpft sind, muss enforce_updates auf true stehen, damit das Triggern erfolgt, auch wenn sich der Wert des Items nicht ändert.




                Ist daran etwas unverständlich?
                Viele Grüße
                Martin

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

                Kommentar


                  #9
                  Msinn Sorry, daran ist nicht unverständlich, es passt aber (glaube ich) nicht zu meinem Anwendungsfall.
                  Ich versuche meinen Anwendungsfall nochmal zu schildern.

                  Ich habe ein boolsches Item (test.impuls im CODE oben). Dieses wird nur in sehr langen Intervallen über eine knx-nachricht verändert (hier noch nicht integriert). Ich möchte von diesem boolschen Item die Einschaltzeit errechnen. Dies möchte ich mit einem Zeitcounter dem Item test.zyklus.teststunden mittels prev_value und prev_age machen (funktioniert auch schon).
                  Da das "Eingangs-Item" (test.impuls) nur in langen Intervallen kommt und das bei der Berechnung zu einer Verfälschung der Einschaltdauer führt, möchte ich über ein "Hilfs-Item" (test.zyklus) gehen. Dieses Hilfsitem (test.zyklus) soll zyklisch und direkt bei Änderung den Wert von Eingangs-Item (test.impuls) zugewiesen bekommen.

                  Vielleicht denke ich ja auch nur zu kompliziert?:

                  Kommentar


                    #10
                    Doch, Du wolltest ein Item, dass zyklisch einen Wert zugewiesen bekommt. Übertragen auf die Config aus Deinem ersten Post:

                    Code:
                    [onewire]
                        [[test]]
                            type = bool                      # type ist eigentlich egal, muss nur definiert sein
                            cycle = 60                       # Wert alle 60 Sek. (2. '=' mit folg. Wert kann entfallen, da er nicht genutzt wird)
                            enforce_updates = true      # Wichtig, damit der Trigger in teststunden jedes mal ausgelöst wird
                    
                            [[[teststunden]]]
                    
                                ...
                    Viele Grüße
                    Martin

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

                    Kommentar

                    Lädt...
                    X