NEWS
JSON Werte in Datenpunkte
-
So, habe noch etwas rum probiert und habe es hinbekommen.
`var request = require('request'); Intervall = setInterval(SendRequest,1000); function SendRequest(){ var options = { url: 'https://home.sensibo.com/api/v2/pods/2mXar2sZ/acStates?apiKey=rBQm5j58LKw76FrUzLIU5KhgYoP2Rz', }; request(options, function (error, response, body){ if (!error){ CreateDevices(JSON.parse(body)); console.log(body); } else{ console.error(error);} }); }//End of Function SendRequest function CreateDevices(data){ if ("undefined" !== typeof data.result){ for (i = 0; i < data.result.length; i++) { for (var ObjName in data.result[i].acState) { if (!getObject('javascript.0.KlimaEsszimmer.States.' +i +'.acState' +'.' +ObjName)){ createState('javascript.0.KlimaEsszimmer.States.' +i +'.acState' +'.' +ObjName,data.result[i].acState[ObjName],{type: typeof data.result[i].acState[ObjName], role: ObjName}); console.log('ERSTELLT'); } else{setState('javascript.0.KlimaEsszimmer.States.' +i +'.acState' + '.' +ObjName,data.result[i].acState[ObjName],akt=true)} } } } else{console.warn('Response in JSON nicht gefunden ! ')} }//End of Function CreateDevices`[/i][/i][/i][/i]
-
-
Hallo zusammen,
Ich bin ganz neu in der Welt des ioBrokers und Umsteiger von fhem.Ich versuche gerade auch eine Json von meinem 3D Drucker auszulesen und die entsprechenden Datensätze selbst anlegen zulassen. Leider komme ich nicht weiter:
Das ist der Output von meiner URL von dem 3D Drucker.
{"status":"P","coords":{"axesHomed":[1,1,1,1,1,1],"wpl":1,"xyz":[160.851,108.581,27.592,45.000,2.000,24.000],"machine":[115.842,58.395,33.482,45.000,2.000,18.110],"extr":[20722.2,0.0,0.0,0.0]},"speeds":{"requested":40.0,"top":40.0},"currentTool":0,"params":{"atxPower":-1,"fanPercent":[0,100,-1,90,100,0,100,0,100,50],"speedFactor":100.0,"extrFactors":[100.0,100.0,100.0,100.0],"babystep":0.000},"seq":2,"sensors":{"probeValue":0,"fanRPM":[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1]},"temps":{"bed":{"current":90.0,"active":90.0,"standby":0.0,"state":2,"heater":0},"current":[90.0,235.4,30.4,31.9,32.7],"state":[2,2,0,0,0],"tools":{"active":[[235.0],[0.0],[0.0],[0.0]],"standby":[[235.0],[0.0],[0.0],[0.0]]},"extra":[]},"time":45569.0,"currentLayer":138,"currentLayerTime":77.1,"extrRaw":[20698.6,0.0,0.0,0.0],"fractionPrinted":88.1,"filePosition":16983003,"firstLayerDuration":749.6,"firstLayerHeight":0.20,"printDuration":24418.6,"warmUpDuration":397.2,"timesLeft":{"file":3431.8,"filament":2551.1,"layer":6133.5}}
Das ist dazu mein Script:
var request = require('request'); Intervall = setInterval(SendRequest,5000); function SendRequest(){ var options = { url: 'http://URLVON3DRUCKER', }; request(options, function (error, response, body){ if (!error){ CreateDevices(JSON.parse(body)); console.log(body); } else{ console.error(error);} }); }//End of Function SendRequest function CreateDevices(data){ if ("undefined" !== typeof data.result){ for (i = 0; i < data.result.length; i++) { for (var ObjName in data.result[i].acState) { if (!getObject('0_userdata.0.3DPrinter.' +i +'.acState' +'.' +ObjName)){ createState('0_userdata.0.3DPrinter.' +i +'.acState' +'.' +ObjName,data.result[i].acState[ObjName],{type: typeof data.result[i].acState[ObjName], role: ObjName}); console.log('ERSTELLT'); } else{setState('0_userdata.0.3DPrinter.' +i +'.acState' + '.' +ObjName,data.result[i].acState[ObjName],akt=true)} } } } else{console.warn('Response in JSON nicht gefunden ! ')} }//End of Function CreateDevices
Dann bekomme ich folgende Meldung in dem Log:
javascript.0 2020-07-29 20:53:50.291 warn (24214) script.js.common.3D_Printer: Response in JSON nicht gefunden ! javascript.0 2020-07-29 20:53:45.258 info (24214) script.js.common.3D_Printer: {"status":"P","coords":{"axesHomed":[1,1,1,1,1,1],"wpl":1,"xyz":[164.129,107.010,27.592,45.000,2.000,24.000],"machine":[123.229,61.852,33.48
An was kann das liegen?
Die Werte einzeln an ioBroker zu schreiben bekomme ich über ein anderes Skript hin. Nur hätte ich gerne alle Werte automatisch angelegt.
-
@Kevin sagte:
An was kann das liegen?
Das Objekt enthält keine Eigenschaft result und ist auch kein Array.
Versuche es mal so:function iter(name, obj) { for(let i in obj) { if(typeof obj[i] == 'object') iter(name + '.' + i, obj[i]); else { log(name + '.' + i + ': ' + obj[i]); if(existsState(name + '.' + i)) setState(name + '.' + i, obj[i]); else createState(name + '.' + i, obj[i]); // type: "mixed" } } } function SendRequest(){ var options = { url: 'http://URLVON3DRUCKER' }; request(options, function (error, response, body){ if (!error) iter('0_userdata.0.3DPrinter', JSON.parse(body)); else console.error(error); }); } schedule('*/5 * * * * *', SendRequest);
-
@paul53 said in JSON Werte in Datenpunkte:
function iter(name, obj) { for(let i in obj) { if(typeof obj[i] == 'object') iter(name + '.' + i, obj[i]); else { log(name + '.' + i + ': ' + obj[i]); if(existsState(name + '.' + i) setState(name + '.' + i, obj[i]); else createState(name + '.' + i, obj[i]); // type: "mixed" } } } function SendRequest(){ var options = { url: 'http://URLVON3DRUCKER', }; request(options, function (error, response, body){ if (!error) iter('0_userdata.0.3DPrinter', JSON.parse(body)); else console.error(error); }); } schedule('*/5 * * * * *', SendRequest);
Danke schon mal für dein Hilfe
Leider hat es nicht ganz funktioniert:
javascript.0 2020-07-29 22:56:55.543 error (24214) at process._tickCallback (internal/process/next_tick.js:68:7) javascript.0 2020-07-29 22:56:55.543 error (24214) at promise.then (/opt/iobroker/node_modules/standard-as-callback/built/index.js:19:49) javascript.0 2020-07-29 22:56:55.542 error (24214) at tryCatcher (/opt/iobroker/node_modules/standard-as-callback/built/utils.js:11:23) javascript.0 2020-07-29 22:56:55.542 error (24214) at client.get (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInRedis.js:616:17) javascript.0 2020-07-29 22:56:55.542 error (24214) at adapter.getForeignState (/opt/iobroker/node_modules/iobroker.javascript/main.js:1124:17) javascript.0 2020-07-29 22:56:55.541 error (24214) at createProblemObject (/opt/iobroker/node_modules/iobroker.javascript/main.js:1533:17) javascript.0 2020-07-29 22:56:55.541 error (24214) at prepareScript (/opt/iobroker/node_modules/iobroker.javascript/main.js:1480:37) javascript.0 2020-07-29 22:56:55.541 error (24214) at compile (/opt/iobroker/node_modules/iobroker.javascript/main.js:1257:28) javascript.0 2020-07-29 22:56:55.540 error (24214) at Object.createScript (vm.js:277:10) javascript.0 2020-07-29 22:56:55.540 error (24214) at new Script (vm.js:83:7) javascript.0 2020-07-29 22:56:55.540 error (24214) SyntaxError: Unexpected identifier javascript.0 2020-07-29 22:56:55.539 error (24214) ^^^^^^^^ javascript.0 2020-07-29 22:56:55.539 error (24214) if(existsState(name + '.' + i) setState(name + '.' + i, obj[i]); javascript.0 2020-07-29 22:56:55.539 error at script.js.common.Skript_1:6 javascript.0 2020-07-29 22:56:55.539 error (24214) script.js.common.Skript_1 compile failed:
-
@Kevin sagte:
Leider hat es nicht ganz funktioniert:
existsState(id) wird anscheinend angemeckert. Welche Version des Javascript-Adapters ?
-
@paul53 Sollte eigentlich die aktuellste Version sein: 4.6.21
-
@Kevin
Sorry, da fehlt eine schließende Klammer vor setState. Habe sie ergänzt. -
@paul53 Perfekt danke für die schnelle Hilfe. Genau wie ich es mir vorgestellt habe.
-
@Kevin sagte:
Genau wie ich es mir vorgestellt habe.
Dann markiere bitte das Thema in der Überschrift des ersten Beitrags als [gelöst].
-
@paul53 Ich habe noch eine Frage
Lässt sich verhindern, dass die Abfrage durchgeführt wird, wenn der Drucker ausgeschaltet ist?
javascript.0 2020-07-31 07:08:11.796 error (24214) Request error: Error: connect ETIMEDOUT 91.15.159.27:8000 javascript.0 2020-07-31 07:08:11.795 error (24214) script.js.common.3D_Printer: {'errno':'ETIMEDOUT','code':'ETIMEDOUT','syscall':'connect','address':'IP','port':8000}
-
-
@paul53 Ich könnte es über einen Datenpunkt an der Fritzbox abfragen. Dann wäre Datenpunkt 3Drucker.active auf true sobald er im netzwerk ist
-
@Kevin sagte:
über einen Datenpunkt an der Fritzbox abfragen
Dann mache die Abfrage als erstes in der Funktion SendRequest().
function SendRequest(){ if(getState('abc.0.xyz.3Drucker.active').val) { var options = { url: 'http://URLVON3DRUCKER' }; request(options, function (error, response, body){ if (!error) iter('0_userdata.0.3DPrinter', JSON.parse(body)); else console.error(error); }); } }