NEWS
[GELÖST] Homepilot Umweltsensor mit Javascript auslesen
-
Hallo zusammen,
ich habe ein regex Problem :-) Vielleicht kann nir ja jemand helfen …
{ "response" : "get_meter_data", "status" : "ok", "data":[{"Lichtwert":"41000 lx"},{"Windgeschw.":"0 m/s"},{"Temperatur":"18.7 °C"},{"Regen":"Nicht erkannt"},{"Sonnenhöhe":"21°"},{"Sonnenrichtung":"Osten (93°)"},{"Aktualisiert":"15.08.18 - 08:55"}] }Aus obiger Ausgabe benötige ich die Sonnenrichtung, aber nur die Gradzahl ohne das Gradzeichen° - Der Regex Sonnenrichtung":"(.*°.) holt den kompletten teil zusammen mit der Himmelsrichtung heraus, ich kann von da aber irgendwie nichts ableiten wie ich nur an die Zahl komme :-( Ich hatte eine Lösung mit Punkten, das funktioniert aber nicht zu 100% weil:
-
Es gibt Norden, Süden, Westen, Osten und alle dazugehörigen zwischenrichtungen wie Nord-Osten usw… d.H die Länge ändert sich ständig
-
Die Gradzahl ist 1° 10° 100° und nicht mit NULLEN aufgefüllt. Auch hier gibt es dann 3 verschiedene Längen an Zahl ...
Kann mir da jemand behilflich sein ?
UPDATE:
Hier ist das Script das in Zusammenarbiet (naja ... er hat es gemacht ... :D ) mit Paul53 herausgekommen ist. Vielen dank dafür !
const request = require('request'); const link = 'http://192.168.1.180/deviceajax.do?meter=1010005'; //homepilot ID & IP eintragen // Datenpunkte erzeugen createState('Homepilot.Sonnenrichtung', 0, {type: 'number', unit: '°'}); createState('Homepilot.Sonnenhöhe', 0, {type: 'number', unit: '°'}); createState('Homepilot.Lichtwert', 0, {type: 'number', unit: 'lux'}); createState('Homepilot.Windgeschwindigkeit', 0, {type: 'number', unit: 'm/s'}); createState('Homepilot.Temperatur', 0, {type: 'number', unit: '°C'}); createState('Homepilot.Regen', 0, {type: 'boolean', unit: ''}); createState('Homepilot.Aktualisiert', 0, {type: 'string', unit: ''}); function sensordaten() { request(link, function(error,response, body) { if(error) log('Fehler request: ' + error, 'error'); else { var data = JSON.parse(body).data; var dir = data[5].Sonnenrichtung; dir = parseFloat(dir.substr(dir.indexOf('(') + 1)); setState('Homepilot.Sonnenrichtung', dir, true); var ele = parseFloat(data[4].Sonnenhöhe); setState('Homepilot.Sonnenhöhe', ele, true); var lux = parseFloat(data[0].Lichtwert); setState('Homepilot.Lichtwert', lux, true); var wind = parseFloat(data[1]['Windgeschw.']); setState('Homepilot.Windgeschwindigkeit', wind, true); var temp = parseFloat(data[2].Temperatur); setState('Homepilot.Temperatur', temp, true); var regen = data[3].Regen; // Das ist ein String ! if(regen == 'Nicht erkannt') setState('Homepilot.Regen', false, true); else setState('Homepilot.Regen', true, true); var aktualisiert = data[6].Aktualisiert; // Das ist ein String ! setState('Homepilot.Aktualisiert', aktualisiert, true); } }); } schedule('*/30 * * * * *', sensordaten); // alle 30 SekundenViele grüße,
Marc
-
-
Ich hatte eine Lösung mit Punkten, das funktioniert aber nicht zu 100% weil:
- Es gibt Norden, Süden, Westen, Osten und alle dazugehörigen zwischenrichtungen wie Nord-Osten usw… d.H die Länge ändert sich ständig `
Vorschlag:
var dir = obj.data[5].Sonnenrichtung; dir = parseFloat(dir.substr(dir.indexOf('(') + 1)); - Es gibt Norden, Süden, Westen, Osten und alle dazugehörigen zwischenrichtungen wie Nord-Osten usw… d.H die Länge ändert sich ständig `
-
-
-
Mit Blockly ist es sehr umständlich. Besser direkt mit Javascript.
const request = require('request'); const link = 'http://...'; function wetter() { request(link, function(error,response, body) { if(error) log('Fehler request: ' + error, 'error'); else { var data = JSON.parse(body).data; var dir = data[5].Sonnenrichtung; dir = parseFloat(dir.substr(dir.indexOf('(') + 1)); // Verwendung von dir (setState()) var ele = parseFloat(data[4].Sonnenhöhe); // Verwendung von ele } }); } wetter(); // Skriptstart -
Vielen Dank auch dafür :-)
Habe ich jetzt am laufen - kann es aber nirgenswo sehen … Wo steht das Ergebnis ? Und wenn ich den Code richtig deute kommen ja auch 2 Variablen dabei raus - Sonnenstand -und höhe
Für Blocky habe ich mir eine Abfrage gemacht und den Sonnenstand mit Start und Ende als Variable gesetzt. Jetzt muss ich das Ergebnis aus dem Script damit abgleichen, also das Wergebnis als Wert aufrufen ...
Ich hätte vielleicht auch noch erwähnen sollen das ich ein lernwilliger blutiger Anfänger bin :lol:
12:45:42.864 [info] javascript.0 Start javascript script.js.sonnenhoehe
12:45:42.864 [error] javascript.0 script.js.sonnenhoehe compile failed: at script.js.sonnenhoehe:1
-
Wo steht das Ergebnis ? Und wenn ich den Code richtig deute kommen ja auch 2 Variablen dabei raus - Sonnenstand -und höhe `
Um die Werte weiter zu verwenden / anzuzeigen müssen sie in Datenpunkte vom Typ "Zahl" (number) geschrieben werden.const request = require('request'); const link = 'http://...'; // Datenpunkte erzeugen createState('Sonnenstand.Richtung', 0, {type: 'number', unit: '°'}); createState('Sonnenstand.Höhe', 0, {type: 'number', unit: '°'}); function wetter() { request(link, function(error,response, body) { if(error) log('Fehler request: ' + error, 'error'); else { var data = JSON.parse(body).data; var dir = data[5].Sonnenrichtung; dir = parseFloat(dir.substr(dir.indexOf('(') + 1)); setState('Sonnenstand.Richtung', dir, true); var ele = parseFloat(data[4]['Sonnenhöhe']); setState('Sonnenstand.Höhe', ele, true); } }); } schedule('* * * * *', wetter); // jede Minute -
Ich kann keinen Fehler sehen … `
Ich auch nicht :oDu hast hoffentlich das Skript nicht unter der Gruppe global erstellt ?
EDIT: Habe .Sonnenhöhe wegen des Umlautes gegen ['Sonnenhöhe'] getauscht, da Javascript es zwar mit der Punktnotation richtig ausführt, aber der Editor meckert.
-
OK, der Fehler war mein Fehler ! Ursprünglich in global erstellt, dann aber geändert. Schien aber trotzdem irgendwie noch gehangen zu haben. ich habe es gelöscht und frisch einfefügt, kein fehler mehr …
Aber wo kann ich denn jetzt die states sehen ? Ich finde die einfach nicht ... :roll:
-
Also - der fehler in zeile 1 ist doch noch da - kam eben nicht weil script nicht gestartet war …
In Objekte - schlag mich - steht nix von dem Script, es wird nichts erstellt - nur das was ich schon drin habe, mehr nicht ... Ich vermute wegen dem Fehler läuft das script überhaupt nicht erst an und erstell auch nix ... Aber wenn Du keinen Fehler findest in der ersten Zeile dann sieht es wohl schlecht aus ...
Regex ist keine Option ? Absolut unmöglich ?
-
Ich vermute wegen dem Fehler läuft das script überhaupt nicht erst an und erstell auch nix … Aber wenn Du keinen Fehler findest in der ersten Zeile dann sieht es wohl schlecht aus ... `
Ja, wenn ein Fehler-Log kommt, läuft das Skript nicht und erstellt folglich auch keine Datenpunkte. Schau mal in den Reiter "Log". Dort werden meist noch weitere Informationen zu dem Fehler ausgegeben (in rot). -
jupp :-)
javascript.0 2018-08-15 14:07:11.001 error at Object.createScript (vm.js:80:10)
javascript.0 2018-08-15 14:07:11.001 error SyntaxError: Identifier 'request' has already been declared
javascript.0 2018-08-15 14:07:11.001 error ^
javascript.0 2018-08-15 14:07:11.000 error const request = require('request');
javascript.0 2018-08-15 14:07:10.999 error at script.js.Homepilot.grad:1
javascript.0 2018-08-15 14:07:10.999 error script.js.Homepilot.grad compile failed:
verstehe aber nicht warum - ich hatte das erste script doch gelöscht :-(
-
soooooooo !!!!! :-) Klappt :-) Javascript Adapter neu gestartet … VIELEN DANK SOWEIT !!!
Ich müsste doch dann theoretisch auch die anderen Teile aus dem Link eingepflegt bekommen, oder ?
{ "response" : "get_meter_data", "status" : "ok", "data":[{"Lichtwert":"30000 lx"},{"Windgeschw.":"0 m/s"},{"Temperatur":"22.1 °C"},{"Regen":"Nicht erkannt"},{"Sonnenhöhe":"53°"},{"Sonnenrichtung":"Süd-Osten (165°)"},{"Aktualisiert":"15.08.18 - 13:17"}] }
Das ° Zeichen bekomme ich weg indem ich unit mit '' schreibe ?
-
Klappt :-) Javascript Adapter neu gestartet `
Schön, dass Du es selbst gelöst hast :D
@meicker:Ich müsste doch dann theoretisch auch die anderen Teile aus dem Link eingepflegt bekommen, oder ? `
Ja, wie es geht, weißt Du jetzt.
@meicker:{"Windgeschw.":"0 m/s"} `
Da der Bezeichner ""Windgeschw." ein unzulässiges Zeichen (Punkt) enthält, muss der Zugriff so erfolgen:var wind = parseFloat(data[1]['Windgeschw.']);Das ° Zeichen bekomme ich weg indem ich unit mit '' schreibe ? `
Nein, mit parseFloat() wird aus dem String "165°)" eine Zahl gemacht und dabei abgebrochen, wenn keine Ziffer mehr folgt. -
Wissen kann man noch nicht behaupten, aber ich reime mir das gerade mal zusammen :-) Will ja was lernen … :D
Ist data 1 nicht eigentlich LICHTWERT ? Und Wingeschwindigkeit 2 ??
Anders gefragt zum ° - wie bekomme ich das weg ? Oder stört das nicht in einer Blocky Abfrage ?