LutzB hat geschrieben: ↑Do Jan 09, 2025 6:47 pm
Danke für die Rückmeldung. Merge ich dann morgen mit der Textanpassung in den Master.
Hallo Lutz,
mir ist noch etwas aufgefallen als ich heute durch Zufall diesen Beitrag gefunden habe
viewtopic.php?p=121271&hilit=sungrow#p121271)
Die eingepflegte Änderung von dir funktioniert bei mir, weil ich zum einen den LAN Port am Sungrow Hybrid nehme und die neue Firmware habe. Ich habe jetzt aber testweise mal auf den WinetS Modbus Abruf (also Version SH_winet_dongle) umgestellt und da funktioniert es nicht. Das liegt daran das das Firmware Update ausschließlich für den Hybrid zählt und nicht für den WinetS. Ich habe das durch Modbus Abfragen verifiziert, beim WinetS ist die Batterieleistung 13021 nachwievor auch Uint_16 ohne Vorzeichen.
Von daher gelten meines Erachtens folgende Bedingungen:
- IF Firmware.v2 AND Version.SH THEN
Code: Alles auswählen
bat_power = self.__tcp_client.read_input_registers(13021, ModbusDataType.INT_16, unit=unit) * -1
- ELSE "der alte Code", das gilt dann für
-- Firmware.v2 und Version.SH_winet_dongle
-- Firmware.v1 und Version.SH
-- Firmware.v1 und Version.SH_winet_dongle
Es gibt jetzt aber noch ein Punkt wo ich glaub das der restliche Code auch ein kleines "Problem" hat, was wieder mit dem Eingangs erwähnten anderen Post zu tun hat. Wenn ich auf WinetS umstelle, dann wird die Zwangsladung als Entladung angezeigt und PV Leistung wird auch angezeigt. Bei Auslesung über den SH Lan Port aber nicht. Das hängt glaube ich mit folgendem Code-Teil zusammen:
Code: Alles auswählen
# Beim WiNet S-Dongle fehlt das Register für das Vorzeichen der Speicherleistung
if self.device_config.configuration.version == Version.SH_winet_dongle:
total_power = self.__tcp_client.read_input_registers(13033, ModbusDataType.INT_32,
wordorder=Endian.Little, unit=unit)
pv_power = self.__tcp_client.read_input_registers(5016, ModbusDataType.UINT_32,
wordorder=Endian.Little, unit=unit)
# Ist die Gesamtleistung des WR größer als die PV-Erzeugung wird der Speicher entladen
if total_power > pv_power:
bat_power = bat_power * -1
Habe mal zwangsgeladen, da wird 13033 also total_power negativ auf -550W (500W Zwangsladung) und 5016 also pv_power bleibt bei 0 (weil Nacht ist). Das heißt er dreht das Vorzeichen nicht um.
Würde es nicht vielleicht besser funktionieren wenn der oben zitierte Code weg kommt und die Unterscheidung rein über das Register 13000 gemacht wird? Also den Code:
resp = self.__tcp_client._delegate.read_input_registers(13000, 1, unit=unit)
binary = bin(resp.registers[0])[2:].zfill(8)
if binary[5] == "1":
bat_power = bat_power * -1
Sungrow schreibt ja in das Register sowohl die Entladung als auch die Ladung. Bei Entladung ist Bit2 ==1 und bei Ladung ist Bit1 ==1. Damit könnte man die bat_power sauber steuern ob entladen oder geladen wird bei den anderen Versionen und Firmwares.
Auszug aus dem Sungrow Modbus Register:
Das habe ich auch mal verifiziert. Wenn Batterie weder geladen noch entladen wird gibt das Register als Decimal 40 aus, bei Ladung 42 und bei Entladung 44 (Nacht ohne weitere Erzeugung).
Stelle mich auch gerne zur Verfügung das zu testen