Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Umlaute im json Element

NEWS

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    22
    1
    1.2k

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.2k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    14
    1
    2.4k

Umlaute im json Element

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
5 Beiträge 3 Kommentatoren 1.9k Aufrufe
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • I Offline
    I Offline
    ioAli
    schrieb am zuletzt editiert von
    #1

    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 Antwort Letzte Antwort
    0
    • blauholstenB Offline
      blauholstenB Offline
      blauholsten
      Developer
      schrieb am zuletzt editiert von
      #2

      Hey,

      Probier Mal so…

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

      Entwickler vom: - Viessman Adapter
      - Alarm Adapter

      1 Antwort Letzte Antwort
      0
      • P Offline
        P Offline
        pix
        schrieb am zuletzt editiert von
        #3

        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

        ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

        1 Antwort Letzte Antwort
        0
        • I Offline
          I Offline
          ioAli
          schrieb am zuletzt editiert von
          #4

          @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 Antwort Letzte Antwort
          0
          • I Offline
            I Offline
            ioAli
            schrieb am zuletzt editiert von
            #5

            @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 Antwort Letzte Antwort
            0
            Antworten
            • In einem neuen Thema antworten
            Anmelden zum Antworten
            • Älteste zuerst
            • Neuste zuerst
            • Meiste Stimmen


            Support us

            ioBroker
            Community Adapters
            Donate

            798

            Online

            32.5k

            Benutzer

            81.7k

            Themen

            1.3m

            Beiträge
            Community
            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
            ioBroker Community 2014-2025
            logo
            • Anmelden

            • Du hast noch kein Konto? Registrieren

            • Anmelden oder registrieren, um zu suchen
            • Erster Beitrag
              Letzter Beitrag
            0
            • Home
            • Aktuell
            • Tags
            • Ungelesen 0
            • Kategorien
            • Unreplied
            • Beliebt
            • GitHub
            • Docu
            • Hilfe