Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem (Bug?) mit value in eval

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

    Problem (Bug?) mit value in eval

    Hallo,

    ich hatte im Chat schon dieses Problem angesprochen.
    Im eval bekommt "value" manchmal den Wert des Trigger-Items.
    Hier erstmal die Items:

    Code:
    Haustechnik:
        UVR:
            WMZ_SOLAR_Kilowattstunden:
                type: num
                database: 'init'
                influx: true
                eval: sh..logic_value()+sh..ueberlauf_counter()*1000
                eval_trigger: .logic_value
    
                logic_value:
                    type: num
                    UVRstring: 'WMZ SOLAR Kilowattstunden (Zähler)'
                    database: 'init'
                    enforce_updates: True
                    influx: True
    
                ueberlauf_counter:
                    type: num
                    database: 'init'
                    eval: value if (sh...logic_value.prev_value() < sh...logic_value()) else value+1
                    eval_trigger: ..logic_value
    Das Problem kann so gut gezeigt werden:
    Code:
    from time import sleep
    sh.Haustechnik.UVR.WMZ_SOLAR_Kilowattstunden.logic_value(1)
    sleep(2)
    
    sh.Haustechnik.UVR.WMZ_SOLAR_Kilowattstunden.ueberlauf_counter(1)
    sh.Haustechnik.UVR.WMZ_SOLAR_Kilowattstunden.logic_value(1)
    print("Ueberlauf Counter und logic value:")
    print(sh.Haustechnik.UVR.WMZ_SOLAR_Kilowattstunden.ueberlauf_counter())
    print(sh.Haustechnik.UVR.WMZ_SOLAR_Kilowattstunden.logic_value())
    
    sh.Haustechnik.UVR.WMZ_SOLAR_Kilowattstunden.logic_value(2)
    sh.Haustechnik.UVR.WMZ_SOLAR_Kilowattstunden.logic_value(1000)
    print("logic_value und previous:")
    print(sh.Haustechnik.UVR.WMZ_SOLAR_Kilowattstunden.logic_value())
    print(sh.Haustechnik.UVR.WMZ_SOLAR_Kilowattstunden.logic_value.prev_value())
    print("Ueberlauf Counter:")
    print(sh.Haustechnik.UVR.WMZ_SOLAR_Kilowattstunden.ueberlauf_counter())
    Das führt zu:
    Code:
    Ueberlauf Counter und logic value:
    2
    1
    
    logic_value und previous:
    1000
    2
    Ueberlauf Counter:
    1000
    Woran kann das liegen? Mache ich einen Fehler, oder ist es ein Bug?

    Gruß,
    Hendrik
    Zuletzt geändert von bmx; 03.11.2020, 20:02.

    #2
    Hallo,

    hat keiner eine Idee?

    Gruß,
    Hendrik

    Kommentar


      #3
      Du setzt mit sh.Haustechnik.UVR.WMZ_SOLAR_Kilowattstunden.logic _value(1000) den Wert von logic_value auf 1000. Dadurch triggerst Du alle verbundenen Items mit der Information value=1000

      Für den Fall des Items Ueberlauf_Counter wird in diesem Item das eval: value if (sh...logic_value.prev_value() < sh...logic_value()) else value+1 ausgeführt mit dem Wert value=1000

      Spiel einfach mal mit folgendem einfachen Beispiel:

      Code:
      Adam:
          type: num
          eval: value+1
          eval_trigger: .Eva
          Eva:
              type: num
      Setze mal im Admininterface Eva auf unterschiedliche Werte und schaue dir an, was bei Adam rauskommt. Wenn Du Adam änderst, dann immer der über das Admin Interface eingegebene Wert + 1

      Wenn Du Eva änderst, dann immer der Wert, den Eva hat um eins erhöht.
      Zuletzt geändert von bmx; 03.11.2020, 20:51.

      Kommentar


        #4
        Gutes Beispiel - war mir in der Form ehrlich gesagt auch nicht klar und könnte in der Doku noch ein bisschen klarer raus gestellt werden, nicht?
        https://www.smarthomeng.de/user/konf...bute/eval.html

        Weiß noch nicht genau, wo und wie es am meisten Sinn macht.. vielleicht hier in der Tabelle?
        Weiter ist es möglich, direkt die Werte der eval_trigger im eval entsprechend auszuwerten:
        Und dann als erster Eintrag value: übernimmt den Wert des zuletzt aktivierten eval_trigger Items (oder so..?)

        Und darunter bei den avg und or Beispiel das Adam und Eva samt Erklärung, was meint ihr?

        Kommentar


          #5
          Hallo,

          ich muss hierauf nochmal zurückkommen.
          Ich bin total verwirrt, weil ich bisher immer dachte, dass "value" den Wert des Items in dem das Eval steht (also Adam in diesem Beispiel) beinhaltet. Ich habe auch noch mal in der Doku geschaut und es geht daraus nicht wirklich vor, was "value" ist (nur in welcher Reihenfolge geändert wird).

          Wie kann ich denn auf den Wert des Items von "Adam" zugreiven?

          Der Usecase ist noch immer der gleiche:
          Ich habe ein externes Gerät, welches nur bis "X" zählen kann. Danach fängt es wieder bei 0 an.
          Ich speichere also den Wert in einem Hilfseitem. Und wenn dieser Wert jemals kleiner wird, muss das Gerät bei 0 wieder angefangen haben. Dann erhöhe ich den Counter um 1 und addiere zum gemeldeten Wert X*Counter.

          Ist eigentlich ganz einfach. Aber ich weiß nicht, wie ich
          Code:
          if (sh...prev_value() < sh...())
          den Wert des Items um 1 erhöhe...

          Gruß
          Hendrik

          Kommentar

          Lädt...
          X