NEWS
[gelöst]Homepilot JSON einlesen
-
Hallo zusammen,
ich steh irgendwie auf dem Schlauch. Nachdem der Node-Red Adapter bei mir zu Zeit spinnt, versuche ich einige der Flows direkt in JavaScript zu realisieren. Nach diesem Vorbild (http://forum.iobroker.net/viewtopic.php?f=21&t=880&sid=968c7f80b8566ec431d300d339231afc) habe ich vor, die JSON Datei meines Hompilot einzulesen. Es sind nur zwei Devices angelernt (zwei Rollläden), deren Position ich in Objekten speichern will.
JSON Datei: http://homepilot.local/deviceajax.do?devices=1
! ````
{ "response" : "get_visible_devices", "status" : "ok", "devices" : [{"did":10000,"name":"Rollo SZ links","description":"Rollotron Standard Schlafzimmer linkes Fenster","initialized":1,"position":80,"productName":"RolloTron Standard","serial":"40","statusesMap":{"Position":80,"Manuellbetrieb":1},"status_changed":1435843704,"deviceGroup":2,"iconSet":{"name":"Rollladen 2","description":"Rollladen Icon-Set mit Streben","strMin":"Auf","strMax":"Zu","valMax":100,"valMin":0,"sprite":{ "imageUri" : "images/sets/rollladen2.png", "numTiles" : 5 },"k":"iconset15"},"iconSetInverted":0,"paired":0,"statusValid":true,"uid":"40 59 0A","visible":true,"groups" : [ ] ,"favoredId":5003,"properties":{"generic":3,"wind":3,"trigger":3,"closingContact":3,"dusk":3,"smoke":3,"sun":3,"temperature":3,"manual":3,"time":3,"dawn":3,"dust":3,"favored":0,"smartphone":3,"motion":3,"temperator":3,"warning":3,"rain":3,"states":[{"cfgKey":"setEveningAuto","cfgId":107,"state":0},{"cfgKey":"setSunAuto","cfgId":105,"state":0},{"cfgKey":"setTimeAuto","cfgId":101,"state":0},{"cfgKey":"setAutomationOverall","cfgId":99,"state":1},{"cfgKey":"setMorningAuto","cfgId":103,"state":0}]},"sortId":914,"sTypes":[],"version":"1.2","sync":-2147481675,"messages":[],"hasErrors":0,"autos":[3,2,0,1,4]},{"did":10001,"name":"Rollo SZ rechts","description":"Rollotron Standard Schlafzimmer rechtesFenster","initialized":1,"position":88,"productName":"RolloTron Standard","serial":"40","statusesMap":{"Position":88,"Manuellbetrieb":0},"status_changed":1435843708,"deviceGroup":2,"iconSet":{"name":"Rollladen 2","description":"Rollladen Icon-Set mit Streben","strMin":"Auf","strMax":"Zu","valMax":100,"valMin":0,"sprite":{ "imageUri" : "images/sets/rollladen2.png", "numTiles" : 5 },"k":"iconset15"},"iconSetInverted":0,"paired":0,"statusValid":true,"uid":"40 58 EA","visible":true,"groups" : [ ] ,"favoredId":5002,"properties":{"generic":3,"wind":3,"trigger":3,"closingContact":3,"dusk":3,"smoke":3,"sun":3,"temperature":3,"manual":3,"time":3,"dawn":3,"dust":3,"favored":0,"smartphone":3,"motion":3,"temperator":3,"warning":3,"rain":3,"states":[{"cfgKey":"setEveningAuto","cfgId":107,"state":0},{"cfgKey":"setSunAuto","cfgId":105,"state":0},{"cfgKey":"setTimeAuto","cfgId":101,"state":0},{"cfgKey":"setAutomationOverall","cfgId":99,"state":0},{"cfgKey":"setMorningAuto","cfgId":103,"state":0}]},"sortId":915,"sTypes":[],"version":"1.2","sync":-2147481767,"messages":[],"hasErrors":0,"autos":[3,2,0,1,4]}] }Dies ist mein kläglicher Versuch mt JSON.parse, der aber nicht läuft. Was ist falsch?
/* Homepilot einlesen
Homepilot Daten in JS Variablen schreiben
erstellt: 02.07.2015 von Pix
*/createState('Homepilot.json');
createState('Homepilot.Rollladen.Schlafzimmer.links.Level');
createState('Homepilot.Rollladen.Schlafzimmer.rechts.Level');var link = 'http://homepilot.local/deviceajax.do?devices=1';
function readHomepilot() {
log('Start Homepilot Daten einlesen');
var request = require('request');request(link, function (error, response, body) { if (!error && response.statusCode == 200) { JSON.parse(body, { explicitArray: false, mergeAttrs: true }, function (err, result) { var data = JSON.stringify(result, null, 2); log(data); setState("javascript.0.Homepilot.json", data); if (err) { log("Fehler: " + err); } else { log('Kein Fehler :-D'); setState("javascript.0.Homepilot.Rollladen.Schlafzimmer.links.Level", result.devices[0].position); // device 10000 setState("javascript.0.Homepilot.Rollladen.Schlafzimmer.rechts.Level", result.devices[1].position); // device 10001 } }); } else { log('Fehler:' + error); } }); // Ende request log('Daten aus Homepilot eingelesen');
}
schedule("*/1 * * * *", readHomepilot);
readHomepilot();Ich brauche die Devices nicht durchzuiterieren. Wenn man später mal einen Adapter baut, kann das sinnvoll sein. Die manuelle Abfrage über __result.devices[x].position__ reicht mir. Gruß Pix
-
Irgendwie strange versuchst du JSON.parse zu benutzen:
/* Homepilot einlesen Homepilot Daten in JS Variablen schreiben erstellt: 02.07.2015 von Pix */ var request = require('request'); createState('Homepilot.json'); createState('Homepilot.Rollladen.Schlafzimmer.links.Level'); createState('Homepilot.Rollladen.Schlafzimmer.rechts.Level'); var link = 'http://homepilot.local/deviceajax.do?devices=1'; function readHomepilot() { log('Start Homepilot Daten einlesen'); var request = require('request'); request(link, function (error, response, body) { if (!error && response.statusCode == 200) { var result; try{ result = JSON.parse(body); var data = JSON.stringify(result, null, 2); log(data); setState("javascript.0.Homepilot.json", data); log('Kein Fehler :-D'); } catch (e) { log('Parse Fehler:' + e); } if (result) { setState("javascript.0.Homepilot.Rollladen.Schlafzimmer.links.Level", result.devices[0].position); // device 10000 setState("javascript.0.Homepilot.Rollladen.Schlafzimmer.rechts.Level", result.devices[1].position); // device 10001 } } else { log('Fehler:' + error); } }); // Ende request log('Daten aus Homepilot eingelesen'); } schedule("*/1 * * * *", readHomepilot); readHomepilot();
-
Hallo Bluefox,
try und catch sagen mir gar nix. Jedenfalls geht es jetzt wunderbar. Ist mir erstmal lieber, als länger auf node-red zu setzen.
Vielen Dank für die schnelle Hilfe!
Gruß
Pix
-
Er hat das Script etwas zerlegt, und das Ergebnis von JSON.parse in eine Variable (result) überführt um damit zu arbeiten.
Mit 'try' wird versucht die nachfolgenden Befehle abzuarbeiten. Sollte ein Fehler auftreten, soll nicht das ganze Script sterben, sondern der Fehler mit 'catch' abgefangen werden. Dort wird in Deinem Fall ein erklärender Log-Eintrag erzeugt.
-
Danke für die Erklärung. Ich lerne nie aus.
Allerdings habe ich festgestellt, dass das Skript so deutlich mehr Ressourcen braucht, als der Node-Red Flow. Bei 15sekündlicher Ausführung ging auf dem MacMini der Lüfter an und die cpu Auslastung auf 100%.
Eigentlich reicht eine Ausführung pro Minute, aber in Node Red waren alle 10s kein Problem.
Vielleicht schaffe ich es irgendwann, einen Adapter draus zu bauen.
Gruß
Pix
Gesendet von meinem iPhone mit Tapatalk
-
Hallo Pix,
kannst du bitte erklären wo man den Code im Javascript Engine einfügen
muss komme da nicht weiter, danke.
Grüße Alex
-
Hallo Alex,
So wie hier beschrieben.
http://forum.iobroker.net/viewtopic.php?t=2011#p17349
Gruß,
Pix
Gesendet mit Tapatalk
-
Hallo Pix,
Danke,
der Heftrücken hat noch gefehlt in der Beschreibung
nun bekomme ich eine Position ermittelt allerdings
stimmt die nicht.
Er zeigt mir 100% an obwohl 80 oder 0 sind und das
auch noch 5 min. später , hast du da eine Idee an was
das liegt