Ankündigung

Einklappen
Keine Ankündigung bisher.

openHab, JSON-String mit Sonderzeichen parsen

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

    openHab, JSON-String mit Sonderzeichen parsen

    Hallo Zusammen

    ich versuch derzeite meine HomePilot an openHab anzubinden. Dazu nutze ich das HTTP-Bindung und interpretiere dann die gesendeten JSON-Daten.
    Meine Rolläden habe ich damit schon gut im Griff. Jetzt möchte ich die Daten meines Rademacher-Umweltsensor auslesen und weiterverarbeiten. Mit dem Temperaturwert klappt das auch schon gut.
    Leider kann ich das Objekt für die Windgeschwinigkeit nicht ansprechen, da als Schlüsselwort dazu "Windgeschw." vergeben ist. Probleme macht mir dabei der Punkt am Ende des Schlüsselwort.

    So sieht der von der Homepilot gesendete Stream nach Eingabe von http://xxx.xxx.xxx.32/deviceajax.do?...10021&ik14bkqd aus:

    Code:
     [SIZE=12px][FONT=arial]{[/FONT][/SIZE]
      [SIZE=12px][FONT=arial]"response": "get_meter_data",[/FONT][/SIZE]
      [SIZE=12px][FONT=arial]"status": "ok",[/FONT][/SIZE]
      [SIZE=12px][FONT=arial]"data": [/FONT][/SIZE]  [SIZE=12px][FONT=arial][[/FONT][/SIZE]
      [SIZE=12px][FONT=arial]{ "Lichtwert": "1000 lx"},[/FONT][/SIZE]
      [SIZE=12px][FONT=arial]{"Windgeschw.": "5 m/s"},[/FONT][/SIZE]
      [SIZE=12px][FONT=arial]{"Temperatur": "6,0 °C"},[/FONT][/SIZE]
      [SIZE=12px][FONT=arial]{"Regen": "Erkannt"},[/FONT][/SIZE]
      [SIZE=12px][FONT=arial]{"Sonnenhöhe": "18°"},[/FONT][/SIZE]
      [SIZE=12px][FONT=arial]{"Sonnenrichtung": "Süden (201°)"},[/FONT][/SIZE]
      [SIZE=12px][FONT=arial]{"Aktualisiert": "30.01.16 – 14:16"}[/FONT][/SIZE]
      [SIZE=12px][FONT=arial]][/FONT][/SIZE]
      [SIZE=12px][FONT=arial]} [/FONT][/SIZE]
    Die Temperatur lese ich dann aus in dem ich folgende Item nutze:
    Code:
    String         StTemp_Markise             "Wetterstation [%s]"            <temperature>      { http="<[http://192.168.178.32/deviceajax.do?meter=10021&ik14bkqd:15000:JS(getWtTemp_Markise.js)]" }
    Der Code in getWtTemp_Markise.js sieht wie folgt aus
    Code:
    JSON.parse(input).data[0].Temperatur;
    Nun das Problem:
    Die Temperatur konnte ich ja über das Schlüsselwort "Temperatur" in der getWtTemp_Markise.js abfragen.
    Bei der Windgeschwindigkeit muss ich nun das Schlüsselwort "Windgeschw." verwenden.
    Dabei macht mit der Punkt am Ende von "Windgeschwindig." probleme.
    Der Aufruf in getWtWind_Markise.js sieht wie folgt aus

    Code:
    JSON.parse(input).data[0].Windgeschw.;
    Doch das führt dazu, das der gesamt JSON-String zurückgegeben wird.
    Ich habe nun einige Variation mit () oder "" ausprobiert, habe aber die Lösung nicht gefunden.

    Hat einer eine Idee wie die richtige Syntax aussehen muss?
    Zuletzt geändert von alibaba0815; 01.02.2016, 13:47.

    #2
    Wenn es nicht direkt im Items geht würde ich es in einer Rule mit StringUtils (import org.apache.commons.lang.StringUtils) versuchen, dort sollte es eine Methode .Replace geben.
    Mit dieser dann den JSON-String bearbeiten(ersetzte "Windgeschw." mit "Windgeschw").

    Kommentar


      #3
      Hallo opus42
      danke für deinen Tip.
      Wie bekomme ich denn ohne Benennung des gewünschten Objektes den gesammten von JSON zurückgegeben String in eine Stringvariable?
      Ich habe in dem JavaScript schon folgendes probiert, jedoch ohne erfolg, es kommt immer zu einer Fehlermeldung oder zur Rückgabe eines null-Zeiger.:

      Code:
      JSON.parse(input).data[0];
      // oder
      JSON.parse(input).data;
      // oder
      JSON.parse(input);

      Kommentar


        #4
        Schau mal in diesen Thread (Post# 2), dort habe ich genau das gemacht, es fehlt nur der .Replace Part.
        Moin, ich bin neu in diesem Thema und brauche mal eine generelle Richtung in der ich weiter suchen soll: Mein Ziel ist es Daten von Webseiten (3) abzurufen

        Kommentar


          #5
          Hallo opus42

          hab das nun dank der Tips wie folgt gelöst:

          Zunächst den gesamten JSON-Stream vom Rademacher-Umweltsensor auf ein String-Item eingelsen:
          Code:
          String  AbfrageUWS  "[%s]"   { http="<[http://xxx.xxx.xxx.32/deviceajax.do?meter=10021&ik14bkqd:15000:REGEX((.*))]"}
          Dann in einer Rule den String wie folgt zerlegt und die relevante Zahl in einen float umgewandelt und an das Item zur anzeige der Windgeschwindigkeit senden:
          Code:
          rule "Empfängt neuen Windgeschwindigkeitswerte vom UWS an der Markise"
          when
              Item AbfrageUWS received update
          then
              var float f
              var String s1
              var String s2
              var String[] s3
          
              // Item in String wandeln, die entscheidene Stelle darin sieht wie folgt aus: ...lx"}, {"Windgeschw.": "5 m/s"},{"Tempera......
              s1 = AbfrageUWS.state.toString
              //  String bis hinter "Windgeschw.:" abtrennen
              s3 = s1.split("Windgeschw.\":\"")
              // den Reststring holen und...
              s2 = s3.get(1)
              //  ...String bis zum "m/s" abtrennen
              s3 = s2.split("m/s")
              // übrig belieb der Geschwindigkeitswert
              f = Float::parseFloat(s3.get(0))      
              // und an Item übergeben
              postUpdate(NrWind_Markise,f)
          end
          Danke für deine Tips, weiter so.
          Zuletzt geändert von alibaba0815; 06.02.2016, 19:10.

          Kommentar


            #6
            Hallo Zusammen,
            habe auch Rademacher Rolladenmotoren und wollte fragen mit welchem Homepilot ihr es hinbekommen haltbar, oder ob beide gehen. Bzw. welcher sinnvoller ist.

            ​Danke Rainer

            Kommentar


              #7
              Hallo Rainer
              ich verwende eine HomePilot 1. Das Thema oben bezieht sich auch darauf. Zur HomePilot 2 kann dir leider nichts sagen.
              Gruß Andreas

              Kommentar

              Lädt...
              X