diff --git a/packages/modules/devices/kostal/kostal_plenticore/bat.py b/packages/modules/devices/kostal/kostal_plenticore/bat.py index 2ea9003784..92202b51df 100644 --- a/packages/modules/devices/kostal/kostal_plenticore/bat.py +++ b/packages/modules/devices/kostal/kostal_plenticore/bat.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 import logging from typing import TypedDict, Any +from pymodbus.constants import Endian from modules.common.abstract_device import AbstractBat from modules.common.component_state import BatState @@ -17,6 +18,7 @@ class KwargsDict(TypedDict): device_id: int modbus_id: int + endianess: Endian client: ModbusTcpClient_ @@ -28,18 +30,21 @@ def __init__(self, component_config: KostalPlenticoreBatSetup, **kwargs: Any) -> def initialize(self) -> None: self.__device_id: int = self.kwargs['device_id'] self.modbus_id: int = self.kwargs['modbus_id'] + self.endianess: Endian = self.kwargs['endianess'] self.client: ModbusTcpClient_ = self.kwargs['client'] self.store = get_bat_value_store(self.component_config.id) self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config)) self.sim_counter = SimCounter(self.__device_id, self.component_config.id, prefix="speicher") def update(self) -> None: - power = self.client.read_holding_registers(582, ModbusDataType.INT_16, unit=self.modbus_id) * -1 - soc = self.client.read_holding_registers(514, ModbusDataType.INT_16, unit=self.modbus_id) + power = self.client.read_holding_registers( + 582, ModbusDataType.INT_16, unit=self.modbus_id, wordorder=self.endianess) * -1 + soc = self.client.read_holding_registers( + 514, ModbusDataType.INT_16, unit=self.modbus_id, wordorder=self.endianess) if power < 0: - power = self.client.read_holding_registers(106, ModbusDataType.FLOAT_32, unit=self.modbus_id) * -1 + power = self.client.read_holding_registers( + 106, ModbusDataType.FLOAT_32, unit=self.modbus_id, wordorder=self.endianess) * -1 imported, exported = self.sim_counter.sim_count(power) - log.debug("raw bat power "+str(power)) bat_state = BatState( power=power, diff --git a/packages/modules/devices/kostal/kostal_plenticore/counter.py b/packages/modules/devices/kostal/kostal_plenticore/counter.py index ea1836e29d..1c8c5e867a 100644 --- a/packages/modules/devices/kostal/kostal_plenticore/counter.py +++ b/packages/modules/devices/kostal/kostal_plenticore/counter.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 from typing import TypedDict, Any +from pymodbus.constants import Endian from modules.common.abstract_device import AbstractCounter from modules.common.component_state import CounterState @@ -14,6 +15,7 @@ class KwargsDict(TypedDict): device_id: int modbus_id: int + endianess: Endian client: ModbusTcpClient_ @@ -25,22 +27,26 @@ def __init__(self, component_config: KostalPlenticoreCounterSetup, **kwargs: Any def initialize(self) -> None: self.__device_id: int = self.kwargs['device_id'] self.modbus_id: int = self.kwargs['modbus_id'] + self.endianess: Endian = self.kwargs['endianess'] 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.sim_counter = SimCounter(self.__device_id, self.component_config.id, prefix="bezug") def update(self) -> None: - power = self.client.read_holding_registers(252, ModbusDataType.FLOAT_32, unit=self.modbus_id) + power = self.client.read_holding_registers( + 252, ModbusDataType.FLOAT_32, unit=self.modbus_id, wordorder=self.endianess) imported, exported = self.sim_counter.sim_count(power) - power_factor = self.client.read_holding_registers(150, ModbusDataType.FLOAT_32, unit=self.modbus_id) + power_factor = self.client.read_holding_registers( + 150, ModbusDataType.FLOAT_32, unit=self.modbus_id, wordorder=self.endianess) currents = [self.client.read_holding_registers( - reg, ModbusDataType.FLOAT_32, unit=self.modbus_id) for reg in [222, 232, 242]] + reg, ModbusDataType.FLOAT_32, unit=self.modbus_id, wordorder=self.endianess) for reg in [222, 232, 242]] voltages = [self.client.read_holding_registers( - reg, ModbusDataType.FLOAT_32, unit=self.modbus_id) for reg in [230, 240, 250]] + reg, ModbusDataType.FLOAT_32, unit=self.modbus_id, wordorder=self.endianess) for reg in [230, 240, 250]] powers = [self.client.read_holding_registers( - reg, ModbusDataType.FLOAT_32, unit=self.modbus_id) for reg in [224, 234, 244]] - frequency = self.client.read_holding_registers(220, ModbusDataType.FLOAT_32, unit=self.modbus_id) + reg, ModbusDataType.FLOAT_32, unit=self.modbus_id, wordorder=self.endianess) for reg in [224, 234, 244]] + frequency = self.client.read_holding_registers( + 220, ModbusDataType.FLOAT_32, unit=self.modbus_id, wordorder=self.endianess) counter_state = CounterState( powers=powers, diff --git a/packages/modules/devices/kostal/kostal_plenticore/device.py b/packages/modules/devices/kostal/kostal_plenticore/device.py index 87dc441f4c..e911c90a4d 100644 --- a/packages/modules/devices/kostal/kostal_plenticore/device.py +++ b/packages/modules/devices/kostal/kostal_plenticore/device.py @@ -1,10 +1,11 @@ #!/usr/bin/env python3 import logging from typing import Iterable, Union +from pymodbus.constants import Endian from modules.common.abstract_device import DeviceDescriptor from modules.common.configurable_device import ConfigurableDevice, ComponentFactoryByType, MultiComponentUpdater -from modules.common.modbus import ModbusTcpClient_ +from modules.common.modbus import ModbusDataType, ModbusTcpClient_ from modules.devices.kostal.kostal_plenticore.bat import KostalPlenticoreBat from modules.devices.kostal.kostal_plenticore.counter import KostalPlenticoreCounter from modules.devices.kostal.kostal_plenticore.inverter import KostalPlenticoreInverter @@ -16,12 +17,14 @@ def create_device(device_config: KostalPlenticore): client = None + endianess = None def create_bat_component(component_config: KostalPlenticoreBatSetup): nonlocal client return KostalPlenticoreBat(component_config, device_id=device_config.id, modbus_id=device_config.configuration.modbus_id, + endianess=endianess, client=client) def create_counter_component(component_config: KostalPlenticoreCounterSetup): @@ -29,6 +32,7 @@ def create_counter_component(component_config: KostalPlenticoreCounterSetup): return KostalPlenticoreCounter(component_config, device_id=device_config.id, modbus_id=device_config.configuration.modbus_id, + endianess=endianess, client=client) def create_inverter_component(component_config: KostalPlenticoreInverterSetup): @@ -36,6 +40,7 @@ def create_inverter_component(component_config: KostalPlenticoreInverterSetup): return KostalPlenticoreInverter(component_config, device_id=device_config.id, modbus_id=device_config.configuration.modbus_id, + endianess=endianess, client=client) def update_components( @@ -46,8 +51,10 @@ def update_components( component.update() def initializer(): - nonlocal client + nonlocal client, endianess client = ModbusTcpClient_(device_config.configuration.ip_address, device_config.configuration.port) + endianess = Endian.Big if client.read_holding_registers( + 5, ModbusDataType.UINT_16, unit=device_config.configuration.modbus_id) else Endian.Little return ConfigurableDevice( device_config=device_config, diff --git a/packages/modules/devices/kostal/kostal_plenticore/inverter.py b/packages/modules/devices/kostal/kostal_plenticore/inverter.py index 966f16b3df..18eb0cbaf4 100644 --- a/packages/modules/devices/kostal/kostal_plenticore/inverter.py +++ b/packages/modules/devices/kostal/kostal_plenticore/inverter.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 from typing import TypedDict, Any +from pymodbus.constants import Endian from modules.common.abstract_device import AbstractInverter from modules.common.component_state import InverterState @@ -14,6 +15,7 @@ class KwargsDict(TypedDict): device_id: int modbus_id: int + endianess: Endian client: ModbusTcpClient_ @@ -25,14 +27,17 @@ def __init__(self, component_config: KostalPlenticoreInverterSetup, **kwargs: An def initialize(self) -> None: self.__device_id: int = self.kwargs['device_id'] self.modbus_id: int = self.kwargs['modbus_id'] + self.endianess: Endian = self.kwargs['endianess'] self.client: ModbusTcpClient_ = self.kwargs['client'] self.store = get_inverter_value_store(self.component_config.id) self.fault_state = FaultState(ComponentInfo.from_component_config(self.component_config)) self.sim_counter = SimCounter(self.__device_id, self.component_config.id, prefix="pv") def update(self) -> None: - power = self.client.read_holding_registers(575, ModbusDataType.INT_16, unit=self.modbus_id) * -1 - exported = self.client.read_holding_registers(320, ModbusDataType.FLOAT_32, unit=self.modbus_id) + power = self.client.read_holding_registers( + 575, ModbusDataType.INT_16, unit=self.modbus_id, wordorder=self.endianess) * -1 + exported = self.client.read_holding_registers( + 320, ModbusDataType.FLOAT_32, unit=self.modbus_id, wordorder=self.endianess) inverter_state = InverterState( power=power,