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 ... ) 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 Sekunden
Viele 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 `
-
Dankeschön - Hätte ich erwähnen sollen das ich das im Parser eintragen möchte ? Ich wüsste jetzt nicht wie ich deinen Vorschlag umsetzen kann … :roll:
Viele grüße,
Marc
-
Ich wüsste jetzt nicht wie ich deinen Vorschlag umsetzen kann … `
Mit dem Javascript-Adapter.Die Webseite, die den JSON-String liefert, kann man mit request einlesen. Hier im Forum gibt es viele Beispiele. Suche: require('request')
-
ist das auch mit blocky möglich ? Den request kann ich oben anstellen, das Ergebnis könnte ich in eine variable packen - aber wie baue ich mit blocky die Abfrage ein ? Den Link einzusetzen zur jason ist ja kein problem … aber der rest ... :shock:
-
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
-
OK
Und was ist an der ersten Zeile falsch ?
13:09:44.167 [error] javascript.0 script.js.sonnenhoehe compile failed: at script.js.sonnenhoehe:1
Erste zeile: const request = require('request');
Ich kann keinen Fehler sehen …
-
Ich kann keinen Fehler sehen … `
Ich auch nichtDu 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:
-
Aber wo kann ich denn jetzt die states sehen ? Ich finde die einfach nicht … `
Im Reiter "Objekte" unter javascript.0.Sonnenstand (wenn das Skript in der Instanz 0 läuft). -
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 ?
-
ich hatte das erste script doch gelöscht `
Ist nicht noch etwas unter der Gruppe global ?Starte mal die Javascript-Instanz neu. Manchmal genügt das Löschen eines Skriptes nicht.
-
lies mal einen über Deinem letzten - haben uns überschnitten
-
Klappt Javascript Adapter neu gestartet `
Schön, dass Du es selbst gelöst hast
@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 …
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 ?