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

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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


  • mumpf
    antwortet
    Hi,

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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


  • Echo
    hat ein Thema erstellt eval für strings?

    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
Lädt...
X