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

Suggested Topics

1.2k
Online

36.7k
Users

42.4k
Topics

587.4k
Posts