Skip to content

Commit

Permalink
Sungrow Fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
Maxify23 committed May 8, 2023
1 parent 549db73 commit 29a77c9
Show file tree
Hide file tree
Showing 8 changed files with 50 additions and 19 deletions.
8 changes: 6 additions & 2 deletions modules/bezug_sungrow/main.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,12 @@ else
MYLOGFILE="$RAMDISKDIR/evu.log"
fi

bash "$OPENWBBASEDIR/packages/legacy_run.sh" "modules.devices.sungrow.device" "counter" "$speicher1_ip" "$sungrowspeicherport" "$sungrowspeicherid" "$sungrowsr" >>"$MYLOGFILE" 2>&1
ret=$?
if [[ "$pvwattmodul" == "wr_sungrow" ]]; then
echo "value read at pv modul" >/dev/null
else
bash "$OPENWBBASEDIR/packages/legacy_run.sh" "modules.devices.sungrow.device" "counter" "$speicher1_ip" "$sungrowspeicherport" "$sungrowspeicherid" "$sungrowsr" "0" "0">>"$MYLOGFILE" 2>&1
ret=$?
fi

openwbDebugLog $DMOD 2 "EVU RET: $ret"

Expand Down
2 changes: 1 addition & 1 deletion modules/speicher_sungrow/main.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ else
MYLOGFILE="$RAMDISKDIR/bat.log"
fi

bash "$OPENWBBASEDIR/packages/legacy_run.sh" "modules.devices.sungrow.device" "bat" "$speicher1_ip" "$sungrowspeicherport" "$sungrowspeicherid" >>"$MYLOGFILE" 2>&1
bash "$OPENWBBASEDIR/packages/legacy_run.sh" "modules.devices.sungrow.device" "bat" "$speicher1_ip" "$sungrowspeicherport" "$sungrowspeicherid" "0" "0">>"$MYLOGFILE" 2>&1
ret=$?

openwbDebugLog $DMOD 2 "BAT RET: $ret"
7 changes: 6 additions & 1 deletion modules/wr_sungrow/main.sh
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@ else
MYLOGFILE="$RAMDISKDIR/nurpv.log"
fi

bash "$OPENWBBASEDIR/packages/legacy_run.sh" "modules.devices.sungrow.device" "inverter" "$speicher1_ip" "$sungrowspeicherport" "$sungrowspeicherid" "1" >>"$MYLOGFILE" 2>&1
if [[ "$wattbezugmodul" == "bezug_sungrow" ]]; then
read_counter=1
else
read_counter=0
fi
bash "$OPENWBBASEDIR/packages/legacy_run.sh" "modules.devices.sungrow.device" "inverter" "$speicher1_ip" "$sungrowspeicherport" "$sungrowspeicherid" "1" "$read_counter" "$sungrowsr">>"$MYLOGFILE" 2>&1

cat "$RAMDISKDIR/pvwatt"
13 changes: 8 additions & 5 deletions packages/modules/devices/sungrow/counter.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ def __init__(self,
self.store = get_counter_value_store(self.component_config.id)
self.component_info = ComponentInfo.from_component_config(self.component_config)

def update(self):
def update(self, pv_power: float):
unit = self.__device_modbus_id
if self.component_config.configuration.version == Version.SH:
power = self.__tcp_client.read_input_registers(13009, ModbusDataType.INT_32,
Expand All @@ -38,10 +38,13 @@ def update(self):
# powers = [power / 10 for power in powers]
# log.info("power: " + str(power) + " powers?: " + str(powers))
else:
power = self.__tcp_client.read_input_registers(5082, ModbusDataType.INT_32,
wordorder=Endian.Little, unit=unit)
if self.component_config.configuration.version == Version.SG_winet_dongle:
power = power * -1
if pv_power != 0:
power = self.__tcp_client.read_input_registers(5082, ModbusDataType.INT_32,
wordorder=Endian.Little, unit=unit)
else:
power = self.__tcp_client.read_input_registers(5090, ModbusDataType.INT_32,
wordorder=Endian.Little, unit=unit)

# no valid data for powers per phase
# powers = self.__tcp_client.read_input_registers(5084, [ModbusDataType.UINT_16] * 3,
# wordorder=Endian.Little, unit=unit)
Expand Down
30 changes: 21 additions & 9 deletions packages/modules/devices/sungrow/device.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from helpermodules.cli import run_using_positional_cli_args
from modules.common import modbus
from modules.common.abstract_device import AbstractDevice, DeviceDescriptor
from modules.common.component_context import SingleComponentUpdateContext
from modules.common.component_context import MultiComponentUpdateContext
from modules.devices.sungrow import bat
from modules.devices.sungrow import counter
from modules.devices.sungrow import inverter
Expand Down Expand Up @@ -59,10 +59,13 @@ def update(self) -> None:
log.debug("Start device reading " + str(self.components))
if self.components:
with self.client:
for component in self.components:
# Auch wenn bei einer Komponente ein Fehler auftritt, sollen alle anderen noch ausgelesen werden.
with SingleComponentUpdateContext(self.components[component].component_info):
self.components[component].update()
with MultiComponentUpdateContext(self.components):
for component in self.components:
if isinstance(component, inverter.SungrowInverter):
pv_power = component.update()
for component in self.components:
if isinstance(component, counter.SungrowCounter):
component.update(pv_power)
else:
log.warning(
self.device_config.name +
Expand All @@ -87,17 +90,26 @@ def read_legacy(ip_address: str, port: int, modbus_id: int, component_config: di
dev.update()


def read_legacy_bat(ip_address: str, port: int, modbus_id: int, num: Optional[int] = None):
def read_legacy_bat(ip_address: str, port: int, modbus_id: int, num: Optional[int] = None, read_counter: Optional[int] = None, version: Optional[int] = None):
read_legacy(ip_address, port, modbus_id, bat.component_descriptor.configuration_factory(id=None))


def read_legacy_counter(ip_address: str, port: int, modbus_id: int, version: int):
def read_legacy_counter(ip_address: str, port: int, modbus_id: int, version: int, read_counter: int, unused_version: int):
read_legacy(ip_address, port, modbus_id, counter.component_descriptor.configuration_factory(
id=None, configuration=SungrowCounterConfiguration(version=Version(version))))


def read_legacy_inverter(ip_address: str, port: int, modbus_id: int, num: int):
read_legacy(ip_address, port, modbus_id, inverter.component_descriptor.configuration_factory(id=num))
def read_legacy_inverter(ip_address: str, port: int, modbus_id: int, num: int, read_counter: int, version: int):
device_config = Sungrow()
device_config.configuration.ip_address = ip_address
device_config.configuration.port = port
device_config.configuration.modbus_id = modbus_id
dev = Device(device_config)
dev.add_component(inverter.component_descriptor.configuration_factory(id=num))
if read_counter == 1:
dev.add_component(counter.component_descriptor.configuration_factory(
id=None, configuration=SungrowCounterConfiguration(version=Version(version))))
dev.update()


def main(argv: List[str]):
Expand Down
3 changes: 2 additions & 1 deletion packages/modules/devices/sungrow/inverter.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ def __init__(self,
self.store = get_inverter_value_store(self.component_config.id)
self.component_info = ComponentInfo.from_component_config(self.component_config)

def update(self) -> None:
def update(self) -> float:
unit = self.__device_modbus_id
power = self.__tcp_client.read_input_registers(5016,
ModbusDataType.UINT_32,
Expand All @@ -40,6 +40,7 @@ def update(self) -> None:
exported=exported
)
self.store.set(inverter_state)
return power


component_descriptor = ComponentDescriptor(configuration_factory=SungrowInverterSetup)
3 changes: 3 additions & 0 deletions web/settings/modulconfigbat.php
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,9 @@ function visibility_solarwatt_ip2() {
<span class="form-text small">Gültige Werte 1-254. Standard ist 1.</span>
</div>
</div>
<div class="card-text alert alert-warning">
Bitte halten Sie zur Fehlervermeidung die Firmware des Sungrow Wechselrichters und Wii Net Dongels aktuell.
</div>
<div class="alert alert-info">
Es muss Sungrow als PV und EVU Modul gewählt werden.
</div>
Expand Down
3 changes: 3 additions & 0 deletions web/settings/modulconfigevu.php
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,9 @@
<div class="card-text alert alert-info">
Konfiguration im zugehörigen Speichermodul des Sungrow erforderlich!
</div>
<div class="card-text alert alert-warning">
Bitte halten Sie zur Fehlervermeidung die Firmware des Sungrow Wechselrichters und Wii Net Dongels aktuell.
</div>
<div class="form-row mb-1">
<label for="sungrowsr" class="col-md-4 col-form-label">Version des Sungrow</label>
<div class="col">
Expand Down

1 comment on commit 29a77c9

@Maxify23
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ich habe drei Fehler ausgemacht im SG.

Auswahl SG (kein Hybrid und SG mit WII NET) verfällt mit FW Update des WR und Dongels. (Seit FW Anfang des Jahres).

Mit einem neuen FW Update war der Vorzeichendreher der diese Unterscheidung hervorgerufen hat obsolet.
Dh. die RICHTIGE Auswahl ist SG (kein Hybrid). Der andere Teil kann gelöscht werden.
(Gestet von Martin(Forum: Leaf-Driver) (mit Belegbildern) im Forum)).

(EIn allegemines Hinweisfenster bei der Auswahl Sungrow mit´:
-"Bitte halten SIe zur Fehlerbehebung Ihren Sungrow Wechselrichter und Wii Net Dongel Firmware aktuell" hilft wahrscheinlich

Wirkleistung falsch ausgelesen

Es wird die Wirkleistung PV ausgelesen aber der Wert ist verkehrt.

Lösung: habe ein anderes Modbus Register gefunden, dass die Wirkleistung des WR ausließt und diese ist korrekt.

(Getestet von kai9555 im Forum)

ABER

Dieses Register kann nicht mit dem SH verwendet werden. Der SH ist Hybrid und erzeugt Nachts ebenfalls mit der Batterieentladung eine Wirkleistung.

Deswegen muss es hier eine Fallunterscheidung geben.

Statischer Hausverbrauch bei PV= 0

Hier liegt das Problem darin, dass das Modbus Register welches den Power Meeter ausließt 30 Minuten nach PV = 0 einfriert auf den letzen angegeben Wert. Dannach bleibt dieser Wert statisch bis der PV Wert > 0 erreicht, dannach funktioniert das Register wieder. Es gibt ein Register das beiim Bezug den richtigen Wert angibt. Dieses geht aber nur für Bezugsgrößen, beim Einspeisen liefert es falsche Werte.

Lösung: Eine Fallunterscheidung der Auslesung für PVpower != 0 muss her.

(Gestet von Martin(Forum: Leaf-Driver) (mit Belegbildern) liegen mir per Email vor)).

Sowohl Martin, Kai (SG Fraktion) als auch ich (SH) haben die Geräte alle auf dem neusten Stand der FW.

Weiteres:

Hinweis zum Thema Modbus erreichbarkeit OpenWB

SH:
-Lan Port -> Funktionsfähig
-WII NET LAN und WIFI ->UNZUREICHEND Funktionsfähig -> NICHT NUTZEN Batterieentladung nicht angezeigt

SG (besitzt kein Lan Port)
-WII NET WIFI -> Funktionsfähig
-WII NET LAN -> Funktionsfähig

Die Grundlegenden Register für PV Leistung laufen überall, doch weiterführende Register z.B. zum Unterscheiden der Batterieleistung laufen nur am LAN Anschluss des SH.

Please sign in to comment.