NEWS
JSON parse Warnung beim auslesen vom Fronius Symo Gen24
-
Hallo,
Ich bitte um Hilfe !
Ich lese die aktuellen Daten eines Fronius nach der Anleitung in der Doku vom iobroker aus. (Werte sind angepasst an Ip und Daten des GEN24).
Allerdings erhalte ich Warnmeldungen bei 2 Werten (Siehe Bild unten)
Die Rohdaten per Browser sehen so aus:
Ausgabe von : http://192.168.2.xxx/solar_api/v1/GetPowerFlowRealtimeData.fcgi{ "Body" : { "Data" : { "Inverters" : { "1" : { "DT" : 1, "P" : 0 } }, "Site" : { "BatteryStandby" : false, "E_Day" : null, "E_Total" : null, "E_Year" : null, "Meter_Location" : "grid", "Mode" : "meter", "P_Akku" : null, "P_Grid" : 1053.3, "P_Load" : -1053.3, "P_PV" : 0.0, "rel_Autonomy" : 0.0, "rel_SelfConsumption" : null }, "Version" : "12" } }, "Head" : { "RequestArguments" : {}, "Status" : { "Code" : 0, "Reason" : "", "UserMessage" : "" }, "Timestamp" : "2021-11-08T16:25:08+00:00" } } Das dazugehörige Script: var request = require("request"); var myJson = {}; var pfad = "Fronius_Symo_Hybrid."; var idP_Akku = pfad + "P_Akku"; var idP_Grid = pfad + "P_Grid"; var idP_Load = pfad + "P_Load"; var idP_PV = pfad + "P_PV"; createState(idP_Akku, 0, { name: 'Leistung Akku', desc: 'Leistung Akku', type: 'number', role: 'value', unit: 'W' }); createState(idP_Grid, 0, { name: 'Leistung Netz', desc: 'Leistung Netz', type: 'number', role: 'value', unit: 'W' }); createState(idP_Load, 0, { name: 'Leistung Haus', desc: 'Leistung Haus', type: 'number', role: 'value', unit: 'W' }); createState(idP_PV, 0, { name: 'Leistung PV', desc: 'Leistung PV', type: 'number', role: 'value', unit: 'W' }); function parseJson(text) { var json ; 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); } }); } var url = 'http://192.168.2.211/solar_api/v1/GetPowerFlowRealtimeData.fcgi'; function main() { readJson(url, function(err,json) { if(!err) { myJson = json; //console.log(myJson.Body.Data.Site.P_Load); //setState(idP_Akku ,myJson.Body.Data.Site.P_Akku); setState(idP_Grid ,myJson.Body.Data.Site.P_Grid); //setState(idP_Load ,myJson.Body.Data.Site.P_Load); //setState(idP_PV ,myJson.Body.Data.Site.P_PV); } else { log("Fehler beim Auslesen des JSON. Keine Daten erhalten.","warn"); myJson = {}; } }); } //schedule("*/10 * * * *", function () { // alle 10 Minuten die Werte abfragen // main(); //}); //alle 10 sec abfragen setInterval(main, 10000); // Beim Skriptstart die Werte abfragen setTimeout(main,500);
MOD-Edit: Code in code-tags gesetzt!
Bei jedem Auslesen von P_Load und P_PV erhalte ich eine Warnung. Die Werte selbst werden korrekt eingetragen.
Vielen Dank für Hilfe Gruss Rudi
-
@rudiradi
JSON und das Skript bitte in Code tags posten, da so nicht lesbar. -
@rudiradi
Sorry bin neu hier.
Das sind die Daten per browser aus dem Fronius ausgelesen:{ "Body" : { "Data" : { "Inverters" : { "1" : { "DT" : 1, "P" : 0 } }, "Site" : { "BatteryStandby" : false, "E_Day" : null, "E_Total" : null, "E_Year" : null, "Meter_Location" : "grid", "Mode" : "meter", "P_Akku" : null, "P_Grid" : 1053.3, "P_Load" : -1053.3, "P_PV" : 0.0, "rel_Autonomy" : 0.0, "rel_SelfConsumption" : null }, "Version" : "12" } }, "Head" : { "RequestArguments" : {}, "Status" : { "Code" : 0, "Reason" : "", "UserMessage" : "" }, "Timestamp" : "2021-11-08T16:25:08+00:00" } }
Das ist mein modifizierter Script zum auslesen der JSON Daten:
var request = require("request"); var myJson = {}; var pfad = "Fronius_Symo_Hybrid."; var idP_Akku = pfad + "P_Akku"; var idP_Grid = pfad + "P_Grid"; var idP_Load = pfad + "P_Load"; var idP_PV = pfad + "P_PV"; createState(idP_Akku, 0, { name: 'Leistung Akku', desc: 'Leistung Akku', type: 'number', role: 'value', unit: 'W' }); createState(idP_Grid, 0, { name: 'Leistung Netz', desc: 'Leistung Netz', type: 'number', role: 'value', unit: 'W' }); createState(idP_Load, 0, { name: 'Leistung Haus', desc: 'Leistung Haus', type: 'number', role: 'value', unit: 'W' }); createState(idP_PV, 0, { name: 'Leistung PV', desc: 'Leistung PV', type: 'number', role: 'value', unit: 'W' }); function parseJson(text) { var json ; 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); } }); } var url = 'http://192.168.2.211/solar_api/v1/GetPowerFlowRealtimeData.fcgi'; function main() { readJson(url, function(err,json) { if(!err) { myJson = json; //console.log(myJson.Body.Data.Site.P_Load); //setState(idP_Akku ,myJson.Body.Data.Site.P_Akku); setState(idP_Grid ,myJson.Body.Data.Site.P_Grid); //setState(idP_Load ,myJson.Body.Data.Site.P_Load); //setState(idP_PV ,myJson.Body.Data.Site.P_PV); } else { log("Fehler beim Auslesen des JSON. Keine Daten erhalten.","warn"); myJson = {}; } }); } //schedule("*/10 * * * *", function () { // alle 10 Minuten die Werte abfragen // main(); //}); //alle 10 sec abfragen setInterval(main, 10000); // Beim Skriptstart die Werte abfragen setTimeout(main,500);
P_Load und P_PV sind auskommentiret da dort Warnungen kommen !?
Gruß Rudi -
@rudiradi sagte: da dort Warnungen kommen !?
Schau mal in den Tab "Protokolle", um mehr über die Warnungen zu erfahren.
-
@rudiradi sagte: Das ist mein modifizierter Script zum auslesen der JSON Daten:
Weshalb verschachtelst Du so Funktionen?
Ich habe mal den Teil ab Zeile 48 vereinfacht:const url = 'http://192.168.2.211/solar_api/v1/GetPowerFlowRealtimeData.fcgi'; function main() { request(url, function (err, state, body) { let site = null; if(!err && body) { site = JSON.parse(body).Body.Data.Site; } else { let error = "(" + err + ") ERROR bei Abfrage von: " + url; log(error, "warn"); } if(site) { //log(site.P_Load); //setState(idP_Akku ,site.P_Akku, true); setState(idP_Grid ,site.P_Grid, true); setState(idP_Load ,site.P_Load, true); setState(idP_PV ,site.P_PV, true); } }); } schedule("* * * * *", main); // jede Minute die Werte abfragen // Beim Skriptstart die Werte abfragen setTimeout(main,500);
-
@paul53
Vielen Dank für die schnelle Antwort. Bin ein paar Tage im Urlaub und werde es dann testen und mich melden. Gruß Rudi -
@paul53
Hallo,
Ich habe den vereinfachten script ausprobiert. Liest alle Werte aus mit Warnungen bei den gleichen 2 Werten (s.o.)
Geht wirklich einfacherHabe den Script selbst hier aus dem Forum:
https://forum.iobroker.net/topic/2294/fronius-symo-hybrid-über-javaskript-auslesen-json/6Hier die Protokolle dazu: (damit kann ich nichts anfangen)
javascript.0 2021-11-15 19:16:01.483 warn at processTicksAndRejections (internal/process/task_queues.js:84:21) javascript.0 2021-11-15 19:16:01.483 warn at endReadableNT (_stream_readable.js:1241:12) javascript.0 2021-11-15 19:16:01.483 warn at IncomingMessage.EventEmitter.emit (domain.js:483:12) javascript.0 2021-11-15 19:16:01.483 warn at IncomingMessage.emit (events.js:326:22) javascript.0 2021-11-15 19:16:01.483 warn at Object.onceWrapper (events.js:420:28) javascript.0 2021-11-15 19:16:01.483 warn at IncomingMessage.<anonymous> (/opt/iobroker/node_modules/request/request.js:1076:12) javascript.0 2021-11-15 19:16:01.483 warn at Request.EventEmitter.emit (domain.js:483:12) javascript.0 2021-11-15 19:16:01.483 warn at Request.emit (events.js:314:20) javascript.0 2021-11-15 19:16:01.483 warn at Request.<anonymous> (/opt/iobroker/node_modules/request/request.js:1154:10) javascript.0 2021-11-15 19:16:01.483 warn at Request.EventEmitter.emit (domain.js:483:12) javascript.0 2021-11-15 19:16:01.483 warn at Request.emit (events.js:314:20) javascript.0 2021-11-15 19:16:01.483 warn at Request.self.callback (/opt/iobroker/node_modules/request/request.js:185:22) javascript.0 2021-11-15 19:16:01.482 warn at Request._callback (/opt/iobroker/node_modules/iobroker.javascript/lib/request.js:27:17) javascript.0 2021-11-15 19:16:01.482 warn at script.js.common.fronius_auslesen_2:64:13 javascript.0 2021-11-15 19:16:01.482 warn at setState (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1439:20) javascript.0 2021-11-15 19:16:01.482 warn You are assigning a number to the state "javascript.0.Fronius_Symo_Hybrid.P_PV" which expects a Energie total. Please fix your code to use a Energie total or change the state type to number. This warning might become an error in future versions. javascript.0 2021-11-15 19:16:01.482 warn at processTicksAndRejections (internal/process/task_queues.js:84:21) javascript.0 2021-11-15 19:16:01.482 warn at endReadableNT (_stream_readable.js:1241:12) javascript.0 2021-11-15 19:16:01.482 warn at IncomingMessage.EventEmitter.emit (domain.js:483:12) javascript.0 2021-11-15 19:16:01.481 warn at IncomingMessage.emit (events.js:326:22) javascript.0 2021-11-15 19:16:01.481 warn at Object.onceWrapper (events.js:420:28) javascript.0 2021-11-15 19:16:01.481 warn at IncomingMessage.<anonymous> (/opt/iobroker/node_modules/request/request.js:1076:12) javascript.0 2021-11-15 19:16:01.481 warn at Request.EventEmitter.emit (domain.js:483:12) javascript.0 2021-11-15 19:16:01.481 warn at Request.emit (events.js:314:20) javascript.0 2021-11-15 19:16:01.481 warn at Request.<anonymous> (/opt/iobroker/node_modules/request/request.js:1154:10) javascript.0 2021-11-15 19:16:01.481 warn at Request.EventEmitter.emit (domain.js:483:12) javascript.0 2021-11-15 19:16:01.481 warn at Request.emit (events.js:314:20) javascript.0 2021-11-15 19:16:01.481 warn at Request.self.callback (/opt/iobroker/node_modules/request/request.js:185:22) javascript.0 2021-11-15 19:16:01.481 warn at Request._callback (/opt/iobroker/node_modules/iobroker.javascript/lib/request.js:27:17) javascript.0 2021-11-15 19:16:01.481 warn at script.js.common.fronius_auslesen_2:63:13 javascript.0 2021-11-15 19:16:01.481 warn at setState (/opt/iobroker/node_modules/iobroker.javascript/lib/sandbox.js:1439:20) javascript.0 2021-11-15 19:16:01.480 warn You are assigning a number to the state "javascript.0.Fronius_Symo_Hybrid.P_Load" which expects a Energie Jahr. Please fix your code to use a Energie Jahr or change the state type to number. This warning might become an error in future versions.
Vielen Dank für Hilfe Gruß Rudi
-
@rudiradi sagte::
warn You are assigning a number to the state "javascript.0.Fronius_Symo_Hybrid.P_Load" which expects a Energie Jahr.
common.type = "Energie Jahr" ist ungültig!
-
@rudiradi sagte in JSON parse Warnung beim auslesen vom Fronius Symo Gen24:
damit kann ich nichts anfangen
da steht
@rudiradi sagte in JSON parse Warnung beim auslesen vom Fronius Symo Gen24:
You are assigning a number to the state "javascript.0.Fronius_Symo_Hybrid.P_Load" which expects a Energie Jahr
was ist das denn für ein Typ?
-
@paul53
Daqnke,Danke das wars!Der Fehler lag in meinen Objekten:
Zeile 5 und 12{ "common": { "name": "Leistung Haus", "desc": "Leistung Haus", "type": "number", "role": "value", "unit": "W" }, "native": { "name": "Leistung Haus", "desc": "Leistung Haus", "type": "number", "role": "value", "unit": "W" }, "type": "state", "_id": "javascript.0.Fronius_Symo_Hybrid.P_Load", "acl": { "object": 1636, "state": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator" }, "from": "system.adapter.admin.0", "user": "system.user.admin", "ts": 1637005033310 }