NEWS
JSON Werte in Datenpunkte
-
Hallo Leute,
ich lese hier schon sehr lange mit und habe bis jetzt fast alle Probleme mit Hilfe des Forums lösen können.
Jetzt stehe ich an einer Sache an und komme nicht weiter, daher habe ich mich jetzt mal angemeldet unf hoffe ihr könnt mir ein wenig helfen…
Nun zum Problem:
Ich nutze für eine meiner Klimaanlagen einen Sensibo Sky Adapter. Es ist möglich die aktuellen Einstellung über eine URL abzufragen. Das klappt soweit auch. Was leider nicht klappt, ist das zerlegen in die einzelnen Datenpunkte...
Hier die Antwort der URL in einem Browser:
{"status": "success", "moreResults": true, "result": [{"status": "Success", "reason": "UserRequest", "acState": {"on": false, "nativeTargetTemperature": 75, "fanLevel": "low", "temperatureUnit": "C", "targetTemperature": 24, "nativeTemperatureUnit": "F", "mode": "cool", "swing": "rangeFull"}, "changedProperties": ["on"], "id": "YfW8tx7HND", "failureReason": null}, {"status": "Success", "reason": "UserRequest", "acState": {"on": true, "nativeTargetTemperature": 75, "fanLevel": "low", "temperatureUnit": "C", "targetTemperature": 24, "nativeTemperatureUnit": "F", "mode": "cool", "swing": "rangeFull"}, "changedProperties": ["targetTemperature"], "id": "AjGJjSuvHX", "failureReason": null}, {"status": "Success", "reason": "UserRequest", "acState": {"on": true, "nativeTargetTemperature": 77, "fanLevel": "low", "temperatureUnit": "C", "targetTemperature": 25, "nativeTemperatureUnit": "F", "mode": "cool", "swing": "rangeFull"}, "changedProperties": ["targetTemperature"], "id": "jdrfSqMWYD", "failureReason": null}, {"status": "Success", "reason": "UserRequest", "acState": {"on": true, "nativeTargetTemperature": 75, "fanLevel": "low", "temperatureUnit": "C", "targetTemperature": 24, "nativeTemperatureUnit": "F", "mode": "cool", "swing": "rangeFull"}, "changedProperties": ["on"], "id": "HQvfSiJosK", "failureReason": null}, {"status": "Success", "reason": "UserRequest", "acState": {"on": false, "nativeTargetTemperature": 75, "fanLevel": "low", "temperatureUnit": "C", "targetTemperature": 24, "nativeTemperatureUnit": "F", "mode": "cool", "swing": "rangeFull"}, "changedProperties": ["on"], "id": "LxE4dT59Hb", "failureReason": null}, {"status": "Success", "reason": "UserRequest", "acState": {"on": true, "nativeTargetTemperature": 75, "fanLevel": "low", "temperatureUnit": "C", "targetTemperature": 24, "nativeTemperatureUnit": "F", "mode": "cool", "swing": "rangeFull"}, "changedProperties": ["on"], "id": "wmPZngxUuY", "failureReason": null}, {"status": "Success", "reason": "UserRequest", "acState": {"on": false, "nativeTargetTemperature": 75, "fanLevel": "low", "temperatureUnit": "C", "targetTemperature": 24, "nativeTemperatureUnit": "F", "mode": "cool", "swing": "rangeFull"}, "changedProperties": ["on"], "id": "gf4Ye7waWu", "failureReason": null}, {"status": "Success", "reason": "UserRequest", "acState": {"on": true, "nativeTargetTemperature": 75, "fanLevel": "low", "temperatureUnit": "C", "targetTemperature": 24, "nativeTemperatureUnit": "F", "mode": "cool", "swing": "rangeFull"}, "changedProperties": ["on"], "id": "DsXUNFuh8m", "failureReason": null}, {"status": "Success", "reason": "UserRequest", "acState": {"on": false, "nativeTargetTemperature": 75, "fanLevel": "low", "temperatureUnit": "C", "targetTemperature": 24, "nativeTemperatureUnit": "F", "mode": "cool", "swing": "rangeFull"}, "changedProperties": ["on"], "id": "D5KratY3vr", "failureReason": null}, {"status": "Success", "reason": "UserRequest", "acState": {"on": true, "nativeTargetTemperature": 75, "fanLevel": "low", "temperatureUnit": "C", "targetTemperature": 24, "nativeTemperatureUnit": "F", "mode": "cool", "swing": "rangeFull"}, "changedProperties": ["fanLevel"], "id": "JE4DhCUodg", "failureReason": null}, {"status": "Success", "reason": "UserRequest", "acState": {"on": true, "nativeTargetTemperature": 75, "fanLevel": "medium", "temperatureUnit": "C", "targetTemperature": 24, "nativeTemperatureUnit": "F", "mode": "cool", "swing": "rangeFull"}, "changedProperties": ["fanLevel"], "id": "fy2E7fVLMz", "failureReason": null}, {"status": "Success", "reason": "UserRequest", "acState": {"on": true, "nativeTargetTemperature": 75, "fanLevel": "medium_low", "temperatureUnit": "C", "targetTemperature": 24, "nativeTemperatureUnit": "F", "mode": "cool", "swing": "rangeFull"}, "changedProperties": ["fanLevel"], "id": "wbxgs2QKFX", "failureReason": null}, {"status": "Success", "reason": "UserRequest", "acState": {"on": true, "nativeTargetTemperature": 75, "fanLevel": "low", "temperatureUnit": "C", "targetTemperature": 24, "nativeTemperatureUnit": "F", "mode": "cool", "swing": "rangeFull"}, "changedProperties": ["swing"], "id": "F8FYwDyhnr", "failureReason": null}, {"status": "Success", "reason": "UserRequest", "acState": {"on": true, "nativeTargetTemperature": 75, "fanLevel": "low", "temperatureUnit": "C", "targetTemperature": 24, "nativeTemperatureUnit": "F", "mode": "cool", "swing": "stopped"}, "changedProperties": ["swing"], "id": "vzFJx2sNia", "failureReason": null}, {"status": "Success", "reason": "UserRequest", "acState": {"on": true, "nativeTargetTemperature": 75, "fanLevel": "low", "temperatureUnit": "C", "targetTemperature": 24, "nativeTemperatureUnit": "F", "mode": "cool", "swing": "fixedTop"}, "changedProperties": ["swing"], "id": "s8MKwEBf2v", "failureReason": null}, {"status": "Success", "reason": "UserRequest", "acState": {"on": true, "nativeTargetTemperature": 75, "fanLevel": "low", "temperatureUnit": "C", "targetTemperature": 24, "nativeTemperatureUnit": "F", "mode": "cool", "swing": "fixedMiddleTop"}, "changedProperties": ["swing"], "id": "wDis4aUxvw", "failureReason": null}, {"status": "Success", "reason": "UserRequest", "acState": {"on": true, "nativeTargetTemperature": 75, "fanLevel": "low", "temperatureUnit": "C", "targetTemperature": 24, "nativeTemperatureUnit": "F", "mode": "cool", "swing": "fixedMiddle"}, "changedProperties": ["swing"], "id": "AR5krPydeZ", "failureReason": null}, {"status": "Success", "reason": "UserRequest", "acState": {"on": true, "nativeTargetTemperature": 75, "fanLevel": "low", "temperatureUnit": "C", "targetTemperature": 24, "nativeTemperatureUnit": "F", "mode": "cool", "swing": "fixedMiddleBottom"}, "changedProperties": ["swing"], "id": "rEWXkbNrhN", "failureReason": null}, {"status": "Success", "reason": "UserRequest", "acState": {"on": true, "nativeTargetTemperature": 75, "fanLevel": "low", "temperatureUnit": "C", "targetTemperature": 24, "nativeTemperatureUnit": "F", "mode": "cool", "swing": "fixedBottom"}, "changedProperties": ["swing"], "id": "sdVjPCnGbE", "failureReason": null}, {"status": "Success", "reason": "UserRequest", "acState": {"on": true, "nativeTargetTemperature": 75, "fanLevel": "low", "temperatureUnit": "C", "targetTemperature": 24, "nativeTemperatureUnit": "F", "mode": "cool", "swing": "rangeFull"}, "changedProperties": ["swing"], "id": "YKJemgmtE5", "failureReason": null}]}
Hier das Script, es werden aber keine Datenpunkte erstellt…
`var request = require('request'); Intervall = setInterval(SendRequest,10000); 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.response){ var Group_by='name'; for (i = 0; i < data.response.length; i++) { for (var ObjName in data.response[i]) { if (!getObject('javascript.0.tests.Devices.'+data.response[i][Group_by].toString().replace(/\s+/g, '_')+'.'+ObjName)){ createState('javascript.0.tests.Devices.'+data.response[i][Group_by].toString().replace(/\s+/g, '_')+'.'+ObjName,data.response[i][ObjName],{type: typeof data.response[i][ObjName], role: ObjName}); console.log('ERSTELLT'); } else{setState('javascript.0.tests.Devices.'+data.response[i][Group_by].toString().replace(/\s+/g, '_')+'.'+ObjName,data.response[i][ObjName],akt=true)} } } } else{console.warn('Response in JSON nicht gefunden ! ')} }//End of Function CreateDevices` Das Problem ist, das in "function CreateDevices(data)" direkt zu "else{console.warn('Response in JSON nicht gefunden ! ')}" geht und in den Log eingetragen wird. Datenpunkte werden keine erstellt.. Für mich sind momentan nur die Werte aus result/0/ wichtig, da dies die aktuellen Sollwerte sind. Wäre super, wenn ihr mir einen Tipp geben könnt, warum mein Script nicht geht.... Vielen Dank im Voraus an die Community![/i][/i][/i][/i][/i][/i][/i]
-
Das Problem ist, das in "function CreateDevices(data)" direkt zu "else{console.warn('Response in JSON nicht gefunden ! ')}" geht und in den Log eingetragen wird. Datenpunkte werden keine erstellt..
Für mich sind momentan nur die Werte aus result/0/ wichtig, da dies die aktuellen Sollwerte sind.
Wäre super, wenn ihr mir einen Tipp geben könnt, warum mein Script nicht geht….
Vielen Dank im Voraus an die Community! `
Du übergibst Deiner Funktion CreateDevices(data) den body, sprich den Inhalt, den Du oben als Rückmeldung gepostet hast.
Dort ist kein Response drin, auf den Du in der Funktion CreateDevices(data) testes. Damit kommst Du in den else Zweig der if Abfrage und es werden keine Datenpunkte angelegt.
Im weiteren Verlauf verwendest Du weiter response. Es muss aus meiner Sicht immer result sein. Result kommt im übergebenen json vor.
Dann sucht Du immer im json unter result ."name".
statt
data.response__[Group_by]
muss hier
data.result__[ObjName]
response gibt es nicht => result
Group_by ist bei Dir immer "name"
ObjName ist der Name des jeweiligen Datenpunks aus dem JSON.
Dann kommen noch ein paar Probleme in Deiner Funktion (Arrays innerhalb des Objekts, null, …).____
-
Jetzt stehe ich an einer Sache an und komme nicht weiter, daher habe ich mich jetzt mal angemeldet unf hoffe ihr könnt mir ein wenig helfen… `
Ach ja… und herzlich willkommen im Forum
Viel Spaß mit ioBroker!
-
Hallo Ruhr70,
vielen Dank für deine Erklärung. Wie Du dir vielleicht vorstellen kannst, bin ich jetzt als Nicht-Profi nicht wirklich in der Lage Dir zu folgen..
Wenn möglich kannst Du mir die Stellen, an den die Änderung hin muss in meinem Script markieren. Wenn ich genau wüsste wo die Änderung hin muss, kann ich es bestimmt auch besser nachvollziehen.
Vielen Dank schon mal für deinen Support!
-
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); }); } }