Ankündigung

Einklappen
Keine Ankündigung bisher.

Fehler bei eval mit String?

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

    Fehler bei eval mit String?

    Moin,

    das Thema ergab sich im SV-Forum, aber mittlerweile muss ich ein sh.ng-Problem lösen, also verschiebe ich das mal hierher

    Ich habe versucht, ein Item, was eine URL enthält (wir durch ein Plugin verändert) mit einem eval in einen kompletten HTML-IMG-Tag umzuschreiben. Dazu habe ich folgende Item-Konfiguration:

    Code:
          albumart:
            type: str
            yamahayxc_cmd: albumart
    
          albumarturl:
            type: str
            visu_acl: rw
            eval: '<img class="ui-corner-all" id="albumImage" src="'+sh.dg.bad.wxbad.albumart()+'" />'
            eval_trigger: dg.bad.wxbad.albumart
    Das gibt folgende Fehlermeldung beim Laden:

    Code:
    2018-01-21 10:24:27 INFO        shyaml       Main         Loading '/usr/local/sh-1.4.2/smarthome/items/media.yaml' to 'OrderedDict' -- shyaml.py:yaml_load:86
    2018-01-21 10:24:28 ERROR    shyaml       Main         YAML-file load error in /usr/local/sh-1.4.2/smarthome/items/media.yaml:
    while parsing a block mapping
      in "<unicode string>", line 79, column 9:
                type: str
                ^ (line: 79)
    expected <block end>, but found '<scalar>'
      in "<unicode string>", line 83, column 65:
         ... rner-all" id="albumImage" src="'+sh.dg.bad.wxbad.albumart+'" />'
                                                                ^ (line: 83) -- shyaml.py:yaml_load:109
    Das "^"-Zeichen ist unter dem "+" vor sh.dg.bad.....

    Ich verstehe auch das "expected block end" nicht - er erwartet an der Stelle ein Anweisungs-/Zeilenende, weil er das + nicht interpretieren kann? Wenn das ein Python-Ausdruck ist, sollte er das doch lesen können (das ursprüngliche Beispiel war im alten Conf-Format geschrieben und soll wohl funktionieren).

    #2
    Das hat erstmal überhaupt nichts mit eval zu tun.

    Die Fehlermeldung
    Code:
     
     2018-01-21 10:24:28 ERROR    shyaml       Main         YAML-file load error in /usr/local/sh-1.4.2/smarthome/items/media.yaml:
    sagt Dir, dass Deine yaml Datei einen invaliden Syntax hat und nicht geladen werden konnte. Dadurch werden alle Inhalte dieser einen yaml Datei nicht geladen.

    Aus den von Dir gepoststen Schnipseln kann ich leider nicht mehr schließen.
    Viele Grüße
    Martin

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

    Kommentar


      #3
      Der erste Schnipsel ist ja der relevante Teil aus der Fehlermeldung. Die Zeile mit dem eval-Ausdruck verursacht den Fehler. Ich verstehe den Fehler aber nicht - also, ich verstehe nicht, wieso er da einen Fehler meldet. Wahrscheinlich stimmt die Syntax des Ausdrucks nicht. Ich habe aber bisher keine anderen Beispiele (im yaml-Format) gefunden, aus denen ich eine passende Syntax für strings hätte schließen können.

      Was brauchst du denn ggf. noch für Informationen? Ich kann die gesamte yaml-Datei einstellen, aber vor dem Hinzufügen des o.a. Items mit der eval-Zeile lief das alles problemlos.
      Bei der Fehlermeldung kamen vorher und hinterher nur weitere (unauffällige) Statusmeldungen vom Prozessstart, die zum o.a. Fehler keinen Bezug haben.

      Kommentar


        #4
        Zitat von Morg Beitrag anzeigen
        Der erste Schnipsel ist ja der relevante Teil aus der Fehlermeldung.
        Das kann ich aus dem Schnipsel nicht sehen. Theoretisch könnte der Fehler in der YAML Datei ganz wo anders liegen und sie wird dann komplett nicht eingelesen.

        Der Syntax des Ausdrucks wird beim Einlesen der YAML Datei überhaupt noch nicht geprüft. Wie gesagt: Es hat erstmal NICHTS mit eval zu tun.

        Zitat von Morg Beitrag anzeigen
        Was brauchst du denn ggf. noch für Informationen?
        Die komplette YAML Dateien wären hilfreich. Evtl. auch ein größerer Ausschnitt as dem Log.

        Zitat von Morg Beitrag anzeigen
        aber vor dem Hinzufügen des o.a. Items mit der eval-Zeile lief das alles problemlos.
        Wie gesagt: Es ist kein eval Fehler sondern ein yaml Fehler.
        Viele Grüße
        Martin

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

        Kommentar


          #5
          Die YAML-Datei: (media.yaml)

          Code:
          %YAML 1.1
          ---
          
          dg:
          
            bad:
              wxbad:
                yamahayxc_host: wx-bad
                yamahayxc_zone: main
          
                power:
                  type: bool
                  yamahayxc_cmd: power
                  enforce_updates: 'True'
          
                volume:
                  type: num
                  yamahayxc_cmd: volume
                  enforce_updates: 'True'
          
                mute:
                  type: bool
                  yamahayxc_cmd: mute
                  enforce_updates: 'True'
          
                input:
                  type: str
                  yamahayxc_cmd: input
                  enforce_updates: 'True'
          
                track:
                  type: str
                  yamahayxc_cmd: track
          
                albumart:
                  type: str
                  yamahayxc_cmd: albumart
          
                albumarturl:
                  type: str
                  visu_acl: rw
                  eval: '<img class="ui-corner-all" id="albumImage" src="' + sh.dg.bad.wxbad.albumart() + '" />'
                  eval_trigger: dg.bad.wxbad.albumart
          
                update:
                  type: bool
                  yamahayxc_cmd: state
                  enforce_updates: 'True'
          
                artist:
                  type: str
                  yamahayxc_cmd: artist
          
                curtime:
                  type: num
                  yamahayxc_cmd: play_time
          
                totaltime:
                  type: num
                  yamahayxc_cmd: total_time
          
                playback:
                  type: str
                  yamahayxc_cmd: playback
                  enforce_updates: 'True'

          Ein kleines bisschen mehr Kontext für den Fehler (bewusst vorn und hinten Zeilen, die sich nicht auf die media.yaml beziehen:
          Code:
          2018-01-22 17:31:57 DEBUG    scheduler    Scheduler    KNX[default] time_default next time: 2018-01-22 17:32:57+01:00 -- scheduler.py:_next_time:385
          2018-01-22 17:31:57 DEBUG    config       Main         parse_yaml: Add filename = haustechnik.yaml to items -- config.py:parse_yaml:306
          2018-01-22 17:31:57 DEBUG    config       Main         parse_yaml: Parsing file media.yaml -- config.py:parse_yaml:293
          2018-01-22 17:31:57 INFO     shyaml       Main         Loading '/usr/local/sh-1.4.2/smarthome/items/media.yaml' to 'OrderedDict' -- shyaml.py:yaml_load:86
          2018-01-22 17:31:58 ERROR    shyaml       Main         YAML-file load error in /usr/local/sh-1.4.2/smarthome/items/media.yaml:
          while parsing a block mapping
            in "<unicode string>", line 79, column 9:
                      type: str
                      ^ (line: 79)
          expected <block end>, but found '<scalar>'
            in "<unicode string>", line 83, column 66:
               ... ner-all" id="albumImage" src="' + sh.dg.bad.wxbad.albumart() + ' ...
                                                   ^ (line: 83) -- shyaml.py:yaml_load:109
          2018-01-22 17:31:58 DEBUG    config       Main         parse_yaml: Parsing file rooms.yaml -- config.py:parse_yaml:293
          2018-01-22 17:31:58 INFO     shyaml       Main         Loading '/usr/local/sh-1.4.2/smarthome/items/rooms.yaml' to 'OrderedDict' -- shyaml.py:yaml_load:86
          2018-01-22 17:32:20 DEBUG    config       Main         parse_yaml: Add filename = rooms.yaml to items -- config.py:parse_yaml:306
          2018-01-22 17:32:20 DEBUG    __init__     Main         Adding listener on: udp:0.0.0.0:42000 -- __init__.py:add_listener:156
          Das ganze Fehlerlog bis x + 3 Seiten weiter gibts bei Bedarf hier: https://pastebin.com/S4HgG3kM, obiger Ausschnitt beginnt bei Zeile 194.

          Kommentar


            #6
            Wie kann es sein, das Deine media.yaml oben nur 65 Zeilen hat aber Fehler in line 79 und line 83 auftreten?

            Und was ist mit
            Code:
             2018-01-22 17:31:52 ERROR shyaml Main YAML-file load error in /usr/local/sh-1.4.2/smarthome/items/._media.yaml:
            'utf-8' codec can't decode byte 0xb0 in position 37: invalid start byte -- shyaml.py:yaml_load:109

            Kommentar


              #7
              Das erste ist eine gute Frage, die ich nicht beantworten kann. Keine Ahnung. Die Stelle, die im Fehlercode angezeigt wird, ist aus der Datei - aber wie der auf die Zeilennummern kommt, weiß ich wirklich nicht.

              Die zweite Datei (._media.yaml) war eine temporäre Datei von meinem Editor, weil ich die media.yaml noch offen hatte, als ich sh.py gestartet habe. Das Log sah vorher entsprechend aus, nur ohne den Verweis auf die ._media.yaml. Sorry dafür.

              Gerade nochmal gecheckt: die Fehlermeldung ist identisch dieselbe, wenn ich die ._media.yaml gelöscht habe.

              Kommentar


                #8
                Wenn das eval wirklich der Ursprung der Fehlermeldung ist, könntest Du mal versuchen das umzuschreiben?

                Evtl.
                Code:
                eval: '<img class="ui-corner-all" id="albumImage" src="'+sh.dg.bad.wxbad.albumart()+'" />'
                ändern in

                Code:
                eval: '<img class="ui-corner-all" id="albumImage" src="{}" />'.format(sh.dg.bad.wxbad.albumart())

                Kommentar


                  #9
                  Derselbe Fehler, das Caret steht unter dem Punkt hinter dem String.

                  Wenn ich nur

                  Code:
                          eval: sh.dg.bad.wxbad.albumart()
                  oder

                  Code:
                          eval: '<img class="ui-corner-all" id="albumImage" src="{}" />'
                  angebe, läuft es ohne Fehlermeldungen. Das Item wird korrekt gesetzt, der eval-Trigger funktioniert auch (im ersten Fall, im zweiten tut sich ja nix).

                  Ich komme immer noch nicht um die Befürchtung herum, dass es am Ausdruck in der eval-Zeile hängt - aber ich habe keine Ahnung, wieso. Eigentlich ist es (sind es beides) gültige Python-Ausdrücke, die manuell im Python-Interpreter auch problemlos evaluieren (wenn ich den Objektaufruf durch eine str-Variable ersetze).

                  Gibt es ggf. Einschränkungen im yaml-Parser, der keine zusammengesetzten Ausdrücke verarbeiten kann? Bin nicht sicher, ob ich das beim Lesen der Doku richtig verstanden habe; aber brauche ich ein extra Modul, damit er mathematische Ausdrücke verarbeitet?

                  Kommentar


                    #10
                    Es könnte sein, das der yaml Parser da einfach Probleme mit hat. Vielleicht muß man etwas tiefer in die Trickkiste greifen. Probier mal ob
                    Code:
                    eval: "'<img class=\"ui-corner-all\" id=\"albumImage\" src=\"{}\" />'.format(sh.dg.bad.wxbad.albumart())"
                    geht.

                    Kommentar


                      #11
                      Super, das hat funktioniert. Ganz herzlichen Dank - auf die Idee, den Python-Ausdruck komplett als string zu kapseln, bin ich auch nicht gekommen.

                      Merke: yaml kann nur "ganze" Strings

                      Kommentar

                      Lädt...
                      X