Die Modbusregister dazu konnte ich dem Projekt https://github.com/Eisbaeeer/sungrow/bl ... gister.tsv entnehmen. Danke an dieser Stelle.
Die Wallbox ist via RS485 am Wechselrichter angeschlossen und kann via Modbus IP abgefragt werden. Dazu muß im WiNet-S Adapter die Adresse ermittelt werden. In der Regel ist es die "2". ( Menü Gerät / Geräteliste, Spalte"Weiterleiten der Modbus ID", Hinweis: Seit dem letzten Update ist der Zugriff über https erforderlich und Modbus über WiNet-S ist stabil.)
Die Werte für Strom und Spannung der drei Phasen und die Anzahl der verwendeten Phasen wird ausgelesen, die jeweilige Leistung berechet und in dem Measurement "WB" gespeichert. Das Measurement "AC" wurde um die Spalte "HausOhneWB" erweitert.
Die Werte können dann in Grafana dargestellt werden.
Code: Alles auswählen
<?php
// 15.01.2025 Matthias Körner
// Abfrage von Daten aus einer Wallbox AC011e-01 via Modbus über WiNet-S Adapter
// Die Modbus Register stammen von folgenden Github Projekt
// https://github.com/Eisbaeeer/sungrow/blob/main/AC011E01_Input-Register.tsv
a
$GeraeteAdrWB = "02"; // Dieser Wert muss aus dem WiNet-S Adapter ausgelesen werden.
// Menü Gerät / Geräteliste, Spalte"Weiterleiten der Modbus ID"
// $Tracelevel = 8; // zu anzeigen von Meldungen bei Inbetriebnahme
// Phase R
$RegisterAdresse = 21301;
$RegisterAnzahl = "0001";
$DatenTyp = "U16";
$Ergebnis = $funktionen->modbus_tcp_lesen($COM1, $GeraeteAdrWB, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase);
$funktionen->log_schreiben("WB Spannung_R".($Ergebnis["Wert"] ), "|--", 8);
if (is_array($Ergebnis)) {
$WB_Spannung_R=$Ergebnis["Wert"]/10;
} else {
$funktionen->log_schreiben("Lesefehler WB", " ", 8);
}
$RegisterAdresse = 21302;
$RegisterAnzahl = "0001";
$DatenTyp = "U16";
$Ergebnis = $funktionen->modbus_tcp_lesen($COM1, $GeraeteAdrWB, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase);
$funktionen->log_schreiben("WB Strom_R".($Ergebnis["Wert"] ), "|--", 8);
if (is_array($Ergebnis)) {
$WB_Strom_R = $Ergebnis["Wert"]/10;
} else {
$funktionen->log_schreiben("Lesefehler WB", " ", 8);
}
// Phase S
$RegisterAdresse = 21303;
$RegisterAnzahl = "0001";
$DatenTyp = "U16";
$Ergebnis = $funktionen->modbus_tcp_lesen($COM1, $GeraeteAdrWB, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase);
$funktionen->log_schreiben("WB Spannung_S".($Ergebnis["Wert"] ), "|--", 8);
if (is_array($Ergebnis)) {
$WB_Spannung_S = $Ergebnis["Wert"]/10;
} else {
$funktionen->log_schreiben("Lesefehler WB", " ", 8);
}
$RegisterAdresse = 21304;
$RegisterAnzahl = "0001";
$DatenTyp = "U16";
$Ergebnis = $funktionen->modbus_tcp_lesen($COM1, $GeraeteAdrWB, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase);
$funktionen->log_schreiben("WB Strom_S".($Ergebnis["Wert"] ), "|--", 8);
if (is_array($Ergebnis)) {
$WB_Strom_S = $Ergebnis["Wert"]/10;
} else {
$funktionen->log_schreiben("Lesefehler WB", " ", 8);
}
// Phanse T
$RegisterAdresse = 21305;
$RegisterAnzahl = "0001";
$DatenTyp = "U16";
$Ergebnis = $funktionen->modbus_tcp_lesen($COM1, $GeraeteAdrWB, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase);
$funktionen->log_schreiben("WB Spannung_T".($Ergebnis["Wert"] ), "|--", 8);
if (is_array($Ergebnis)) {
$WB_Spannung_T = $Ergebnis["Wert"]/10;
} else {
$funktionen->log_schreiben("Lesefehler WB", " ", 8);
}
$RegisterAdresse = 21306;
$RegisterAnzahl = "0001";
$DatenTyp = "U16";
$Ergebnis = $funktionen->modbus_tcp_lesen($COM1, $GeraeteAdrWB, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase);
$funktionen->log_schreiben("WB Strom_T".($Ergebnis["Wert"] ), "|--", 8);
if (is_array($Ergebnis)) {
$WB_Strom_T = $Ergebnis["Wert"]/10;
} else {
$funktionen->log_schreiben("Lesefehler WB", " ", 8);
}
// Phasenanzahl
$RegisterAdresse = 21203;
$RegisterAnzahl = "0001";
$DatenTyp = "U16";
$Ergebnis = $funktionen->modbus_tcp_lesen($COM1, $GeraeteAdrWB, $FunktionsCode, $RegisterAdresse, $RegisterAnzahl, $DatenTyp, $Timebase);
$funktionen->log_schreiben("WB Strom_T".($Ergebnis["Wert"] ), "|--", 8);
if (is_array($Ergebnis)) {
$WB_Phase = $Ergebnis["Wert"];
} else {
$funktionen->log_schreiben("Lesefehler WB", " ", 8);
}
//Leistung aus allen Phasen ermitteln
$LeistungWB_R = $WB_Spannung_R*$WB_Strom_R;
$LeistungWB_S = $WB_Spannung_S*$WB_Strom_S;
$LeistungWB_T = $WB_Spannung_T*$WB_Strom_T;
$LeistungWB = $LeistungWB_R+$LeistungWB_S+$LeistungWB_T;
//Leistung für Haus berechnen
$HausOhneWB = $aktuelleDaten["Hausverbrauch"] - $LeistungWB;
//Query erstellen
// WB Measurement (Neu)
$aktuelleDaten["ZusatzQuery"] = "WB ";
$aktuelleDaten["ZusatzQuery"] .= "Spannung_R=".$WB_Spannung_R.",Strom_R=".$WB_Strom_R.",Leistung_R=".$LeistungWB_R;
$aktuelleDaten["ZusatzQuery"] .= ",Spannung_S=".$WB_Spannung_S.",Strom_S=".$WB_Strom_S.",Leistung_S=".$LeistungWB_S;
$aktuelleDaten["ZusatzQuery"] .= ",Spannung_T=".$WB_Spannung_T.",Strom_T=".$WB_Strom_T.",Leistung_T=".$LeistungWB_T;
$aktuelleDaten["ZusatzQuery"] .= ",Leistung=".$LeistungWB.",Phasen=".$WB_Phase;
$aktuelleDaten["ZusatzQuery"] .= "\n";
// AC Measurement (neue Spalte)
$aktuelleDaten["ZusatzQuery"] .= "AC HausOhneWB=".$HausOhneWB;
$aktuelleDaten["ZusatzQuery"] .= " ".$aktuelleDaten['zentralerTimestamp'];
// $funktionen->log_schreiben( $aktuelleDaten["ZusatzQuery"], " ", 8);
?>