From 274feba6dfb7ab330ff6f9cd5d7536d222bd9417 Mon Sep 17 00:00:00 2001 From: ndrsnhs Date: Tue, 15 Apr 2025 11:35:03 +0200 Subject: [PATCH] add Janitza as bat counter --- .../modules/devices/janitza/janitza/bat.py | 45 +++++++++++++++++++ .../modules/devices/janitza/janitza/config.py | 14 ++++++ .../modules/devices/janitza/janitza/device.py | 20 ++++++--- .../devices/janitza/janitza/inverter.py | 4 +- 4 files changed, 74 insertions(+), 9 deletions(-) create mode 100644 packages/modules/devices/janitza/janitza/bat.py diff --git a/packages/modules/devices/janitza/janitza/bat.py b/packages/modules/devices/janitza/janitza/bat.py new file mode 100644 index 0000000000..c1e58908b0 --- /dev/null +++ b/packages/modules/devices/janitza/janitza/bat.py @@ -0,0 +1,45 @@ +#!/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.simcount import SimCounter +from modules.common.store import get_bat_value_store +from modules.devices.janitza.janitza.config import JanitzaBatSetup + + +class KwargsDict(TypedDict): + device_id: int + tcp_client: modbus.ModbusTcpClient_ + modbus_id: int + + +class JanitzaBat(AbstractBat): + def __init__(self, component_config: JanitzaBatSetup, **kwargs: Any) -> None: + self.component_config = component_config + self.kwargs: KwargsDict = kwargs + + def initialize(self) -> None: + self.__device_id: int = self.kwargs['device_id'] + self.__tcp_client: modbus.ModbusTcpClient_ = self.kwargs['tcp_client'] + self.__modbus_id: int = self.kwargs['modbus_id'] + 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)) + + def update(self): + power = self.__tcp_client.read_holding_registers(19026, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * -1 + imported, exported = self.sim_counter.sim_count(power) + + bat_state = BatState( + power=power, + imported=imported, + exported=exported + ) + self.store.set(bat_state) + + +component_descriptor = ComponentDescriptor(configuration_factory=JanitzaBatSetup) diff --git a/packages/modules/devices/janitza/janitza/config.py b/packages/modules/devices/janitza/janitza/config.py index 79abba28c0..f0992dfa7b 100644 --- a/packages/modules/devices/janitza/janitza/config.py +++ b/packages/modules/devices/janitza/janitza/config.py @@ -50,3 +50,17 @@ def __init__(self, id: int = 0, configuration: JanitzaInverterConfiguration = None) -> None: super().__init__(name, type, id, configuration or JanitzaInverterConfiguration()) + + +class JanitzaBatConfiguration: + def __init__(self): + pass + + +class JanitzaBatSetup(ComponentSetup[JanitzaBatConfiguration]): + def __init__(self, + name: str = "Janitza Speicher-Zähler", + type: str = "bat", + id: int = 0, + configuration: JanitzaBatConfiguration = None) -> None: + super().__init__(name, type, id, configuration or JanitzaBatConfiguration()) diff --git a/packages/modules/devices/janitza/janitza/device.py b/packages/modules/devices/janitza/janitza/device.py index ac350fb6ab..8e538a9926 100644 --- a/packages/modules/devices/janitza/janitza/device.py +++ b/packages/modules/devices/janitza/janitza/device.py @@ -5,9 +5,8 @@ from modules.common.configurable_device import ComponentFactoryByType, ConfigurableDevice, MultiComponentUpdater from modules.common import modbus from modules.common.abstract_device import DeviceDescriptor -from modules.devices.janitza.janitza import counter -from modules.devices.janitza.janitza.config import Janitza, JanitzaCounterSetup, JanitzaInverterSetup -from modules.devices.janitza.janitza.inverter import JanitzaInverter +from modules.devices.janitza.janitza import counter, inverter, bat +from modules.devices.janitza.janitza.config import Janitza, JanitzaCounterSetup, JanitzaInverterSetup, JanitzaBatSetup log = logging.getLogger(__name__) @@ -22,10 +21,16 @@ def create_counter_component(component_config: JanitzaCounterSetup): def create_inverter_component(component_config: JanitzaInverterSetup): nonlocal client - return JanitzaInverter(component_config, device_id=device_config.id, tcp_client=client, - modbus_id=device_config.configuration.modbus_id) + return inverter.JanitzaInverter(component_config, device_id=device_config.id, tcp_client=client, + modbus_id=device_config.configuration.modbus_id) - def update_components(components: Iterable[Union[counter.JanitzaCounter, JanitzaInverter]]): + def create_bat_component(component_config: JanitzaBatSetup): + nonlocal client + return bat.JanitzaBat(component_config, device_id=device_config.id, tcp_client=client, + modbus_id=device_config.configuration.modbus_id) + + def update_components(components: Iterable[Union[counter.JanitzaCounter, inverter.JanitzaInverter, + bat.JanitzaBat]]): nonlocal client with client: for component in components: @@ -40,7 +45,8 @@ def initializer(): initializer=initializer, component_factory=ComponentFactoryByType( counter=create_counter_component, - inverter=create_inverter_component + inverter=create_inverter_component, + bat=create_bat_component ), component_updater=MultiComponentUpdater(update_components) ) diff --git a/packages/modules/devices/janitza/janitza/inverter.py b/packages/modules/devices/janitza/janitza/inverter.py index 8af3513e6f..4fd99e6c0c 100644 --- a/packages/modules/devices/janitza/janitza/inverter.py +++ b/packages/modules/devices/janitza/janitza/inverter.py @@ -7,7 +7,7 @@ from modules.common.fault_state import ComponentInfo, FaultState from modules.common.modbus import ModbusDataType from modules.common.simcount import SimCounter -from modules.common.store import get_counter_value_store +from modules.common.store import get_inverter_value_store from modules.devices.janitza.janitza.config import JanitzaInverterSetup @@ -27,7 +27,7 @@ def initialize(self) -> None: self.__tcp_client: modbus.ModbusTcpClient_ = self.kwargs['tcp_client'] self.__modbus_id: int = self.kwargs['modbus_id'] self.sim_counter = SimCounter(self.__device_id, self.component_config.id, prefix="pv") - self.store = get_counter_value_store(self.component_config.id) + self.store = get_inverter_value_store(self.component_config.id) self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config)) def update(self):