Ankündigung

Einklappen
Keine Ankündigung bisher.

EVAL gurus wanted ;)

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

    #76
    Zitat von Msinn Beitrag anzeigen
    Du könntest das per **on_change** in jedem Item mit den Einzelwerten machen.
    Bei der Verwendung von **on_change** weiß ich zumindest den Key für das entsprechende Wertepaar im Dict, aber wie bekomme ich den Wert im dict aktualisiert?

    Kommentar


      #77
      Du kannst keinen einzelnen Eintrag in einem dict setzen. Dafür gibt es bisher keine Funktionalität. Du musst in jedem on_update das dict neu zusammen bauen.

      Ich empfehle hier on_update(s) statt einem eval im dict item, da Du so das dict Item noch anderweitig (z.B. in der Admin GUI) modifizieren kannst, was bei einem evel erstmal nicht geht. Du kannst natürlich auch ein eval konstruieren, dass das dict zusammenbaut und alle Einzel-Items unter eval_trigger aufführen.
      Viele Grüße
      Martin

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

      Kommentar


        #78
        Zitat von Msinn Beitrag anzeigen
        Du musst in jedem on_update das dict neu zusammen bauen.
        Danke dir. Hast du hier ein Beispiel für den Einstieg? Wie könnte das Aussehen?

        Kommentar


          #79
          Bau Dir einen String zusammen, der wie das gewünschte dict aussieht.

          Probier das doch einfach im eval Syntax Prüfer aus. Gib als Ausdruck z.B. {'key1': 'value1', 'key2': 'value2'} ein.

          Als Ergebnis der Berechnung des Ausdrucks erhältst Du {"key1":"value1","key2":"value2"}
          und der Datentyp des berechneten Ausdrucks ist : dict
          Viele Grüße
          Martin

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

          Kommentar


            #80
            Zitat von Msinn Beitrag anzeigen
            Du könntest das per **on_change** in jedem Item mit den Einzelwerten machen.
            Randbemerkung, mal rein aus Interesse:

            Ich kenne mich zwar weder mit Milight noch mit MQTT aus. Ich könnte mir aber gut vorstellen, dass sich hier mehrere Werte gleichzeitig ändern können (z.B. r/g/b), und das sehr schnell in sehr kurzen Abständen (z.B. durch Slider auf der Visu). Das dürfte bei gleichzeitigem Triggern von on_change auf mehreren Items mit Schreibvorgang auf ein und dasselbe Zielitem vermutlich ein schönes Tohuwabohu geben, oder?

            Somit ist die von Dir oben beschriebene eval-Lösung vermutlich die sauberste Lösung, da wird wenigstens der Reihe nach abgearbeitet ("FiFo-Queue").

            Was ich noch nicht verstehe:
            Warum sollten die einzelnen Items bei Änderung nicht jeder für sich einen passenden MQTT-String generieren und verschicken, statt jedesmal ein neues "globales" dict zusammenzufummeln? Vielleicht stecke ich da aber auch nicht genug in der Materie drin ...

            /tom

            Kommentar


              #81
              Zitat von Tom Bombadil Beitrag anzeigen
              Somit ist die von Dir oben beschriebene eval-Lösung vermutlich die sauberste Lösung, da wird wenigstens der Reihe nach abgearbeitet ("FiFo-Queue").
              Wird es beim on_change auch
              und die eval Lösung erzeugt so wie oben beschrieben auch genau so viele MQTT Telegramme, weil jeder geänderte Wert das eval triggert.
              Viele Grüße
              Martin

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

              Kommentar


                #82
                Hallo,

                ich habe wieder einmal eine Frage zur Gestaltung eines eval.

                Meine Aufgabe ist das Zählen der Updates eines Items mit gleichem Wert und Setzen eines anderen Items bei einer gewissen Anzahl in einer gewissen Zeit
                Die Anwendung ist folgende:
                Ich habe an einem Markisenarm einen Bewegungssensor befestigt. Dieser sendet bei Bewegung einen String mit der Bewegungsart vibration, tilt oder drop.
                Dies kommt in einem Item in shNG an. Nun möchte ich bei 3 aufeinanderfolgenden gleichen Bewegungen innerhalb von 30s ein bool-Item für den Windalarm triggern.



                Hier mal mein Versuch bei dem allerdings das Zählen der Updates mit gleich Wert noch nicht funktioniert.
                Code:
                djt11lm_02:
                        remark: Markise West
                        action:
                            type: str
                            zigbee2mqtt_topic: DJT11LM_02
                            zigbee2mqtt_attr: action
                            enforce_updates: yes
                            
                            last_action:
                                type: str
                                eval: value if value != sh..() else None
                                eval_trigger: ..
                                
                            counter:
                                name: Zähler Action
                                type: num
                                autotimer: 30 = 1
                                eval: sh..() + 1 if value == sh...last_action() else 0
                                eval_trigger: ..
                                
                        windalarm:
                            type: bool
                            eval: True if value == 3 else False
                            eval_trigger: ..action.counter
                            enforce_updates: yes
                Wer hat hierfür eine Idee?

                Kommentar


                  #83
                  Hier ein Beispiel:
                  Code:
                   k_a:
                  type: bool
                  knx_dpt: 1
                  knx_cache: 3/0/100
                  knx_send: 3/0/0
                  visu: toggle
                  
                  status:
                  type: num
                  knx_dpt: 1
                  knx_cache: 3/0/100
                  visu: toggle
                  
                  zaehl:
                  type: num
                  eval: self.return_parent().zaehl() + (self.return_parent()())
                  eval_trigger: knx_raum.ug.k_aktor_azi.schalt.k_a.status
                  cache: true # test iO nur dadurch bleibt wert nach neustart erhalten
                  Gruß, JG

                  Kommentar


                    #84
                    Zitat von Haiphong Beitrag anzeigen
                    Hier ein Beispiel:
                    Danke Dir.
                    Das Beispiel passt leider nicht ganz, da Dein "Auslöser" ein boolsches Item ist.

                    Was mir aber aufgefallen ist:
                    • Für was gibt es das Item "status"? Das ist doch das gleiche wie das Item "k_a".
                    • Das Item "zaehl" läßt sich vereinfachen bzw lesbarer schreiben. So sollte es auch gehen:
                    Code:
                    k_a:
                        type: bool
                        knx_dpt: 1
                        knx_cache: 3/0/100
                        knx_send: 3/0/0
                        visu: toggle
                    
                        zaehl:
                            type: num
                            eval: sh..() + value    # relative Adressierung. . bedeutet gleiches Item; value entspricht dem Wert des Items, dass getriggert hat
                            eval_trigger: ..        # relative Adressierung. .. bedeutet eine Ebene nach oben
                            cache: true             # test iO nur dadurch bleibt wert nach neustart erhalten

                    Kommentar


                      #85
                      Staus, ist der Status vom Aktor-Kanal.

                      Die relative adessierung verwende ich - bisher noch - nicht.....
                      Gruß, JG

                      Kommentar

                      Lädt...
                      X