From d781e41631c28fb778996778de3c757a6823c721 Mon Sep 17 00:00:00 2001 From: ggtimtom Date: Mon, 4 Aug 2025 20:21:37 +0200 Subject: [PATCH 1/6] feat: add zcs and chint --- packages/modules/devices/chint/__init__ .py | 0 .../modules/devices/chint/chint/__init__.py | 0 .../modules/devices/chint/chint/config.py | 42 +++++++++++ .../modules/devices/chint/chint/counter.py | 72 +++++++++++++++++++ .../modules/devices/chint/chint/device.py | 42 +++++++++++ packages/modules/devices/chint/vendor.py | 14 ++++ packages/modules/devices/zcs/__init__ .py | 0 packages/modules/devices/zcs/vendor.py | 14 ++++ packages/modules/devices/zcs/zcs/__init__.py | 0 packages/modules/devices/zcs/zcs/config.py | 42 +++++++++++ packages/modules/devices/zcs/zcs/device.py | 42 +++++++++++ packages/modules/devices/zcs/zcs/inverter.py | 44 ++++++++++++ 12 files changed, 312 insertions(+) create mode 100644 packages/modules/devices/chint/__init__ .py create mode 100644 packages/modules/devices/chint/chint/__init__.py create mode 100644 packages/modules/devices/chint/chint/config.py create mode 100644 packages/modules/devices/chint/chint/counter.py create mode 100644 packages/modules/devices/chint/chint/device.py create mode 100644 packages/modules/devices/chint/vendor.py create mode 100644 packages/modules/devices/zcs/__init__ .py create mode 100644 packages/modules/devices/zcs/vendor.py create mode 100644 packages/modules/devices/zcs/zcs/__init__.py create mode 100644 packages/modules/devices/zcs/zcs/config.py create mode 100644 packages/modules/devices/zcs/zcs/device.py create mode 100644 packages/modules/devices/zcs/zcs/inverter.py diff --git a/packages/modules/devices/chint/__init__ .py b/packages/modules/devices/chint/__init__ .py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/modules/devices/chint/chint/__init__.py b/packages/modules/devices/chint/chint/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/modules/devices/chint/chint/config.py b/packages/modules/devices/chint/chint/config.py new file mode 100644 index 0000000000..377124ab62 --- /dev/null +++ b/packages/modules/devices/chint/chint/config.py @@ -0,0 +1,42 @@ +from typing import Optional +from helpermodules.auto_str import auto_str +from modules.common.component_setup import ComponentSetup + +from ..vendor import vendor_descriptor + + +@auto_str +class CHINTConfiguration: + def __init__(self, ip_address: Optional[str] = None, port: int = 8899): + self.ip_address = ip_address + self.port = port + + +@auto_str +class CHINT: + def __init__(self, + name: str = "CHINT", + type: str = "chint", + id: int = 0, + configuration: CHINTConfiguration = None) -> None: + self.name = name + self.type = type + self.vendor = vendor_descriptor.configuration_factory().type + self.id = id + self.configuration = configuration or CHINTConfiguration() + + +@auto_str +class CHINTCounterConfiguration: + def __init__(self, modbus_id: int = 1): + self.modbus_id = modbus_id + + +@auto_str +class CHINTCounterSetup(ComponentSetup[CHINTCounterConfiguration]): + def __init__(self, + name: str = "CHINT DTSU666 Zähler", + type: str = "counter", + id: int = 0, + configuration: CHINTCounterConfiguration = None) -> None: + super().__init__(name, type, id, configuration or CHINTCounterConfiguration()) diff --git a/packages/modules/devices/chint/chint/counter.py b/packages/modules/devices/chint/chint/counter.py new file mode 100644 index 0000000000..ba422fd51c --- /dev/null +++ b/packages/modules/devices/chint/chint/counter.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python3 +from typing import TypedDict, Any +from modules.common.abstract_device import AbstractCounter +from modules.common.component_state import CounterState +from modules.common.component_type import ComponentDescriptor +from modules.common.fault_state import ComponentInfo, FaultState +from modules.common.modbus import ModbusDataType, ModbusTcpClient_ +# from modules.common.simcount import SimCounter +from modules.common.store import get_counter_value_store +from modules.devices.zcs.zcs.config import ZCSCounterSetup + + +class KwargsDict(TypedDict): + device_id: int + client: ModbusTcpClient_ + + +class ZCSCounter(AbstractCounter): + def __init__(self, component_config: ZCSCounterSetup, **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.client: ModbusTcpClient_ = self.kwargs['client'] + # self.sim_counter = SimCounter(self.__device_id, self.component_config.id, prefix="bezug") + 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.client.read_holding_registers(0x2012, ModbusDataType.INT_32, unit=self.__modbus_id) + frequency = self.client.read_holding_registers(0x2044, ModbusDataType.INT_32, unit=self.__modbus_id)/100 + # imported, exported = self.sim_counter.sim_count(power) + + try: + power1 = self.client.read_holding_registers(0x2014, ModbusDataType.INT_16, unit=self.__modbus_id) * -4 + power2 = self.client.read_holding_registers(0x2016, ModbusDataType.INT_16, unit=self.__modbus_id) * -4 + power3 = self.client.read_holding_registers(0x2018, ModbusDataType.INT_16, unit=self.__modbus_id) * -4 + powers = [ + power1, + power2, + power3] + power = power1 + power2 + power3 + + voltages = [ + self.client.read_holding_registers(0x2006, ModbusDataType.INT_16, unit=self.__modbus_id) / 10, + self.client.read_holding_registers(0x2008, ModbusDataType.INT_16, unit=self.__modbus_id) / 10, + self.client.read_holding_registers(0x200A, ModbusDataType.INT_16, unit=self.__modbus_id) / 10 + ] + + currents = [ + self.client.read_holding_registers(0x200C, ModbusDataType.INT_16, unit=self.__modbus_id) / 10, + self.client.read_holding_registers(0x200E, ModbusDataType.INT_16, unit=self.__modbus_id) / 10, + self.client.read_holding_registers(0x2010, ModbusDataType.INT_16, unit=self.__modbus_id) / 10 + ] + except Exception: + powers = None + + counter_state = CounterState( + currents=currents, + # imported=imported, + # exported=exported, + power=power, + frequency=frequency, + # power_factors=power_factors, + powers=powers, + voltages=voltages + ) + self.store.set(counter_state) + + +component_descriptor = ComponentDescriptor(configuration_factory=ZCSCounterSetup) diff --git a/packages/modules/devices/chint/chint/device.py b/packages/modules/devices/chint/chint/device.py new file mode 100644 index 0000000000..7e66f65e9d --- /dev/null +++ b/packages/modules/devices/chint/chint/device.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python3 +import logging +from typing import Iterable, Union + +from modules.common.abstract_device import DeviceDescriptor +from modules.common.component_context import SingleComponentUpdateContext +from modules.common.configurable_device import ConfigurableDevice, ComponentFactoryByType, MultiComponentUpdater +from modules.common.modbus import ModbusTcpClient_ +from modules.devices.chint.chint.config import CHINT, CHINTCounterSetup +from modules.devices.chint.chint.counter import CHINTCounter + +log = logging.getLogger(__name__) + + +def create_device(device_config: CHINT): + client = None + + def create_counter_component(component_config: CHINTCounterSetup): + nonlocal client + return CHINTCounter(component_config, device_id=device_config.id, client=client) + + def update_components(components: Iterable[Union[CHINTCounter]]): + with client: + for component in components: + with SingleComponentUpdateContext(component.fault_state): + 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( + counter=create_counter_component, + ), + component_updater=MultiComponentUpdater(update_components) + ) + + +device_descriptor = DeviceDescriptor(configuration_factory=CHINT) diff --git a/packages/modules/devices/chint/vendor.py b/packages/modules/devices/chint/vendor.py new file mode 100644 index 0000000000..fa72f537e2 --- /dev/null +++ b/packages/modules/devices/chint/vendor.py @@ -0,0 +1,14 @@ +from pathlib import Path + +from modules.common.abstract_device import DeviceDescriptor +from modules.devices.vendors import VendorGroup + + +class Vendor: + def __init__(self): + self.type = Path(__file__).parent.name + self.vendor = "CHINT" + self.group = VendorGroup.VENDORS.value + + +vendor_descriptor = DeviceDescriptor(configuration_factory=Vendor) diff --git a/packages/modules/devices/zcs/__init__ .py b/packages/modules/devices/zcs/__init__ .py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/modules/devices/zcs/vendor.py b/packages/modules/devices/zcs/vendor.py new file mode 100644 index 0000000000..494a49c88b --- /dev/null +++ b/packages/modules/devices/zcs/vendor.py @@ -0,0 +1,14 @@ +from pathlib import Path + +from modules.common.abstract_device import DeviceDescriptor +from modules.devices.vendors import VendorGroup + + +class Vendor: + def __init__(self): + self.type = Path(__file__).parent.name + self.vendor = "ZCS" + self.group = VendorGroup.VENDORS.value + + +vendor_descriptor = DeviceDescriptor(configuration_factory=Vendor) diff --git a/packages/modules/devices/zcs/zcs/__init__.py b/packages/modules/devices/zcs/zcs/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/modules/devices/zcs/zcs/config.py b/packages/modules/devices/zcs/zcs/config.py new file mode 100644 index 0000000000..10d8f34a96 --- /dev/null +++ b/packages/modules/devices/zcs/zcs/config.py @@ -0,0 +1,42 @@ +from typing import Optional +from helpermodules.auto_str import auto_str +from modules.common.component_setup import ComponentSetup + +from ..vendor import vendor_descriptor + + +@auto_str +class ZCSConfiguration: + def __init__(self, ip_address: Optional[str] = None, port: int = 8899): + self.ip_address = ip_address + self.port = port + + +@auto_str +class ZCS: + def __init__(self, + name: str = "ZCS", + type: str = "zcs", + id: int = 0, + configuration: ZCSConfiguration = None) -> None: + self.name = name + self.type = type + self.vendor = vendor_descriptor.configuration_factory().type + self.id = id + self.configuration = configuration or ZCSConfiguration() + + +@auto_str +class ZCSInverterConfiguration: + def __init__(self, modbus_id: int = 1): + self.modbus_id = modbus_id + + +@auto_str +class ZCSInverterSetup(ComponentSetup[ZCSInverterConfiguration]): + def __init__(self, + name: str = "ZCS Azzurro 3PH 12KTL Wechselrichter", + type: str = "inverter", + id: int = 0, + configuration: ZCSInverterConfiguration = None) -> None: + super().__init__(name, type, id, configuration or ZCSInverterConfiguration()) diff --git a/packages/modules/devices/zcs/zcs/device.py b/packages/modules/devices/zcs/zcs/device.py new file mode 100644 index 0000000000..eb24b3ed4a --- /dev/null +++ b/packages/modules/devices/zcs/zcs/device.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python3 +import logging +from typing import Iterable, Union + +from modules.common.abstract_device import DeviceDescriptor +from modules.common.component_context import SingleComponentUpdateContext +from modules.common.configurable_device import ConfigurableDevice, ComponentFactoryByType, MultiComponentUpdater +from modules.common.modbus import ModbusTcpClient_ +from modules.devices.zcs.zcs.config import ZCS, ZCSInverterSetup +from modules.devices.zcs.zcs.inverter import ZCSInverter + +log = logging.getLogger(__name__) + + +def create_device(device_config: ZCS): + client = None + + def create_inverter_component(component_config: ZCSInverterSetup): + nonlocal client + return ZCSInverter(component_config, device_id=device_config.id, client=client) + + def update_components(components: Iterable[Union[ZCSInverter]]): + with client: + for component in components: + with SingleComponentUpdateContext(component.fault_state): + 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( + inverter=create_inverter_component, + ), + component_updater=MultiComponentUpdater(update_components) + ) + + +device_descriptor = DeviceDescriptor(configuration_factory=ZCS) diff --git a/packages/modules/devices/zcs/zcs/inverter.py b/packages/modules/devices/zcs/zcs/inverter.py new file mode 100644 index 0000000000..5ee082a8fa --- /dev/null +++ b/packages/modules/devices/zcs/zcs/inverter.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python3 +from typing import TypedDict, Any +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, ModbusTcpClient_ +from modules.common.simcount import SimCounter +from modules.common.store import get_inverter_value_store +from modules.devices.zcs.zcs.config import ZCSInverterSetup + + +class KwargsDict(TypedDict): + device_id: int + client: ModbusTcpClient_ + + +class ZCSInverter(AbstractInverter): + def __init__(self, component_config: ZCSInverterSetup, **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.client: ModbusTcpClient_ = self.kwargs['client'] + self.sim_counter = SimCounter(self.__device_id, self.component_config.id, prefix="pv") + self.store = get_inverter_value_store(self.component_config.id) + self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config)) + + def update(self) -> None: + power = self.client.read_holding_registers(0x0485, ModbusDataType.INT_16, unit=self.__modbus_id)/100 + exported = self.client.read_holding_registers(0x0684, ModbusDataType.UINT_32, unit=self.__modbus_id)/100 + # exported = self.sim_counter.sim_count(power)[1] + + inverter_state = InverterState( + # currents=currents, + power=power, + exported=exported + # dc_power=dc_power + ) + self.store.set(inverter_state) + + +component_descriptor = ComponentDescriptor(configuration_factory=ZCSInverterSetup) From 49088fb6bb2f4c74f8f24317c7fd1d397ab61bac Mon Sep 17 00:00:00 2001 From: ggtimtom Date: Mon, 4 Aug 2025 22:29:23 +0200 Subject: [PATCH 2/6] fix: variable names and modbus --- .../modules/devices/chint/chint/counter.py | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/packages/modules/devices/chint/chint/counter.py b/packages/modules/devices/chint/chint/counter.py index ba422fd51c..1bef21b881 100644 --- a/packages/modules/devices/chint/chint/counter.py +++ b/packages/modules/devices/chint/chint/counter.py @@ -7,7 +7,8 @@ from modules.common.modbus import ModbusDataType, ModbusTcpClient_ # from modules.common.simcount import SimCounter from modules.common.store import get_counter_value_store -from modules.devices.zcs.zcs.config import ZCSCounterSetup +from modules.devices.chint.chint.config import CHINTCounterSetup +from pymodbus.constants import Endian class KwargsDict(TypedDict): @@ -15,10 +16,11 @@ class KwargsDict(TypedDict): client: ModbusTcpClient_ -class ZCSCounter(AbstractCounter): - def __init__(self, component_config: ZCSCounterSetup, **kwargs: Any) -> None: +class CHINTCounter(AbstractCounter): + def __init__(self, component_config: CHINTCounterSetup, **kwargs: Any) -> None: self.component_config = component_config self.kwargs: KwargsDict = kwargs + self.__modbus_id = component_config.configuration.modbus_id def initialize(self) -> None: self.__device_id: int = self.kwargs['device_id'] @@ -29,13 +31,13 @@ def initialize(self) -> None: def update(self): # power = self.client.read_holding_registers(0x2012, ModbusDataType.INT_32, unit=self.__modbus_id) - frequency = self.client.read_holding_registers(0x2044, ModbusDataType.INT_32, unit=self.__modbus_id)/100 + frequency = self.client.read_holding_registers(0x2044, ModbusDataType.FLOAT_32, Endian.Big, Endian.Big, unit=self.__modbus_id)/100 # imported, exported = self.sim_counter.sim_count(power) try: - power1 = self.client.read_holding_registers(0x2014, ModbusDataType.INT_16, unit=self.__modbus_id) * -4 - power2 = self.client.read_holding_registers(0x2016, ModbusDataType.INT_16, unit=self.__modbus_id) * -4 - power3 = self.client.read_holding_registers(0x2018, ModbusDataType.INT_16, unit=self.__modbus_id) * -4 + power1 = self.client.read_holding_registers(0x2014, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * -4 + power2 = self.client.read_holding_registers(0x2016, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * -4 + power3 = self.client.read_holding_registers(0x2018, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * -4 powers = [ power1, power2, @@ -43,15 +45,15 @@ def update(self): power = power1 + power2 + power3 voltages = [ - self.client.read_holding_registers(0x2006, ModbusDataType.INT_16, unit=self.__modbus_id) / 10, - self.client.read_holding_registers(0x2008, ModbusDataType.INT_16, unit=self.__modbus_id) / 10, - self.client.read_holding_registers(0x200A, ModbusDataType.INT_16, unit=self.__modbus_id) / 10 + self.client.read_holding_registers(0x2006, ModbusDataType.FLOAT_32, unit=self.__modbus_id) / 10, + self.client.read_holding_registers(0x2008, ModbusDataType.FLOAT_32, unit=self.__modbus_id) / 10, + self.client.read_holding_registers(0x200A, ModbusDataType.FLOAT_32, unit=self.__modbus_id) / 10 ] currents = [ - self.client.read_holding_registers(0x200C, ModbusDataType.INT_16, unit=self.__modbus_id) / 10, - self.client.read_holding_registers(0x200E, ModbusDataType.INT_16, unit=self.__modbus_id) / 10, - self.client.read_holding_registers(0x2010, ModbusDataType.INT_16, unit=self.__modbus_id) / 10 + self.client.read_holding_registers(0x200C, ModbusDataType.FLOAT_32, unit=self.__modbus_id) / 10, + self.client.read_holding_registers(0x200E, ModbusDataType.FLOAT_32, unit=self.__modbus_id) / 10, + self.client.read_holding_registers(0x2010, ModbusDataType.FLOAT_32, unit=self.__modbus_id) / 10 ] except Exception: powers = None @@ -69,4 +71,4 @@ def update(self): self.store.set(counter_state) -component_descriptor = ComponentDescriptor(configuration_factory=ZCSCounterSetup) +component_descriptor = ComponentDescriptor(configuration_factory=CHINTCounterSetup) From 4639d7e505d859d331dfca338ca30b0aad2ac964 Mon Sep 17 00:00:00 2001 From: ggtimtom Date: Fri, 8 Aug 2025 22:18:34 +0200 Subject: [PATCH 3/6] fix: initialize modbus varaibles --- packages/modules/devices/chint/chint/config.py | 3 ++- packages/modules/devices/chint/chint/counter.py | 6 ++---- packages/modules/devices/chint/chint/device.py | 3 ++- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/modules/devices/chint/chint/config.py b/packages/modules/devices/chint/chint/config.py index 377124ab62..42b5cab2df 100644 --- a/packages/modules/devices/chint/chint/config.py +++ b/packages/modules/devices/chint/chint/config.py @@ -7,9 +7,10 @@ @auto_str class CHINTConfiguration: - def __init__(self, ip_address: Optional[str] = None, port: int = 8899): + def __init__(self, ip_address: Optional[str] = None, modbus_id: int = 32, port: int = 8899): self.ip_address = ip_address self.port = port + self.modbus_id = modbus_id @auto_str diff --git a/packages/modules/devices/chint/chint/counter.py b/packages/modules/devices/chint/chint/counter.py index 1bef21b881..b2f26f0249 100644 --- a/packages/modules/devices/chint/chint/counter.py +++ b/packages/modules/devices/chint/chint/counter.py @@ -5,10 +5,8 @@ from modules.common.component_type import ComponentDescriptor from modules.common.fault_state import ComponentInfo, FaultState from modules.common.modbus import ModbusDataType, ModbusTcpClient_ -# from modules.common.simcount import SimCounter from modules.common.store import get_counter_value_store from modules.devices.chint.chint.config import CHINTCounterSetup -from pymodbus.constants import Endian class KwargsDict(TypedDict): @@ -24,14 +22,14 @@ def __init__(self, component_config: CHINTCounterSetup, **kwargs: Any) -> None: def initialize(self) -> None: self.__device_id: int = self.kwargs['device_id'] + self.__modbus_id: int = self.kwargs['modbus_id'] self.client: ModbusTcpClient_ = self.kwargs['client'] - # self.sim_counter = SimCounter(self.__device_id, self.component_config.id, prefix="bezug") 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.client.read_holding_registers(0x2012, ModbusDataType.INT_32, unit=self.__modbus_id) - frequency = self.client.read_holding_registers(0x2044, ModbusDataType.FLOAT_32, Endian.Big, Endian.Big, unit=self.__modbus_id)/100 + frequency = self.client.read_holding_registers(0x2044, ModbusDataType.FLOAT_32, unit=self.__modbus_id)/100 # imported, exported = self.sim_counter.sim_count(power) try: diff --git a/packages/modules/devices/chint/chint/device.py b/packages/modules/devices/chint/chint/device.py index 7e66f65e9d..ce847589e5 100644 --- a/packages/modules/devices/chint/chint/device.py +++ b/packages/modules/devices/chint/chint/device.py @@ -17,7 +17,8 @@ def create_device(device_config: CHINT): def create_counter_component(component_config: CHINTCounterSetup): nonlocal client - return CHINTCounter(component_config, device_id=device_config.id, client=client) + return CHINTCounter(component_config=component_config, modbus_id=device_config.configuration.modbus_id, + device_id=device_config.id, client=client) def update_components(components: Iterable[Union[CHINTCounter]]): with client: From 18dd7079f9b1050330cef6bd2de5f85f77cdeb86 Mon Sep 17 00:00:00 2001 From: ggtimtom Date: Fri, 8 Aug 2025 22:25:41 +0200 Subject: [PATCH 4/6] fix: add remaining values for chint counter --- .../modules/devices/chint/chint/counter.py | 52 +++++++++++-------- packages/modules/devices/zcs/zcs/inverter.py | 17 ++++-- 2 files changed, 42 insertions(+), 27 deletions(-) diff --git a/packages/modules/devices/chint/chint/counter.py b/packages/modules/devices/chint/chint/counter.py index b2f26f0249..971f69e8ea 100644 --- a/packages/modules/devices/chint/chint/counter.py +++ b/packages/modules/devices/chint/chint/counter.py @@ -28,41 +28,47 @@ def initialize(self) -> None: self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config)) def update(self): - # power = self.client.read_holding_registers(0x2012, ModbusDataType.INT_32, unit=self.__modbus_id) - frequency = self.client.read_holding_registers(0x2044, ModbusDataType.FLOAT_32, unit=self.__modbus_id)/100 - # imported, exported = self.sim_counter.sim_count(power) - try: - power1 = self.client.read_holding_registers(0x2014, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * -4 - power2 = self.client.read_holding_registers(0x2016, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * -4 - power3 = self.client.read_holding_registers(0x2018, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * -4 + irat = self.client.read_holding_registers(0x0006, ModbusDataType.INT_16, unit=self.__modbus_id) + urat = self.client.read_holding_registers(0x0007, ModbusDataType.INT_16, unit=self.__modbus_id) + power_ratio = urat*0.1*irat*0.1 + frequency = self.client.read_holding_registers(0x2044, ModbusDataType.FLOAT_32, unit=self.__modbus_id)/100 + power = self.client.read_holding_registers(0x2012, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * power_ratio powers = [ - power1, - power2, - power3] - power = power1 + power2 + power3 - + self.client.read_holding_registers(0x2014, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * power_ratio, + self.client.read_holding_registers(0x2016, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * power_ratio, + self.client.read_holding_registers(0x2018, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * power_ratio + ] + voltage_ratio = urat*0.1*0.1 voltages = [ - self.client.read_holding_registers(0x2006, ModbusDataType.FLOAT_32, unit=self.__modbus_id) / 10, - self.client.read_holding_registers(0x2008, ModbusDataType.FLOAT_32, unit=self.__modbus_id) / 10, - self.client.read_holding_registers(0x200A, ModbusDataType.FLOAT_32, unit=self.__modbus_id) / 10 + self.client.read_holding_registers(0x2006, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * voltage_ratio, + self.client.read_holding_registers(0x2008, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * voltage_ratio, + self.client.read_holding_registers(0x200A, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * voltage_ratio ] - + current_ratio = irat*0.001 currents = [ - self.client.read_holding_registers(0x200C, ModbusDataType.FLOAT_32, unit=self.__modbus_id) / 10, - self.client.read_holding_registers(0x200E, ModbusDataType.FLOAT_32, unit=self.__modbus_id) / 10, - self.client.read_holding_registers(0x2010, ModbusDataType.FLOAT_32, unit=self.__modbus_id) / 10 + self.client.read_holding_registers(0x200C, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * current_ratio, + self.client.read_holding_registers(0x200E, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * current_ratio, + self.client.read_holding_registers(0x2010, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * current_ratio + ] + power_factors = [ + self.client.read_holding_registers(0x202C, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * 0.001, + self.client.read_holding_registers(0x202E, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * 0.001, + self.client.read_holding_registers(0x2030, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * 0.001 ] + ep_ratio = irat * urat * 100 + imported_ep = self.client.read_holding_registers(0x401E, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * ep_ratio + exported_ep = self.client.read_holding_registers(0x4028, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * ep_ratio except Exception: - powers = None + powers, currents, voltages, power_factors, power, frequency, imported_ep, exported_ep = None counter_state = CounterState( currents=currents, - # imported=imported, - # exported=exported, + imported=imported_ep, + exported=exported_ep, power=power, frequency=frequency, - # power_factors=power_factors, + power_factors=power_factors, powers=powers, voltages=voltages ) diff --git a/packages/modules/devices/zcs/zcs/inverter.py b/packages/modules/devices/zcs/zcs/inverter.py index 5ee082a8fa..4a4f3021bf 100644 --- a/packages/modules/devices/zcs/zcs/inverter.py +++ b/packages/modules/devices/zcs/zcs/inverter.py @@ -19,6 +19,7 @@ class ZCSInverter(AbstractInverter): def __init__(self, component_config: ZCSInverterSetup, **kwargs: Any) -> None: self.component_config = component_config self.kwargs: KwargsDict = kwargs + self.__modbus_id = component_config.configuration.modbus_id def initialize(self) -> None: self.__device_id: int = self.kwargs['device_id'] @@ -28,12 +29,20 @@ def initialize(self) -> None: self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config)) def update(self) -> None: - power = self.client.read_holding_registers(0x0485, ModbusDataType.INT_16, unit=self.__modbus_id)/100 - exported = self.client.read_holding_registers(0x0684, ModbusDataType.UINT_32, unit=self.__modbus_id)/100 - # exported = self.sim_counter.sim_count(power)[1] + try: + power = self.client.read_holding_registers(0x0485, ModbusDataType.INT_16, unit=self.__modbus_id)*10 + exported = self.client.read_holding_registers(0x0684, ModbusDataType.UINT_32, unit=self.__modbus_id)*10 + currents = [ + self.client.read_holding_registers(0x48E, ModbusDataType.FLOAT_32, unit=self.__modbus_id)*0.01, + self.client.read_holding_registers(0x499, ModbusDataType.FLOAT_32, unit=self.__modbus_id)*0.01, + self.client.read_holding_registers(0x4A4, ModbusDataType.FLOAT_32, unit=self.__modbus_id)*0.01 + ] + except Exception: + power = None + exported = None inverter_state = InverterState( - # currents=currents, + currents=currents, power=power, exported=exported # dc_power=dc_power From 5afe11631d1367c4242da89cb3c17563f966b07a Mon Sep 17 00:00:00 2001 From: ggtimtom Date: Sat, 9 Aug 2025 08:41:10 +0200 Subject: [PATCH 5/6] fix: improve values read from modbus --- .../modules/devices/chint/chint/config.py | 6 +-- .../modules/devices/chint/chint/counter.py | 50 +++++++++++++------ .../modules/devices/chint/chint/device.py | 4 +- packages/modules/devices/zcs/zcs/inverter.py | 18 ++++--- 4 files changed, 52 insertions(+), 26 deletions(-) diff --git a/packages/modules/devices/chint/chint/config.py b/packages/modules/devices/chint/chint/config.py index 42b5cab2df..80987e44e7 100644 --- a/packages/modules/devices/chint/chint/config.py +++ b/packages/modules/devices/chint/chint/config.py @@ -7,10 +7,9 @@ @auto_str class CHINTConfiguration: - def __init__(self, ip_address: Optional[str] = None, modbus_id: int = 32, port: int = 8899): + def __init__(self, ip_address: Optional[str] = None, port: int = 8899): self.ip_address = ip_address self.port = port - self.modbus_id = modbus_id @auto_str @@ -29,8 +28,9 @@ def __init__(self, @auto_str class CHINTCounterConfiguration: - def __init__(self, modbus_id: int = 1): + def __init__(self, modbus_id: int = 1, invert: bool = False): self.modbus_id = modbus_id + self.invert = invert @auto_str diff --git a/packages/modules/devices/chint/chint/counter.py b/packages/modules/devices/chint/chint/counter.py index 971f69e8ea..2cdd188e1f 100644 --- a/packages/modules/devices/chint/chint/counter.py +++ b/packages/modules/devices/chint/chint/counter.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +import logging from typing import TypedDict, Any from modules.common.abstract_device import AbstractCounter from modules.common.component_state import CounterState @@ -8,6 +9,8 @@ from modules.common.store import get_counter_value_store from modules.devices.chint.chint.config import CHINTCounterSetup +log = logging.getLogger(__name__) + class KwargsDict(TypedDict): device_id: int @@ -19,37 +22,51 @@ def __init__(self, component_config: CHINTCounterSetup, **kwargs: Any) -> None: self.component_config = component_config self.kwargs: KwargsDict = kwargs self.__modbus_id = component_config.configuration.modbus_id + self.invert = component_config.configuration.invert def initialize(self) -> None: self.__device_id: int = self.kwargs['device_id'] - self.__modbus_id: int = self.kwargs['modbus_id'] self.client: ModbusTcpClient_ = self.kwargs['client'] self.store = get_counter_value_store(self.component_config.id) self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config)) def update(self): + powers = voltages = currents = power_factors = None + imported_ep = exported_ep = power = frequency = 0 try: irat = self.client.read_holding_registers(0x0006, ModbusDataType.INT_16, unit=self.__modbus_id) urat = self.client.read_holding_registers(0x0007, ModbusDataType.INT_16, unit=self.__modbus_id) power_ratio = urat*0.1*irat*0.1 + if self.invert: + power_ratio = power_ratio * -1 frequency = self.client.read_holding_registers(0x2044, ModbusDataType.FLOAT_32, unit=self.__modbus_id)/100 - power = self.client.read_holding_registers(0x2012, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * power_ratio + power = self.client.read_holding_registers(0x2012, + ModbusDataType.FLOAT_32, unit=self.__modbus_id) * power_ratio powers = [ - self.client.read_holding_registers(0x2014, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * power_ratio, - self.client.read_holding_registers(0x2016, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * power_ratio, - self.client.read_holding_registers(0x2018, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * power_ratio + self.client.read_holding_registers(0x2014, + ModbusDataType.FLOAT_32, unit=self.__modbus_id) * power_ratio, + self.client.read_holding_registers(0x2016, + ModbusDataType.FLOAT_32, unit=self.__modbus_id) * power_ratio, + self.client.read_holding_registers(0x2018, + ModbusDataType.FLOAT_32, unit=self.__modbus_id) * power_ratio ] voltage_ratio = urat*0.1*0.1 voltages = [ - self.client.read_holding_registers(0x2006, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * voltage_ratio, - self.client.read_holding_registers(0x2008, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * voltage_ratio, - self.client.read_holding_registers(0x200A, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * voltage_ratio + self.client.read_holding_registers(0x2006, + ModbusDataType.FLOAT_32, unit=self.__modbus_id) * voltage_ratio, + self.client.read_holding_registers(0x2008, + ModbusDataType.FLOAT_32, unit=self.__modbus_id) * voltage_ratio, + self.client.read_holding_registers(0x200A, + ModbusDataType.FLOAT_32, unit=self.__modbus_id) * voltage_ratio ] current_ratio = irat*0.001 currents = [ - self.client.read_holding_registers(0x200C, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * current_ratio, - self.client.read_holding_registers(0x200E, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * current_ratio, - self.client.read_holding_registers(0x2010, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * current_ratio + self.client.read_holding_registers(0x200C, + ModbusDataType.FLOAT_32, unit=self.__modbus_id) * current_ratio, + self.client.read_holding_registers(0x200E, + ModbusDataType.FLOAT_32, unit=self.__modbus_id) * current_ratio, + self.client.read_holding_registers(0x2010, + ModbusDataType.FLOAT_32, unit=self.__modbus_id) * current_ratio ] power_factors = [ self.client.read_holding_registers(0x202C, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * 0.001, @@ -57,10 +74,15 @@ def update(self): self.client.read_holding_registers(0x2030, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * 0.001 ] ep_ratio = irat * urat * 100 - imported_ep = self.client.read_holding_registers(0x401E, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * ep_ratio - exported_ep = self.client.read_holding_registers(0x4028, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * ep_ratio + imported_ep = self.client.read_holding_registers(0x401E, + ModbusDataType.FLOAT_32, unit=self.__modbus_id) * ep_ratio + exported_ep = self.client.read_holding_registers(0x4028, + ModbusDataType.FLOAT_32, unit=self.__modbus_id) * ep_ratio + if self.invert: + imported_ep, exported_ep = exported_ep, imported_ep + except Exception: - powers, currents, voltages, power_factors, power, frequency, imported_ep, exported_ep = None + log.debug("Modbus could not be read.") counter_state = CounterState( currents=currents, diff --git a/packages/modules/devices/chint/chint/device.py b/packages/modules/devices/chint/chint/device.py index ce847589e5..b9c9b7173e 100644 --- a/packages/modules/devices/chint/chint/device.py +++ b/packages/modules/devices/chint/chint/device.py @@ -17,7 +17,7 @@ def create_device(device_config: CHINT): def create_counter_component(component_config: CHINTCounterSetup): nonlocal client - return CHINTCounter(component_config=component_config, modbus_id=device_config.configuration.modbus_id, + return CHINTCounter(component_config=component_config, device_id=device_config.id, client=client) def update_components(components: Iterable[Union[CHINTCounter]]): @@ -40,4 +40,4 @@ def initializer(): ) -device_descriptor = DeviceDescriptor(configuration_factory=CHINT) +device_descriptor = DeviceDescriptor(configuration_factory=CHINT) \ No newline at end of file diff --git a/packages/modules/devices/zcs/zcs/inverter.py b/packages/modules/devices/zcs/zcs/inverter.py index 4a4f3021bf..a3d4381c04 100644 --- a/packages/modules/devices/zcs/zcs/inverter.py +++ b/packages/modules/devices/zcs/zcs/inverter.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +import logging from typing import TypedDict, Any from modules.common.abstract_device import AbstractInverter from modules.common.component_state import InverterState @@ -9,6 +10,8 @@ from modules.common.store import get_inverter_value_store from modules.devices.zcs.zcs.config import ZCSInverterSetup +log = logging.getLogger(__name__) + class KwargsDict(TypedDict): device_id: int @@ -29,18 +32,19 @@ def initialize(self) -> None: self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config)) def update(self) -> None: + power = exported = 0 + currents = None try: power = self.client.read_holding_registers(0x0485, ModbusDataType.INT_16, unit=self.__modbus_id)*10 exported = self.client.read_holding_registers(0x0684, ModbusDataType.UINT_32, unit=self.__modbus_id)*10 currents = [ - self.client.read_holding_registers(0x48E, ModbusDataType.FLOAT_32, unit=self.__modbus_id)*0.01, - self.client.read_holding_registers(0x499, ModbusDataType.FLOAT_32, unit=self.__modbus_id)*0.01, - self.client.read_holding_registers(0x4A4, ModbusDataType.FLOAT_32, unit=self.__modbus_id)*0.01 + self.client.read_holding_registers(0x48E, ModbusDataType.INT_16, unit=self.__modbus_id)*0.01, + self.client.read_holding_registers(0x499, ModbusDataType.INT_16, unit=self.__modbus_id)*0.01, + self.client.read_holding_registers(0x4A4, ModbusDataType.INT_16, unit=self.__modbus_id)*0.01 ] except Exception: - power = None - exported = None - + log.debug("Modbus could not be read.") + inverter_state = InverterState( currents=currents, power=power, @@ -50,4 +54,4 @@ def update(self) -> None: self.store.set(inverter_state) -component_descriptor = ComponentDescriptor(configuration_factory=ZCSInverterSetup) +component_descriptor = ComponentDescriptor(configuration_factory=ZCSInverterSetup) \ No newline at end of file From 22297d8ce3b194265d43493897d608f989a7cd49 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Tue, 18 Nov 2025 08:15:39 +0100 Subject: [PATCH 6/6] improve chint and azzuro zcs --- .../azzurro_zcs_3p}/__init__.py | 0 .../azzurro_zcs/azzurro_zcs_3p/config.py | 38 +++++++++ .../azzurro_zcs_3p}/device.py | 21 ++--- .../azzurro_zcs_3p/pv_inverter.py} | 18 ++--- .../modules/devices/chint/chint/config.py | 3 +- .../modules/devices/chint/chint/counter.py | 77 ++++++------------- .../modules/devices/chint/chint/device.py | 5 +- packages/modules/devices/zcs/__init__ .py | 0 packages/modules/devices/zcs/vendor.py | 14 ---- packages/modules/devices/zcs/zcs/config.py | 42 ---------- 10 files changed, 84 insertions(+), 134 deletions(-) rename packages/modules/devices/{zcs/zcs => azzurro_zcs/azzurro_zcs_3p}/__init__.py (100%) create mode 100644 packages/modules/devices/azzurro_zcs/azzurro_zcs_3p/config.py rename packages/modules/devices/{zcs/zcs => azzurro_zcs/azzurro_zcs_3p}/device.py (58%) rename packages/modules/devices/{zcs/zcs/inverter.py => azzurro_zcs/azzurro_zcs_3p/pv_inverter.py} (78%) delete mode 100644 packages/modules/devices/zcs/__init__ .py delete mode 100644 packages/modules/devices/zcs/vendor.py delete mode 100644 packages/modules/devices/zcs/zcs/config.py diff --git a/packages/modules/devices/zcs/zcs/__init__.py b/packages/modules/devices/azzurro_zcs/azzurro_zcs_3p/__init__.py similarity index 100% rename from packages/modules/devices/zcs/zcs/__init__.py rename to packages/modules/devices/azzurro_zcs/azzurro_zcs_3p/__init__.py diff --git a/packages/modules/devices/azzurro_zcs/azzurro_zcs_3p/config.py b/packages/modules/devices/azzurro_zcs/azzurro_zcs_3p/config.py new file mode 100644 index 0000000000..b05c3b6ac0 --- /dev/null +++ b/packages/modules/devices/azzurro_zcs/azzurro_zcs_3p/config.py @@ -0,0 +1,38 @@ +from typing import Optional + +from modules.common.component_setup import ComponentSetup +from ..vendor import vendor_descriptor + + +class ZCS3PConfiguration: + def __init__(self, modbus_id: int = 1, ip_address: Optional[str] = None, port: int = 502): + self.modbus_id = modbus_id + self.ip_address = ip_address + self.port = port + + +class ZCS3P: + def __init__(self, + name: str = "Azzurro - ZCS 3PH 12KTL", + type: str = "azzurro_zcs_3p", + id: int = 0, + configuration: ZCS3PConfiguration = None) -> None: + self.name = name + self.type = type + self.vendor = vendor_descriptor.configuration_factory().type + self.id = id + self.configuration = configuration or ZCS3PConfiguration() + + +class ZCSPvInverterConfiguration: + def __init__(self): + pass + + +class ZCSPvInverterSetup(ComponentSetup[ZCSPvInverterConfiguration]): + def __init__(self, + name: str = "ZCS Azzurro Wechselrichter", + type: str = "pv_inverter", + id: int = 0, + configuration: ZCSPvInverterConfiguration = None) -> None: + super().__init__(name, type, id, configuration or ZCSPvInverterConfiguration()) diff --git a/packages/modules/devices/zcs/zcs/device.py b/packages/modules/devices/azzurro_zcs/azzurro_zcs_3p/device.py similarity index 58% rename from packages/modules/devices/zcs/zcs/device.py rename to packages/modules/devices/azzurro_zcs/azzurro_zcs_3p/device.py index eb24b3ed4a..a276877b47 100644 --- a/packages/modules/devices/zcs/zcs/device.py +++ b/packages/modules/devices/azzurro_zcs/azzurro_zcs_3p/device.py @@ -1,25 +1,28 @@ #!/usr/bin/env python3 import logging -from typing import Iterable, Union +from typing import Iterable from modules.common.abstract_device import DeviceDescriptor from modules.common.component_context import SingleComponentUpdateContext from modules.common.configurable_device import ConfigurableDevice, ComponentFactoryByType, MultiComponentUpdater from modules.common.modbus import ModbusTcpClient_ -from modules.devices.zcs.zcs.config import ZCS, ZCSInverterSetup -from modules.devices.zcs.zcs.inverter import ZCSInverter +from modules.devices.azzurro_zcs.azzurro_zcs_3p.config import ZCS3P, ZCSPvInverterSetup +from modules.devices.azzurro_zcs.azzurro_zcs_3p.pv_inverter import ZCSPvInverter log = logging.getLogger(__name__) -def create_device(device_config: ZCS): +def create_device(device_config: ZCS3P): client = None - def create_inverter_component(component_config: ZCSInverterSetup): + def create_pv_inverter_component(component_config: ZCSPvInverterSetup): nonlocal client - return ZCSInverter(component_config, device_id=device_config.id, client=client) + return ZCSPvInverter(component_config=component_config, + modbus_id=device_config.configuration.modbus_id, + client=client) - def update_components(components: Iterable[Union[ZCSInverter]]): + def update_components(components: Iterable[ZCSPvInverter]): + nonlocal client with client: for component in components: with SingleComponentUpdateContext(component.fault_state): @@ -33,10 +36,10 @@ def initializer(): device_config=device_config, initializer=initializer, component_factory=ComponentFactoryByType( - inverter=create_inverter_component, + pv_inverter=create_pv_inverter_component, ), component_updater=MultiComponentUpdater(update_components) ) -device_descriptor = DeviceDescriptor(configuration_factory=ZCS) +device_descriptor = DeviceDescriptor(configuration_factory=ZCS3P) diff --git a/packages/modules/devices/zcs/zcs/inverter.py b/packages/modules/devices/azzurro_zcs/azzurro_zcs_3p/pv_inverter.py similarity index 78% rename from packages/modules/devices/zcs/zcs/inverter.py rename to packages/modules/devices/azzurro_zcs/azzurro_zcs_3p/pv_inverter.py index a3d4381c04..8b878fac4b 100644 --- a/packages/modules/devices/zcs/zcs/inverter.py +++ b/packages/modules/devices/azzurro_zcs/azzurro_zcs_3p/pv_inverter.py @@ -6,28 +6,25 @@ from modules.common.component_type import ComponentDescriptor from modules.common.fault_state import ComponentInfo, FaultState from modules.common.modbus import ModbusDataType, ModbusTcpClient_ -from modules.common.simcount import SimCounter from modules.common.store import get_inverter_value_store -from modules.devices.zcs.zcs.config import ZCSInverterSetup +from modules.devices.azzurro_zcs.azzurro_zcs_3p.config import ZCSPvInverterSetup log = logging.getLogger(__name__) class KwargsDict(TypedDict): - device_id: int client: ModbusTcpClient_ + modbus_id: int -class ZCSInverter(AbstractInverter): - def __init__(self, component_config: ZCSInverterSetup, **kwargs: Any) -> None: +class ZCSPvInverter(AbstractInverter): + def __init__(self, component_config: ZCSPvInverterSetup, **kwargs: Any) -> None: self.component_config = component_config self.kwargs: KwargsDict = kwargs - self.__modbus_id = component_config.configuration.modbus_id def initialize(self) -> None: - self.__device_id: int = self.kwargs['device_id'] + self.__modbus_id: int = self.kwargs['modbus_id'] self.client: ModbusTcpClient_ = self.kwargs['client'] - self.sim_counter = SimCounter(self.__device_id, self.component_config.id, prefix="pv") self.store = get_inverter_value_store(self.component_config.id) self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config)) @@ -44,14 +41,13 @@ def update(self) -> None: ] except Exception: log.debug("Modbus could not be read.") - + inverter_state = InverterState( currents=currents, power=power, exported=exported - # dc_power=dc_power ) self.store.set(inverter_state) -component_descriptor = ComponentDescriptor(configuration_factory=ZCSInverterSetup) \ No newline at end of file +component_descriptor = ComponentDescriptor(configuration_factory=ZCSPvInverterSetup) diff --git a/packages/modules/devices/chint/chint/config.py b/packages/modules/devices/chint/chint/config.py index 80987e44e7..377124ab62 100644 --- a/packages/modules/devices/chint/chint/config.py +++ b/packages/modules/devices/chint/chint/config.py @@ -28,9 +28,8 @@ def __init__(self, @auto_str class CHINTCounterConfiguration: - def __init__(self, modbus_id: int = 1, invert: bool = False): + def __init__(self, modbus_id: int = 1): self.modbus_id = modbus_id - self.invert = invert @auto_str diff --git a/packages/modules/devices/chint/chint/counter.py b/packages/modules/devices/chint/chint/counter.py index 2cdd188e1f..8b0189d453 100644 --- a/packages/modules/devices/chint/chint/counter.py +++ b/packages/modules/devices/chint/chint/counter.py @@ -13,7 +13,6 @@ class KwargsDict(TypedDict): - device_id: int client: ModbusTcpClient_ @@ -21,68 +20,40 @@ class CHINTCounter(AbstractCounter): def __init__(self, component_config: CHINTCounterSetup, **kwargs: Any) -> None: self.component_config = component_config self.kwargs: KwargsDict = kwargs - self.__modbus_id = component_config.configuration.modbus_id - self.invert = component_config.configuration.invert def initialize(self) -> None: - self.__device_id: int = self.kwargs['device_id'] self.client: ModbusTcpClient_ = self.kwargs['client'] self.store = get_counter_value_store(self.component_config.id) self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config)) + self.__modbus_id = self.component_config.configuration.modbus_id def update(self): powers = voltages = currents = power_factors = None imported_ep = exported_ep = power = frequency = 0 - try: - irat = self.client.read_holding_registers(0x0006, ModbusDataType.INT_16, unit=self.__modbus_id) - urat = self.client.read_holding_registers(0x0007, ModbusDataType.INT_16, unit=self.__modbus_id) - power_ratio = urat*0.1*irat*0.1 - if self.invert: - power_ratio = power_ratio * -1 - frequency = self.client.read_holding_registers(0x2044, ModbusDataType.FLOAT_32, unit=self.__modbus_id)/100 - power = self.client.read_holding_registers(0x2012, - ModbusDataType.FLOAT_32, unit=self.__modbus_id) * power_ratio - powers = [ - self.client.read_holding_registers(0x2014, - ModbusDataType.FLOAT_32, unit=self.__modbus_id) * power_ratio, - self.client.read_holding_registers(0x2016, - ModbusDataType.FLOAT_32, unit=self.__modbus_id) * power_ratio, - self.client.read_holding_registers(0x2018, + irat = self.client.read_holding_registers(0x0006, ModbusDataType.INT_16, unit=self.__modbus_id) + urat = self.client.read_holding_registers(0x0007, ModbusDataType.INT_16, unit=self.__modbus_id) + power_ratio = urat*0.1*irat*0.1 + + frequency = self.client.read_holding_registers(0x2044, ModbusDataType.FLOAT_32, unit=self.__modbus_id)/100 + power = self.client.read_holding_registers(0x2012, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * power_ratio - ] - voltage_ratio = urat*0.1*0.1 - voltages = [ - self.client.read_holding_registers(0x2006, - ModbusDataType.FLOAT_32, unit=self.__modbus_id) * voltage_ratio, - self.client.read_holding_registers(0x2008, - ModbusDataType.FLOAT_32, unit=self.__modbus_id) * voltage_ratio, - self.client.read_holding_registers(0x200A, - ModbusDataType.FLOAT_32, unit=self.__modbus_id) * voltage_ratio - ] - current_ratio = irat*0.001 - currents = [ - self.client.read_holding_registers(0x200C, - ModbusDataType.FLOAT_32, unit=self.__modbus_id) * current_ratio, - self.client.read_holding_registers(0x200E, - ModbusDataType.FLOAT_32, unit=self.__modbus_id) * current_ratio, - self.client.read_holding_registers(0x2010, - ModbusDataType.FLOAT_32, unit=self.__modbus_id) * current_ratio - ] - power_factors = [ - self.client.read_holding_registers(0x202C, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * 0.001, - self.client.read_holding_registers(0x202E, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * 0.001, - self.client.read_holding_registers(0x2030, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * 0.001 - ] - ep_ratio = irat * urat * 100 - imported_ep = self.client.read_holding_registers(0x401E, - ModbusDataType.FLOAT_32, unit=self.__modbus_id) * ep_ratio - exported_ep = self.client.read_holding_registers(0x4028, - ModbusDataType.FLOAT_32, unit=self.__modbus_id) * ep_ratio - if self.invert: - imported_ep, exported_ep = exported_ep, imported_ep - - except Exception: - log.debug("Modbus could not be read.") + powers = [self.client.read_holding_registers(reg, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * power_ratio + for reg in [0x2014, 0x2016, 0x2018]] + voltage_ratio = urat*0.1*0.1 + voltages = [self.client.read_holding_registers( + reg, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * voltage_ratio + for reg in [0x2006, 0x2008, 0x200A]] + current_ratio = irat*0.001 + currents = [self.client.read_holding_registers( + reg, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * current_ratio + for reg in [0x200C, 0x200E, 0x2010]] + power_factors = [self.client.read_holding_registers(reg, ModbusDataType.FLOAT_32, unit=self.__modbus_id) * 0.001 + for reg in [0x202C, 0x202E, 0x2030]] + ep_ratio = irat * urat * 100 + imported_ep = self.client.read_holding_registers(0x401E, + ModbusDataType.FLOAT_32, unit=self.__modbus_id) * ep_ratio + exported_ep = self.client.read_holding_registers(0x4028, + ModbusDataType.FLOAT_32, unit=self.__modbus_id) * ep_ratio counter_state = CounterState( currents=currents, diff --git a/packages/modules/devices/chint/chint/device.py b/packages/modules/devices/chint/chint/device.py index b9c9b7173e..ff7b982add 100644 --- a/packages/modules/devices/chint/chint/device.py +++ b/packages/modules/devices/chint/chint/device.py @@ -17,8 +17,7 @@ def create_device(device_config: CHINT): def create_counter_component(component_config: CHINTCounterSetup): nonlocal client - return CHINTCounter(component_config=component_config, - device_id=device_config.id, client=client) + return CHINTCounter(component_config=component_config, client=client) def update_components(components: Iterable[Union[CHINTCounter]]): with client: @@ -40,4 +39,4 @@ def initializer(): ) -device_descriptor = DeviceDescriptor(configuration_factory=CHINT) \ No newline at end of file +device_descriptor = DeviceDescriptor(configuration_factory=CHINT) diff --git a/packages/modules/devices/zcs/__init__ .py b/packages/modules/devices/zcs/__init__ .py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/modules/devices/zcs/vendor.py b/packages/modules/devices/zcs/vendor.py deleted file mode 100644 index 494a49c88b..0000000000 --- a/packages/modules/devices/zcs/vendor.py +++ /dev/null @@ -1,14 +0,0 @@ -from pathlib import Path - -from modules.common.abstract_device import DeviceDescriptor -from modules.devices.vendors import VendorGroup - - -class Vendor: - def __init__(self): - self.type = Path(__file__).parent.name - self.vendor = "ZCS" - self.group = VendorGroup.VENDORS.value - - -vendor_descriptor = DeviceDescriptor(configuration_factory=Vendor) diff --git a/packages/modules/devices/zcs/zcs/config.py b/packages/modules/devices/zcs/zcs/config.py deleted file mode 100644 index 10d8f34a96..0000000000 --- a/packages/modules/devices/zcs/zcs/config.py +++ /dev/null @@ -1,42 +0,0 @@ -from typing import Optional -from helpermodules.auto_str import auto_str -from modules.common.component_setup import ComponentSetup - -from ..vendor import vendor_descriptor - - -@auto_str -class ZCSConfiguration: - def __init__(self, ip_address: Optional[str] = None, port: int = 8899): - self.ip_address = ip_address - self.port = port - - -@auto_str -class ZCS: - def __init__(self, - name: str = "ZCS", - type: str = "zcs", - id: int = 0, - configuration: ZCSConfiguration = None) -> None: - self.name = name - self.type = type - self.vendor = vendor_descriptor.configuration_factory().type - self.id = id - self.configuration = configuration or ZCSConfiguration() - - -@auto_str -class ZCSInverterConfiguration: - def __init__(self, modbus_id: int = 1): - self.modbus_id = modbus_id - - -@auto_str -class ZCSInverterSetup(ComponentSetup[ZCSInverterConfiguration]): - def __init__(self, - name: str = "ZCS Azzurro 3PH 12KTL Wechselrichter", - type: str = "inverter", - id: int = 0, - configuration: ZCSInverterConfiguration = None) -> None: - super().__init__(name, type, id, configuration or ZCSInverterConfiguration())