diff --git a/packages/modules/devices/siemens/siemens_logo84/__init__.py b/packages/modules/devices/siemens/siemens_logo84/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/modules/devices/siemens/siemens_logo84/bat.py b/packages/modules/devices/siemens/siemens_logo84/bat.py new file mode 100644 index 0000000000..93e17fe64f --- /dev/null +++ b/packages/modules/devices/siemens/siemens_logo84/bat.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 +from typing import TypedDict, Any + +from modules.common import modbus +from modules.common.abstract_device import AbstractBat +from modules.common.component_state import BatState +from modules.common.component_type import ComponentDescriptor +from modules.common.fault_state import ComponentInfo, FaultState +from modules.common.modbus import ModbusDataType +from modules.common.store import get_bat_value_store +from modules.devices.siemens.siemens_logo84.config import SiemensLogo84BatSetup + + +class KwargsDict(TypedDict): + client: modbus.ModbusTcpClient_ + modbus_id: int + + +class SiemensLogo84Bat(AbstractBat): + def __init__(self, component_config: SiemensLogo84BatSetup, **kwargs: Any) -> None: + self.component_config = component_config + self.kwargs: KwargsDict = kwargs + + def initialize(self) -> None: + self.__tcp_client: modbus.ModbusTcpClient_ = self.kwargs['client'] + self.__modbus_id: int = self.kwargs['modbus_id'] + self.store = get_bat_value_store(self.component_config.id) + self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config)) + + def update(self) -> None: + with self.__tcp_client: + power = self.__tcp_client.read_holding_registers(342, ModbusDataType.INT_16, unit=self.__modbus_id) * -1 + soc = self.__tcp_client.read_holding_registers(343, ModbusDataType.INT_16, unit=self.__modbus_id) + imported = self.__tcp_client.read_holding_registers(344, ModbusDataType.INT_16, unit=self.__modbus_id)*1000 + exported = self.__tcp_client.read_holding_registers(345, ModbusDataType.INT_16, unit=self.__modbus_id)*1000 + + bat_state = BatState( + power=power, + soc=soc, + imported=imported, + exported=exported + ) + self.store.set(bat_state) + + +component_descriptor = ComponentDescriptor(configuration_factory=SiemensLogo84BatSetup) diff --git a/packages/modules/devices/siemens/siemens_logo84/config.py b/packages/modules/devices/siemens/siemens_logo84/config.py new file mode 100644 index 0000000000..135c934700 --- /dev/null +++ b/packages/modules/devices/siemens/siemens_logo84/config.py @@ -0,0 +1,38 @@ +from typing import Optional + +from modules.common.component_setup import ComponentSetup +from ..vendor import vendor_descriptor + + +class SiemensLogo84Configuration: + def __init__(self, modbus_id: int = 1, ip_address: Optional[str] = None, port: int = 507): + self.modbus_id = modbus_id + self.ip_address = ip_address + self.port = port + + +class SiemensLogo84: + def __init__(self, + name: str = "Siemens LOGO!8.4", + type: str = "siemens_logo84", + id: int = 0, + configuration: SiemensLogo84Configuration = None) -> None: + self.name = name + self.type = type + self.vendor = vendor_descriptor.configuration_factory().type + self.id = id + self.configuration = configuration or SiemensLogo84Configuration() + + +class SiemensLogo84BatConfiguration: + def __init__(self): + pass + + +class SiemensLogo84BatSetup(ComponentSetup[SiemensLogo84BatConfiguration]): + def __init__(self, + name: str = "Siemens LOGO! 8.4 Speicher-Zähler", + type: str = "bat", + id: int = 0, + configuration: SiemensLogo84BatConfiguration = None) -> None: + super().__init__(name, type, id, configuration or SiemensLogo84BatConfiguration()) diff --git a/packages/modules/devices/siemens/siemens_logo84/device.py b/packages/modules/devices/siemens/siemens_logo84/device.py new file mode 100644 index 0000000000..65521c9bd8 --- /dev/null +++ b/packages/modules/devices/siemens/siemens_logo84/device.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python3 +import logging +from typing import Iterable, Union + +from modules.common.abstract_device import DeviceDescriptor +from modules.common.configurable_device import ComponentFactoryByType, ConfigurableDevice, MultiComponentUpdater +from modules.common.modbus import ModbusTcpClient_ +from modules.devices.siemens.siemens_logo84.config import (SiemensLogo84, SiemensLogo84BatSetup) +from modules.devices.siemens.siemens_logo84 import bat + +log = logging.getLogger(__name__) + + +def create_device(device_config: SiemensLogo84): + client = None + + def create_bat_component(component_config: SiemensLogo84BatSetup): + nonlocal client + return bat.SiemensLogo84Bat(component_config, client=client, modbus_id=device_config.configuration.modbus_id) + + def update_components(components: Iterable[Union[bat.SiemensLogo84Bat]]): + nonlocal client + with client: + for component in components: + component.update() + + def initializer(): + nonlocal client + client = ModbusTcpClient_(device_config.configuration.ip_address, device_config.configuration.port) + + return ConfigurableDevice( + device_config=device_config, + initializer=initializer, + component_factory=ComponentFactoryByType( + bat=create_bat_component + ), + component_updater=MultiComponentUpdater(update_components) + ) + + +device_descriptor = DeviceDescriptor(configuration_factory=SiemensLogo84)