NEWS
Umlaute im json Element
-
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ß
-
Hey,
Probier Mal so…
myJson.data[1]["Windgeschw."]
-
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
-
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?
-
@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
:).