ich habe seit kurzem einen Sungrow SG17RT mit einem WiNetS. Bei der Suche nach einer Möglichkeit zum Auslesen der Werte ohne über Sungrows Cloud (iSolarCloud) gehen zu müssen, habe ich so ziemlich alle größeren Projekte in dem Umfeld ausprobiert. Funktionierende Umsetzungen waren nur in https://github.com/meltaxa/solariot] und https://github.com/bohdan-s/SunGather]. Beide verwenden im Backend https://github.com/bohdan-s/SungrowModbusWebClient und bieten die Möglichkeit in verschiedene Formate zu exportieren. Sie bringen aber keine Anzeige-Komponente mit.
Zuerst habe ich die Daten mit solariot in eine InfluxDB geschrieben, und dann im grafana von solaranzeige integriert. Das war aber nur bedingt ausreichend.
Um mich etwas intensiver mit der Technik auseinander zu setzen, habe ich den Programmfluss aus SungrowModbusWebClient in php für solaranzeige nachimplementiert. Zuerst hatte ich alles in Regler 70 integriert, was aber eigentlich keinen Sinn macht, da an so ziemlich jeder interessanten Stelle die SG WRs von der SH (Hybrid) WRs divergieren und Regler 70 eigentlich nur für SHs ist. Daher habe ich einen neuen Regler daraus gemacht. Bei den Namen der Daten bin ich dann von den Bezeichnungen in Solaranzeige abgewichen und habe die Bezeichnungen aus der Sungrow Doku verwendet. Eine für den Regler passende query für funktionen.inc.php ist:
Code: Alles auswählen
if (date( "i" ) == "01" or $daten["Demodaten"] or date( "H" ) == date( "H", $Sonnenaufgang )) {
$query .= "Info ";
$query .= "dev_code=\"".$daten["dev_code"]."\"";
$query .= ",dev_model=\"".$daten["dev_model"]."\"";
$query .= ",dev_type=\"".$daten["dev_type"]."\"";
$query .= ",Installed_PV_Power=\"".$daten["Installed PV Power"]."\"";
$query .= ",Objekt=\"".$daten["Objekt"]."\"";
$query .= ",Datum=\"".$daten["Datum"]."\"";
$query .= " ".$daten["zentralerTimestamp"];
$query .= "\n";
}
$query .= "AC ";
$query .= "phase_A_voltage=".$daten["phase A voltage"];
$query .= ",phase_B_Voltage=".$daten["phase B Voltage"];
$query .= ",phase_C_Voltage=".$daten["phase C Voltage"];
$query .= ",Phase_A_current=".$daten["Phase A current"];
$query .= ",Phase_B_current=".$daten["Phase B current"];
$query .= ",Phase_C_current=".$daten["Phase C current"];
//$query .= ",Leistung_R=".$daten["AC_Leistung_R"];
//$query .= ",Leistung_S=".$daten["AC_Leistung_S"];
//$query .= ",Leistung_T=".$daten["AC_Leistung_T"];
$query .= ",Grid_frequency=".$daten["Grid frequency"];
$query .= ",Total_active_power=".$daten["Total active power"];
//$query .= ",export=".$daten["export"];
//$query .= ",import=".$daten["import"];
//$query .= ",usage=".$daten["usage"];
$query .= " ".$daten["zentralerTimestamp"];
$query .= "\n";
$query .= "PV ";
$query .= "Total_DC_power=".$daten["Total DC power"];
//for ($i = 1; $i <= $daten["Anz_PV_Strings"]; $i++) {
//$query .= ",String_".$i."_voltage=".$daten["String ".$i." voltage"];
//$query .= ",String_".$i."_current=".$daten["String ".$i." current"];
//$query .= ",String_".$i."_power=".$daten["String ".$i." power"];
//$query .= ",String_".$i."_power=".($daten["String ".$i." voltage"] * $daten["String ".$i." current"]);
//}
for ($i = 1; $i <= $daten["Anz_MPP_Trackers"]; $i++) {
$query .= ",MPPT_".$i."_voltage=".$daten["MPPT ".$i." voltage"];
$query .= ",MPPT_".$i."_current=".$daten["MPPT ".$i." current"];
//$query .= ",MPPT_Leistung".$i."=".($daten["MPPT".$i."_Leistung"]);
$query .= ",MPPT_".$i."_power=".($daten["MPPT ".$i." voltage"] * $daten["MPPT ".$i." current"]);
}
$query .= " ".$daten["zentralerTimestamp"];
$query .= "\n";
$query .= "Service ";
$query .= "Internal_temperature=".$daten["Internal temperature"];
$query .= ",Fault/Alarmcode_1=".$daten["Fault/Alarmcode 1"];
$query .= ",Work_state=".$daten["Work state"];
$query .= ",Work_state_text=\"".$daten["Work state text"]."\"";
$query .= ",Anz_MPPT=".$daten["Anz_MPP_Trackers"];
$query .= ",Anz_Strings=".$daten["Anz_PV_Strings"];
$query .= ",Modell_ID=".$daten["ModellID"];
$query .= ",Modell=\"".$daten["Modell"]."\"";
$query .= ",Effizienz=".$daten["Effizienz"];
$query .= ",dev_sn=\"".$daten["dev_sn"]."\"";
//$query .= ",Geraetestatus=\"".$daten["Geraetestatus"]."\"";
$query .= " ".$daten["zentralerTimestamp"];
$query .= "\n";
$query .= "Summen ";
$query .= "Daily_power_yields=".$daten["Daily power yields"];
$query .= ",Total_power_yields=".$daten["Total power yields"];
$query .= ",Monthly_power_yields=".$daten["Monthly power yields"];
$query .= ",Total_running_time=".$daten["Total running time"];
$query .= ",Daily_running_time=".$daten["Daily running time"];
//$query .= ",Wh_EinspeisungHeute=".$daten["EinspeisungHeute"];
//$query .= ",Wh_BezugHeute=".$daten["BezugHeute"];
//$query .= ",Wh_HausverbrauchHeute=".$daten["HausverbrauchHeute"];
$query .= " ".$daten["zentralerTimestamp"];
$query .= "\n";
Leider ist mein SmartMeter falsch am Wechselrichter angeschlossen worden. Somit fehlen die Werte zu Import und Export von Strom sowie die Trennung zu Eigenverbrauch und Einspeisung. Das hole ich nach, wenn der Anschluss korrigiert wird.
Die Lösung nutzt eine Kommunikation über Websocket auf Port 8082, gefolgt von normalem http auf Port 80. In der config sind also die IP und Port 8082 anzugeben. Für den Websocket Teil habe ich auf https://github.com/Textalk/websocket-php zurückgegriffen. Daher gibt es eine Abhängigkeit zu diesen php Dateien. Die habe ich mittels
Code: Alles auswählen
composer require textalk/websocket
Code: Alles auswählen
apt install php-mbstring
Einige Register scheinen nicht über WiNetS zugreifbar zu sein. So komme ich an die String-Stromstärke nicht heran. Auch "Installed PV Power" ist bei mir immer 0xFFFF, also nicht zugreifbar.
Falls das jemandem nützt, gern geschehen. Vielleicht kann das auch direkt in solaranzeige integriert werden. Wie gesagt, WiNetS ist hier Voraussetzung. Für direkte ModBus Kommunikation ist das nicht geeignet. Dafür sollte man Regler 70 entsprechend den SG Registern anpassen.