Ankündigung

Einklappen
Keine Ankündigung bisher.

EVAL gurus wanted ;)

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

    EVAL gurus wanted ;)

    Hallo Zusammen,

    ich stehe gerade auf dem Schlauch, denn ich schaffe es nicht folgende Funktion mittels eval zu implementieren.

    Zunächst folgende Items

    bedtime: BOOLEAN, regelt die Schlafenszeit pro Raum (=Eingangsitem für die Autoblind Beschattungssteuerung, etc.)
    uzsu_trigger: BOOLEN, wird mittels UZSU gesetzt (der Wert solle von bedtime übernommen werden, sofern kein hangover aktiv ist)
    hangover: BOOLEAN, Zentrales Item, welches um 12:00 Uhr auf False zurückgesetzt wird.

    Folgendes Zielszenario:
    Im Regelfall wird bedtime manuell über die Visu oder über das Hilfsitem uzsu_trigger gesteuert.

    Wird nun hangover (z.B. nachmittags) aktiviert, soll zunächst bedtime unverändert bleiben, na ja noch keine bedtime ist.
    bedtime wird, wie sonst auch, durch uzsu_trigger oder manuell aktiv.

    Im Sonderfall das hangover aktiv ist und uzsu_trigger von True auf False wechselt soll jedoch bedtime auf True bleiben, bis es entweder manuell (=direkt) auf False gesetzt wird oder hangover auf False geht (manuell oder spätestens um 12:00).

    Insgesamt soll die direkte, manuelle Steuerung von bedtime (z.B. über die Visu) immer Vorrang haben.

    Die bedtime eval_trigger habe ich auf uzsu_trigger und hangover gestellt, aber irgendwie schaffe ich es nicht, dass ich einen passenden eval Ausdruck hinbekommen, der den Statuswechsel von uzsu_tigger von True auf False erfasst.

    Danke
    Markus

    #2
    Unbescheiden wie ich bin fühle ich mich mit Eval-Guru gleich angesprochen.

    Vielleicht funktioniert folgender Ansatz:
    Code:
    uzsu_trigger:
        on_update: ..bedtime = value if value or not sh...hangover() else None
    Rahmenbedingungen:
    • bedtime und hangover haben weder eval noch eval_trigger
    • Die Anzahl der Punkte gilt jeweils, wenn bedtime, uzsu_trigger und hangover Geschwister sind.

    Erklärung:
    • on_update: ..bedtime = value if value or not sh...hangover() else None
      weisst bedtime den Wert von uzsu_trigger zu.
    • on_update: ..bedtime = value if value or not sh...hangover() else None
      aber nur, wenn der Wert True ist, also die bedtime aktiviert werden soll...
    • on_update: ..bedtime = value if value or not sh...hangover() else None
      ... oder hangover nicht aktiviert ist.

    Kommentar


      #3
      Hm, und wenn hangover um 12 Uhr wieder auf False geht, dann bekommt es aber bedtime nicht mit, wenn da kein eval_trigger registriert ist, oder?
      Bei hangover kann ich aber kein on_update setzen, da dieses item für viele Funktionen verwendet werden soll...

      Kommentar


        #4
        Hmm, ich fühle mich auch irgendwie angesprochen

        Der Vorschlag von smai ist ja schon mal super, ich nehme mich mal des 2. Teils an:
        Zitat von gama Beitrag anzeigen
        Hm, und wenn hangover um 12 Uhr wieder auf False geht, dann bekommt es aber bedtime nicht mit,
        Zitat von gama Beitrag anzeigen
        Bei hangover kann ich aber kein on_update setzen, da dieses item für viele Funktionen verwendet werden soll...
        Warum nicht? Es wäre die einfachste Lösung:
        Code:
        hangover:
            on_update: ..bedtime = 0 if not sh...hangover() else None
        Es geht aber auch mit eval. Da deine weitere Nebenbedingung auch noch folgende ist...
        Zitat von gama Beitrag anzeigen
        Insgesamt soll die direkte, manuelle Steuerung von bedtime (z.B. über die Visu) immer Vorrang haben.
        ...muss bedtime ein Item ohne kompliziertes eval bleiben. Für die Benachrichtigung von hangover nutzen wir dann ein Hilfsitem:
        Code:
        bedtime:
            name: Bett
            type: bool
            eval: value
            eval_trigger: .hangover
            hangover:
                name: Hilfs-Hangover
                type: bool
                enforce_updates: yes
                eval: 0 if not sh....hangover() else None
                eval_trigger: ...hangover
        Hier wird Bedtime durch jeden Trigger (also auch Visu) normal gesetzt, das Hilfsitem bedtime.hangover wird aber durch das globale hangover getriggert und geht auf 0, wenn das globale hangover false wird. Da das Item nie auf 1 geht, muss man ein enforce_updates spendieren.

        Du hast aber noch nicht gesagt, was der Fall sein soll, wenn hangover manuell auf false gesetzt wird (also irgendwann vor 12), während bedtime true ist...

        Gruß, Waldemar


        Kommentar


          #5
          Zitat von gama Beitrag anzeigen
          Hm, und wenn hangover um 12 Uhr wieder auf False geht, dann bekommt es aber bedtime nicht mit, wenn da kein eval_trigger registriert ist, oder?
          Ich hatte die Anforderung so verstanden, dass dies nicht geschehen soll.

          Die Lösung hat Waldemar ja schon geliefert. Ich würde ebenfalls das on_udpate beim hangover setzen, es ist ja egal, wozu dieses sonst noch verwendet wird.
          Das sh...hangover() in dem on_update könnte noch vereinfacht werden zu sh..() oder einfach value.

          Kommentar


            #6
            Ein on_update beim Zentral-Item "hangover" wollte ich vermeiden, da ich meist bei der (Fehler-) Suche bei der eigentlichen Funktion anfange und dort sehen möchte, welche items Einfluss nehmen - ist aber erst einmal nice-to-have.

            Wenn hangover manuell auf false gesetzt wird, so soll auch der gesetzte wert von uzsu_trigger übernommen werden. Also fällt mir nachts ein, ich kann doch nicht ausschlafen, dann setze ich hangover auf False, die Automatik "uzsu_trigger" übernimmt die Kontrolle.

            Also
            - folgt bedtime dem wert des uzsu-items, jedoch nur beim Ausschalten von hangover.
            - überschreibt uzsu_trigger den bedtime Wert. Ist hangover aktiv, wird kein False gesetzt.

            ??

            Kommentar


              #7
              Hi,

              dann muss es wohl so heißen:
              Code:
              hangover:
                  on_update: ..bedtime = sh...uzsu_trigger() if not value else None
              Dabei ist schon der Vorschlag von
              Zitat von smai Beitrag anzeigen
              Das sh...hangover() in dem on_update könnte noch vereinfacht werden zu sh..() oder einfach value
              eingebaut.

              Gruß, Waldemar

              Kommentar


                #8
                Ok, aber dann brauche ich für jedes item, auf welches hangover schreibt einen Eintrag.
                Per eval unter bedtime siehst du keinen Ansatz, oder? Das würde wie erwähnt die Nachvollziehbarkeit oder Fehlersucher erleichtern...

                könnte man mit uszu_trigger.prev_value(), ggf. mit prev_age() arbeiten?
                Zuletzt geändert von gama; 30.10.2018, 14:07.

                Kommentar


                  #9
                  IMG_9828.JPG Ich habe es noch einmal als Signalgraph dokumentiert...

                  Kommentar


                    #10
                    Hallo,
                    ich habe auch eine Frage, das EVAL betreffend.

                    Im Grunde möchte ich eine MQTT Nachricht auswerten, ob ein bestimmter Taster gedrückt wurde. Wenn im String der MQTT Nachricht ein bestimmter Key einen Wert annimmt, möchte ich das bool Item auf 1 stellen.

                    Meine Items sehen so aus:

                    Code:
                            Result_str:
                                type: str
                                mqtt_topic_in: SONOFF_RF1/tele/RESULT
                                cache: 'yes'
                                #SONOFF_RF1/tele/RESULT {"RfReceived":{"Sync":8000,"Low":270,"High":770,"Data":"4C1012","RfKey":4}}
                                #SONOFF_RF1/tele/RESULT {"RfReceived":{"Sync":8000,"Low":260,"High":780,"Data":"4C1018","RfKey":5}}
                                #SONOFF_RF1/tele/RESULT {"RfReceived":{"Sync":8000,"Low":260,"High":780,"Data":"4C1014","RfKey":6}}
                                received_key4:
                                    type: bool
                                    eval: 1 if int(sh...()['RfReceived']['RfKey']) == 4 else None
                                    eval_trigger: ..
                    Das Item SONOFF.SONOFF_RF1.Result_str erhält die MQTT Nachricht (Beispiele sind oben zusehen). Das Item SONOFF.SONOFF_RF1.Result_str.received_key4 soll immer 1 werden, wenn der entsprechende Key gleich 4 ist.

                    Im Log kommt:
                    Code:
                    WARNING  SONOFF.SONOFF_RF1.Result_str.received_key4 Item SONOFF.SONOFF_RF1.Result_str.received_key4: problem evaluating 1 if int(sh.SONOFF.SONOFF_RF1.Result_str()['RfReceived']['RfKey']) == 4 else None: string indices must be integers
                    Was mache ich falsch?
                    Danke für die Rückmeldungen

                    Kommentar


                      #11
                      Ich kenne das MGTT-Plugin nicht, aber dein Item SONOFF.SONOFF_RF1.Result_str ist vom Type str(ing), du versuchst es in dem eval aber als dict zu behandeln.
                      Liefert MQTT ein dict oder einen String? Möglicherweise einen String mit JSON drin wie in deinen Kommentaren gezeigt?

                      Kommentar


                        #12
                        Die Beispiel in den Kommentaren sind die realen MQTT Topics bzw. Messages. Ich denke also ein String mit JSON.

                        Kommentar


                          #13
                          Im Readme sind die Items vom Typ foo, das lässt mich eher vermuten, dass das Plugin ein dict liefert.
                          Stell den Typ von Result_str auf foo um und schau, ob dein eval dann funktioniert.

                          NACHTRAG:
                          Es gibt auch den Typ dict, vielleicht wäre dieser richtiger.
                          Zuletzt geändert von smai; 07.11.2018, 15:26. Grund: Nachtrag

                          Kommentar


                            #14
                            Das war es. Mit Typ dict klappt es.
                            Machmal sieht man den Wald vor lauter Bäumen nicht.
                            Danke!

                            Kommentar


                              #15
                              Zitat von smai Beitrag anzeigen
                              Liefert MQTT ein dict oder einen String?
                              Wenn das Item als dict definiert ist, wird ein per MQTT Message eingehender json String in ein dict gewandelt. Wenn Das Item als str definiert ist, wird ein per MQTT Message eingehender json String dort als str abgelegt.
                              Viele Grüße
                              Martin

                              Kommentar

                              Lädt...
                              X