Ankündigung

Einklappen
Keine Ankündigung bisher.

EVAL gurus wanted ;)

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

    #16
    Danke Msinn
    Das könnte vielleicht in der Doku ergänzt werden (oder habe ich es überlesen?).
    Auch der Typ im Beispiel sollte wohl besser auf dict geändert werden.

    Kommentar


      #17
      Der Typ im Beispiel ist schon ok. Es ist ja nicht klar was das MQTT Device sendet. Der Daten-Inhalt der MQTT Messages ist nicht genormt. Das können Binärdaten, Texte (nur als ASCII), etc. sein. Genaugenommen ist das Datenelement einer MQTT Message immer ein Array of Byte. Das ändert sich erst mit der Protokoll Version 5.0 (für die es aber noch keine fertigen Implementierungen gibt).

      Das Plugin unterstützt deshalb das Casteing in den Datentyp des Items. (siehe auch Release Notes im Support Thread)

      Code:
      MQTT Plugin v1.3.1 (2017-05-01)
      • Unterstützung aller drei QoS Modi für Nachrichten
      • Retained Flag Unterstützung für Nachrichten
      • MQTT Testamant Message (Last Will)
      • Birth Message
      • Je Plugin Instanz nur eine Client Session zum Broker .
      • Smart Plugin
      • Multi-Instance fähig
      • Type-Casting (Umwandlung in die SmartHomeNG Datentypen) für ein- und ausgehende Nachrichten
      • Type-Casting (Umwandlung in die SmartHomeNG Datentypen) für Payloads in Logik-Triggern
      Zuletzt geändert von Msinn; 07.11.2018, 17:50.
      Viele Grüße
      Martin

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

      Kommentar


        #18
        Hallo,

        mal wieder eine Fragen an die Eval-Gurus ;o)

        Kann man mit einem eval die numerischen Werte 3er Items als str mit Kommatrennung schreiben?
        Bislang mache ich das mit einer Logik:
        Code:
        r = sh.Licht.Wohnzimmer.Kanal1.rgb.r()
        g = sh.Licht.Wohnzimmer.Kanal1.rgb.g()
        b = sh.Licht.Wohnzimmer.Kanal1.rgb.b()
        sh.Licht.Wohnzimmer.Kanal1.rgb([r,g,b])
        Mit eval wäre das aber eleganter.

        Ich habe mal folgendes versucht:
        Code:
        SONOFF:
            SONOFF_RGBW1:
                type: str
                mqtt_topic_in: SONOFF_RGBW1/tele/LWT
                telegram_message: 'SONOFF_RGBW1: [VALUE]!'
                
                Hue:
                    type: num
                
                Sat:
                    type: num
                
                Bright:
                    type: num
        
                Switch:
                    type: bool
                    mqtt_topic_out: SONOFF_RGBW1/cmnd/POWER
                    enforce_updates: 'yes'
                    
                HSB:
                    type: foo
                    eval: str(sh.SONOFF.SONOFF_RGBW1.Hue()),str(sh.SONOFF.SONOFF_RGBW1.Sat()),str(sh.SONOFF.SONOFF_RGBW1.Bright())
                    eval_trigger:
                      - ..Hue
                      - ..Sat
                      - ..Bright
        Das Ergebnis bei HSB durch das eval ist dann bspw ('100', '90', '100'). Ich bräuchte aber (100,90,100), also ohne Hochkommas und Leerzeichen.

        Weiterer Versuch mit:
        Code:
        SONOFF:
            SONOFF_RGBW1:
                type: str
                mqtt_topic_in: SONOFF_RGBW1/tele/LWT
                telegram_message: 'SONOFF_RGBW1: [VALUE]!'
                
                Switch:
                    type: bool
                    mqtt_topic_out: SONOFF_RGBW1/cmnd/POWER
                    enforce_updates: 'yes'
                
                Hue:
                    type: num
                    visu: 'yes'
                    visu_acl: rw
                
                Sat:
                    type: num
                    visu: 'yes'
                    visu_acl: rw
                
                Bright:
                    type: num
                    visu: 'yes'
                    visu_acl: rw
        
                HSB:
                    type: list
                    eval: [sh.SONOFF.SONOFF_RGBW1.Hue(), sh.SONOFF.SONOFF_RGBW1.Sat(), sh.SONOFF.SONOFF_RGBW1.Bright()]
                    eval_trigger:
                      - ..Hue
                      - ..Sat
                      - ..Bright
        ergibt den Fehler:
        Code:
        2018-12-02  17:54:08 ERROR    lib.item          Item SONOFF.SONOFF_RGBW1.HSB: problem creating: 'list' object has no attribute 'find'
        Traceback (most recent call last):
          File "/usr/local/smarthome/lib/item.py", line 563, in __init__
            child = Item(smarthome, self, child_path, value)
          File "/usr/local/smarthome/lib/item.py", line 453, in __init__
            self._process_eval(value)
          File "/usr/local/smarthome/lib/item.py", line 776, in _process_eval
            value = self.get_stringwithabsolutepathes(value, 'sh.', '(', KEY_EVAL)
          File "/usr/local/smarthome/lib/item.py", line 1753, in get_stringwithabsolutepathes
            if evalstr.find(begintag+'.') == -1:
        AttributeError: 'list' object has no attribute 'find'
        Wie bekommt am das hin?
        War hier auch schon mal Thema, aber ohne "lesbare" Lösung.

        Dankeschön
        Zuletzt geändert von Sisamiwe; 02.12.2018, 17:59.

        Kommentar


          #19
          Erster Schnellschuss: int() statt str() für die einzelnen Werte nehmen und das ganze in ein str() einbetten?
          /tom

          Nachtrag: Was ich meine - ich habe z.B. einen Haufen solcher (zugegebenermaßen unschönen, aber funktionierenden) evals, um das obligatorische Leerzeichen von der Einheit in der späteren Visu-Ausgabe zu umschiffen:
          Code:
          str(int(sh.mein_item())) + '%'
          Du müsstest wahrscheinlich den String nur mit '+' weiterbasteln und dabei auch Kommata usw. setzen ...
          Zuletzt geändert von Tom Bombadil; 02.12.2018, 18:08.

          Kommentar


            #20
            Tom Bombadil

            Das klappt auch nicht:
            Code:
            Item SONOFF.SONOFF_RGBW1.HSB: problem evaluating str(int(sh.SONOFF.SONOFF_RGBW1.Hue()), int(sh.SONOFF.SONOFF_RGBW1.Sat()), int(sh.SONOFF.SONOFF_RGBW1.Bright())): str() argument 2 must be str, not int

            Kommentar


              #21
              Wie die Fehlermeldung schon sagt - für jede einzelne Umwandlung str(int()) statt nur int() verwenden ...
              /tom

              Nachtrag - also (ungetestet):
              Code:
               eval: str(int(sh.SONOFF.SONOFF_RGBW1.Hue())) + ',' + str(int(sh.SONOFF.SONOFF_RGBW1.Sat())) + ',' + str(int(sh.SONOFF.SONOFF_RGBW1.Bright()))
              Zuletzt geändert von Tom Bombadil; 02.12.2018, 18:27.

              Kommentar


                #22
                Tom Bombadil
                Das war! Danke.

                So klappt es:
                Code:
                SONOFF:
                    SONOFF_RGBW1:
                       
                        Hue:
                            type: num
                            cache: 'yes'
                            visu: 'yes'
                            visu_acl: rw
                        
                        Sat:
                            type: num
                            cache: 'yes'
                            visu: 'yes'
                            visu_acl: rw
                        
                        Bright:
                            type: num
                            cache: 'yes'
                            visu: 'yes'
                            visu_acl: rw
                
                        HSB:
                            type: str
                            eval: str(int(sh...Hue())) + ',' + str(int(sh...Sat())) + ',' + str(int(sh...Bright()))
                            eval_trigger:
                              - ..Hue
                              - ..Sat
                              - ..Bright
                Msinn

                Vielleicht kannst Du das Beisiel in das Readme mit aufnehmen, da man es doch immer bei Farbbeleuchtung in den Items braucht (R+G+B --> R,G,B oder H+S+B --> H,S,B).
                Wäre Super.

                Michael

                Kommentar


                  #23
                  Schön, dass es klappt, Michael - ich bin mir sicher, die Python-Gurus können da mit Dicts / Listen / Arrays noch ganz andere elegante "Schweinereien" veranstalten, aber wie schon geschrieben: Nicht schön, aber funktional.
                  /tom

                  Kommentar


                    #24
                    Hi,

                    folgender eval sollte auch gehen (und ist meiner Meinung nach lesbarer):
                    Code:
                    eval: '{0},{1},{2}'.format(sh...Hue(), sh...Sat(), sh...Bright())
                    Wobei mir nicht klar ist, wofür man das braucht... und es passt nicht zu dem, was Du im RGB-Beispiel mit der Logik geschrieben hast! Da arbeitest Du nicht mit einem String, sonder mit einer Liste. Und auch das, was zwischendurch da stand
                    Zitat von Sisamiwe Beitrag anzeigen
                    ('100', '90', '100')
                    war kein String, sondern ein Tupel. Deswegen war ich mir die ganze Zeit nicht sicher, was Du wirklich willst...

                    Aber schön, wenn es jetzt klappt.

                    Gruß, Waldemar

                    Kommentar


                      #25
                      Siehste! *grins*
                      /tom

                      Kommentar


                        #26
                        mumpf

                        Super. Danke.

                        Was ich wollte: Für die Kommandos an RGB oder HSB Leuchtmitteln bzpw. im Milight Plugin oder auch für MQTT Payploads (Tasmota) braucht man eine Zeichenkette mit den Einzelwerten, die durch ein Komma getrennt sind. Dem Empfänger ist es glaube ich egal, ob String oder Liste. Im Prinzip müssen die 3 numerischen Werte aus den Items in eine Zeichenkette zusammengeführt werden, also R,G,B oder H,S,B.

                        Ist Dein Eval
                        Zitat von mumpf Beitrag anzeigen
                        eval: '{0},{1},{2}'.format(sh...Hue(), sh...Sat(), sh...Bright())
                        dann eine Liste?

                        Kommentar


                          #27
                          Nein, ein String, der über .format gesteuert wird: Klick. Die fehlende explizite Umwandlung von int in str jagt mir jedesmal kalte Schauer über den Rücken, aber ich muss ja zum Glück seit 20 Jahren nicht mehr aktiv programmieren ...

                          (oder wie die Bauern in meiner alten Heimat sagen: "Dies'n niemodsche Kram hemm wie noch nie mokkt.")

                          /tom

                          Kommentar


                            #28
                            Hi Tom Bombadil,

                            ich bin durchaus für typysiertes und typgerechtes programmieren. Ich sehe es auch genau so, dass ein expliziter Cast besser ist als ein impliziter. Nur ist die .format-Funktion ja so definiert, dass sie ihre Argumente in einen String umwandelt, warum soll man es dann nochmal machen?

                            Gruß, Waldemar

                            Kommentar


                              #29
                              Nicht falsch verstehen, Waldemar - ich ziehe meinen Hut vor Deiner sauberen und eleganten Lösung (hatte ich ja eh schon vorhergesagt, dass da sicher noch was besseres kommen wird). Und mit der Definition von .format hast Du auch Recht.

                              Ist halt nur so ein Bauchgefühl - jemand, dem in frühen Tagen Maschinen- und Assemblercode eingebläut wurden, werden die Zeiten von 'try / except / egal_blas_das_kraftwerk_hoch' und 'DatentypIstMirDochWumpe' wohl immer ein wenig suspekt sein ...

                              /tom

                              Kommentar


                                #30
                                mumpf

                                Ich habe Deinen Vorschlag gerade versucht umzusetzen. Allerdings gibt es im YAML Check einen Fehlermeldung, die ich nicht gelöst bekomme.
                                Mein Item:
                                Code:
                                SONOFF:
                                    SONOFF_RGBW1:
                                       
                                        HSB:
                                            type: str
                                            cache: yes
                                            #eval: str(int(sh...Hue())) + ',' + str(int(sh...Sat())) + ',' + str(int(sh...Bright()))
                                            eval: '{0},{1},{2}'.format(sh...Hue(), sh...Sat(), sh...Bright())
                                            eval_trigger:
                                              - ..Hue
                                              - ..Sat
                                              - ..Bright
                                            mqtt_topic_out: SONOFF_RGBW1/cmnd/HsbColor
                                            enforce_updates: yes
                                und die Fehlermeldung im YAML Check:
                                Code:
                                ERROR: 
                                
                                while parsing a block mapping
                                  in "<unicode string>", line 5, column 13:
                                                type: str
                                                ^ (line: 5)
                                expected <block end>, but found '<scalar>'
                                  in "<unicode string>", line 8, column 32:
                                                eval: '{0},{1},{2}'.format(sh...Hue(), sh...Sat(),  ... 
                                                                   ^ (line: 8)
                                Was ist falsch?

                                Kommentar

                                Lädt...
                                X