Ankündigung

Einklappen

Aufruf

Bitte helft bei unserer Spendenaktion: Spendenaktion Helmut Lintschinger
Mehr anzeigen
Weniger anzeigen

eval für strings?

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

    eval für strings?

    Ein frohes neues Jahr.
    Ich versuche ein Mapping zwischen Zahlen und Texten herzustellen.
    Code:
    0 = keine Regeneration
    1 = Soletank füllen
    2 = Besalzen
    3 = Verdrängen
    4 = Rückspülen
    5 = Auswaschen
    Meine Items sind (einrücken bekomme ich gerade nicht hin, passt aber.):
    Code:
     softliq:
      name: SoftliQ SC18
     
    aktuelleregeneration:
     key: D_Y_5
      type: num
     mqtt_topic_in: softliq/Regenerationsschritt
     
     text:
       name: Aktueller Regenerationsschritt
       type: str
       eval_trigger: softliq.aktuelleregeneration
       eval: keineRegeneration if (sh.softliq.aktuelleregeneration()==0) else Soletankfüllen if (sh.softliq.aktuelleregeneration()==1) else Besalzen if (sh.softliq.aktuelleregeneration()==2) else Verdrängen if (sh.softliq.aktuelleregeneration()==3) else Rückspülen if (sh.softliq.aktuelleregeneration()==4) else Auswaschen
    Das "text" Element ist leider immer leer. Muss ich die in Eval genutzten Strings durch " oder ' Escapen? Wenn ich das mache, meckert er "Eval Syntax Checker" im Backend. Sind die Text so wie aktuell Variablen?
    Zuletzt geändert von Echo; 02.01.2019, 20:26. Grund: Gelöst

    #2
    Schau mal diesen Thread an...

    Du könntest Dir ggf. sogar ein Hilfsitem einrichten, wo Du in einem Dict nur die Mappings von Wert und Text hast und das Du dann im eval abrufst. So bleibt das ganze übersichtlicher.
    Jetzt ohne, das ich das getestet habe:

    Code:
    softliq:
        name: SoftliQ SC18
     
        aktuelleregeneration:
            key: D_Y_5
            type: num
            mqtt_topic_in: softliq/Regenerationsschritt
     
        text:
            name: Aktueller Regenerationsschritt
            type: str
            eval_trigger: softliq.aktuelleregeneration
            eval: sh.softliq.text.lookup()[sh.softliq.aktuelleregeneration()]
    
            lookup:
                type: dict
                initial_value: { 0 : 'keine Regeneration', 1: 'Soletank füllen', 2: 'Besalzen', 3: 'Verdrängen', 4: 'Rückspülen', 5: 'Auswaschen' }
    Zuletzt geändert von bmx; 01.01.2019, 14:42.

    Kommentar


      #3
      Cool Vielen Dank! Probiere ich gleich aus.
      Update: Und es hat funktioniert :-)
      Code:
       eval: (['keine Regeneration','Soletank füllen','Besalzen','Verdrängen','Rückspülen','Auswaschen'][int(value)])
      Zuletzt geändert von Echo; 02.01.2019, 20:26. Grund: Erfolgsmeldung

      Kommentar


        #4
        Hallo,

        hab gerade etwas ähnliches mit eval ausprobiert, jedoch finde ich den Fehler nicht, wenn ich Speicher_Status auf eine Zahl von 0 bis 6 setzte..

        Code:
        2020-05-28  16:17:20 WARNING  lib.item            Item Photovoltaik.Speicher_Status.Text: problem evaluating [sh.Photovoltaik.Speicher_Status.Text.lookup()][value]: list index out of range
        Code:
        Photovoltaik:
            Speicher_Status:
                type: num
                solaredge_listen: S_Status
                mod_write: False
                Text:
                    type: str
                    eval_trigger: Photovoltaik.Speicher_Status
                    eval: "[sh..lookup()][value]"
                    lookup:
                        type: dict
                        initial_value: "{0: 'Aus', 1: 'Standby', 2: 'Init', 3: 'Laden', 4: 'Entladen', 5: 'Fehler', 6: 'Leerlauf'}"


        ohne die Anführungszeichen beim eval
        Code:
        eval: [sh..lookup()][value]
        Code:
        2020-05-28 16:19:44 ERROR lib.shyaml YAML-file load error in /usr/local/smarthome/items/photovoltaik.yaml:
        while parsing a block mapping
        in "<unicode string>", line 143, column 13:
        type: str
        ^ (line: 143)
        expected <block end>, but found '['
        in "<unicode string>", line 145, column 33:
        eval: [sh..lookup()][value]
        ^ (line: 145)
        NOTE: Look for the error at the expected <block end>, near the second specified line number

        Kommentar


          #5
          Hi,

          versuch es mal ohne [ ]!
          Code:
          eval: "sh..lookup()[value]
          Gruß, Waldemar

          Kommentar


            #6
            Du darfst im eval keine [] um sh..lookup() angeben, und auch keine "", also

            Code:
            ...
            eval: sh..lookup()[value]
            ...
            So sollte das gehen, vergleiche auch oben das Beispiel von bmxp...

            edit: kommt davon, wenn man nicht gleich antwortet Waldemar war schneller, aber ich glaube, die "" müssen auch weg, er soll ja nicht "sh..lookup..." zurückgeben, oder?
            Zuletzt geändert von Morg; 28.05.2020, 17:06.

            Kommentar


              #7
              Hi,

              ja, ich bin mir bei yaml und " immer nicht sicher, aber es wird auf jeden Fall funktionieren, wenn keine " da sind. Ich hab ja auch die hinteren entfernt, die vorderen vergessen...

              Gruß, Waldemar

              Kommentar


                #8
                Eine Erläuterung zum Entstehen der Fehlermeldungen:

                Mit den Anführungszeichen wurde yaml angewiesen den Inhalt als String zu interpretieren. Damit war die yaml Datei gültig und der Ausdruck wurde als eval im item gespeichert. Da der Ausdruck jedoch keine gültige Python Expression war, werfolgte der WARNING Eintrag im Log.

                Bei Weglassen der Anführungszeichen versuchte yaml den Typ des Wertes zu interpretieren. Da das erste Zeichen eine eckige Klammer war, inerpretierte yaml „das ist eine Liste“. Als nach der Eckigen Klammer zu noch eine eckige Klammer kam war yaml nicht mehr in der Lage einen gültigen Typ zu erkennen (eine Liste konnte es ja nun nicht mehr sein. Deshalb kam bereits beim Einlesen der yaml Datei der Fehler.
                Zuletzt geändert von Msinn; 28.05.2020, 21:23. Grund: Typos beseitigt
                Viele Grüße
                Martin

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

                Kommentar


                  #9
                  Martin, schön erklärt. Noch eine Ergänzung:

                  Code:
                  [sh.Photovoltaik.Speicher_Status.Text.lookup()][value]: list index out of range
                  Der erste Teil ist eine Liste mit einem Element, nämlich dem Wert von ...lookup(). Die zweite Klammer wäre dann der Elementzugriff auf das Element der Liste, das dem Wert von value entspricht. Bei value = False interpretiert Python value = False als 0 und liefert das erste (Index = 0) Element zurück. Bei value = True interpretiert Python das als 1 und will das 2. Element (Index = 1) liefern - die Liste hat aber nur ein Element, also Fehler.

                  Code:
                  >>> ['xyz'][False]
                  'xyz'
                  *>>> ['xyz'][True]
                  Traceback (most recent call last):
                  File "<stdin>", line 1, in <module>
                  IndexError: list index out of range
                  >>>

                  Kommentar


                    #10
                    Danke - ohne Klammern geht es - ich hab die Klammern in der Doku gesehen und auch so übernommen. Ich dache mir schon dass mit dem eval etwas nicht stimmt. Hier weiter oben in Post 3 hätte ich es auch sehen können..


                    Enumeration über Dictionary mit Lookup-Item


                    Code:
                    aktuelleregeneration:
                        name: Aktueller Regenerationsschritt als num
                        type: num
                    
                        text:
                            name: Aktueller Regenerationsschritt als String
                            type: str
                            eval: [sh..lookup()][value]
                            eval_trigger: ..
                    
                            lookup:
                                type: dict
                                initial_value: { 0: 'keine Regeneration', 1: 'Soletank füllen', 2: 'Besalzen', 3: 'Verdrängen', 4: 'Rückspülen', 5: 'Auswaschen' }
                    Zuletzt geändert von ivande; 28.05.2020, 20:57.

                    Kommentar

                    Lädt...
                    X