FRONIUS Wechselrichter

Moin Moin,

ich habe jetzt noch einen Freund gefagt der eigentlich Fit ist und auch der kommt mit den Werten nicht klar .
Ich habe aufgegeben und macht das jetzt mit Json hier aus dem Forum. :frowning:

https://www.symcon.de/forum/threads/23608-Fronius-Wechselrichter-mittels-JSON-in-IPS-einbinden?highlight=fronuis

kann einen Export einstellen.

Fronuis_export.txt (108 KB)

Ich habe alle Varianten durch.
Modbus RTU, Modbus TCP, Json-Api und
wenn man den Datamanger von Fronius hat, dann

die schönste und einfachste:
Push-Service am Wechselrichter aktivieren und automatisch über einen Webhook an IPS pushen.

War noch nie der Freund von zyklischen Abfragen. :cool:

Hast du da zufällig die abfrageWerte pro Mpp tracker / also pro String gefunden…?
Seit kurzem gibt es das im neuen fronius portal. Irgendwo müssen die ja herkommen…

Da mich meine Ost dach Seite getrennt zur Südwest Seite interessieren würde.

Gesendet von meinem Redmi Note 2 mit Tapatalk


/solar_api/v1/GetStringRealtimeData.cgi

Kommt das im json rüber ist die Frage :slight_smile: würde mich interessieren. Genau wie der webhook :slight_smile: stell das mal vor

Gesendet von iPhone mit Tapatalk

Also über JSON kannst Du die Strings Abfragen, sofern beide DC-Eingänge belegt sind.
Ebenso kannst Du die String per Push-Service bekommen und per Modbus geht’s auch.

Modbus-Register für die Strings:

Im Prinzip sind die Daten die über den Push-Service kommen so ziemlich die gleichen wie
jene die man über die JSON-API abfragen kann.
Ist der gleiche JSON-String.

Bis jetzt funktioniert:
Datamanager IO States
SolarAPI v1 - CurrentData - Powerflow
SolarAPI v1 - CurrentData - Meter
SolarAPI v1 - Logdata - Errors and Events
SunSpec Datalogger v1.0b - inverter float model

Kann ich nicht, da bei mir nicht vorhanden und somit keine Werte im Array:
SolarAPI v1 - CurrentData - SensorCard
SolarAPI v1 - CurrentData - StringControl

Bringt keine nützlichen Daten:
SolarAPI v1 - CurrentData - Inverter


Das Skript (im Anhang) nach IPS kopieren und ausführen.


Push-Service Konfiguration:
IP und Port anpassen nicht vergessen :slight_smile:

PS.: Bei dem SunSpec DingsBums wird zwar keine Verbindung angezeigt aber es werden trotzdem im
Minuten Rhythmus Daten gesendet.

Fronius_PushService.ips.zip (5.24 KB)

Moin,

kann es sein, dass über JSON und MODBUS nicht die gleichen Werte abgefragt werden können? Ich suche z.B. die aktuelle Einspeise- bzw. Bezugsleistung. Per JSON kriege ich sie mit GetMeterRealtimeData.cgi und dann unter PowerReal_P_Sum

Wenn mir jetzt einer sagt, unter welchem MODBUS Register sich der Wert versteckt, dann kann ich die JSON Geschichte hier abschalten.

Danke und Gruß,
Christoph

Das ist die Abfrage vom Smartmeter ?

Also Modbus-Adresse: 240

und dann:
40097: PowerReal_P_Sum
40129: EnergyReal_WAC_Sum_Produced
40137: EnergyReal_WAC_Sum_Consumed

240 ist die Geräte id in den Gateway Einstellungen oder ?

Gesendet von iPhone mit Tapatalk

Danke für den Hinweis. Funktioniert hier jedoch spontan nicht. Magst Du einen Screenshot Deiner Modbus Instanz zur Verfügung stellen?

Danke!

Öhm achnö, jetzt musste ich wieder meine alten Skripte suchen.

Ich nutze die IPS-Lösung für Modbus nicht wirklich, ausser für RTU over TCP weil ich dafür
noch keine brauchbare Alternativ gefunden habe.

Alles andere läuft über Modbus-Class.
Ist schneller, stabiler und einfacher bei der Installation und Wartung.

Aber egal, andere Geschichte.

Zu Deiner Frage/Bitte:
Am Wechselrichter - Sunspec Model Type auf float nicht auf int+SF

Client Socket:
ClientSocket.jpg

Modbus Gateway: (übergeordnete Instanz der Client Socket)
ModbusGateway.jpg

Modbus Device: (übergeordnete Instanz der Modbus Gateway)
DIe Adresse ist nun die zum Wert: „PowerReal_P_Sum“


ModbusDeviceValue.jpg

Hier mal eines meiner Skripte zum Probieren:
Macht die Sache um einiges leichter und schneller :rolleyes:


<?
// *****************************************************************************
// *****************************************************************************

// ID vom Parentobjekt
	$parentID = 40887 /*[Fronius]*/;

// -----------------------------------------------------------------------------

// Einstellungen ClientSocket
	$cs_data = array(
			"name" 	=> "CS_Fronius-Smartmeter",
			"ident" => "pvCSMeter_1",
			"ip" 	=> "1.1.1.1",
			"port" 	=> 502
			);

// -----------------------------------------------------------------------------

// Einstellungen ModbusDevice
	$status = false;	// Status emulieren
	$time = 5000;		// Pollzeit in ms
	
// *****************************************************************************
// *****************************************************************************

// ModbusGateway anlegen
// ----------------------
	$modbusGateway = CreateModbusGateway("Fronius-Smartmeter", "pvModGwMeter_1", 10, 0, 240, false, $cs_data);
	
	
// ModbusDevices (Adressen) anlegen
// ---------------------------------   	
	CreateModbusDevice($parentID, "Strom L1", "Current_AC_Phase_1", 10, 7, 40073, $modbusGateway);
   	CreateModbusDevice($parentID, "Strom L2", "Current_AC_Phase_2", 11, 7, 40075 /*[Test-Skripte\Saugroboter\Installation-Eigen]*/, $modbusGateway);
   	CreateModbusDevice($parentID, "Strom L3", "Current_AC_Phase_3", 12, 7, 40077, $modbusGateway);
   	CreateModbusDevice($parentID, "Spannung AVG-N", "Voltage_AC_AVG_N", 13, 7, 40079, $modbusGateway);
   	CreateModbusDevice($parentID, "Spannung L1-N", "Voltage_AC_Phase_1", 14, 7, 40081, $modbusGateway);
   	CreateModbusDevice($parentID, "Spannung L2-N", "Voltage_AC_Phase_2", 15, 7, 40083, $modbusGateway);
   	CreateModbusDevice($parentID, "Spannung L3-N", "Voltage_AC_Phase_3", 16, 7, 40085, $modbusGateway);
	CreateModbusDevice($parentID, "Spannung AVG", "Voltage_AC_AVG_Phase", 17, 7, 40087, $modbusGateway);
   	CreateModbusDevice($parentID, "Spannung L1-L2", "Voltage_AC_PhaseToPhase_12", 18, 7, 40089, $modbusGateway);
   	CreateModbusDevice($parentID, "Spannung L2-L3", "Voltage_AC_PhaseToPhase_23", 19, 7, 40091, $modbusGateway);
   	CreateModbusDevice($parentID, "Spannung L3-L1", "Voltage_AC_PhaseToPhase_31", 20, 7, 40093, $modbusGateway);
   	CreateModbusDevice($parentID, "Frequenz", "Frequency_Phase_Average", 21, 7, 40095, $modbusGateway);
   	CreateModbusDevice($parentID, "Leistung gesamt", "PowerReal_P_Sum", 22, 7, 40097, $modbusGateway);
   	CreateModbusDevice($parentID, "Leistung L1", "PowerReal_P_Phase_1", 23, 7, 40099, $modbusGateway);
   	CreateModbusDevice($parentID, "Leistung L2", "PowerReal_P_Phase_2", 24, 7, 40101, $modbusGateway);
   	CreateModbusDevice($parentID, "Leistung L3", "PowerReal_P_Phase_3", 25, 7, 40103, $modbusGateway);
   	CreateModbusDevice($parentID, "Scheinleistung gesamt", "PowerReactive_P_Sum", 26, 7, 40113, $modbusGateway);
	CreateModbusDevice($parentID, "cosPhi", "PowerFactor_Sum", 27, 7, 40121, $modbusGateway);
	CreateModbusDevice($parentID, "Arbeit gesamt", "EnergyReal_WAC_Sum_Produced", 28, 7, 40129, $modbusGateway);
	CreateModbusDevice($parentID, "Bezug gesamt", "EnergyReal_WAC_Sum_Consumed", 29, 7, 40137, $modbusGateway);
	CreateModbusDevice($parentID, "Events", "Events", 30, 6, 40193, $modbusGateway);

   
// *****************************************************************************
// *****************************************************************************

// Funktion Modbus Gateway anlegen
// --------------------------------	   
function CreateModbusGateway($name, $ident, $pos, $mode, $address, $swapw, $cs_data){
	$mb_gwID = @IPS_GetObjectIDByIdent($ident, $parentID);
	
	if($mb_gwID === false){
		$mb_gwID = IPS_CreateInstance("{A5F663AB-C400-4FE5-B207-4D67CC030564}");
   		IPS_SetName($mb_gwID, $name);
   		IPS_SetIdent($mb_gwID, $ident);
   		IPS_SetPosition($mb_gwID, $pos);
		IPS_SetProperty($mb_gwID, "GatewayMode", $mode);
		IPS_SetProperty($mb_gwID, "DeviceID", $address);
		IPS_SetProperty($mb_gwID, "SwapWords", $swapw);
   		IPS_ApplyChanges($mb_gwID);
		}
	
	// ClientSocket Einstellungen
	$csID = IPS_GetInstance($mb_gwID)['ConnectionID'];
	if($csID === false) $csID = IPS_CreateInstance("{3CFF0FD9-E306-41DB-9B5A-9D06D38576C3}");

	IPS_SetName($csID, $cs_data['name']);
   	IPS_SetIdent($csID, $cs_data['ident']);
   	IPS_SetPosition($csID, 0);
   	IPS_SetProperty($csID, "Open", true);
   	IPS_SetProperty($csID, "Host", $cs_data['ip']);
   	IPS_SetProperty($csID, "Port", $cs_data['port']);

   	IPS_ApplyChanges($csID);
	
	return $mb_gwID;
	}
	
	
// Funktion Modbus Device anlegen
// -------------------------------	   
function CreateModbusDevice($parentID, $name, $ident, $pos, $datatype, $address, $connectID){
Global $status, $time;

	$mb_addID = @IPS_GetObjectIDByIdent($ident, $parentID);
	
	if($mb_addID === false){
		$mb_addID = IPS_CreateInstance("{CB197E50-273D-4535-8C91-BB35273E3CA5}");
   		IPS_SetParent($mb_addID, $parentID);
   		IPS_SetName($mb_addID, $name);
   		IPS_SetIdent($mb_addID, $ident);
   		IPS_SetPosition($mb_addID, $position);
		IPS_SetProperty($mb_addID, "DataType", $datatype);
		IPS_SetProperty($mb_addID, "ReadFunctionCode", 3);
		IPS_SetProperty($mb_addID, "ReadAddress", $address);
		IPS_SetProperty($mb_addID, "WriteFunctionCode", 0);
   		IPS_SetProperty($mb_addID, "WriteAddress", 0);
   		IPS_SetProperty($mb_addID, "EmulateStatus", $status);
   		IPS_SetProperty($mb_addID, "Poller", $time);
   		IPS_DisconnectInstance($mb_addID);
   		IPS_ConnectInstance($mb_addID, $connectID);
   		IPS_ApplyChanges($mb_addID);
		}
	}

// *****************************************************************************
// *****************************************************************************

?>

Danke für die Push Service Lösung.
Soeben in unserem 8.2er eingerichtet.
Unterhalb von Wechselrichter kommen Daten… Unterhalb von Leistungsdaten dagegen nichts…
Muss man im Initialen Skript die passenden Werte Mappen?

Gesendet von meinem Redmi Note 2 mit Tapatalk

Das hat wohl etwas damit zu tun:


	// prüfen auf Fronius JSON
	if(json_decode($content, true)){
		$data = json_decode($content, true);
	
		if(array_key_exists("Inverters", $data['Body'])) $hook_sender = "powerflow";
		elseif(array_key_exists("states", $data)) $hook_sender = "states";
		elseif($data['Head']['RequestArguments']['Query'] == "Meter") $hook_sender = "meter";
		elseif($data['Head']['RequestArguments']['Query'] == "Inverter+SensorCard+Meter") $hook_sender = "logData";
		elseif($data['Head']['RequestArguments']['Query'] == "Errors+Events") $hook_sender = "logError";
		}

füge das mal ein nach $data = json_decode($content, true);


IPS_LogMessage("PV_Auswertung", print_r($data['Body'], true));
IPS_LogMessage("PV_Auswertung", print_r($data['Head'], true));

Mal sehen was da bei Dir dann bei den Meldungen ankommt.

Den eigentlich sollte das $data[‚Head‘][‚RequestArguments‘][‚Query‘] eindeutig nachweisen von welcher API
die Daten kommen, nur ist dies leider nicht sauber implementiert.

Also bleibt uns jetzt nur „trail and error“ als Lösung :cool:

Danke.
Heute Abend probier ich’s direkt aus… Das gute Wetter muss man Outdoor nützen :wink:
IPS muss warten

Gesendet von meinem Redmi Note 2 mit Tapatalk

Ich hab die beiden Zeilen mal eingebaut.

In der Meldungsansicht zeigt sich dann:
Werte werden aber noch nicht verarbeitet…

Das teste ich auch mal :slight_smile: Danke das sich jetzt hier was tut

Gesendet von iPhone mit Tapatalk

Aso aha, wie viele Push-Service hast Du eingerichtet?

Wechselrichter = SunSpec Datalogger v1.0b - inverter float model (am Bild: Inverter - SunSpec)

Produktionsdaten = SolarAPI v1 - CurrentData - Powerflow (am Bild: Powerflow)

Smartmeter = SolarAPI v1 - CurrentData - Meter (am Bild: Meter)

Fehler = SolarAPI v1 - Logdata - Errors and Events (am Bild: Logdata - Error)

IO Status = Datamanager IO States (am Bild: IO States)

Es gibt leider keinen Push-Service der alles auf einmal liefert

@manni

you made my day!!!
Danke dir… ja die restlichen PUSH Service haben komplett gefehlt.

Man sollte auf der Fronius Seite, nachdem man die ganze PUSH Service hinterlegt hat, auch oben RECHTS das Häkchen zum Übernehmen/Speichern drücken :banghead: :D:D:D

Jetzt kommen alle Datensätze rein… Passt super!

Auch die Berechnung über den Smart Meter funktioniert ins negative… Gerade läuft unsere Wärmepumpe (ca. 2000W) und vom Dach kommen nur noch 400Watt… ergo -1600Watt…:smiley:

Ich glaube, ich habs jetzt nach fast 2 Jahren letztendlich geschafft durch reverse engineering, da die Doku und spec sehr verbesserungswürdig ist.

Ich glaube, dass ich jetzt die Ampere, die Spannung und die Leistung pro MPP Tracker über Modbus auslesen kann.

Für diejenigen, die auch den smart meter nutzen, ist das nicht gültig…ich lese die Sachen vom fronius symo 5.0-3-m mit integriertem (W)LAN Datenlogger aus.

Ich habe das ganze in ein Excel gegeben zwecks besserer Übersicht, was ich hier hochgeladen habe…vielleicht hilfts ja dem einen oder anderen Leidesgenossen weiter.

modbus.xlsx.zip (26.6 KB)