NEWS
Fronius Symo Hybrid über Javaskript auslesen (Json)
-
Guten Abend,
zu Ostern habe ich mein scheitern zum Thema Modbus hier im Forum dokumentiert.
Der WechselRichter hat mit dem SW-Versionsstand eine Macke an der Ecke (lt. Support).
Anschließend habe ich mehrere Wege verfolgt, jetzt bin ich der Meinung das die Übung mit JavaSkript erledigt werden könnte?
über folgende URL:
10.0.0.6/solar_api/v1/GetInverterRealtimeData.cgi?Scope=System
bekomme ich folgende vier Werte zurück, kann mir der IOBroker diese auslesen, anzeigen und wegspeichern?
{ "Head" : { "RequestArguments" : { "DataCollection" : "", "Scope" : "System" }, "Status" : { "Code" : 0, "Reason" : "", "UserMessage" : "" }, "Timestamp" : "2016-04-06T19:56:37+02:00" }, "Body" : { "Data" : { "PAC" : { "Unit" : "W", "Values" : { "1" : 0 } }, "DAY_ENERGY" : { "Unit" : "Wh", "Values" : { "1" : 23834 } }, "YEAR_ENERGY" : { "Unit" : "Wh", "Values" : { "1" : 390751 } }, "TOTAL_ENERGY" : { "Unit" : "Wh", "Values" : { "1" : 391336 } } } } }
kann mir BITTE jemand helfen!!!
Danke für Eure Unterstützung!
lg SolarElch
-
bekomme ich folgende vier Werte zurück, kann mir der IOBroker diese auslesen, anzeigen und wegspeichern? `
probier mal:
var request = require("request"); var myJson; var pfad = "Fronius_Symo_Hybrid."; var idDAY_ENERGY = pfad + "ENERGY_DAY"; var idPAC = pfad + "PAC"; var idYEAR_ENERGY = pfad + "ENERGY_YEAR"; var idTOTAL_ENERGY = pfad + "ENERGY_TOTAL"; createState(idDAY_ENERGY, 0, { name: 'Energie Tag', desc: 'Energie Tag', type: 'number', role: 'value', unit: 'Wh' }); createState(idPAC, 0, { name: 'Leistung', desc: 'Leistung', type: 'number', role: 'value', unit: 'W' }); createState(idYEAR_ENERGY, 0, { name: 'Energie Jahr', desc: 'Leistung', type: 'Energie Jahr', role: 'value', unit: 'Wh' }); createState(idTOTAL_ENERGY, 0, { name: 'Energie Total', desc: 'Leistung', type: 'Energie total', role: 'value', unit: 'Wh' }); 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); } }); } var url = 'http://10.0.0.6/solar_api/v1/GetInverterRealtimeData.cgi?Scope=System'; readJson(url, function(err,json) { if(!err) { myJson = json; //log(myJson.LocationList.StopLocation[0].name); log("DAY_ENERGY: " + myJSON.Body.Data.DAY_ENERGY.Values[1],"info"); log("PAC: " + myJSON.Body.Data.PAC.Values[1],"info"); log("YEAR_ENERGY: " + myJSON.Body.Data.YEAR_ENERGY.Values[1],"info"); log("TOTAL_ENERGY: " + myJSON.Body.Data.TOTAL_ENERGY.Values[1],"info"); setState(idDAY_ENERGY ,myJSON.Body.Data.DAY_ENERGY.Values[1]); setState(idPAC ,myJSON.Body.Data.PAC.Values[1]); setState(idYEAR_ENERGY ,myJSON.Body.Data.YEAR_ENERGY.Values[1]); setState(idTOTAL_ENERGY ,myJSON.Body.Data.TOTAL_ENERGY.Values[1]); } else { log("Fehler beim Auslesen des JSON. Keine Daten erhalten.","warn"); myJson = {}; } });
-
Guten Abend ruhr70!
so nah war ich meinem Ziel noch nicht!!!!
es ist zum greifen nahe…
dachte schon ich muss auf eine andere Plattform ausweichen...!!!
JS ist so etwas von nicht meine Welt... DANKE, DANKE, DANKE!!!!
anbei der der Auszug aus dem Log:
ReferenceError: myJSON is not defined at script.js.Fronius.HausStrom.Skript1:79:35 at Request._callback (script.js.Fronius.HausStrom.Skript1:63:13) at Request.self.callback (/opt/iobroker/node_modules/iobroker.javascript/node_modules/request/request.js:199:22) at Request.EventEmitter.emit (events.js:98:17) at Request. (/opt/iobroker/node_modules/iobroker.javascript/node_modules/request/request.js:1036:10) at Request.EventEmitter.emit (events.js:117:20) at IncomingMessage. (/opt/iobroker/node_modules/iobroker.javascript/node_modules/request/request.js:963:12) at IncomingMessage.EventEmitter.emit (events.js:117:20) at _stream_readable.js:920:16 at process._tickCallback (node.js:415:13)
sehe die Werte schon im VIS...
das ist alles sooooo spannend...
lg SolarElch
-
sehe die Werte schon im VIS… `
Du dürftest aber nur die nackten Datenpunkte ohne Inhalt gesehen haben oder?
Ich hatte da leider einenTippfehler (myJSON statt myJson) drin. Danke fürs log.
Neue Version. Fragt nun zum Anfang die Werte einmal ab und dann alle 10 Minuten.
var request = require("request"); var myJson = {}; var pfad = "Fronius_Symo_Hybrid."; var idDAY_ENERGY = pfad + "ENERGY_DAY"; var idPAC = pfad + "PAC"; var idYEAR_ENERGY = pfad + "ENERGY_YEAR"; var idTOTAL_ENERGY = pfad + "ENERGY_TOTAL"; createState(idDAY_ENERGY, 0, { name: 'Energie Tag', desc: 'Energie Tag', type: 'number', role: 'value', unit: 'Wh' }); createState(idPAC, 0, { name: 'Leistung', desc: 'Leistung', type: 'number', role: 'value', unit: 'W' }); createState(idYEAR_ENERGY, 0, { name: 'Energie Jahr', desc: 'Leistung', type: 'Energie Jahr', role: 'value', unit: 'Wh' }); createState(idTOTAL_ENERGY, 0, { name: 'Energie Total', desc: 'Leistung', type: 'Energie total', role: 'value', unit: 'Wh' }); 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); } }); } var url = 'http://10.0.0.6/solar_api/v1/GetInverterRealtimeData.cgi?Scope=System'; function main() { readJson(url, function(err,json) { if(!err) { myJson = json; log("DAY_ENERGY: " + myJson.Body.Data.DAY_ENERGY.Values[1],"info"); log("PAC: " + myJson.Body.Data.PAC.Values[1],"info"); log("YEAR_ENERGY: " + myJson.Body.Data.YEAR_ENERGY.Values[1],"info"); log("TOTAL_ENERGY: " + myJson.Body.Data.TOTAL_ENERGY.Values[1],"info"); setState(idDAY_ENERGY ,myJson.Body.Data.DAY_ENERGY.Values[1]); setState(idPAC ,myJson.Body.Data.PAC.Values[1]); setState(idYEAR_ENERGY ,myJson.Body.Data.YEAR_ENERGY.Values[1]); setState(idTOTAL_ENERGY ,myJson.Body.Data.TOTAL_ENERGY.Values[1]); } else { log("Fehler beim Auslesen des JSON. Keine Daten erhalten.","warn"); myJson = {}; } }); } schedule("*/10 * * * *", function () { // alle 10 Minuten die Werte abfragen main(); }); // Beim Skriptstart die Werte abfragen setTimeout(main,500);
-
Servus ruhr70,
konnte es heute gar nicht mehr abwarten von der firma nach hause zu kommen.
ES FUNKTIONIERT!!!!
jetzt noch ein diagramm (wegen der optik
und die daten in eine sql db hinein (das werde ich über ein shell skript erledigen
kopiere mir dss skript dann noch einmal damit ich auch das smart meter auslesen kann….
7" display mit rahmen für den raspi ist schon bestellt, darstellung der werte für die frau
ps.: ist das ok für dich wenn ich diesen beitrag im pv forum verlinke, das werden sicher einige pv anlagen betreiber mit kuss verwenden.
du hast schon jetzt 186 views... das skript wird sicher der hit!!!!
Danke die noch einmal!!!!
lg SolarElch
-
Guten Abend ruhr70,
könne nochmal deine Unterstützung brauchen wenn du so nett bist….
habe dein Skript wie folgt umgebaut:
var request = require("request"); var myJson = {}; var pfad = "Fronius_SmartMeter"; var idEnergyReal_WAC_Sum_Produced = pfad + "EnergyReal_WAC_Sum_Produced"; var idEnergyReal_WAC_Sum_Consumed = pfad + "EnergyReal_WAC_Sum_Consumed"; var idEnergyReal_WAC_Plus_Absolute = pfad + "EnergyReal_WAC_Plus_Absolute"; var idEnergyReal_WAC_Minus_Absolute = pfad + "EnergyReal_WAC_Minus_Absolute"; createState(idEnergyReal_WAC_Sum_Produced, 0, { name: 'Sum Produced', desc: 'Sum Produced', type: 'number', role: 'value', unit: 'Wh' }); createState(idEnergyReal_WAC_Sum_Consumed, 0, { name: 'Sum Consumed', desc: 'Sum Consumed', type: 'number', role: 'value', unit: 'Wh' }); createState(idEnergyReal_WAC_Plus_Absolute, 0, { name: 'WAC Plus', desc: 'WAC Plus', type: 'number', role: 'value', unit: 'Wh' }); createState(idEnergyReal_WAC_Minus_Absolute, 0, { name: 'WAC Minus', desc: 'WAC Minus', type: 'number', role: 'value', unit: 'Wh' }); 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); } }); } var url = 'http://10.0.0.6/solar_api/v1/GetMeterRealtimeData.cgi?Scope=Device&DeviceId=0'; function main() { readJson(url, function(err,json) { if(!err) { myJson = json; log("EnergyReal_WAC_Sum_Produced: " + myJson.Body.Data.EnergyReal_WAC_Sum_Produced.Values[1],"info"); log("EnergyReal_WAC_Sum_Consumed: " + myJson.Body.Data.EnergyReal_WAC_Sum_Consumed.Values[1],"info"); log("EnergyReal_WAC_Plus_Absolute: " + myJson.Body.Data.EnergyReal_WAC_Plus_Absolute.Values[1],"info"); log("EnergyReal_WAC_Minus_Absolute: " + myJson.Body.Data.EnergyReal_WAC_Minus_Absolute.Values[1],"info"); setState(idEnergyReal_WAC_Sum_Produced ,myJson.Body.Data.EnergyReal_WAC_Sum_Produced.Values[1]); setState(idEnergyReal_WAC_Sum_Consumed ,myJson.Body.Data.EnergyReal_WAC_Sum_Consumed.Values[1]); setState(idEnergyReal_WAC_Plus_Absolute ,myJson.Body.Data.EnergyReal_WAC_Plus_Absolute.Values[1]); setState(idEnergyReal_WAC_Minus_Absolute ,myJson.Body.Data.EnergyReal_WAC_Minus_Absolute.Values[1]); } else { log("Fehler beim Auslesen des JSON. Keine Daten erhalten.","warn"); myJson = {}; } }); } schedule("*/15 * * * *", function () { // alle 15 Minuten die Werte abfragen main(); }); // Beim Skriptstart die Werte abfragen setTimeout(main,500); damit ich dann diesen String auslesen kann: { "Head" : { "RequestArguments" : { "DeviceClass" : "Meter", "DeviceId" : "0", "Scope" : "Device" }, "Status" : { "Code" : 0, "Reason" : "", "UserMessage" : "" }, "Timestamp" : "2016-04-14T22:20:20+02:00" }, "Body" : { "Data" : { "Details" : { "Serial" : "15520147", "Model" : "Fronius SmartMeter", "Manufacturer" : "Fronius" }, "TimeStamp" : 1460665219, "Enable" : 1, "Visible" : 1, "PowerReal_P_Sum" : 7345.59, "Meter_Location_Current" : 0, "PowerReal_P_Phase_1" : 3272.18, "PowerReal_P_Phase_2" : 2110.06, "PowerReal_P_Phase_3" : 1963.35, "PowerReactive_Q_Sum" : -96.62, "PowerReactive_Q_Phase_1" : -71.61, "PowerReactive_Q_Phase_2" : 38.35, "PowerReactive_Q_Phase_3" : -63.36, "Current_AC_Phase_1" : 14.174, "Current_AC_Phase_2" : 9.031, "Current_AC_Phase_3" : 8.433, "Voltage_AC_Phase_1" : 231.2, "Voltage_AC_Phase_2" : 233.8, "Voltage_AC_Phase_3" : 233, "Voltage_AC_PhaseToPhase_12" : 402.7, "Voltage_AC_PhaseToPhase_23" : 404.3, "Voltage_AC_PhaseToPhase_31" : 402, "Frequency_Phase_Average" : 50, "PowerApparent_S_Sum" : 7346, "PowerFactor_Sum" : 0.99, "PowerFactor_Phase_1" : 0.99, "PowerFactor_Phase_2" : 1, "PowerFactor_Phase_3" : 0.99, "EnergyReal_WAC_Sum_Produced" : 345066, "EnergyReal_WAC_Sum_Consumed" : 1113042, "EnergyReactive_VArAC_Sum_Produced" : 769590, "EnergyReactive_VArAC_Sum_Consumed" : 603290, "EnergyReal_WAC_Plus_Absolute" : 1113042, "EnergyReal_WAC_Minus_Absolute" : 345066 } } } im Log steht dann aber: 22:27:40.471 [info] javascript.0 Start javascript script.js.Fronius.HausStrom.Fronius_SmartMeter 22:27:40.472 [info] javascript.0 script.js.Fronius.HausStrom.Fronius_SmartMeter: registered 0 subscriptions and 1 schedule 22:27:41.597 [error] TypeError: Cannot read property '1' of undefined at script.js.Fronius.HausStrom.Fronius_SmartMeter:75:107 at Request._callback (script.js.Fronius.HausStrom.Fronius_SmartMeter:59:13) at Request.self.callback (/opt/iobroker/node_modules/iobroker.javascript/node_modules/request/request.js:199:22) at Request.EventEmitter.emit (events.js:98:17) at Request. (/opt/iobroker/node_modules/iobroker.javascript/node_modules/request/request.js:1036:10) at Request.EventEmitter.emit (events.js:117:20) at IncomingMessage. (/opt/iobroker/node_modules/iobroker.javascript/node_modules/request/request.js:963:12) at IncomingMessage.EventEmitter.emit (events.js:117:20) at _stream_readable.js:920:16 at process._tickCallback (node.js:415:13)
Danke!!! dir SolarElch
-
log("EnergyReal_WAC_Sum_Produced: " + myJson.Body.Data.EnergyReal_WAC_Sum_Produced.Values[1],"info"); log("EnergyReal_WAC_Sum_Consumed: " + myJson.Body.Data.EnergyReal_WAC_Sum_Consumed.Values[1],"info"); log("EnergyReal_WAC_Plus_Absolute: " + myJson.Body.Data.EnergyReal_WAC_Plus_Absolute.Values[1],"info"); log("EnergyReal_WAC_Minus_Absolute: " + myJson.Body.Data.EnergyReal_WAC_Minus_Absolute.Values[1],"info"); setState(idEnergyReal_WAC_Sum_Produced ,myJson.Body.Data.EnergyReal_WAC_Sum_Produced.Values[1]); setState(idEnergyReal_WAC_Sum_Consumed ,myJson.Body.Data.EnergyReal_WAC_Sum_Consumed.Values[1]); setState(idEnergyReal_WAC_Plus_Absolute ,myJson.Body.Data.EnergyReal_WAC_Plus_Absolute.Values[1]); setState(idEnergyReal_WAC_Minus_Absolute ,myJson.Body.Data.EnergyReal_WAC_Minus_Absolute.Values[1]); ```` `
Nach dem Aufbau Deines JSON ist das .Values[1] am Ende zu viel. Das kommt im JSON nicht vor.
Probier mal so:
log("EnergyReal_WAC_Sum_Produced: " + myJson.Body.Data.EnergyReal_WAC_Sum_Produced,"info"); log("EnergyReal_WAC_Sum_Consumed: " + myJson.Body.Data.EnergyReal_WAC_Sum_Consumed,"info"); log("EnergyReal_WAC_Plus_Absolute: " + myJson.Body.Data.EnergyReal_WAC_Plus_Absolute,"info"); log("EnergyReal_WAC_Minus_Absolute: " + myJson.Body.Data.EnergyReal_WAC_Minus_Absolute,"info"); setState(idEnergyReal_WAC_Sum_Produced ,myJson.Body.Data.EnergyReal_WAC_Sum_Produced); setState(idEnergyReal_WAC_Sum_Consumed ,myJson.Body.Data.EnergyReal_WAC_Sum_Consumed); setState(idEnergyReal_WAC_Plus_Absolute ,myJson.Body.Data.EnergyReal_WAC_Plus_Absolute); setState(idEnergyReal_WAC_Minus_Absolute ,myJson.Body.Data.EnergyReal_WAC_Minus_Absolute);
-
Hallo,
ich habe das Script modifiziert und erweitert.
Dies liest nun alle 5 Minuten die wichtigsten Daten von einem Fronius Symo mit Smart Meter.
Bei Verwendung einfach nur die IP Adresse anpassen.
Hier der Code:
!
var urlInverter = 'http://192.168.1.123/solar_api/v1/GetInverterRealtimeData.cgi?Scope=System'; var urlMeter = 'http://192.168.1.123/solar_api/v1/GetMeterRealtimeData.cgi?Scope=System'; ! var path = "froniusSymo."; var pathInverter = "inverter."; var pathMeter = "meter."; ! var idInverterCode = path + pathInverter + "Code"; var idPAC = path + pathInverter + "PAC"; var idDAY_ENERGY = path + pathInverter + "DAY_ENERGY"; var idYEAR_ENERGY = path + pathInverter + "YEAR_ENERGY"; var idTOTAL_ENERGY = path + pathInverter + "TOTAL_ENERGY"; var idMeterCode = path + pathMeter + "Code"; var idPowerRealPsum = path + pathMeter + "PowerReal_P_Sum"; var idPowerRealPphase1 = path + pathMeter + "PowerReal_P_Phase_1"; var idPowerRealPphase2 = path + pathMeter + "PowerReal_P_Phase_2"; var idPowerRealPphase3 = path + pathMeter + "PowerReal_P_Phase_3"; var idCurrentAcPhase1 = path + pathMeter + "Current_AC_Phase_1"; var idCurrentAcPhase2 = path + pathMeter + "Current_AC_Phase_2"; var idCurrentAcPhase3 = path + pathMeter + "Current_AC_Phase_3"; var idVoltageAcPhase1 = path + pathMeter + "Voltage_AC_Phase_1"; var idVoltageAcPhase2 = path + pathMeter + "Voltage_AC_Phase_2"; var idVoltageAcPhase3 = path + pathMeter + "Voltage_AC_Phase_3"; var idEnergyRealWacSumProd = path + pathMeter + "EnergyReal_WAC_Sum_Produced"; var idEnergyRealWacSumCons = path + pathMeter + "EnergyReal_WAC_Sum_Consumed"; ! createState(idInverterCode, 0, { name: 'Inverter request status code', desc: 'Indicates if the request went OK or gives a hint about what went wrong', type: 'number', role: 'value' }); ! createState(idPAC, 0, { name: 'Inverter AC power', desc: 'Actual AC power', type: 'number', role: 'value', unit: 'W' }); ! createState(idDAY_ENERGY, 0, { name: 'Inverter day energy', desc: 'Energy generated on current day', type: 'number', role: 'value', unit: 'Wh' }); ! createState(idYEAR_ENERGY, 0, { name: 'Inverter year energy', desc: 'Energy generated in current year', type: 'number', role: 'value', unit: 'Wh' }); ! createState(idTOTAL_ENERGY, 0, { name: 'Inverter overall energy', desc: 'Energy generated overall', type: 'number', role: 'value', unit: 'Wh' }); ! createState(idMeterCode, 0, { name: 'Meter request status code', desc: 'Indicates if the request went OK or gives a hint about what went wrong', type: 'number', role: 'value' }); ! createState(idPowerRealPsum, 0, { name: 'Meter consumption', desc: 'Actual consumption of power', type: 'number', role: 'value', unit: 'W' }); ! createState(idPowerRealPphase1, 0, { name: 'Meter consumption on phase 1', desc: 'Actual consumption of power on phase 1', type: 'number', role: 'value', unit: 'W' }); ! createState(idPowerRealPphase2, 0, { name: 'Meter consumption on phase 2', desc: 'Actual consumption of power on phase 2', type: 'number', role: 'value', unit: 'W' }); ! createState(idPowerRealPphase3, 0, { name: 'Meter consumption on phase 3', desc: 'Actual consumption of power on phase 3', type: 'number', role: 'value', unit: 'W' }); ! createState(idCurrentAcPhase1, 0, { name: 'Meter current on phase 1', desc: 'Actual AC current on phase 1', type: 'number', role: 'value', unit: 'A' }); ! createState(idCurrentAcPhase2, 0, { name: 'Meter current on phase 2', desc: 'Actual AC current on phase 2', type: 'number', role: 'value', unit: 'A' }); createState(idCurrentAcPhase3, 0, { name: 'Meter current on phase 3', desc: 'Actual AC current on phase 3', type: 'number', role: 'value', unit: 'A' }); ! createState(idVoltageAcPhase1, 0, { name: 'Meter voltage on phase 1', desc: 'Actual AC voltage on phase 1', type: 'number', role: 'value', unit: 'V' }); ! createState(idVoltageAcPhase2, 0, { name: 'Meter voltage on phase 2', desc: 'Actual AC voltage on phase 2', type: 'number', role: 'value', unit: 'V' }); createState(idVoltageAcPhase3, 0, { name: 'Meter voltage on phase 3', desc: 'Actual AC voltage on phase 3', type: 'number', role: 'value', unit: 'V' }); ! createState(idEnergyRealWacSumProd, 0, { name: 'Meter sum of energy produced', desc: 'Sum of real energy produced', type: 'number', role: 'value', unit: 'Wh' }); ! createState(idEnergyRealWacSumCons, 0, { name: 'Meter sum of energy consumed', desc: 'Sum of real energy consumed', type: 'number', role: 'value', unit: 'Wh' }); ! var request = require("request"); var myJson = {}; ! 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 request from: " + url; log(error, "warn"); callback(error, null); } }); } ! function main() { readJson(urlInverter, function(err,json) { if(!err) { myJson = json; log("Code: " + myJson.Head.Status.Code,"info"); log("PAC: " + myJson.Body.Data.PAC.Values[1],"info"); log("DAY_ENERGY: " + myJson.Body.Data.DAY_ENERGY.Values[1],"info"); log("YEAR_ENERGY: " + myJson.Body.Data.YEAR_ENERGY.Values[1],"info"); log("TOTAL_ENERGY: " + myJson.Body.Data.TOTAL_ENERGY.Values[1],"info"); setState(idInverterCode ,parseInt(myJson.Head.Status.Code)); setState(idPAC ,parseInt(myJson.Body.Data.PAC.Values[1])); setState(idDAY_ENERGY ,parseInt(myJson.Body.Data.DAY_ENERGY.Values[1])); setState(idYEAR_ENERGY ,parseInt(myJson.Body.Data.YEAR_ENERGY.Values[1])); setState(idTOTAL_ENERGY ,parseInt(myJson.Body.Data.TOTAL_ENERGY.Values[1])); } else { log("Error reading JSON from Fronius inverter. No data!","warn"); myJson = {}; } }); readJson(urlMeter, function(err,json) { if(!err) { myJson = json; log("Code: " + myJson.Head.Status.Code,"info"); log("PowerReal_P_Sum: " + myJson.Body.Data[0].PowerReal_P_Sum,"info"); log("PowerReal_P_Phase_1: " + myJson.Body.Data[0].PowerReal_P_Phase_1,"info"); log("PowerReal_P_Phase_2: " + myJson.Body.Data[0].PowerReal_P_Phase_2,"info"); log("PowerReal_P_Phase_3: " + myJson.Body.Data[0].PowerReal_P_Phase_3,"info"); log("Current_AC_Phase_1: " + myJson.Body.Data[0].Current_AC_Phase_1,"info"); log("Current_AC_Phase_2: " + myJson.Body.Data[0].Current_AC_Phase_2,"info"); log("Current_AC_Phase_3: " + myJson.Body.Data[0].Current_AC_Phase_3,"info"); log("Voltage_AC_Phase_1: " + myJson.Body.Data[0].Voltage_AC_Phase_1,"info"); log("Voltage_AC_Phase_2: " + myJson.Body.Data[0].Voltage_AC_Phase_2,"info"); log("Voltage_AC_Phase_3: " + myJson.Body.Data[0].Voltage_AC_Phase_3,"info"); log("EnergyReal_WAC_Sum_Produced: " + myJson.Body.Data[0].EnergyReal_WAC_Sum_Produced,"info"); log("EnergyReal_WAC_Sum_Consumed: " + myJson.Body.Data[0].EnergyReal_WAC_Sum_Consumed,"info"); setState(idMeterCode ,parseInt(myJson.Head.Status.Code)); setState(idPowerRealPsum ,parseInt(myJson.Body.Data[0].PowerReal_P_Sum)); setState(idPowerRealPphase1 ,parseInt(myJson.Body.Data[0].PowerReal_P_Phase_1)); setState(idPowerRealPphase2 ,parseInt(myJson.Body.Data[0].PowerReal_P_Phase_2)); setState(idPowerRealPphase3 ,parseInt(myJson.Body.Data[0].PowerReal_P_Phase_3)); setState(idCurrentAcPhase1 ,parseInt(myJson.Body.Data[0].Current_AC_Phase_1)); setState(idCurrentAcPhase2 ,parseInt(myJson.Body.Data[0].Current_AC_Phase_2)); setState(idCurrentAcPhase3 ,parseInt(myJson.Body.Data[0].Current_AC_Phase_3)); setState(idVoltageAcPhase1 ,parseInt(myJson.Body.Data[0].Voltage_AC_Phase_1)); setState(idVoltageAcPhase2 ,parseInt(myJson.Body.Data[0].Voltage_AC_Phase_2)); setState(idVoltageAcPhase3 ,parseInt(myJson.Body.Data[0].Voltage_AC_Phase_3)); setState(idEnergyRealWacSumProd ,parseInt(myJson.Body.Data[0].EnergyReal_WAC_Sum_Produced)); setState(idEnergyRealWacSumCons ,parseInt(myJson.Body.Data[0].EnergyReal_WAC_Sum_Consumed)); } else { log("Error reading JSON from Fronius Smart Meter. No data!","warn"); myJson = {}; } }); } ! schedule("*/5 * * * *", function () { // poll every 5 minutes main(); }); ! // poll values at startup setTimeout(main,500); !
-
Hallo,
ich habe das Script modifiziert und erweitert.
Dies liest nun alle 5 Minuten die wichtigsten Daten von einem Fronius Symo mit Smart Meter.
Bei Verwendung einfach nur die IP Adresse anpassen.
Hier der Code:
!
var urlInverter = 'http://192.168.1.123/solar_api/v1/GetInverterRealtimeData.cgi?Scope=System'; var urlMeter = 'http://192.168.1.123/solar_api/v1/GetMeterRealtimeData.cgi?Scope=System'; ! var path = "froniusSymo."; var pathInverter = "inverter."; var pathMeter = "meter."; ! var idInverterCode = path + pathInverter + "Code"; var idPAC = path + pathInverter + "PAC"; var idDAY_ENERGY = path + pathInverter + "DAY_ENERGY"; var idYEAR_ENERGY = path + pathInverter + "YEAR_ENERGY"; var idTOTAL_ENERGY = path + pathInverter + "TOTAL_ENERGY"; var idMeterCode = path + pathMeter + "Code"; var idPowerRealPsum = path + pathMeter + "PowerReal_P_Sum"; var idPowerRealPphase1 = path + pathMeter + "PowerReal_P_Phase_1"; var idPowerRealPphase2 = path + pathMeter + "PowerReal_P_Phase_2"; var idPowerRealPphase3 = path + pathMeter + "PowerReal_P_Phase_3"; var idCurrentAcPhase1 = path + pathMeter + "Current_AC_Phase_1"; var idCurrentAcPhase2 = path + pathMeter + "Current_AC_Phase_2"; var idCurrentAcPhase3 = path + pathMeter + "Current_AC_Phase_3"; var idVoltageAcPhase1 = path + pathMeter + "Voltage_AC_Phase_1"; var idVoltageAcPhase2 = path + pathMeter + "Voltage_AC_Phase_2"; var idVoltageAcPhase3 = path + pathMeter + "Voltage_AC_Phase_3"; var idEnergyRealWacSumProd = path + pathMeter + "EnergyReal_WAC_Sum_Produced"; var idEnergyRealWacSumCons = path + pathMeter + "EnergyReal_WAC_Sum_Consumed"; ! createState(idInverterCode, 0, { name: 'Inverter request status code', desc: 'Indicates if the request went OK or gives a hint about what went wrong', type: 'number', role: 'value' }); ! createState(idPAC, 0, { name: 'Inverter AC power', desc: 'Actual AC power', type: 'number', role: 'value', unit: 'W' }); ! createState(idDAY_ENERGY, 0, { name: 'Inverter day energy', desc: 'Energy generated on current day', type: 'number', role: 'value', unit: 'Wh' }); ! createState(idYEAR_ENERGY, 0, { name: 'Inverter year energy', desc: 'Energy generated in current year', type: 'number', role: 'value', unit: 'Wh' }); ! createState(idTOTAL_ENERGY, 0, { name: 'Inverter overall energy', desc: 'Energy generated overall', type: 'number', role: 'value', unit: 'Wh' }); ! createState(idMeterCode, 0, { name: 'Meter request status code', desc: 'Indicates if the request went OK or gives a hint about what went wrong', type: 'number', role: 'value' }); ! createState(idPowerRealPsum, 0, { name: 'Meter consumption', desc: 'Actual consumption of power', type: 'number', role: 'value', unit: 'W' }); ! createState(idPowerRealPphase1, 0, { name: 'Meter consumption on phase 1', desc: 'Actual consumption of power on phase 1', type: 'number', role: 'value', unit: 'W' }); ! createState(idPowerRealPphase2, 0, { name: 'Meter consumption on phase 2', desc: 'Actual consumption of power on phase 2', type: 'number', role: 'value', unit: 'W' }); ! createState(idPowerRealPphase3, 0, { name: 'Meter consumption on phase 3', desc: 'Actual consumption of power on phase 3', type: 'number', role: 'value', unit: 'W' }); ! createState(idCurrentAcPhase1, 0, { name: 'Meter current on phase 1', desc: 'Actual AC current on phase 1', type: 'number', role: 'value', unit: 'A' }); ! createState(idCurrentAcPhase2, 0, { name: 'Meter current on phase 2', desc: 'Actual AC current on phase 2', type: 'number', role: 'value', unit: 'A' }); createState(idCurrentAcPhase3, 0, { name: 'Meter current on phase 3', desc: 'Actual AC current on phase 3', type: 'number', role: 'value', unit: 'A' }); ! createState(idVoltageAcPhase1, 0, { name: 'Meter voltage on phase 1', desc: 'Actual AC voltage on phase 1', type: 'number', role: 'value', unit: 'V' }); ! createState(idVoltageAcPhase2, 0, { name: 'Meter voltage on phase 2', desc: 'Actual AC voltage on phase 2', type: 'number', role: 'value', unit: 'V' }); createState(idVoltageAcPhase3, 0, { name: 'Meter voltage on phase 3', desc: 'Actual AC voltage on phase 3', type: 'number', role: 'value', unit: 'V' }); ! createState(idEnergyRealWacSumProd, 0, { name: 'Meter sum of energy produced', desc: 'Sum of real energy produced', type: 'number', role: 'value', unit: 'Wh' }); ! createState(idEnergyRealWacSumCons, 0, { name: 'Meter sum of energy consumed', desc: 'Sum of real energy consumed', type: 'number', role: 'value', unit: 'Wh' }); ! var request = require("request"); var myJson = {}; ! 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 request from: " + url; log(error, "warn"); callback(error, null); } }); } ! function main() { readJson(urlInverter, function(err,json) { if(!err) { myJson = json; log("Code: " + myJson.Head.Status.Code,"info"); log("PAC: " + myJson.Body.Data.PAC.Values[1],"info"); log("DAY_ENERGY: " + myJson.Body.Data.DAY_ENERGY.Values[1],"info"); log("YEAR_ENERGY: " + myJson.Body.Data.YEAR_ENERGY.Values[1],"info"); log("TOTAL_ENERGY: " + myJson.Body.Data.TOTAL_ENERGY.Values[1],"info"); setState(idInverterCode ,parseInt(myJson.Head.Status.Code)); setState(idPAC ,parseInt(myJson.Body.Data.PAC.Values[1])); setState(idDAY_ENERGY ,parseInt(myJson.Body.Data.DAY_ENERGY.Values[1])); setState(idYEAR_ENERGY ,parseInt(myJson.Body.Data.YEAR_ENERGY.Values[1])); setState(idTOTAL_ENERGY ,parseInt(myJson.Body.Data.TOTAL_ENERGY.Values[1])); } else { log("Error reading JSON from Fronius inverter. No data!","warn"); myJson = {}; } }); readJson(urlMeter, function(err,json) { if(!err) { myJson = json; log("Code: " + myJson.Head.Status.Code,"info"); log("PowerReal_P_Sum: " + myJson.Body.Data[0].PowerReal_P_Sum,"info"); log("PowerReal_P_Phase_1: " + myJson.Body.Data[0].PowerReal_P_Phase_1,"info"); log("PowerReal_P_Phase_2: " + myJson.Body.Data[0].PowerReal_P_Phase_2,"info"); log("PowerReal_P_Phase_3: " + myJson.Body.Data[0].PowerReal_P_Phase_3,"info"); log("Current_AC_Phase_1: " + myJson.Body.Data[0].Current_AC_Phase_1,"info"); log("Current_AC_Phase_2: " + myJson.Body.Data[0].Current_AC_Phase_2,"info"); log("Current_AC_Phase_3: " + myJson.Body.Data[0].Current_AC_Phase_3,"info"); log("Voltage_AC_Phase_1: " + myJson.Body.Data[0].Voltage_AC_Phase_1,"info"); log("Voltage_AC_Phase_2: " + myJson.Body.Data[0].Voltage_AC_Phase_2,"info"); log("Voltage_AC_Phase_3: " + myJson.Body.Data[0].Voltage_AC_Phase_3,"info"); log("EnergyReal_WAC_Sum_Produced: " + myJson.Body.Data[0].EnergyReal_WAC_Sum_Produced,"info"); log("EnergyReal_WAC_Sum_Consumed: " + myJson.Body.Data[0].EnergyReal_WAC_Sum_Consumed,"info"); setState(idMeterCode ,parseInt(myJson.Head.Status.Code)); setState(idPowerRealPsum ,parseInt(myJson.Body.Data[0].PowerReal_P_Sum)); setState(idPowerRealPphase1 ,parseInt(myJson.Body.Data[0].PowerReal_P_Phase_1)); setState(idPowerRealPphase2 ,parseInt(myJson.Body.Data[0].PowerReal_P_Phase_2)); setState(idPowerRealPphase3 ,parseInt(myJson.Body.Data[0].PowerReal_P_Phase_3)); setState(idCurrentAcPhase1 ,parseInt(myJson.Body.Data[0].Current_AC_Phase_1)); setState(idCurrentAcPhase2 ,parseInt(myJson.Body.Data[0].Current_AC_Phase_2)); setState(idCurrentAcPhase3 ,parseInt(myJson.Body.Data[0].Current_AC_Phase_3)); setState(idVoltageAcPhase1 ,parseInt(myJson.Body.Data[0].Voltage_AC_Phase_1)); setState(idVoltageAcPhase2 ,parseInt(myJson.Body.Data[0].Voltage_AC_Phase_2)); setState(idVoltageAcPhase3 ,parseInt(myJson.Body.Data[0].Voltage_AC_Phase_3)); setState(idEnergyRealWacSumProd ,parseInt(myJson.Body.Data[0].EnergyReal_WAC_Sum_Produced)); setState(idEnergyRealWacSumCons ,parseInt(myJson.Body.Data[0].EnergyReal_WAC_Sum_Consumed)); } else { log("Error reading JSON from Fronius Smart Meter. No data!","warn"); myJson = {}; } }); } ! schedule("*/5 * * * *", function () { // poll every 5 minutes main(); }); ! // poll values at startup setTimeout(main,500); !
`Hi,
habe dei Script mit meinem Fronius Symo 7.x probiert aber er hat bei den Meterwerten ein Problem:
javascript.0 TypeError: Cannot read property 'PowerReal_P_Sum' of undefined at script.js.Fronius.PVBruchsal:217:70 at Request._callback (script.js.Fronius.PVBruchsal:185:13) at Request.self.callback (/opt/iobroker/node_modules/iobroker.javascript/node_modules/request/request.js:186:22) at emitTwo (events.js:87:13) at Request.emit (events.js:172:7) at Request. (/opt/iobroker/node_modules/iobroker.javascript/node_modules/request/request.js:1081:10) at emitOne (events.js:77:13) at Request.emit (events.js:169:7) at IncomingMessage. (/opt/iobroker/node_modules/iobroker.javascript/node_modules/request/request.js:1001:12) at IncomingMessage.g (events.js:260:16)
Meine json ist allerdings auch nicht so ausführlich wie die des Hybrid.
PowerReal_P_Sum ist allerdings vorhanden!
Was könnte das Problem sein?
{ "Head" : { "RequestArguments" : { "DeviceClass" : "Meter", "DeviceId" : "1", "Scope" : "Device" }, "Status" : { "Code" : 0, "Reason" : "", "UserMessage" : "" }, "Timestamp" : "2017-02-22T12:28:12+01:00" }, "Body" : { "Data" : { "Details" : { "Serial" : "n.a.", "Model" : "S0 Meter at inverter 1", "Manufacturer" : "Fronius" }, "TimeStamp" : 1487762891, "Enable" : 1, "Visible" : 1, "PowerReal_P_Sum" : -291.238569, "Meter_Location_Current" : 1, "EnergyReal_WAC_Minus_Relative" : 24 } } }
Danke!
-
Was könnte das Problem sein? `
Dein JSON enthält kein Array, da nur wenige Daten. Bitte ändern:myJson.Body.Data[0].PowerReal_P_Sum --> myJson.Body.Data.PowerReal_P_Sum
Alle anderen auskommentieren oder löschen, da nicht vorhanden.
-
Was könnte das Problem sein? `
Dein JSON enthält kein Array, da nur wenige Daten. Bitte ändern:myJson.Body.Data[0].PowerReal_P_Sum --> myJson.Body.Data.PowerReal_P_Sum
Alle anderen auskommentieren oder löschen, da nicht vorhanden. `
Gerade hatte ichs gefunden
aber Danke!!
hier dann der fertige Code für alle Fronius Symo Besitzer!!
! ````
var urlInverter = 'http://192.168.1.1/solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceID=1&DataCollection=CommonInverterData';
var urlMeter = 'http://192.168.1.1/solar_api/v1/GetMeterRealtimeData.cgi?Scope=Device&DeviceId=1';
! var path = "froniusSymo.";
var pathInverter = "inverter.";
var pathMeter = "meter.";
! var idInverterCode = path + pathInverter + "Code";
var idPAC = path + pathInverter + "PAC";
var idDAY_ENERGY = path + pathInverter + "DAY_ENERGY";
var idYEAR_ENERGY = path + pathInverter + "YEAR_ENERGY";
var idTOTAL_ENERGY = path + pathInverter + "TOTAL_ENERGY";
var idMeterCode = path + pathMeter + "Code";
var idPowerRealPsum = path + pathMeter + "PowerReal_P_Sum";
! createState(idInverterCode, 0, {
name: 'Inverter request status code',
desc: 'Indicates if the request went OK or gives a hint about what went wrong',
type: 'number',
role: 'value'
});
! createState(idPAC, 0, {
name: 'Inverter AC power',
desc: 'Actual AC power',
type: 'number',
role: 'value',
unit: 'W'
});
! createState(idDAY_ENERGY, 0, {
name: 'Inverter day energy',
desc: 'Energy generated on current day',
type: 'number',
role: 'value',
unit: 'Wh'
});
! createState(idYEAR_ENERGY, 0, {
name: 'Inverter year energy',
desc: 'Energy generated in current year',
type: 'number',
role: 'value',
unit: 'Wh'
});
! createState(idTOTAL_ENERGY, 0, {
name: 'Inverter overall energy',
desc: 'Energy generated overall',
type: 'number',
role: 'value',
unit: 'Wh'
});
! createState(idMeterCode, 0, {
name: 'Meter request status code',
desc: 'Indicates if the request went OK or gives a hint about what went wrong',
type: 'number',
role: 'value'
});
! createState(idPowerRealPsum, 0, {
name: 'Meter consumption',
desc: 'Actual consumption of power',
type: 'number',
role: 'value',
unit: 'W'
});
! var request = require("request");
var myJson = {};
! 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 request from: " + url;
log(error, "warn");
callback(error, null);
}
});
}
! function main() {
readJson(urlInverter, function(err,json) {
if(!err) {
myJson = json;
log("Code: " + myJson.Head.Status.Code,"info");
log("PAC: " + myJson.Body.Data.PAC.Values[1],"info");
log("DAY_ENERGY: " + myJson.Body.Data.DAY_ENERGY.Values[1],"info");
log("YEAR_ENERGY: " + myJson.Body.Data.YEAR_ENERGY.Values[1],"info");
log("TOTAL_ENERGY: " + myJson.Body.Data.TOTAL_ENERGY.Values[1],"info");
setState(idInverterCode ,parseInt(myJson.Head.Status.Code));
setState(idPAC ,parseInt(myJson.Body.Data.PAC.Values[1]));
setState(idDAY_ENERGY ,parseInt(myJson.Body.Data.DAY_ENERGY.Values[1]));
setState(idYEAR_ENERGY ,parseInt(myJson.Body.Data.YEAR_ENERGY.Values[1]));
setState(idTOTAL_ENERGY ,parseInt(myJson.Body.Data.TOTAL_ENERGY.Values[1]));
} else {
log("Error reading JSON from Fronius inverter. No data!","warn");
myJson = {};
}
});
readJson(urlMeter, function(err,json) {
if(!err) {
myJson = json;
log("Code: " + myJson.Head.Status.Code,"info");
log("PowerReal_P_Sum: " + myJson.Body.Data.PowerReal_P_Sum,"info");
setState(idMeterCode ,parseInt(myJson.Head.Status.Code));
setState(idPowerRealPsum ,parseInt(myJson.Body.Data.PowerReal_P_Sum));
} else {
log("Error reading JSON from Fronius Smart Meter. No data!","warn");
myJson = {};
}
});
}
! schedule("*/5 * * * *", function () { // poll every 5 minutes
main();
});
! // poll values at startup
setTimeout(main,500); -
Ein flow zum Transfer der Inverterdaten nach InfluxDB
! [
! {
! "id": "2a7e3123.ad03ae",
! "type": "tab",
! "label": "Read fronius"
! },
! {
! "id": "fd6b509c.77443",
! "type": "inject",
! "z": "2a7e3123.ad03ae",
! "name": "Tick",
! "topic": "",
! "payload": "",
! "payloadType": "date",
! "repeat": "",
! "crontab": "*/1 4-22 * * *",
! "once": false,
! "x": 288,
! "y": 212,
! "wires": [
! [
! "22d2788d.d27808"
! ]
! ]
! },
! {
! "id": "22d2788d.d27808",
! "type": "http request",
! "z": "2a7e3123.ad03ae",
! "name": "Read Fronius data",
! "method": "GET",
! "url": "http://192.168.4.181/solar_api/v1/GetIn … verterData",
! "tls": "",
! "x": 473,
! "y": 238,
! "wires": [
! [
! "9686437.4938ec"
! ]
! ]
! },
! {
! "id": "9686437.4938ec",
! "type": "json",
! "z": "2a7e3123.ad03ae",
! "name": "",
! "x": 585,
! "y": 296,
! "wires": [
! [
! "bb4056ca.6f3138"
! ]
! ]
! },
! {
! "id": "bb4056ca.6f3138",
! "type": "switch",
! "z": "2a7e3123.ad03ae",
! "name": "Check Error Code",
! "property": "payload.Body.Data.DeviceStatus.ErrorCode",
! "propertyType": "msg",
! "rules": [
! {
! "t": "eq",
! "v": "0",
! "vt": "num"
! }
! ],
! "checkall": "true",
! "outputs": 1,
! "x": 680,
! "y": 350,
! "wires": [
! [
! "29bf8fb4.dba5"
! ]
! ]
! },
! {
! "id": "c2c27a4e.27dc28",
! "type": "catch",
! "z": "2a7e3123.ad03ae",
! "name": "",
! "scope": null,
! "x": 315,
! "y": 387,
! "wires": [
! []
! ]
! },
! {
! "id": "29bf8fb4.dba5",
! "type": "function",
! "z": "2a7e3123.ad03ae",
! "name": "Split attributes",
! "func": "\nvar newmsg = {};\nnewmsg.topic = msg.topic;\nnewmsg.payload = {};\n\nvar src = msg.payload.Body.Data;\nfor (var key in src) {\n newmsg.payload[key] = src[key]\n}\nreturn newmsg;",
! "outputs": 1,
! "noerr": 0,
! "x": 808,
! "y": 414,
! "wires": [
! [
! "dbda39b3.e5aa38"
! ]
! ]
! },
! {
! "id": "dbda39b3.e5aa38",
! "type": "function",
! "z": "2a7e3123.ad03ae",
! "name": "Prepare for influx",
! "func": "\nvar newmsg = {};\nnewmsg.topic = msg.topic;\nvar vals = {};\n\nvar src = msg.payload;\nfor (var key in src) {\n if(typeof src[key].Value != "undefined")\n vals[key] = src[key].Value\n}\nnewmsg.payload = vals\nreturn newmsg;",
! "outputs": 1,
! "noerr": 0,
! "x": 914,
! "y": 489,
! "wires": [
! [
! "aff49a5e.3ee358"
! ]
! ]
! },
! {
! "id": "aff49a5e.3ee358",
! "type": "influxdb out",
! "z": "2a7e3123.ad03ae",
! "influxdb": "d898da53.9e89f8",
! "name": "",
! "measurement": "pv",
! "x": 1087,
! "y": 559,
! "wires": []
! },
! {
! "id": "d898da53.9e89f8",
! "type": "influxdb",
! "z": "",
! "hostname": "127.0.0.1",
! "port": "8086",
! "protocol": "http",
! "database": "infra",
! "name": ""
! }
! ]
1803_clipboard08.jpg -
Hallo,
ich bin gerade dabei den Adapter für den Fronius Wechselrichter zu machen und hätte z.Z. eine Frage: kann mir jemand sagen was "EnergyReal_WAC_Minus_Relative" sein soll? Und am Besten mit Einheit
Danke!!
Grüße,
ldittmar