Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 42 additions & 1 deletion packages/modules/devices/victron/victron/bat.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#!/usr/bin/env python3
from typing import Any, TypedDict
import logging
from typing import Any, Optional, TypedDict

from modules.common import modbus
from modules.common.abstract_device import AbstractBat
Expand All @@ -11,6 +12,8 @@
from modules.common.store import get_bat_value_store
from modules.devices.victron.victron.config import VictronBatSetup

log = logging.getLogger(__name__)


class KwargsDict(TypedDict):
device_id: int
Expand All @@ -28,6 +31,7 @@ def initialize(self) -> None:
self.sim_counter = SimCounter(self.__device_id, self.component_config.id, prefix="speicher")
self.store = get_bat_value_store(self.component_config.id)
self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config))
self.last_mode = 'Undefined'

def update(self) -> None:
modbus_id = self.component_config.configuration.modbus_id
Expand All @@ -44,5 +48,42 @@ def update(self) -> None:
)
self.store.set(bat_state)

def set_power_limit(self, power_limit: Optional[int]) -> None:
modbus_id = self.component_config.configuration.modbus_id

# Wenn Victron Dynamic ESS aktiv, erfolgt keine weitere Regelung in openWB
dynamic_ess_mode = self.__tcp_client.read_holding_registers(5400, ModbusDataType.UINT_16, unit=modbus_id)
if dynamic_ess_mode == 1:
log.debug("Dynamic ESS Mode ist aktiv, daher erfolgt keine Regelung des Speichers durch openWB")
return

if power_limit is None:
log.debug("Keine Batteriesteuerung, Selbstregelung durch Wechselrichter")
if self.last_mode is not None:
# ESS Mode 1 für Selbstregelung mit Phasenkompensation setzen
self.__tcp_client.write_registers(39, [0], data_type=ModbusDataType.UINT_16, unit=228)
self.__tcp_client.write_registers(2902, [1], data_type=ModbusDataType.UINT_16, unit=modbus_id)
self.last_mode = None
elif power_limit == 0:
log.debug("Aktive Batteriesteuerung. Batterie wird auf Stop gesetzt und nicht entladen")
if self.last_mode != 'stop':
# ESS Mode 3 für externe Steuerung und keine Entladung
self.__tcp_client.write_registers(2902, [3], data_type=ModbusDataType.UINT_16, unit=modbus_id)
self.__tcp_client.write_registers(39, [1], data_type=ModbusDataType.UINT_16, unit=228)
self.last_mode = 'stop'
elif power_limit > 0:
if self.last_mode != 'discharge':
# ESS Mode 3 für externe Steuerung und auf L1 wird entladen
self.__tcp_client.write_registers(2902, [3], data_type=ModbusDataType.UINT_16, unit=modbus_id)
self.__tcp_client.write_registers(39, [0], data_type=ModbusDataType.UINT_16, unit=228)
self.last_mode = 'discharge'
# Die maximale Entladeleistung begrenzen auf 5000W
power_value = int(min(power_limit, 5000)) * -1
log.debug(f"Aktive Batteriesteuerung. Batterie wird mit {power_value} W entladen")
self.__tcp_client.write_registers(37, [power_value & 0xFFFF], data_type=ModbusDataType.INT_16, unit=228)

def power_limit_controllable(self) -> bool:
return True


component_descriptor = ComponentDescriptor(configuration_factory=VictronBatSetup)