NEWS
Request in Adapter verliert Daten
-
Hallo Zusammen,
da ich seit kurzen über drei Discovergy Zähler verfüge, möchte ich diese mit IOBROKER über die neue Discovergy API auslesen.
Mein Script scheitert aktuell an dem Request. Der Request wird aufgerufen und es wird auch der ConsumerKey abgeholt.
Innerhalb des Request übergebe ich die Daten an eine globale Variable DAPI_Token. Sobald der Request verlassen wird sind die Daten weg.
Die Funktion zum Speichern der Token wird fehlerfrei aufgerufen, aber es wird keine Datei erstellt.
Wo liegt mein (Gedanken) Fehler?
Danke für die Hilfe
//*********************************************************************************************************************** //*********************************************************************************************************************** //*** //*** iobroker.doscovergy Adapter //*** //*** Adapter for reading Discovergy electricity meters via the API //*** //*** API Documentation: https://api.discovergy.com/docs/ //*** //*** (c) 2017 //*** //*********************************************************************************************************************** //*********************************************************************************************************************** "use strict"; //*** //*** INIT //*** var debug = true; var DAPIconnected = false; var DAPISignin = true; var utils = require(__dirname + '/lib/utils'); var adapter = utils.adapter('discovergy'); var request = require('request'); var DAPI_Constants = { BaseUrl : 'https://api.discovergy.com/public/v1/', ClientName : 'iobroker.discovergy', TokenFile : adapter.adapterDir + '/' + adapter.namespace + '.token.json' } var DAPI_Token = { ConsumerKey:'' }; var DAPI_MeterData = {}; //*** //*** is called when adapter shuts down - callback has to be called under any circumstances! //*** adapter.on('unload', function (callback) { try { adapter.log.info('cleaned everything up...'); callback(); } catch (e) { callback(); } }); //*** //*** is called when databases are connected and adapter received configuration. //*** start here! adapter.on('ready', function () { main(); }); function main() { //*** //*** Gespeichertes Token lesen oder neuen consumer token paar erzeugen //*** Fn_DAPIReadTokenFile(); } // END main function Fn_DAPIReadTokenFile () { var FunctionName = 'Fn_DAPIReadTokenFile'; var TokenRead = false; //*** Gespeichertes Token aus Datei lesen try { adapter.readFile(DAPI_Constants.TokenFile, 'utf8', function (error, data) { if ( !error ) { DAPI_Token = JSON.parse(data); if ( debug ) console.log(FunctionName + ' - Read: ' + DAPI_Constants.TokenFile); var TokenRead = true; } else { adapter.log.error(FunctionName + ' - error: ', error); // Error beim Einlesen adapter.stop; } }); } catch (e) { if ( debug ) console.log(FunctionName + ' - ERROR TRY: ', e); } // END try if ( !TokenRead ) Fn_DAPIGetConsumerToken(); } // END function Fn_DAPIReadTokenFile function Fn_DAPIWriteTokenFile () { var FunctionName = 'Fn_DAPIWriteTokenFile'; var data = JSON.stringify(DAPI_Token); try { adapter.writeFile(DAPI_Constants.TokenFile, data, function (error) {}); if ( debug ) console.log(FunctionName + ' - Write:'); } catch (e) { adapter.log.error(FunctionName + ' - ERROR TRY : ' + e); } } // END function Fn_DAPIWriteToken function Fn_DAPIGetConsumerToken () { var FunctionName = 'Fn_DAPIGetConsumerToken'; var Data; var RequestOptions = { method: 'POST', uri: DAPI_Constants.BaseUrl + 'oauth1/consumer_token', body: "client=" + DAPI_Constants.ClientName, headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }; // END RequestOptions try { request(RequestOptions, function (error, response, body) { if (!error && response.statusCode == 200) { // kein Fehler, Inhalt in body if ( debug ) console.log(FunctionName + ' - body: ', body); Data = JSON.parse(body); if ( debug ) console.log(FunctionName + ' - Data key:', Data.key); if ( debug ) console.log(FunctionName + ' - Data secret:', Data.secret); DAPI_Token.ConsumerKey = Data.key; DAPI_Token.ConsumerKeySecret = Data.secret; DAPI_Token.Client = Data.owner; if ( debug ) console.log(FunctionName + ' - Token key:', DAPI_Token.ConsumerKey); if ( debug ) console.log(FunctionName + ' - Token secret:', DAPI_Token.ConsumerKeySecret); Fn_DAPIWriteTokenFile(); } else { adapter.log.error(FunctionName + ' - error: ', error); // Error beim Einlesen adapter.stop; } }); } catch (e) { adapter.log.error(FunctionName + ' - Fehler TRY: ' + e); adapter.stop; } } // END function Fn_DAPIGetConsumerToken
Debug-Ausgabe in VS-Code
Fn_DAPIGetConsumerToken - body: {"key":"h2hn832rg4fgl4e1828caljlu0","secret":"notc9uh6j8l86lhr203cb290eg","owner":"iobroker.discovergy","attributes":{},"principal":null}
Fn_DAPIGetConsumerToken - Data key: h2hn832rg4fgl4e1828caljlu0
Fn_DAPIGetConsumerToken - Data secret: notc9uh6j8l86lhr203cb290eg
Fn_DAPIGetConsumerToken - Token key: h2hn832rg4fgl4e1828caljlu0
Fn_DAPIGetConsumerToken - Token secret: notc9uh6j8l86lhr203cb290eg
Fn_DAPIWriteTokenFile - Write:
3973_iobroker.discovergy.rar -
if ( debug ) console.log(FunctionName + ' - Write:'); `
Also das deine Ausgabe leer ist liegt wohl daran das du hier keine Variable in deine Ausgabe geschrieben hast.
Warum keine Datei geschrieben wird kann ich dir leider auch nicht sagen, es sieht auf den ersten Blick in Ordnung aus.
Statt der Pfadangabe in der Funktion writeFile kannst du ja mal nur einen Datei namen angeben.
-
Hallo,
es liegt nicht an dem debug.log. Diese Zeile zeigt nur an, das, dass die Datei geschrieben wurde.
Die Daten sind in der Variable data und sind korrekt in einen String gepackt.
Ich glaube fast das man den gesamten Ablauf in diesen Request packen muss und die weiteren Requests
geschachtelt.
Wirft bei mir eine Frage auf: Muss bei jedem Durchlauf (Abfrage Zähler) die gesamte oauth Prozedur wiederholt werden?
Gruß Guido
-
Hallo,
hast du die Abfrage der Discovergy Zähler zum Laufen bekommen?
Wenn ja, wäre ich sehr an deinem Skript interessiert.
Danke!
Gruß
-
-
Ich hätte auch interesse! Seit heute hängt der discovergy Zähler bei mir im Keller.
Gruß