Ankündigung

Einklappen
Keine Ankündigung bisher.

YAML, Item Konfiguration, eigener Type mit Sonderzeichen - Wie

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

    YAML, Item Konfiguration, eigener Type mit Sonderzeichen - Wie

    Hallo,

    ich stelle nun noch die letzten Items auf das YAML Format um. Klappt alles prima, bis auf einen Sonderfall.

    Ich habe eine Logic, mit der der ich via ssh den Status meiner NAS abfrage. Dazu werden die jeweiligen ssh Befehle als spezieller type des jeweiligen Items definiert.
    Beispiel:
    nas.yaml
    Code:
            temp:
                type: list
                ssh_cmd_pull: i2cget -y 0x0 0x0a 0x07 | xargs printf '%d\n'
                cache: 'yes'
    
                num:
                    type: num
                    eval: sh.ssh.nsa325.temp()[0]
                    eval_trigger: ssh.nsa325.temp
    
            cooler:
                type: list
                ssh_cmd_pull: i2cget -y 0x0 0x0a 0x08 | xargs printf '%d\n'
                cache: 'yes'
    
                num:
                    type: num
                    eval: sh.ssh.nsa325.cooler()[0]
                    eval_trigger: ssh.nsa325.cooler
    Nun sind in den ssh Befehlen Sonderzeichen enthalten, die nach YAML so nicht erlaubt sind. Zum einen ist dort | enthalten, zum anderen auch das %.


    Der entsprechende Teil der Logic sieht so aus:
    Code:
    if trigger['by'] == 'Scheduler':   # scheduler / cycle
        for item in sh.find_items('ssh_cmd_pull'):    # findet alle Items die ein Attribut 'ssh_cmd_pull' besitzen und führe cmd auf remote host aus
            cmd = item.conf['ssh_cmd_pull']
            if isinstance(cmd, list):
                cmd = "'"+' | '.join(cmd)+"'"
            host = item.return_parent().conf['ssh_host']
            stdin, stdout, stderr = ssh[host].exec_command(cmd)
            res = stdout.readlines()
            logger.debug("Logik SSH_Server : {0} : {1}".format(cmd, res) )
            item(res[0].split(' '))
    
    elif trigger['by'] == 'Item':  # watchitem
        item = sh.return_item(trigger['source'])
        cmd = item.conf['ssh_cmd_push']
        host = item.return_parent().conf['ssh_host']
        stdin, stdout, stderr = ssh[host].exec_command(cmd)
        stdout.readlines()
        logger.debug("Logik SSH_Server : cmd_push: " + cmd)
        item(0)
    Wie kann ich das umstellen bzw. kann man die ssh Befehle in irgendwas einpacken, so dass YAML das akzeptiert?

    Danke für Eure Rückmeldung.

    #2
    Hi,

    setze den gesamten Wert in Anführungszeichen ("), dann sollte es gehen.

    Gruß Waldemar
    OpenKNX www.openknx.de

    Kommentar


      #3
      mumpf

      Hallo Waldemar,

      danke für die schnelle Antwort. Hab es gleich getestet. Ist schon besser, reicht aber noch nicht.

      Bei diesem Befehlt kommt noch ein Fehler:
      Code:
              interface:
                  type: list
                  ssh_cmd_pull: "cat /proc/net/dev | grep vlan1 | cut -d: -f2 | tr -s " " | cut -d" " -f1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16"
                  cache: 'yes'

      Logeintrag.
      Code:
      while parsing a block mapping
        in "<unicode string>", line 177, column 13:
                      type: list
                      ^ (line: 177)
      expected <block end>, but found '<scalar>'
        in "<unicode string>", line 179, column 83:
           ... p vlan1 | cut -d: -f2 | tr -s " " | cut -d" " -f1,2,3,4,5,6,7,8, ... 
                                               ^ (line: 179)
      Fällt Dir noch was ein?

      Kommentar


        #4
        hilft der conf yaml converter im backend da nicht?

        Kommentar


          #5
          psilo

          Leider nicht!

          conf:
          Code:
                  [[[temp]]]
                      type = list
                      ssh_cmd_pull = 'i2cget -y 0x0 0x0a 0x07 | xargs printf '%d\n''
                      cache = yes
                      [[[[num]]]]
                          type = num
                          eval = sh.ssh.nsa325.temp()[0]
                          eval_trigger = ssh.nsa325.temp
          yaml:
          Code:
          %YAML 1.1
          ---
          
          temp:
              type: list
              ssh_cmd_pull:
                - "'i2cget -y 0x0 0x0a 0x07"
                - xargs printf '%d\n''
              cache: 'yes'
          
              num:
                  type: num
                  eval: sh.ssh.nsa325.temp()[0]
                  eval_trigger: ssh.nsa325.temp

          Kommentar


            #6
            Vielleicht ein Zeichensatzproblem speicherst du mit utf8 ab?

            Kommentar


              #7
              Zitat von Sisamiwe Beitrag anzeigen
              Fällt Dir noch was ein?
              Klar! In der Zeile hast Du ja schon Anführungsstriche, da musst Du dann eben Hochkommata (') außen rum setzen.

              Gruß, Waldemar

              P.S.: Was alles möglich ist (bzw. sein sollte, denn es hängt vom verwendeten YAML-Parser ab), findest Du mit Google unter dem Stichwort "yaml escape character".
              OpenKNX www.openknx.de

              Kommentar


                #8
                Soll in der CONF der Eintrag eine Liste sein? So wird der Eintrag eingelesen. Wenn nicht, versuch mal folgends:

                Gib den String mal in den Converter im Backend ein und ersetzte dabei den senkrechten Strich durch ein anderes Zeichen (z.B. #)

                Im Ergebnis der Konvertierung ersetze # wieder durch dn senkrechten Strich und trage das in die YAML Datei ein.
                Viele Grüße
                Martin

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

                Kommentar


                  #9
                  Alternativ könnte es auch funktionieren den senkrechten Strich in der CONF Version zu escapen (also \| )
                  Viele Grüße
                  Martin

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

                  Kommentar


                    #10
                    Hallo,

                    so nun geht es. Funktioniert tut eine Mischung aus allen Kommentaren.
                    Der String muss in quotes gesetzt werden und es funktionieren ' oder auch ", wichtig ist nur, dass dieses Zeichnen nicht schon nativ in dem String ist.

                    DANKE.

                    Kommentar

                    Lädt...
                    X