Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Umlaute im json Element

    NEWS

    • ioBroker goes Matter ... Matter Adapter in Stable

    • 15. 05. Wartungsarbeiten am ioBroker Forum

    • Monatsrückblick - April 2025

    Umlaute im json Element

    This topic has been deleted. Only users with topic management privileges can see it.
    • I
      ioAli last edited by

      Hallo zusammen

      mir haben schon so einige Tips und Themen hier im Forum bei meiner Hausautomation weitergeholfen.

      Doch nun stehe ich an einer Stelle wo ich nicht weiterkomme.

      Ich möchte die Messwerte von meinem Rademacher Umweltsensor auslesen.

      Der Umweltsensor ist in dem Homepilot-Adapter noch nicht implementiert,

      daher versuche ich es über eine json-Anfrage.

      Mit etwas probieren (Wireshark sei Dank) habe ich rausgefunden das mit

      http://192.168.178.156/deviceajax.do?meter=10022&j6b3jkfg 
      

      die Wetterdaten wie folgt zurükgegeben werden:

      ! ````
      {
      "response": "get_meter_data",
      "status": "ok",
      "data": [
      {
      "Lichtwert": "16 lx"
      },
      {
      "Windgeschw.": "0 m/s"
      },
      {
      "Temperatur": "16.7 °C"
      },
      {
      "Regen": "Nicht erkannt"
      },
      {
      "Sonnenhöhe": "1°"
      },
      {
      "Sonnenrichtung": "Westen (294°)"
      },
      {
      "Aktualisiert": "13.08.17 - 21:20"
      }
      ]
      }

      
      Ursprünglich wollte ich diese Rückgabe mit dem Parse-Adapter bearbeiten, jedoch hat das nicht funktioniert.
      
      Obwohl ich den RegEx-String auf RegEx101ermittelt und getestet hatte bekam ich kein Ergebnis.
      
      Aufgefallen war mir, das der eingegeben RegEx-String in den EIgenschaften des Opjektes nicht vollständig angezeigt wurde.
      
      Nun habe ich mich entschieden den String in einem Scrips mit readjson() selber auszuwerten. Das funktioniert mit folgendem Script soweit auch ganz gut:
      
      >! ````
      var request = require("request");
      >! var myJson = {};
      >! var pfad = "Umweltsensor.";
      >! var idLichtwert         = pfad + "Lichtwert";
      var idWindgeschw        = pfad + "Windgeschw";
      var idTemperatur        = pfad + "Temperatur";
      var idRegen             = pfad + "Regen";
      var idSonnenhoehe       = pfad + "Sonnenhöhe";
      var idSonnenrichtung    = pfad + "Sonnenrichtung";
      var idAktualisiert      = pfad + "Aktualisiert";
      >! createState(idLichtwert, 0, {
          name: 'Lichtwert',
          desc: 'Helligkeit',
          type: 'string',
          role: 'value',
          unit: ''
      });
      >! createState(idWindgeschw, 0, {
          name: 'Windgeschwindigkeit',
          desc: 'Windgeschwindigkeit',
          type: 'string',
          role: 'value',
          unit: ''
      });
      >! createState(idTemperatur, 0, {
          name: 'Außentemperatur',
          desc: 'Temperatur',
          type: 'string',
          role: 'value',
          unit: ''
      });
      >! createState(idRegen, 0, {
          name: 'Regen',
          desc: 'Regen',
          type: 'string',
          role: 'value',
          unit: ''
      });
      >! createState(idSonnenhoehe, 0, {
          name: 'Sonnenhöhe',
          desc: 'Sonnenhöhe',
          type: 'string',
          role: 'value',
          unit: ''
      });
      >! createState(idSonnenrichtung, 0, {
          name: 'Sonnenrichtung',
          desc: 'Sonnenrichtung',
          type: 'string',
          role: 'value',
          unit: ''
      });
      >! createState(idAktualisiert, 0, {
          name: 'Aktualisiert',
          desc: 'Aktualisiert',
          type: 'string',
          role: 'value',
          unit: ''
      });
      >! function parseJson(text) {
          if (text === "") return {};
          try {
              json = JSON.parse(text);
          } catch (ex) {
              json = {};
          }
          if(!json) json = {};
          return json;
      }
      >! function readJson(url, callback) {
          request(url, function (err, state, body){
              if (body) {
                  var json = parseJson(body);
                  callback(null, json);
              } else {
                  var error = "(" + err + ") ERROR bei Abfrage von: " + url;
                  log(error, "warn");  
                  callback(error, null);
              }
          });
      }
      >! var url = 'http://192.168.178.156/deviceajax.do?meter=10022&j6b3jkfg';
      >! function main() {
          log("Main");
          readJson(url, function(err,json) {
              if(!err) {
                  myJson = json;
                  log("Lichtwert:     " + myJson.data[0].Lichtwert,"info");
                  log("Windgeschw.:   " + myJson.data[1].Windgeschw,"info");
                  log("Temperatur:    " + myJson.data[2].Temperatur,"info");
                  log("Regen:         " + myJson.data[3].Regen,"info");
                  log("Sonnenhöhe:    " + myJson.data[4].Sonnenhoehe,"info");
                  log("Sonnenrichtung:" + myJson.data[5].Sonnenrichtung,"info");
                  log("Aktualisiert:  " + myJson.data[6].Aktualisiert,"info");
                  setState(idLichtwert,       myJson.data[0].Lichtwert);
                  setState(idWindgeschw,      myJson.data[1].Windgeschw);
                  setState(idTemperatur,      myJson.data[2].Temperatur);
                  setState(idRegen,           myJson.data[3].Regen);
                  setState(idSonnenhoehe,     myJson.data[4].Sonnenhoehe);
                  setState(idSonnenrichtung,  myJson.data[5].Sonnenrichtung);
                  setState(idAktualisiert,    myJson.data[6].Aktualisiert);
              } else {
                  log("Fehler beim Auslesen des JSON. Keine Daten erhalten.","warn");
                  myJson = {};
              }
          });
      }
      >! schedule("*/3 * * * * *", function () { // alle 10 Minuten die Werte abfragen
          main();
      });
      >! // Beim Skriptstart die Werte abfragen
      setTimeout(main,500);
      >! ````
      
      Nur das Elemente "Sonnenhöhe" bekomme ich wg. dem Umlaut und das Element "Windgeschw." wg. dem Punkt am Ende nicht adressiert.
      
      Der Code müsste ja wie fogt aussehen:
      
             setState(idWindgeschw,      myJson.data[1].Windgeschw.); // Punkt am Ende geht nicht
             setState(idSonnenhoehe,     myJson.data[4].Sonnenhöhe);  // ö geht nicht
      
      
      Wie kann ich auf die beiden Elemente zugreifen?
      
      Mir fehlt noch die Erfahrung mit der Scriptprogrammierung. Vielleicht gibt es auch einen einfacheren Weg?
      
      Gruß
      1 Reply Last reply Reply Quote 0
      • blauholsten
        blauholsten Developer last edited by

        Hey,

        Probier Mal so…

        myJson.data[1]["Windgeschw."]      
        
        1 Reply Last reply Reply Quote 0
        • P
          pix last edited by

          Hallo,

          du könntest vor der Auswertung in der JSON die Umlaute mit regex ersetzen.

          function parseJson(text) {
              if (text === "") return {};
              text_korrekt = text.replace(/ö/,"oe"); // <---- Umlaut ö ersetzen
              try {
                  json = JSON.parse(text_korrekt); // <--- bereinigten text in Objekt wandeln
              } catch (ex) {
                  json = {};
              }
              if(!json) json = {};
              return json;
          }
          
          

          Bei der weiteren Auswertung musst du natürlich dann auch "Sonnenhoehe" mit "oe" und nicht mehr mit "ö" schreiben.

          Weiterhin ist es natürlich auch wünschenswert, Zahlenwerte ohne Einheit in die ioBroker Objekte zu schreiben. So lässt sich über den History Adapter auch eine Datenbasis für Diagramme schaffen. Zur Zeit werden die Werte als String gespeichert. Um das zu erreichen kannst du innerhalb von setState noch parseInt() oder parseFloat() verwenden. Dann sind aber die "Typen" in createState() noch von "string" auch "number" zu ändern und die "unit" entsprechend zu setzen ("°C" oder "m/s").

          Gruß

          Pix

          1 Reply Last reply Reply Quote 0
          • I
            ioAli last edited by

            @blauholsten:

            Hey,

            Probier Mal so…

            myJson.data[1]["Windgeschw."]      
            ```` `  
            

            Hallo blauholsten

            super, hat funktioniert. 🙂 🙂

            Ich stehe noch an den Anfängen der Javascript-Programmierung.

            Habe früher c++ in programmiert, mit dem Adressieren ( wann eckige oder runde oder geschweifte Klammern, mit und ohnen "") tue ich mich noch schwer.

            Wo finde ich den gute Grundlagen-Informationen mit Beispielen zur Adressierung?

            1 Reply Last reply Reply Quote 0
            • I
              ioAli last edited by

              @pix:

              Weiterhin ist es natürlich auch wünschenswert, Zahlenwerte ohne Einheit in die ioBroker Objekte zu schreiben. So lässt sich über den History Adapter auch eine Datenbasis für Diagramme schaffen. Zur Zeit werden die Werte als String gespeichert. Um das zu erreichen kannst du innerhalb von setState noch parseInt() oder parseFloat() verwenden. Dann sind aber die "Typen" in createState() noch von "string" auch "number" zu ändern und die "unit" entsprechend zu setzen ("°C" oder "m/s").

              Gruß

              Pix `

              Hallo Pix,

              danke für deinen Hinweis, hat funtioniert 🙂 :).

              1 Reply Last reply Reply Quote 0
              • First post
                Last post

              Support us

              ioBroker
              Community Adapters
              Donate

              502
              Online

              31.6k
              Users

              79.5k
              Topics

              1.3m
              Posts

              3
              5
              1715
              Loading More Posts
              • Oldest to Newest
              • Newest to Oldest
              • Most Votes
              Reply
              • Reply as topic
              Log in to reply
              Community
              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
              The ioBroker Community 2014-2023
              logo