Ankündigung

Einklappen
Keine Ankündigung bisher.

EVAL gurus wanted ;)

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

  • Msinn
    antwortet
    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.

    Einen Kommentar schreiben:


  • Tom Bombadil
    antwortet
    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

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    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

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    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?

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    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.

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    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?

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    Du könntest das per **on_change** in jedem Item mit den Einzelwerten machen.

    Einen Kommentar schreiben:


  • Sisamiwe
    antwortet
    Hallo,
    ich habe mal wieder eine Frage das eval betreffend in Zusammenhang mit MQTT.

    Ich versuche ein MILIGHT Gateway via MQTT einzubinden. Über das MQTT-Topic-In bekomme ich folgendes/oder ein ähnliches Dict:
    Code:
    MILIGHT/0x1235/rgb_cct/1/state {"state":"ON","status":"ON","brightness":179,"level":70,"hue":340,"saturation":100,"color":{"r":255},"bulb_mode":"color"}
    Im ersten Schritt habe ich das Dict "zerlegt", so dass die entsprechenden Werte in einzelnen Items zur Verfügung stehen und auch in der Visu benutzt werden können.

    Nun suche ich nach der Möglichkeit, die einzelnen Werte bei Änderung wieder zu einem Dict zusammenzusetzen bzw. das bestehende entsprechend zu ändern und über das MQTT-Topic-Out zu senden.

    Lässt sich das per eval machen?

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    Du solltest evtl. on_change statt on_update verwenden (je nach gewünschtem Verhalten). Bei on_update wird die Steckdose auch geschaltet wenn sich der Spiegellicht Wert nicht ändert (z.B. Spiegellicht ist bereits an und über die GA 1/1/100 kommt ein eineutes EIN Signal). Falls die Steckdose nur geschaltet werden soll, wenn sich der Zustand des Spiegellichts ändert, wäre on_change angebracht.

    Einen Kommentar schreiben:


  • jonsson
    antwortet
    Danke für die raschen Antworten, es waren tatsächlich die Hochkommata.
    Umbau auf das steurnde item habe ich auch schon versucht, eben auch hier ging es nicht wegend den Hochkommata.

    Ich hatte ursprünglich Anführungszeichen (dachte, weil string), die hat aber der Parser reklamiert.

    mumpf stimmt:
    Code:
    2020-11-18  00:04:37 WARNING  lib.item            Item OG.Kinderbad.Spiegellicht.EinAus: 'on_update' item-value='True' problem evaluating ON if value else OFF: name 'ON' is not defined
    So funktioniert es nun:
    Code:
            Spiegellicht:
                EinAus:
                    type: bool
                    visu_acl: rw
                    knx_dpt: 1
                    knx_listen: 1/4/100
                    knx_send: 1/1/100
                    knx_init: 1/1/100
                    on_update: OG.Kinderbad.Steckdose = 'ON' if value else 'OFF'
            Steckdose:
                type: str
                mqtt_topic_out: zigbee2mqtt/0x086bd7fffe5f6a35/set/state
                visu_acl: rw
                enforce_updates: 'true'

    Einen Kommentar schreiben:


  • Msinn
    antwortet
    Wenn Du eval nutzt, wird das Item per Formel gesetzt und nicht „per Itembaum“.

    wenn Du nur zusätzlich schalten willst wenn das Spieleglich schaltet, solltest Du statt eval im Steckdosen Item zu nutzen, im Spiegel item ein on_change verwenden. Das setzt dann bei einer Veränderung des Spiegellichts das Steckdosen Item. Das Steckdosen Item bleibt aber unabhängig schaltbar.

    Einen Kommentar schreiben:


  • mumpf
    antwortet
    Hi Johannes,

    ich bin mir ziemlich sicher, dass im Log einige Fehlermeldungen stehen... Du hättest da reinschauen sollen.

    Ich glaube, da muss folgendes stehen:
    Code:
    eval: 'ON' if sh.OG.Kinderbad.Spiegellicht.EinAus() else 'OFF'
    Gruß, Waldemar

    Einen Kommentar schreiben:


  • Onkelandy
    antwortet
    Schon mal 1 if bla()==1 else 0 probiert?
    besser wäre noch das über on_update vom einaus item statt im eval zu machen. Dann kannst du jedenfalls unabhängig schalten

    Einen Kommentar schreiben:


  • jonsson
    antwortet
    Guten Abend,

    ich bin jetzt seit Stunden mit der Steckdose beschäftigt und bekomme es nicht hin.
    Diese soll mit dem Spiegellicht mitgeschaltet werden, wenn 1 dann payload "ON" sonst payload "OFF"

    Entferne ich die 2 eval Zeilen, kann ich über den Itembaum problemlos schalten, mit den Zeilen kann ich weder die Steckdose schalten, noch reagiert sie auf Änderungen des Lichts.

    Code:
    OG:
        Kinderbad:
            Spiegellicht:
                EinAus:
                    type: bool
                    visu_acl: rw
                    knx_dpt: 1
                    knx_listen: 1/4/100
                    knx_send: 1/1/100
                    knx_init: 1/1/100
            Steckdose:
                type: str
                mqtt_topic_out: zigbee2mqtt/0x086bd7fffe5f6a35/set/state
                visu_acl: rw
                eval: ON if sh.OG.Kinderbad.Spiegellicht.EinAus()=='true' else OFF
                eval_trigger: OG.Kinderbad.Spiegellicht.EinAus
    Danke
    Johannes

    Einen Kommentar schreiben:


  • mumpf
    antwortet
    Zitat von Sisamiwe Beitrag anzeigen
    Ich möchte nicht kleinlich sein, aber wo genau liest Du in der Doku von autotimer heraus, dass die Wertzuweisung auch über ein Item passieren kann?
    Du zitierst die Doku doch selber:
    Zitat von Sisamiwe Beitrag anzeigen
    Es können aber sowohl <dauer> als auch<wert>über ein Item zugewiesen werden.
    Vielleicht verstehe ich Deine Frage nicht richtig, sonst würde ich sagen, die hast Du Dir selber beantwortet .

    Gruß, Waldemar

    Einen Kommentar schreiben:

Lädt...
X