NEWS
FRONIUS Adapter Entwicklung eingestellt?
-
Super, Danke. D. h., wenn ich meine Einstellungen so einstellen lasse:
sollte es wie bei Dir auch funktionieren, richtig?
-
Genau
-
Na, dann werde ich das mal dem Herren Solarteur weiterleiten, evtl. kann er das ja per Fernwartung so einstellen. Spätestens aber wenn sie die Batterie bringen Bin ich mal gespannt.
-
Aber die API-Aufrufe mit Javaskript sollten auch so funktionieren
-
Leider nicht, ebenso bei @JB_Sullivan (s. vorherige Posts).
Daher die Hoffnung, das es mit den Modbus-Einstellungen zusammenhängt.
-
Welches JavaSkript hast du dir denn gebastelt? Ich habe leider keine Ahnung davon. Die Browser Aufrufe die oben so gepostet wurden liefern alle irgendwelche Werte zurück.
Leider bin ich weit davon entfernt mit JavaSkript irgend etwas sinnvolles damit anzustellen.
-
@qqolli
Ne hier mal das Java Skript (IP musst du in den ersten 2 Zeilen anpassen)var urlInverter = 'http://10.6.9.57/solar_api/v1/GetInverterRealtimeData.cgi?Scope=Device&DeviceID=1&DataCollection=CommonInverterData'; var urlMeter = 'http://10.6.9.57/solar_api/v1/GetMeterRealtimeData.cgi?Scope=Device&DeviceId=0'; var path = "FroniusSymoGEN24."; var pathInverter = "inverter."; var pathMeter = "meter."; var idInverter = path + pathInverter + "Inverter"; var idIAC = path + pathInverter + "IAC"; var idIAC_L1 = path + pathInverter + "IACL1"; var idIAC_L2 = path + pathInverter + "IACL2"; var idIAC_L3 = path + pathInverter + "IACL3"; var idPAC = path + pathInverter + "PAC"; var idSAC = path + pathInverter + "SAC"; var idUAC = path + pathInverter + "UAC"; var idUDC_1 = path + pathInverter + "UDC1"; var idUDC_2 = path + pathInverter + "UDC2"; var idIDC_1 = path + pathInverter + "IDC1"; var idIDC_2 = path + pathInverter + "IDC2"; var idPDC_1 = path + pathInverter + "PDC1"; var idPDC_2 = path + pathInverter + "PDC2"; var idMIAC_1 = path + pathMeter + "IAC_1"; var idMIAC_2 = path + pathMeter + "IAC_2"; var idMIAC_3 = path + pathMeter + "IAC_3"; var idMIAC_S = path + pathMeter + "IAC_S"; var idMUAC_12 = path + pathMeter + "UAC_12"; var idMUAC_23 = path + pathMeter + "UAC_23"; var idMUAC_31 = path + pathMeter + "UAC_31"; var idModel = path + pathMeter + "Model"; var idSerial = path + pathMeter + "Serial"; var idFrequenz = path + pathMeter + "Frequenz"; var idActiveAbsolutminus = path + pathMeter + "ActiveAbsolutminus"; var idActiveAbsolutplus = path + pathMeter + "ActiveAbsolutplus"; var idActiveVerbraucht = path + pathMeter + "ActiveVerbraucht"; var idActiveProduziert = path + pathMeter + "ActiveProduziert"; var idReactiveVerbraucht = path + pathMeter + "ReactiveVerbraucht"; var idReactiveProduziert = path + pathMeter + "ReactiveProduziert"; createState(idInverter, 0, { name: 'Wechselrichter Status', type: 'string', role: 'value', unit: ' ' }); createState(idIAC, 0, { name: 'AC Ausgangsstrom', type: 'number', role: 'value', unit: 'A' }); createState(idIAC_L1, 0, { name: 'AC Ausgangsstrom L1', type: 'number', role: 'value', unit: 'A' }); createState(idIAC_L2, 0, { name: 'AC Ausgangsstrom L2', type: 'number', role: 'value', unit: 'A' }); createState(idIAC_L3, 0, { name: 'AC Ausgangsstrom L3', type: 'number', role: 'value', unit: 'A' }); createState(idPAC, 0, { name: 'AC Ausgangsleistung', type: 'number', role: 'value', unit: 'W' }); createState(idSAC, 0, { name: 'AC Scheinleistung', type: 'number', role: 'value', unit: 'VA' }); createState(idUAC, 0, { name: 'AC Ausgangsspannung', type: 'number', role: 'value', unit: 'V' }); createState(idUDC_1, 0, { name: 'DC Eingangsspannung 1', type: 'number', role: 'value', unit: 'V' }); createState(idUDC_2, 0, { name: 'DC Eingangsspannung 2', type: 'number', role: 'value', unit: 'V' }); createState(idIDC_1, 0, { name: 'DC Eingangsstrom 1', type: 'number', role: 'value', unit: 'A' }); createState(idIDC_2, 0, { name: 'DC Eingangsstrom 2', type: 'number', role: 'value', unit: 'A' }); createState(idPDC_1, 0, { name: 'DC Eingangsleistung 1', type: 'number', role: 'value', unit: 'W' }); createState(idPDC_2, 0, { name: 'DC Eingangsleistung 2', type: 'number', role: 'value', unit: 'W' }); createState(idMIAC_1, 0, { name: 'AC Strom L1', type: 'number', role: 'value', unit: 'A' }); createState(idMIAC_2, 0, { name: 'AC Strom L2', type: 'number', role: 'value', unit: 'A' }); createState(idMIAC_3, 0, { name: 'AC Strom L3', type: 'number', role: 'value', unit: 'A' }); createState(idMIAC_S, 0, { name: 'AC Strom Summe', type: 'number', role: 'value', unit: 'A' }); createState(idMUAC_12, 0, { name: 'AC Spannung L1-L2', type: 'number', role: 'value', unit: 'V' }); createState(idMUAC_23, 0, { name: 'AC Spannung L2-L3', type: 'number', role: 'value', unit: 'V' }); createState(idMUAC_31, 0, { name: 'AC Spannung L3-L1', type: 'number', role: 'value', unit: 'V' }); createState(idModel, 0, { name: 'Model Smartmeter', type: 'string', role: 'value' }); createState(idSerial, 0, { name: 'SerienNr. Smartmeter', type: 'string', role: 'value' }); createState(idFrequenz, 0, { name: 'Netzfrequenz', type: 'number', role: 'value', unit: 'Hz' }); createState(idActiveAbsolutminus, 0, { name: '', type: 'number', role: 'value', unit: 'Wh' }); createState(idActiveAbsolutplus, 0, { name: '', type: 'number', role: 'value', unit: 'Wh' }); createState(idActiveVerbraucht, 0, { name: '', type: 'number', role: 'value', unit: 'Wh' }); createState(idActiveProduziert, 0, { name: '', type: 'number', role: 'value', unit: 'Wh' }); createState(idReactiveVerbraucht, 0, { name: '', type: 'number', role: 'value', unit: 'Wh' }); createState(idReactiveProduziert, 0, { name: '', 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( myJson.Body.Data.DeviceStatus.InverterState); setState(idInverter ,myJson.Body.Data.DeviceStatus.InverterState); setState(idIAC ,parseFloat(myJson.Body.Data.IAC.Value)); setState(idIAC_L1 ,parseFloat(myJson.Body.Data.IAC_L1.Value)); setState(idIAC_L2 ,parseFloat(myJson.Body.Data.IAC_L2.Value)); setState(idIAC_L3 ,parseFloat(myJson.Body.Data.IAC_L3.Value)); setState(idPAC ,parseFloat(myJson.Body.Data.PAC.Value)); setState(idSAC ,parseFloat(myJson.Body.Data.SAC.Value)); setState(idUAC ,parseFloat(myJson.Body.Data.UAC.Value)); setState(idIDC_1 ,parseFloat(myJson.Body.Data.IDC.Value)); setState(idIDC_2 ,parseFloat(myJson.Body.Data.IDC_2.Value)); setState(idUDC_1 ,parseFloat(myJson.Body.Data.UDC.Value)); setState(idUDC_2 ,parseFloat(myJson.Body.Data.UDC_2.Value)); setState(idPDC_1 ,(parseFloat(myJson.Body.Data.IDC.Value) * parseFloat(myJson.Body.Data.UDC.Value))); setState(idPDC_2 ,(parseFloat(myJson.Body.Data.IDC_2.Value) * parseFloat(myJson.Body.Data.UDC_2.Value))); } else { log("Error reading JSON from Fronius Wechselrichter. No data!","warn"); myJson = {}; } }); readJson(urlMeter, function(err,json) { if(!err) { myJson = json; //log( myJson.Body.Data.Details.Model); setState(idMIAC_1 ,parseFloat(myJson.Body.Data.ACBRIDGE_CURRENT_ACTIVE_MEAN_01_F32)); setState(idMIAC_2 ,parseFloat(myJson.Body.Data.ACBRIDGE_CURRENT_ACTIVE_MEAN_02_F32)); setState(idMIAC_3 ,parseFloat(myJson.Body.Data.ACBRIDGE_CURRENT_ACTIVE_MEAN_03_F32)); setState(idMIAC_S ,parseFloat(myJson.Body.Data.ACBRIDGE_CURRENT_AC_SUM_NOW_F64)); setState(idMUAC_12 ,parseFloat(myJson.Body.Data.ACBRIDGE_VOLTAGE_MEAN_12_F32)); setState(idMUAC_23 ,parseFloat(myJson.Body.Data.ACBRIDGE_VOLTAGE_MEAN_23_F32)); setState(idMUAC_31 ,parseFloat(myJson.Body.Data.ACBRIDGE_VOLTAGE_MEAN_31_F32)); setState(idModel ,myJson.Body.Data.Details.Model); setState(idSerial ,myJson.Body.Data.Details.Serial); setState(idFrequenz ,parseFloat(myJson.Body.Data.GRID_FREQUENCY_MEAN_F32)); setState(idActiveAbsolutminus ,parseFloat(myJson.Body.Data.SMARTMETER_ENERGYACTIVE_ABSOLUT_MINUS_F64)); setState(idActiveAbsolutplus ,parseFloat(myJson.Body.Data.SMARTMETER_ENERGYACTIVE_ABSOLUT_PLUS_F64)); setState(idActiveVerbraucht ,parseFloat(myJson.Body.Data.SMARTMETER_ENERGYACTIVE_CONSUMED_SUM_F64)); setState(idActiveProduziert ,parseFloat(myJson.Body.Data.SMARTMETER_ENERGYACTIVE_PRODUCED_SUM_F64)); setState(idReactiveVerbraucht ,parseFloat(myJson.Body.Data.SMARTMETER_ENERGYREACTIVE_CONSUMED_SUM_F64)); setState(idReactiveProduziert ,parseFloat(myJson.Body.Data.SMARTMETER_ENERGYREACTIVE_PRODUCED_SUM_F64)); } else { log("Error reading JSON from Fronius SmartMeter. No data!","warn"); myJson = {}; } }); } schedule("*/5 * * * * *", function () { // poll every 5 sec main(); }); // poll values at startup setTimeout(main,1000);
Mod-Edit: Code/Log in Code Tags gepackt. Bitte benutzt die Code Tags Funktion -> </>
Hier gehts zur Hilfe. -
Perfekt - läuft !!!! Ist ja witzig bei den IP Adressen - ich habe vorne auch 10. und hinten auch .57
PS: Kann man den API aufrufen die in Beitrag 63 alle genannt wurden ggf. noch mehr per JavaSkript aus dem WR heraus holen? Wenn ich die dort genannten URL`s in die BrowserZeile eingebe, bekomme ich auch entsprechende (für mich kryptische) Rückmeldungen.
https://forum.iobroker.net/topic/33809/fronius-adapter-entwicklung-eingestellt/67
z.B. so:
{ "Body" : { "Data" : { "Inverters" : { "1" : { "Battery_Mode" : "normal", "DT" : 1, "P" : 620, "SOC" : 9.5 } }, "Site" : { "BackupMode" : false, "BatteryStandby" : false, "E_Day" : null, "E_Total" : null, "E_Year" : null, "Meter_Location" : "grid", "Mode" : "bidirectional", "P_Akku" : -256.51113891601562, "P_Grid" : -5.7000000000000002, "P_Load" : -614.29999999999995, "P_PV" : 921.45986938476562, "rel_Autonomy" : 100.0, "rel_SelfConsumption" : 99.08064516129032 }, "Version" : "12" } }, "Head" : { "RequestArguments" : { "Scope" : "System" }, "Status" : { "Code" : 0, "Reason" : "", "UserMessage" : "" }, "Timestamp" : "2020-11-18T11:59:15+00:00" } }
-
@JB_Sullivan
Welche benötigst du noch ?
Ich habe (noch) keinen Akku und die Akkudaten deshalb noch nicht ausgelesen.Gruß Mike
-
?!?, jetzt habt ihr mich komplett abgehängt. Ich dachte das das mit den Holding-Registern zumindest bei mir und bei Dir nicht ging. Die API-Aufrufe gehen, aber im Modbus-Adapter mit den geposteten Holding-Registern geht nicht (s. Fehlermeldungen weiter oben im Post). Wie hast Du es hinbekommen, das es jetzt bei Dir geht? Dachte die IP ist dieselbe wie die vom Dashboard?
-
Einmal die Seriennummern der Geräte
IP/solar_api/v1/GetActiveDeviceInfo.cgi?DeviceClass=System
den Akku mit dem SoC
IP/solar_api/v1/GetPowerFlowRealtimeData.fcgi?Scope=System
Hier wäre noch der Custom Name drin
IP/solar_api/v1/GetInverterInfo.cgi
-
Ja, weiss ich und wenn ich es im Browser eingebe bekomme ich auch eine Rückmeldung. Aber wie bekommst Du es in die DP ohne das der Modbusadapter grün ist?
DP für Inverter und Meter sind bei mir leer
-
das hat jetzt offensichtlich auch nichts mit dem ModBUs zu tun. Mike hat heraus gefunden, wie man die Daten die bestehende API liefert per JavaSkript (das was er oben gepostet hat) als Datenpunkte aufbereiten kann.
Offensichtlich liefert der GEN24 schon eine ganze Menge an Datenpunkten, auch ohne das man alles mögliche dafür freischalten muss. Das Problem scheint zu sein, das der "alte" ioB Fronius Adapter vermutliche eine andere Abfrage Struktur verwendet, weshalb die Werte einfach im jetzigen Fronius Adapter nicht dargestellt werden.
Vielleicht sollte man mal @Idittmar kontaktieren, denn er hat doch einiges im Homematic Forum zu Thema Fronius beigetragen.
-
Du musst im ioB Admin unter Skripte das Skipt was Mike oben gepostet hat einbauen und starten. Dann werden die DP`s unter 0.javascript selbstständig angelegt.
-
@JB_Sullivan kannst du mir mal die Browserausgabe der 3 API-Aufrufe zukommen lassen ? Dann pflege ich die Datenpunkte noch ein.
-
Ja geil! Dem geht. Bin heute ein bisserl begriffsstutzig
@Mike97714 Danke für Dein Skript!
-
JO - hier Bitte schön
Seriennummern
{ "Body" : { "Data" : { "1" : { "DT" : 1, "Serial" : "Speicher" }, "Meter" : { "0" : { "DT" : -1, "Serial" : "Wechselrichter" } }, "Ohmpilot" : {}, "Storage" : { "0" : { "DT" : -1, "Serial" : "Smartmeter vermute ich " } } } }, "Head" : { "RequestArguments" : { "DeviceClass" : "System" }, "Status" : { "Code" : 0, "Reason" : "", "UserMessage" : "" }, "Timestamp" : "2020-11-18T13:21:49+00:00" } }
powerflow - aber zusätzlich mit BYD Speicher
{ "Body" : { "Data" : { "Inverters" : { "1" : { "Battery_Mode" : "normal", "DT" : 1, "P" : 532, "SOC" : 23.0 } }, "Site" : { "BackupMode" : false, "BatteryStandby" : false, "E_Day" : null, "E_Total" : null, "E_Year" : null, "Meter_Location" : "grid", "Mode" : "bidirectional", "P_Akku" : -2071.77783203125, "P_Grid" : -2.6000000000000001, "P_Load" : -529.39999999999998, "P_PV" : 2648.8490829467773, "rel_Autonomy" : 100.0, "rel_SelfConsumption" : 99.511278195488714 }, "Version" : "12" } }, "Head" : { "RequestArguments" : { "Scope" : "System" }, "Status" : { "Code" : 0, "Reason" : "", "UserMessage" : "" }, "Timestamp" : "2020-11-18T13:23:19+00:00" } }
.... und hier eher unwichtig aber Nice to Have - Custom Name
{ "Body" : { "Data" : { "1" : { "CustomName" : "JB_Sullivan", "DT" : 1, "PVPower" : 0, "Show" : 1, "StatusCode" : "Running", "UniqueID" : "SN Wechselrichter" } } }, "Head" : { "RequestArguments" : {}, "Status" : { "Code" : 0, "Reason" : "", "UserMessage" : "" }, "Timestamp" : "2020-11-18T13:24:40+00:00" } }
Ich habe gerade die Doku der Fronius API V1 am Wickel und teste mal alle Aufrufe durch, vielleicht geht ja noch mehr.
-
Also die API V1 nimmt in vielen Passagen schon Bezug auf den GEN24 - wenn auch nur mit der Aussage das der Datensatz nicht mehr verfügbar ist, oder einen Error zurück liefert - so z.B. was das auslesen des Akku Hersteller betrifft.
Naja am Ende der Doku steht es auch - man sollte sich jetzt nicht zuviel Arbeit machen. Ist alles nur temporär und mit @Mike97714 seinem Skript kommt man für den Übergang schon an allerlei Daten heran.
Müssen wir halt bis Dezember warten bis Fronius tatsächlich eine passende API veröffentlicht die auch für den GEN24 richtig funktioniert.
-
@JB_Sullivan sagte in FRONIUS Adapter Entwicklung eingestellt?:
So, wieder zu Hause - jetzt hatte ich mal Zeit das Skript genau anzusehen. Also 5 Sekunden Aktualisierung habe ich jetzt erstmal auf 30 Sekunden hoch gesetzt. Ich glaube alle 5 Sekunden soviele Werte ist für den Netzwerk Trafic nicht unbedingt zuträglich - und mal ehrlich, braucht man einen so hohen Aktualisierungsintervall?
..... aber wo ist der Unterschied zwischen AktiveAbsolutMinus/Plus und AktivProduziert / AktivVerbraucht - sind bei mir bei allen 4 Datenpunkten die gleichen Werte drin. Hatte eigentlich gedacht, das ich auf diese Werte Sourceanalytix ansetzen könnte.
..... und was sind das für Werte von Reaktiv Produziert / Verbraucht? Ich kann die mit keinen Werten aus meiner History in Zusammenhang bringen.
-
Einen Guten Abend zusammen- heute ist ein bisschen was auf PN Ebene zwischen mir und @Idittmar - dem Entwickler des Adapters gelaufen.
Offensichtlich wurde durch den User @nkleber ein GIT Request erstellt. Fragt mich nicht was das genau bedeutet, aber Idittmar hat dann irgendwie eine Version 1.0.6 des Fronius Adapter aus dem Hut gezaubert.
Diese Version zeigt für GEN24 WR schonmal deutlich mehr an, als die Version 1.0.5. Vom Wechselrichter (inverter) bekommt man über den Fronius Adapter zwar immer noch keine Werte rein, dafür nahezu alles von Fronius Smartmeter (meter). Powerflow ist nahezu unverändert geblieben.
Ich habe die Fronius Instanz gestoppt, über das GIT Adapter Menü den Fronius Adapter angewählt und auf 1.0.6 angehoben.
Danach die Instanz wieder gestartet. Im Objekt Baum sah dann alles ein bisschen Chaotisch aus. Ich habe daraufhin nochmal die Instanz gestoppt, den Objekt Baum gelöscht und durch den Start der Instanz wieder neu erzeugen lassen.
Aktuell sieht das ganze so aus.
Wie gesagt, nur der Wechselrichter liefert keine Werte, was aber bestimmt auch irgendwie gehen sollte, den @Mike97714 sein Skript holt die Werte ja auch ab.