Zitat von Msinn
Beitrag anzeigen
Ankündigung
Einklappen
Keine Ankündigung bisher.
EVAL gurus wanted ;)
Einklappen
X
-
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
-
Zitat von Msinn Beitrag anzeigenDu musst in jedem on_update das dict neu zusammen bauen.
Kommentar
-
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
-
Zitat von Msinn Beitrag anzeigenDu könntest das per **on_change** in jedem Item mit den Einzelwerten machen.
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
-
Zitat von Tom Bombadil Beitrag anzeigenSomit ist die von Dir oben beschriebene eval-Lösung vermutlich die sauberste Lösung, da wird wenigstens der Reihe nach abgearbeitet ("FiFo-Queue").
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
-
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
Kommentar
-
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
-
Zitat von Haiphong Beitrag anzeigenHier ein Beispiel:
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
-
Hallo,
vielleicht schreibe ich das mal in diesen Thread, das Thema passt auf jeden Fall.
Ich möchte gerne die basic.window Funktion im Smartvisu nutzen. Diese benutzt einen num-parameter um zwischen "geschlossen", "gekippt" und "offen" zu unterscheiden. Bei mir liegen diese Signale nur als bools vor. Also einer für gekippt und einer für geöffnet.
Nun meine einfache Frage: Kann ich mit einem eval aus zwei bools einen num-wert berechnen. Ich verweifele einfach nur als dem "AND"...
Code:eval: 1 if sh.haus.eg.wc.fenster.schwenk() and !sh.haus.eg.wc.fenster.kipp() else 0
Code:eval: 1 if sh.haus.eg.wc.fenster.schwenk() && !sh.haus.eg.wc.fenster.kipp() else 0
Code:eval: 1 if (sh.haus.eg.wc.fenster.schwenk()) and (!sh.haus.eg.wc.fenster.kipp()) else 0
Code:eval: 1 if ((sh.haus.eg.wc.fenster.schwenk() == true) and (sh.haus.eg.wc.fenster.kipp() == false)) else 0
ihr seht bis zum else if bin ich noch gar nicht gekommen....
ist das einfach nicht vorgesehen, oder ist mein Syntax einfach falsch?
Danke
Georg
Kommentar
-
Das Ausrufungszeichen hast Du aus einer anderen Sprache da rein geschummelt. Das kennt Python nicht. Da gehört ganz normal ein not hin.
Aus Deinem ersten Beispiel:
Code:eval: 1 if sh.haus.eg.wc.fenster.schwenk() and not sh.haus.eg.wc.fenster.kipp() else 0
Viele Grüße
Martin
There is no cloud. It's only someone else's computer.
Kommentar
-
Zitat von Msinn Beitrag anzeigeneval: 1 if sh.haus.eg.wc.fenster.schwenk() and not sh.haus.eg.wc.fenster.kipp() else 0
danke - funktioniert!
Kommentar
Kommentar