NEWS
Json aus Rest Api URL von Solaranalge
-
Hallo ich habe den tollen Adapter für Solarwatt, leider ist bei mir irgenwo der Wurm drin.
Deshalb möchte ich gerne einige Werte per JavaScript abfragen.
Ich habe das mit der Verschachtelung im Json in iobroker nicht verstanden.
Kann mir da jemand weiter helfen?Das ist das JSON der Seite:
[ { "id": "xxxxxxx", "name": "PV-Anlage", "deviceClass": "com.kiwigrid.devices.pvplant.PVPlant", "powerACOut": 0 }, { "id": "urn:kiwigrid:location:xxxxxx", "name": "Standort 1", "deviceClass": "com.kiwigrid.devices.location.Location", "powerConsumed": 3445.4679999999985, "powerProduced": 0, "powerIn": 844, "powerOut": 0 } ]
Hier mein zusammengeklebtest JavaScript
var url = 'http://192.168.xxx.xxx/rest/kiwigrid/eps/powerValues'; var path = "solarwatt."; var idpowerACOut = path + "powerACOut"; var idpowerConsumed = path + "powerConsumed"; var request = require("request"); var myJson = {}; createState(idpowerACOut, 0, { name: 'powerACOut aus', desc: 'xxxx', type: 'number', role: 'value' }); createState(idpowerConsumed, 0, { name: 'powerConsumed alles', desc: 'xxxx', type: 'number', role: 'value' }); function parseJson(text) { if (text === "") return {}; try { json = JSON.parse(text); } catch (ex) { json = {}; } if(!json) json = {}; return json; } function readJson(url, callback) { request(url, function (err, state, body){ if (body) { var json = parseJson(body); callback(null, json); } else { var error = "(" + err + ") ERROR bei Abfrage von: " + url; log(error, "warn"); callback(error, null); } }); } function main() { readJson(url, function(err,json) { if(!err) { myJson = json; log("powerACOut: " + myJson.powerACOut,"info"); log("powerConsumed: " + myJson.powerConsumed,"info"); setState(idpowerACOut ,parseInt(myJson.powerACOut)); setState(idpowerConsumed ,parseFloat(myJson.powerConsumed)); } else { log("Error reading JSON from solarwatt. No data!","warn"); myJson = {}; } }); }
Im Log steht dann das und es kommen natürlich keine Werte an
10:33:02.353 info javascript.0 script.js.xxx.json91: powerACOut: undefined 10:33:02.353 info javascript.0 script.js.xxx.json91: powerConsumed: undefined
Alles was im im Browser oder der JavaScript Editor funktioniert, will im iobroker nicht...
[1]["powerConsumed"] [1].powerConsumed 1.powerConsumed
-
@lutzer
JSON (String) muss erst in ein Objekt gewandelt werden (Zeile 49), um auf die Eigenschaften zugreifen zu können.myJson = JSON.parse(json);
-
@paul53 said in Json aus Rest Api URL von Solaranalge:
myJson = JSON.parse(json);
OK hab ich getausch, klappt leider noch nicht.
Hier das Log
11:08:05.526 error javascript.0 script.js.xxx.json91: SyntaxError: Unexpected token o in JSON at position 1 11:08:05.526 error javascript.0 at script.js.xxx.json91:49:28 11:08:05.526 error javascript.0 at Request._callback (script.js.xxx.json91:37:13)
Wenn ich folgendes verwende bekomme ich auch Daten:
log("powerACOut: " + myJson[0].powerACOut,"info"); an Stelle von log("powerACOut: " + myJson.powerACOut,"info");
Das müsste es ja sein, steht auch kein Fehler in der Log (außer wenn ich jetzt " myJson = JSON.parse(json);" verwende.
11:17:14.485 info javascript.0 Start javascript script.js.xxx.json91 11:17:14.485 info javascript.0 script.js.xxx.json91: registered 0 subscriptions and 1 schedule 11:17:15.058 info javascript.0 script.js.xxx.json91: powerACOut: 1252.3125999999997 11:17:15.058 info javascript.0 script.js.xxx.json91: powerConsumed: 780
-
@lutzer sagte:
steht auch kein Fehler in der Log (außer wenn ich jetzt " myJson = JSON.parse(json);" verwende.
Dann ist es kein JSON, sondern bereits ein Objekt. Sehe gerade: Das Parsen passiert bereits in der Funktion readJson().
Zeilen 52, 53 müssten dann so funktionieren:
setState(idpowerACOut, parseInt(myJson[0].powerACOut)); setState(idpowerConsumed, parseFloat(myJson[1].powerConsumed));
-
@paul53 said in Json aus Rest Api URL von Solaranalge:
Ja genau so klappt es DANKE.
Ich habe da noch einen wieteren Link der etwas mehr verschachtelt ist.
Irgendwie komme ich da mit "[4]" nicht weiter:
Ich möchte die "282" haben:{ "result": { "items": [ { "tagValues": { "PowerIn": { "tagName": "PowerIn", "guid": "urn:solarwatt:myreserve:pm:xxxxxxxx", "value": 282 },
log("PowerIn: " + myJson[4].PowerIn,"info"); setState(idDPowerIn ,parseInt(myJson[4].PowerIn));
Der Pfad im Browser sagt: result.items[0].tagValues.PowerIn.value
-
@lutzer sagte:
Der Pfad im Browser sagt: result.items[0].tagValues.PowerIn.value
Enthält myJson schon das Objekt oder JSON ? Für das Objekt sollte es so funktionieren:
myJson.result.items[0].tagValues.PowerIn.value
parseInt() ist nicht erforderlich, denn es ist bereits eine Zahl.
-
Alles Gut habe mich in der Funktion vertan.
ES geht genau so.
Vielen Dank!Sehr cool das man den phat aus dem Browser nehmen kann.
-
Ich hab da heute Morgen ein neues Problem bekommen.
Diese Nacht wurde die Firmware vom Energymanager geupdatet und die Struktur der Json verändert.Kann man das irgendwie anders abfangen, durch suchen oder ähnliches?
//alt: setState(idDPowerSelfSupplied ,myJson.result.items[1].tagValues.PowerSelfSupplied.value); log("PowerConsumedFromStorage: " + myJson.result.items[1].tagValues.PowerConsumedFromStorage.value,"info"); //neu: setState(idDPowerSelfSupplied ,myJson.result.items[5].tagValues.PowerSelfSupplied.value); log("PowerConsumedFromStorage: " + myJson.result.items[5].tagValues.PowerConsumedFromStorage.value,"info");
Was unschön ist das manche Bezeichnungen sich etwas gleichen:
"StateOfCharge": //gesucht "StateOfChargeReactivateDischarging": //nicht gesucht "StateOfChargeMinimum": //nicht gesucht "StateOfChargeShutDownLimit": //nicht gesucht
-
@lutzer sagte:
abfangen, durch suchen oder ähnliches?
var arr = myJson.result.items; for(let i = 0; i < arr.length; i++) { if(arr[i].tagValues) { let tags = arr[i].tagValues; if(tags.PowerSelfSupplied) { log(tags.PowerSelfSupplied.value); } if(tags.PowerConsumedFromStorage) { log(tags.PowerConsumedFromStorage.value); } } }
-
Könntest du mir bitte helfen wo ich die Schleife einbauen muss?
Ich denke ich habe es gefunden. Aber wenn du noch mal drüber schauen würdest wär ich dankbar.Hier der aktuelle Code:
//...Teil der Funktion readJson(urlDevices, function(err,json) { if(!err) { myJson = json; var arr = myJson.result.items; for(let i = 0; i < arr.length; i++) { if(arr[i].tagValues) { let tags = arr[i].tagValues; if(tags.PowerIn) { log(tags.PowerIn.value); setState(idDPowerIn ,tags.PowerIn.value); } if(tags.PowerSelfSupplied) { log(tags.PowerSelfSupplied.value); setState(idDPowerSelfSupplied ,tags.PowerSelfSupplied.value); } //...usw
//der alte Code var urlValues = 'http://192.168.xxx.xxx/rest/kiwigrid/eps/powerValues'; var urlDevices = 'http://192.168.xxx.xxx/rest/kiwigrid/wizard/devices'; var path = "solarwatt."; var request = require("request"); var myJson = {}; //Values var idpowerACOut = path + "powerACOut"; var idpowerConsumed = path + "powerConsumed"; var idpowerProduced = path + "powerProduced"; var idpowerIn = path + "powerIn"; var idpowerOut = path + "powerOut"; createState(idpowerACOut, 0, { name: 'powerACOut aus', desc: 'xxxx', type: 'number', role: 'value'}); createState(idpowerConsumed, 0, { name: 'Gesamtverbrauch', desc: 'xxxx', type: 'number', role: 'value'}); createState(idpowerProduced, 0, { name: 'powerProduced', desc: 'xxxx', type: 'number', role: 'value'}); createState(idpowerIn, 0, { name: 'powerIn', desc: 'xxxx', type: 'number', role: 'value'}); createState(idpowerOut, 0, { name: 'powerOut', desc: 'xxxx', type: 'number', role: 'value'}); //Devices var idDPowerIn = path + "PowerInD"; var idDPowerSelfSupplied = path + "PowerSelfSupplied"; var idDPowerConsumedFromStorage = path + "PowerConsumedFromStorage"; var idDStateOfCharge = path + "StateOfCharge"; var idDPowerConsumedFromGrid = path + "PowerConsumedFromGrid"; var idDPowerBuffered = path + "PowerBuffered"; var idDPowerConsumedFromProducers = path + "PowerConsumedFromProducers"; createState(idDPowerSelfSupplied, 0, { name: 'Eigenverbrauch', desc: 'xxxx', type: 'number', role: 'value' }); createState(idDPowerIn, 0, { name: 'Stromzukauf', desc: 'xxxx', type: 'number', role: 'value' }); createState(idDPowerConsumedFromStorage, 0, { name: 'Batterieversorgung', desc: 'xxxx', type: 'number', role: 'value' }); createState(idDStateOfCharge, 0, { name: 'Ladestand', desc: 'xxxx', type: 'number', role: 'value' }); createState(idDPowerConsumedFromGrid, 0, { name: 'Netzbezug', desc: 'xxxx', type: 'number', role: 'value' }); createState(idDPowerBuffered, 0, { name: 'Batterieaufladung', desc: 'xxxx', type: 'number', role: 'value' }); createState(idDPowerConsumedFromProducers, 0, { name: 'Eigenverbrauch', desc: 'xxxx', type: 'number', role: 'value' }); function parseJson(text) { if (text === "") return {}; try { json = JSON.parse(text); } catch (ex) { json = {};} if(!json) json = {}; return json; } function readJson(url, callback) { request(url, function (err, state, body){ if (body) { var json = parseJson(body); callback(null, json); } else { var error = "(" + err + ") ERROR bei Abfrage von: " + url; log(error, "warn"); callback(error, null);} });} function main() { readJson(urlValues, function(err,json) { if(!err) { myJson = json; log("powerACOut: " + myJson[0].powerACOut,"info"); log("powerConsumed: " + myJson[1].powerConsumed,"info"); log("powerProduced: " + myJson[1].powerProduced,"info"); log("powerIn: " + myJson[1].powerIn,"info"); log("powerOut: " + myJson[1].powerOut,"info"); setState(idpowerACOut ,parseInt(myJson[0].powerACOut)); setState(idpowerConsumed ,parseInt(myJson[1].powerConsumed)); setState(idpowerProduced ,parseInt(myJson[1].powerProduced)); setState(idpowerIn ,parseInt(myJson[1].powerIn)); setState(idpowerOut ,parseInt(myJson[1].powerOut)); } else { log("Error reading JSON from solarwatt. No data!","warn"); myJson = {}; } }); readJson(urlDevices, function(err,json) { if(!err) { myJson = json; log("PowerIn: " + myJson.result.items[2].tagValues.PowerIn.value,"info"); setState(idDPowerIn ,myJson.result.items[2].tagValues.PowerIn.value); log("PowerSelfSupplied: " + myJson.result.items[5].tagValues.PowerSelfSupplied.value,"info"); setState(idDPowerSelfSupplied ,myJson.result.items[5].tagValues.PowerSelfSupplied.value); log("PowerConsumedFromStorage: " + myJson.result.items[5].tagValues.PowerConsumedFromStorage.value,"info"); setState(idDPowerConsumedFromStorage ,myJson.result.items[5].tagValues.PowerConsumedFromStorage.value); log("StateOfCharge: " + myJson.result.items[10].tagValues.StateOfCharge.value,"info"); setState(idDStateOfCharge ,myJson.result.items[10].tagValues.StateOfCharge.value); log("PowerConsumedFromGrid: " + myJson.result.items[5].tagValues.PowerConsumedFromGrid.value,"info"); setState(idDPowerConsumedFromGrid ,myJson.result.items[5].tagValues.PowerConsumedFromGrid.value); log("PowerBuffered: " + myJson.result.items[5].tagValues.PowerBuffered.value,"info"); setState(idDPowerBuffered ,myJson.result.items[5].tagValues.PowerBuffered.value); log("PowerConsumedFromProducers: " + myJson.result.items[5].tagValues.PowerConsumedFromProducers.value,"info"); setState(idDPowerConsumedFromProducers ,myJson.result.items[5].tagValues.PowerConsumedFromProducers.value); } else { log("Error reading JSON from solarwatt. No data!","warn"); myJson = {}; } }); }