diff --git a/packages/modules/devices/janitza/janitza/config.py b/packages/modules/devices/janitza/janitza/config.py index ba63b0e06d..79abba28c0 100644 --- a/packages/modules/devices/janitza/janitza/config.py +++ b/packages/modules/devices/janitza/janitza/config.py @@ -36,3 +36,17 @@ def __init__(self, id: int = 0, configuration: JanitzaCounterConfiguration = None) -> None: super().__init__(name, type, id, configuration or JanitzaCounterConfiguration()) + + +class JanitzaInverterConfiguration: + def __init__(self): + pass + + +class JanitzaInverterSetup(ComponentSetup[JanitzaInverterConfiguration]): + def __init__(self, + name: str = "Janitza PV-Zähler", + type: str = "inverter", + id: int = 0, + configuration: JanitzaInverterConfiguration = None) -> None: + super().__init__(name, type, id, configuration or JanitzaInverterConfiguration()) diff --git a/packages/modules/devices/janitza/janitza/device.py b/packages/modules/devices/janitza/janitza/device.py index f3b268be94..6233324279 100644 --- a/packages/modules/devices/janitza/janitza/device.py +++ b/packages/modules/devices/janitza/janitza/device.py @@ -1,23 +1,28 @@ #!/usr/bin/env python3 import logging -from typing import Iterable +from typing import Iterable, Union from modules.common.configurable_device import ComponentFactoryByType, ConfigurableDevice, MultiComponentUpdater from modules.common import modbus from modules.common.abstract_device import DeviceDescriptor from modules.common.component_context import SingleComponentUpdateContext -from modules.devices.janitza.janitza import counter -from modules.devices.janitza.janitza.config import Janitza, JanitzaCounterSetup +from modules.devices.janitza.janitza.counter import JanitzaCounter +from modules.devices.janitza.janitza.inverter import JanitzaInverter +from modules.devices.janitza.janitza.config import Janitza, JanitzaCounterSetup, JanitzaInverterSetup log = logging.getLogger(__name__) def create_device(device_config: Janitza): def create_counter_component(component_config: JanitzaCounterSetup): - return counter.JanitzaCounter(device_config.id, component_config, client, - device_config.configuration.modbus_id) + return JanitzaCounter(device_config.id, component_config, client, + device_config.configuration.modbus_id) - def update_components(components: Iterable[counter.JanitzaCounter]): + def create_inverter_component(component_config: JanitzaInverterSetup): + return JanitzaInverter(device_config.id, component_config, client, + device_config.configuration.modbus_id) + + def update_components(components: Iterable[Union[JanitzaCounter, JanitzaInverter]]): with client: for component in components: with SingleComponentUpdateContext(component.fault_state): @@ -31,6 +36,7 @@ def update_components(components: Iterable[counter.JanitzaCounter]): device_config=device_config, component_factory=ComponentFactoryByType( counter=create_counter_component, + inverter=create_inverter_component ), component_updater=MultiComponentUpdater(update_components) ) diff --git a/packages/modules/devices/janitza/janitza/inverter.py b/packages/modules/devices/janitza/janitza/inverter.py new file mode 100644 index 0000000000..9b439206b5 --- /dev/null +++ b/packages/modules/devices/janitza/janitza/inverter.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python3 +from typing import Dict, Union + +from dataclass_utils import dataclass_from_dict +from modules.common import modbus +from modules.common.abstract_device import AbstractInverter +from modules.common.component_state import InverterState +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_counter_value_store +from modules.devices.janitza.janitza.config import JanitzaInverterSetup + + +class JanitzaInverter(AbstractInverter): + def __init__(self, + device_id: int, + component_config: Union[Dict, JanitzaInverterSetup], + tcp_client: modbus.ModbusTcpClient_, + modbus_id: int) -> None: + self.__device_id = device_id + self.component_config = dataclass_from_dict(JanitzaInverterSetup, component_config) + self.__tcp_client = tcp_client + self.__modbus_id = 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.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 + _, exported = self.sim_counter.sim_count(power) + + inverter_state = InverterState( + power=power, + exported=exported + ) + self.store.set(inverter_state) + + +component_descriptor = ComponentDescriptor(configuration_factory=JanitzaInverterSetup)