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
33 changes: 32 additions & 1 deletion packages/modules/devices/kostal/kostal_plenticore/bat.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
import logging
from typing import TypedDict, Any
from typing import TypedDict, Any, Optional
from pymodbus.constants import Endian

from modules.common.abstract_device import AbstractBat
Expand Down Expand Up @@ -54,5 +54,36 @@ def update(self) -> None:
)
self.store.set(bat_state)

# 0x40A 1034 Battery charge power (DC) setpoint, absolute - W Float 2 RW
# negative Werte: laden, positive Werte: entladen
# Kostal setzt das Register autmatisch nach Timeout zurück auf Eigensteuerung.
# Timeout kann im Kostal UI geändert werden. Standardwert 30s

def set_power_limit(self, power_limit: Optional[int]) -> None:
unit = self.device_config.configuration.modbus_id
log.debug(f'last_mode: {self.last_mode}')

if power_limit is None:
# Wert wird nur einmal gesetzt damit die Eigenregelung nach Timeout greift
log.debug("Keine Batteriesteuerung, Selbstregelung durch Wechselrichter")
if self.last_mode is not None:
self.__tcp_client.write_registers(1034, [0], data_type=ModbusDataType.FLOAT_32, unit=unit)
self.last_mode = None
elif power_limit == 0:
# wiederholt auf Stop setzen damit sich Register nicht zurücksetzt
log.debug("Aktive Batteriesteuerung. Batterie wird auf Stop gesetzt und nicht entladen")
self.__tcp_client.write_registers(1034, [0], data_type=ModbusDataType.FLOAT_32, unit=unit)
self.last_mode = 'stop'
elif power_limit < 0:
log.debug(f"Aktive Batteriesteuerung. Batterie wird mit {power_limit} W entladen für den Hausverbrauch")
# Die maximale Entladeleistung begrenzen auf 7000W
power_value = int(min(abs(power_limit), 7000)) * -1
log.debug(f"Aktive Batteriesteuerung. Batterie wird mit {power_value} W entladen für den Hausverbrauch")
self.__tcp_client.write_registers(1034, [power_value], data_type=ModbusDataType.FLOAT_32, unit=unit)
self.last_mode = 'discharge'

def power_limit_controllable(self) -> bool:
return True


component_descriptor = ComponentDescriptor(configuration_factory=KostalPlenticoreBatSetup)