Ankündigung

Einklappen
Keine Ankündigung bisher.

EVAL gurus wanted ;)

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

    #31
    Ah, sorry. Alles, was hinter eval: steht, muss in Anführungszeichen ("). Also vor dem ersten Hochkomma und hinter die letzte Klammer.

    Gruß Waldemar

    Kommentar


      #32
      mumpf

      Super Danke. Hatte es grad selbst auch rausgefunden.

      Kommentar


        #33
        Hallo,

        nun habe ich eine ähnliche Frage wie letzte Woche.
        Ich möchte mit eval eine Liste aus 3 numerischen Items erzeugen.

        Code:
                    RGB:
                        name: RGB
                        type: list
                        milight_rgb: 1
                        cache: yes
                        eval: ?????????????
                        eval_trigger:
                          - .r
                          - .g
                          - .b
                        
                        r:
                            name: Wert für Rot
                            type: num
                            cache: yes
                            visu_acl: rw
        
                        g:
                            name: Wert für Grün
                            type: num
                            cache: yes
                            visu_acl: rw
        
                        b:
                            name: Wert für Blau
                            type: num
                            cache: yes
                            visu_acl: rw
        Wie muss das Eval im item RGB lauten, so dass eine Liste mit den 3 numerischen Werten gebildet wird?
        Danke Euch.

        Kommentar


          #34
          Code:
          eval: "[sh..r(), sh..g(), sh..b()]"
          Zur Info: Für die smartVISU brauchst du nicht unbedingt einzelne Items, du kannst auch dasjenige mit der Liste angeben.

          Kommentar


            #35
            ... und wieder mal eine Fragestellung in dem Zusammenhang.

            hier werden die neuen Funktionen der UZSU beschrieben.

            You want to turn on a specific light (e.g. christmas decoration) at a specific time. When leaving the house you prefer to turn that light off. When returning home it should be turned on again (only) if the UZSU would not have turned it off in the meanwhile:
            Braucht man dafür wirklich eine Logik oder geht das auch mit eval?
            Code:
            uzsustatus = sh.light.uzsu.planned()
            if (uzsustatus['value'] == 0) and (sh.light.uzsu.activate() == True):
                sh.light(1)
            Das hätte den Vorteil, dass man nicht für jedes Item eine Logik braucht.

            Was meint ihr?

            Kommentar


              #36
              Evtl. etwa so:
              Code:
              light:
                type: bool
                uzsu:
                  type: dict
                  uzsu_item: light
                  trigger:
                    type: bool
                    on_update: ... = value if (...planned()['value'] != value) and (...activate() == True) else None
              Beim Setzen eines Wertes auf light.uzsu.trigger wird dieser Wert an light weitergereicht, sofern die UZSU als nächstes das Gegenteil vorsieht.
              Also wie im Beispiel mit der Logik, nur dass es sowohl für ein- wie auch ausschalten genutzt werden kann.

              Kommentar


                #37
                Hi,

                Zitat von Sisamiwe Beitrag anzeigen
                Das hätte den Vorteil, dass man nicht für jedes Item eine Logik braucht.
                die Aussage ist natürlich nicht richtig. Du kannst eine Logik ohne weiteres so schreiben, dass sie relativ zum aufrufenden Item arbeitet und somit nur einmal für alle Items existieren muss.

                Gruß, Waldemar

                Kommentar


                  #38
                  Zitat von smai Beitrag anzeigen
                  Beim Setzen eines Wertes auf light.uzsu.trigger wird dieser Wert an light weitergereicht, sofern die UZSU als nächstes das Gegenteil vorsieht.
                  Also wie im Beispiel mit der Logik, nur dass es sowohl für ein- wie auch ausschalten genutzt werden kann.
                  Im Bespiel war noch ein Fehler drin.
                  So geht es:

                  Code:
                  Licht:
                      Flur:
                          type: bool
                          eval: or
                          eval_trigger: .*.OnOff
                          Treppe:
                              OnOff:
                                  type: bool
                                  visu_acl: rw
                                  cache: yes
                                  uzsu:
                                      type: dict
                                      uzsu_item: ..
                                      cache: yes
                                      visu_acl: rw
                                      trigger:
                                          type: bool
                                          on_update:
                                          - ... = value if (sh....uzsu.planned()['value'] != value) and (sh....uzsu.activate() == True) else None

                  Kommentar


                    #39
                    Stimmt, das sh. vergessen. Eigentlich müsste anstatt sh....uzsu.planned() auch sh...planned() funktionieren, hast du das getestet?

                    Kommentar


                      #40
                      Stimmt. Kann man auch so machen!
                      Sieht dann so aus:
                      Code:
                      Licht:
                          Flur:
                              type: bool
                              eval: or
                              eval_trigger: .*.OnOff
                              Treppe:
                                  OnOff:
                                      type: bool
                                      visu_acl: rw
                                      cache: yes
                                      uzsu:
                                          type: dict
                                          uzsu_item: ..
                                          cache: yes
                                          visu_acl: rw
                                          trigger:
                                              type: bool
                                              on_update:
                                              - ... = value if (sh...planned()['value'] != value) and (sh...activate() == True) else None

                      Kommentar


                        #41
                        Hallo,
                        ich habe wieder eine Frage, das eval betreffend.

                        Ich haben 2 Items mit folgender Definition:
                        Code:
                        wetter:
                            darksky:
                                currently:
                                   windBearing:
                                        type: num
                                        ds_matchstring: currently/windBearing
                                        cache: yes
                                        
                                        windBearing_compass_string:
                                            type: str
                                            eval: "['N','NO','O','SO','S','SW','W','NW','N'][(int(value) + 22.5) / 45]"
                                            eval_trigger: ..
                        Code:
                        heizung:
                               vorlaufbeeinflussung_zum_aktor:
                                    name: Stellgröße, die zum Aktor übermittelt wird
                                    type: num
                                    visu_acl: ro
                                    database: init
                                    eval: int(sh.heizung.vorlaufbeeinflussung.vorlaufbeeinflussung_logikoutput() if sh.heizung.vorlaufbeeinflussung()==1 else int(sh.heizung.vorlaufbeeinflussung.vorlaufbeeinflussung_manuell()))
                                    eval_trigger:
                                      - heizung.vorlaufbeeinflussung
                                      - heizung.vorlaufbeeinflussung.vorlaufbeeinflussung_logikoutput
                                      - heizung.vorlaufbeeinflussung.vorlaufbeeinflussung_manuell
                                  
                                vorlaufbeeinflussung_str:
                                    name: Beeinflussung des Heizkreisvorlaufes mittels Widerstandszuschaltung
                                    type: str
                                    eval: "['Tag_max','Tag_Med','Tag_min','Nacht','Frostschutz'][int(value)]"
                                    eval_trigger: ..vorlaufbeeinflussung_zum_aktor
                                    cache: yes


                        die bei Neustart eine Warnung im Log erzeugen:
                        Code:
                        2019-01-18  19:49:11 WARNING  wetter.darksky.currently.windBearing.windBearing_compass_string Item wetter.darksky.currently.windBearing.windBearing_compass_string: problem evaluating ['N','NO','O','SO','S','SW','W','NW','N'][(int(value) + 22.5) / 45]: invalid literal for int() with base 10: ''
                        2019-01-18  19:49:11 WARNING  heizung.vorlaufbeeinflussung.vorlaufbeeinflussung_str Item heizung.vorlaufbeeinflussung.vorlaufbeeinflussung_str: problem evaluating ['Tag_max','Tag_Med','Tag_min','Nacht','Frostschutz'][int(value)]: invalid literal for int() with base 10: 'Frostschutz'
                        Was ist falsch?
                        Danke Euch für die Hinweise.

                        Ergänzung:

                        und das ganze nochmal:
                        Definition:
                        Code:
                        SONOFF:
                            RGBW2:
                                Sensor:
                                    type: dict
                                    mqtt_topic_in: SONOFF_RGBW2/tele/SENSOR
                                    #{'Time': '2019-01-18T19:42:35', 'AM2301': {'Humidity': 43.9, 'Temperature': 15.6}, 'TempUnit': 'C'}
                                    Temp:
                                        type: num
                                        eval: sh...()['AM2301']['Temperature']
                                        eval_trigger: ..
                                        database: init
                                    Hum:
                                        type: num
                                        eval: sh...()['AM2301']['Humidity']
                                        eval_trigger: ..
                                        database: init

                        Log:
                        Code:
                        2019-01-18  19:49:29 WARNING  SONOFF.SONOFF_RGBW2.Sensor.Temp Item SONOFF.SONOFF_RGBW2.Sensor.Temp: problem evaluating sh.SONOFF.SONOFF_RGBW2.Sensor()['AM2301']['Temperature']: 'AM2301'
                        2019-01-18  19:49:29 WARNING  SONOFF.SONOFF_RGBW2.Sensor.Hum Item SONOFF.SONOFF_RGBW2.Sensor.Hum: problem evaluating sh.SONOFF.SONOFF_RGBW2.Sensor()['AM2301']['Humidity']: 'AM2301'
                        Zuletzt geändert von Sisamiwe; 18.01.2019, 19:59.

                        Kommentar


                          #42
                          Die Ursache dürfte sein, dass ein str Item mit Leerstring '' initialisiert wird. Dies wird dann als value im eval verwendet.
                          Beim SONOFG ähnlich: Dort ist das dict noch leer, wenn das eval von Temp/Hum ausgeführt wird.

                          Eigentlich kannst du das einfach ignorieren.
                          Wenn es dich extrem stört, kannst du auch per if prüfen, ob der value != '' oder alternativ ob er nummerisch ist bzw. beim SONOFF ob der key existiert.

                          Kommentar


                            #43
                            Hallo,

                            ich habe mal wieder ein frage zur effizienten Umsetzung eines Eval.
                            Ich habe eine Reihe von num Items und möchte zu jedem noch ein bool-Item haben, also TRUE, wenn der Wert des passenden num-Items > 0 ansonsten FALSE.

                            Mein Versuch:
                            Code:
                                        stellgr_rueckmeldung:
                                            type: num
                                            visu_acl: rw
                                            knx_dpt: '5.001'
                                            knx_cache: 0/3/68
                                            database: init
                                        stellgr_rueckmeldung_bool:
                                            type: bool
                                            visu_acl: rw
                                            database: init
                                            eval: 0 if value == 0 else 1
                                            eval_trigger: ..stellgr_rueckmeldung
                            Geht das noch einfacher?

                            Danke Euch.

                            Kommentar


                              #44
                              Ja.

                              eval: value

                              Gruß, Waldemar

                              Kommentar


                                #45
                                Hallo,

                                ich habe versucht, Post #31 zu erweitern, um meine neue Philips Hue Lampe über zigbee2mqtt zu steuern.
                                Die nötige Message ist etwas komplizierter (siehe zigbee2mqtt Doku):

                                Code:
                                 
                                 { "state": "ON", // Or "OFF", "TOGGLE" "brightness": 255, // Value between 0 and 255 "color_temp": 155, "color": { // XY color "x": 0.123, "y": 0.123, // OR // RGB color "r": 46, "g": 102, "b": 193, // OR // HEX color "hex": "#547CFF", // OR // Hue and/or saturation color "hue": 360, "saturation": 100 },
                                Das versuche ich nun mit den folgenden Item Definitionen darzustellen:

                                Code:
                                   huelicht2:
                                        switch:
                                            name: mqtt_huelicht2_switch
                                            type: bool
                                            autotimer: 3600 = 0
                                #            on_change: mqtt.huelicht2.mqtt_out = '{ "state":"on"}' if sh.mqtt.huelicht2.switch() else '{"state":"off"}'
                                '{"state":"off"}'
                                            enforce_updates: 'true'
                                            visu_acl: rw
                                
                                        r:
                                            type: num
                                            visu_acl: rw
                                
                                        g:
                                            type: num
                                            visu_acl: rw
                                
                                        b:
                                            type: num
                                            visu_acl: rw
                                
                                        brightness:
                                            type: num
                                            visu_acl: rw
                                
                                        color_temp:
                                            type: num
                                            visu_acl: rw
                                
                                        saturation:
                                            type: num
                                            visu_acl: rw
                                
                                        mqtt_out:
                                            name: mqtt_huelicht2_out
                                            type: str
                                            eval: "'{ \"state\":\"on\", \"color\": {\"r\": {0}, \"g\": {1}, \"b\": {2}}}'.format(sh...r(),sh...g(),sh...b())  if sh.mqtt.huelicht2.switch() else '{\"state\":\"off\"}'"
                                            eval_trigger:
                                              - ..switch
                                              - ..r
                                              - ..g
                                              - ..b
                                            enforce_uptdates: true
                                            mqtt_topic_out: 'zigbee2mqtt/huelicht2/set'
                                
                                        mqtt_in:
                                            name: mqtt_huelicht2_in
                                            type: dict
                                            mqtt_topic_in: 'zigbee2mqtt/huelicht2'
                                        status:
                                            name: mqtt_huelicht2_status
                                            type: bool
                                            eval: sh...mqtt_in().get('state')
                                            eval_trigger: ..mqtt_in
                                Leider kann der eval Befehl nicht ausgewertet werden, im smarthome.log bekomme ich folgende Fehlermeldung:
                                Code:
                                2019-08-11  15:41:11 WARNING  mqtt.huelicht2.mqtt_out Item mqtt.huelicht2.mqtt_out: problem evaluating '{ "state":"on", "color": {"r": {0}, "g": {1}, "b": {2}}}'.format(sh.mqtt.huelicht2.r(),sh.mqtt.huelicht2.g(),sh.mqtt.huelicht2.b())  if sh.mqtt.huelicht2.switch() else '{"state":"off"}': ' "state"'
                                Was mache ich falsch, bzw. wie kann ich den benötigten String erzeugen?

                                Danke für die Unterstützung.

                                Kommentar

                                Lädt...
                                X