Skip to content

Commit 0148f23

Browse files
committed
add possibility to charge
1 parent 48d029a commit 0148f23

5 files changed

Lines changed: 42 additions & 4 deletions

File tree

packages/modules/devices/sigenergy/sigenergy/bat.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,13 @@ def set_power_limit(self, power_limit: Optional[int]) -> None:
5555
log.debug("Keine Batteriesteuerung, Selbstregelung durch Wechselrichter")
5656
if self.last_mode is not None:
5757
# Entladesperre ab 5%, Ansonsten Eigenregelung
58-
self.__tcp_client.write_registers(40048, [50], data_type=ModbusDataType.UINT_16, unit=unit)
58+
self.client.write_registers(40048, [50], data_type=ModbusDataType.UINT_16, unit=unit)
5959
self.last_mode = None
6060
else:
6161
log.debug("Aktive Batteriesteuerung. Batterie wird auf Stop gesetzt und nicht entladen")
6262
if self.last_mode != 'stop':
6363
# Entladesperre auch bei 100% SoC
64-
self.__tcp_client.write_registers(40048, [1000], data_type=ModbusDataType.UINT_16, unit=unit)
64+
self.client.write_registers(40048, [1000], data_type=ModbusDataType.UINT_16, unit=unit)
6565
self.last_mode = 'stop'
6666

6767
def power_limit_controllable(self) -> bool:

packages/modules/devices/solarmax/solarmax/bat.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ def set_power_limit(self, power_limit: Optional[int]) -> None:
5555
if self.last_mode is not None:
5656
self.__tcp_client.write_registers(142, [0], data_type=ModbusDataType.INT_16, unit=unit)
5757
self.last_mode = None
58-
elif power_limit == 0:
58+
elif power_limit >= 0:
59+
# Solarmax kann nicht aktiv laden
5960
log.debug("Aktive Batteriesteuerung. Batterie wird auf Stop gesetzt und nicht entladen")
6061
self.__tcp_client.write_registers(140, [0], data_type=ModbusDataType.INT_16, unit=unit)
6162
self.__tcp_client.write_registers(141, [0], data_type=ModbusDataType.INT_16, unit=unit)

packages/modules/devices/sonnen/sonnenbatterie/bat.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,20 @@ def initialize(self) -> None:
4545
self.api = JsonApi(host=self.__device_address,
4646
api_version=JsonApiVersion.V2 if self.__device_variant == 3 else JsonApiVersion.V1,
4747
auth_token=self.__api_v2_token if self.__device_variant == 3 else None)
48+
self.last_mode = 'Undefined'
4849

4950
def update(self) -> None:
5051
self.store.set(self.api.update_battery(sim_counter=self.sim_counter))
5152

5253
def set_power_limit(self, power_limit: Optional[int]) -> None:
53-
self.api.set_power_limit(power_limit=power_limit)
54+
if power_limit is None:
55+
# Wert wird nur einmal gesetzt
56+
if self.last_mode is not None:
57+
self.api.set_power_limit(power_limit=power_limit)
58+
self.last_mode = None
59+
else:
60+
self.api.set_power_limit(power_limit=power_limit)
61+
self.last_mode = 'active'
5462

5563
def power_limit_controllable(self) -> bool:
5664
return self.api.power_limit_controllable()

packages/modules/devices/sungrow/sungrow/bat.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,16 @@ def set_power_limit(self, power_limit: Optional[int]) -> None:
140140
power_value = int(min(abs(power_limit), 5000))
141141
log.debug(f"Aktive Batteriesteuerung. Batterie wird mit {power_value} W entladen für den Hausverbrauch")
142142
self.__tcp_client.write_register(13051, power_value, data_type=ModbusDataType.UINT_16, unit=unit)
143+
elif power_limit > 0:
144+
log.debug(f"Aktive Batteriesteuerung. Batterie wird mit {power_limit} W geladen")
145+
if self.last_mode != 'charge':
146+
self.__tcp_client.write_register(13049, 2, data_type=ModbusDataType.UINT_16, unit=unit)
147+
self.__tcp_client.write_register(13050, 0xAA, data_type=ModbusDataType.UINT_16, unit=unit)
148+
self.last_mode = 'charge'
149+
# Die maximale Entladeleistung begrenzen auf 5000W, maximaler Wertebereich Modbusregister.
150+
power_value = int(min(power_limit, 5000))
151+
log.debug(f"Aktive Batteriesteuerung. Batterie wird mit {power_value} W geladen")
152+
self.__tcp_client.write_register(13051, power_value, data_type=ModbusDataType.UINT_16, unit=unit)
143153

144154
def power_limit_controllable(self) -> bool:
145155
return True

packages/modules/devices/victron/victron/bat.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,25 @@ def set_power_limit(self, power_limit: Optional[int]) -> None:
9595
40, power_value & 0xFFFF, data_type=ModbusDataType.INT_16, unit=vebus_id)
9696
self.__tcp_client.write_register(
9797
41, power_value & 0xFFFF, data_type=ModbusDataType.INT_16, unit=vebus_id)
98+
elif power_limit > 0:
99+
if self.last_mode != 'charge':
100+
# ESS Mode 3 für externe Steuerung und auf L1 wird entladen
101+
self.__tcp_client.write_register(2902, 3, data_type=ModbusDataType.UINT_16, unit=modbus_id)
102+
self.__tcp_client.write_register(39, 0, data_type=ModbusDataType.UINT_16, unit=vebus_id)
103+
self.last_mode = 'charge'
104+
# Die maximale Entladeleistung begrenzen auf 5000W
105+
if phases == 3:
106+
power_limit = power_limit / 3
107+
power_value = int(min(power_limit, 5000))
108+
log.debug(f"Aktive Batteriesteuerung. Victron mit {phases} Phase(n). "
109+
f"Batterie wird mit {power_value} W pro Phase geladen.")
110+
self.__tcp_client.write_register(
111+
37, power_value & 0xFFFF, data_type=ModbusDataType.INT_16, unit=vebus_id)
112+
if phases == 3:
113+
self.__tcp_client.write_register(
114+
40, power_value & 0xFFFF, data_type=ModbusDataType.INT_16, unit=vebus_id)
115+
self.__tcp_client.write_register(
116+
41, power_value & 0xFFFF, data_type=ModbusDataType.INT_16, unit=vebus_id)
98117

99118
def power_limit_controllable(self) -> bool:
100119
return True

0 commit comments

Comments
 (0)