NEWS
FRONIUS Adapter Entwicklung eingestellt?
-
Ich habe jetzt zusätzlich nochmal den Port 502 in der Fritzbox freigegeben und zwei Holding Registers angelegt. Adapter bleibt aber Gelb
Das Einzige was ich jetzt "mehr" zu sehen bekomme, nachdem ich den Port 502 freigegeben habe, ist die ModBus DEBUG Antwort über gefundene Ports (auch USB).
COM1 ist der deconz2 USB Zigbee Stick
COM2 ist RFLink
und COM ist der Chipsatz der Wlan Karte des BYD Solar Speicher (wch.cn)2020-11-17 20:14:08.600 - info: modbus.0 (7608) List of port: [{"path":"COM3","manufacturer":"wch.cn","serialNumber":"xxxxxxxx","pnpId":"USB\\VID_1A86&PID_7523\\5&912F20F&0&2","locationId":"Port_#0002.Hub_#0002","vendorId":"1A86","productId":"7523"},{"path":"COM4","manufacturer":"Microsoft","serialNumber":"xxxxxx","pnpId":"USB\\VID_1CF1&PID_0030\\DE2129022","locationId":"Port_#0001.Hub_#0002","vendorId":"1CF1","productId":"0030"},{"path":"COM1","manufacturer":"Wiesemann & Theis GmbH","pnpId":"ROOT\\PORTS\\0000"}]
-
Habe ich auch gerade versucht, ist ähnlich wie bei Dir, außer dem BYD response, da die noch geliefert wird
-
@qqolli
Wer hat gesagt das ich nicht das Technican Passwort habe ? -
Du alter Schlawiner Gibt es etwas im Modbus-Menü (als Technican) das man verändern/umschalten oder setzen muss damit es funktioniert? Wenn ja, lass ich das dann meinen Solateur machen wenn die das nächste mal kommen und die Batterie bringen.
-
@qqolli
in diesem Posthttps://forum.iobroker.net/topic/33809/fronius-adapter-entwicklung-eingestellt/136
das erste Bild sind die Modbuseinstellungen vom Wechselrichter
-
Hallo Mike,
danke für die Info. Wenn der Solarteur wieder da ist schauen wir mal rein ob das bei mir so eingestellt ist; wenn nicht, stellen wir es so ein wie bei Dir angegeben
-
Noch was vergessen. Du hast den Modbus im WR auf Master gesetzt, ebenso im ioBroker Modbus-Adapter. Ist das OK wenn beide Master sind?
-
@qqolli
Modbus tcp ist im WR Slave
Modbus RTU sind beide Master -
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