From 42d95a6c93bbc55793ba2bde891b6a7daeb04a65 Mon Sep 17 00:00:00 2001 From: dj3mu Date: Sat, 19 Oct 2024 17:28:52 +0200 Subject: [PATCH 01/10] Initial support for Algodue UEM meters on CP --- packages/modules/common/algodue.py | 95 +++++++++++++++++++ .../internal_chargepoint_handler/clients.py | 16 +++- 2 files changed, 106 insertions(+), 5 deletions(-) create mode 100644 packages/modules/common/algodue.py diff --git a/packages/modules/common/algodue.py b/packages/modules/common/algodue.py new file mode 100644 index 0000000000..f7879cb1eb --- /dev/null +++ b/packages/modules/common/algodue.py @@ -0,0 +1,95 @@ +#!/usr/bin/env python3 +import logging +from typing import List, Tuple, Optional + +from modules.common import modbus +from modules.common.abstract_counter import AbstractCounter +from modules.common.modbus import ModbusDataType + +log = logging.getLogger(__name__) + + +class Algodue(AbstractCounter): + serial_cached: Optional[str] = None + model_cached: Optional[str] = None + + def __init__(self, modbus_id: int, client: modbus.ModbusTcpClient_) -> None: + self.client = client + self.id = modbus_id + + def get_imported(self) -> float: + return self.client.read_input_registers(0x1106, ModbusDataType.FLOAT_32, unit=self.id) + + def get_exported(self) -> float: + return self.client.read_input_registers(0x110e, ModbusDataType.FLOAT_32, unit=self.id) + + def get_frequency(self) -> float: + return self.client.read_input_registers(0x1038, ModbusDataType.FLOAT_32, unit=self.id) + + def get_serial_number(self) -> Optional[str]: + # serial will never change - at least until power cycle + if self.serial_cached is not None: + return self.serial_cached + + serial_chars = self.client.read_holding_registers(0x500, [ModbusDataType.UINT_8]*10, unit=self.id) + serial_string = "" + for x in serial_chars: + serial_string += chr(x) + log.debug("Algodue serial is " + serial_string) + self.serial_cached = serial_string + return self.serial_cached + + def get_currents(self) -> List[float]: + return self.client.read_input_registers(0x100E, [ModbusDataType.FLOAT_32]*3, unit=self.id) + + def get_power_factors(self) -> List[float]: + return self.client.read_input_registers(0x1018, [ModbusDataType.FLOAT_32]*3, unit=self.id) + + def get_power(self) -> Tuple[List[float], float]: + powers = self.client.read_input_registers(0x1020, [ModbusDataType.FLOAT_32]*3, unit=self.id) + power = sum(powers) + return powers, power + + def get_voltages(self) -> List[float]: + return self.client.read_input_registers(0x1000, [ModbusDataType.FLOAT_32]*3, unit=self.id) + + def get_model(self) -> Optional[str]: + # model will never change - at least until power cycle + if self.model_cached is not None: + return self.model_cached + + model_id = self.client.read_holding_registers(0x505, ModbusDataType.UINT_16, unit=self.id) + model_string = "unknown" + if model_id == 0x03: + model_string = "6 A, 3 phases, 4 wires" + elif model_id == 0x08: + model_string = "80 A, 3 phases, 4 wires" + elif model_id == 0x0c: + model_string = "80 A, 1 phase, 2 wires" + elif model_id == 0x10: + model_string = "40 A, 1 phase, 2 wires" + elif model_id == 0x12: + model_string = "63 A, 3 phases, 4 wires" + + type_id = self.client.read_holding_registers(0x506, ModbusDataType.UINT_16, unit=self.id) + type_string = "unknown" + if type_id == 0x00: + type_string = "NO MID, RESET" + elif type_id == 0x01: + type_string = "MID" + elif type_id == 0x02: + type_string = "NO MID" + elif type_id == 0x03: + type_string = "NO MID, Wiring selection" + elif type_id == 0x05: + type_string = "MID no varh" + elif type_id == 0x09: + type_string = "MID Wiring selection" + elif type_id == 0x0a: + type_string = "MID no varh, Wiring selection" + elif type_id == 0x0b: + type_string = "NO MID, RESET, Wiring selection" + meterinfo = "Algodue UEM " + model_string + " (" + type_string + ")" + log.error("Algodue model returning: " + meterinfo) + self.model_cached = meterinfo + return self.model_cached diff --git a/packages/modules/internal_chargepoint_handler/clients.py b/packages/modules/internal_chargepoint_handler/clients.py index 8b4d3ebc25..b74629643f 100644 --- a/packages/modules/internal_chargepoint_handler/clients.py +++ b/packages/modules/internal_chargepoint_handler/clients.py @@ -6,7 +6,7 @@ from modules.common.hardware_check import SeriesHardwareCheckMixin from modules.common.modbus import ModbusSerialClient_, ModbusTcpClient_ -from modules.common import mpm3pm, sdm +from modules.common import mpm3pm, sdm, algodue from modules.common import evse from modules.common import b23 @@ -15,13 +15,19 @@ BUS_SOURCES = ("/dev/ttyUSB0", "/dev/ttyUSB1", "/dev/ttyACM0", "/dev/serial0") -METERS = Union[mpm3pm.Mpm3pm, sdm.Sdm630_72, b23.B23] +METERS = Union[mpm3pm.Mpm3pm, sdm.Sdm630_72, b23.B23, algodue.Algodue] meter_config = NamedTuple("meter_config", [('type', METERS), ('modbus_id', int)]) + +# Note: Algodue meters expect entry of modbus ID in hex. 9b = 155, 9c = 156. +# We code ID in hex here so it's exactly what must be entered in meter. CP0_METERS = [meter_config(mpm3pm.Mpm3pm, modbus_id=5), meter_config(sdm.Sdm630_72, modbus_id=105), - meter_config(b23.B23, modbus_id=201)] + meter_config(b23.B23, modbus_id=201), + meter_config(algodue.Algodue, modbus_id=0x9b)] -CP1_METERS = [meter_config(mpm3pm.Mpm3pm, modbus_id=6), meter_config(sdm.Sdm630_72, modbus_id=106)] +CP1_METERS = [meter_config(mpm3pm.Mpm3pm, modbus_id=6), + meter_config(sdm.Sdm630_72, modbus_id=106), + meter_config(algodue.Algodue, modbus_id=0x9c)] EVSE_ID_CP0 = [1] EVSE_ID_TWO_BUSSES_CP1 = [1, 2] @@ -67,7 +73,7 @@ def find_meter_client(meters: List[meter_config], client: Union[ModbusSerialClie try: if meter_client.get_voltages()[0] > 200: with ModifyLoglevelContext(log, logging.DEBUG): - log.debug("Verbauter Zähler: "+str(meter_type)+" mit Modbus-ID: "+str(modbus_id)) + log.error("Verbauter Zähler: "+str(meter_type)+" mit Modbus-ID: "+str(modbus_id)) return meter_client except Exception: log.debug(client) From 72359f8ce7f074c8f22e921e30fa82b8b22ad329 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sat, 19 Oct 2024 18:04:06 +0200 Subject: [PATCH 02/10] log serial and model even if only warnintgs and errors are enabled caching prevents this to appear too often --- packages/modules/common/algodue.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/modules/common/algodue.py b/packages/modules/common/algodue.py index f7879cb1eb..461b2af9ff 100644 --- a/packages/modules/common/algodue.py +++ b/packages/modules/common/algodue.py @@ -35,7 +35,8 @@ def get_serial_number(self) -> Optional[str]: serial_string = "" for x in serial_chars: serial_string += chr(x) - log.debug("Algodue serial is " + serial_string) + # due to caching this appears rarely - but it's nice to have always have it in main log + log.error("Algodue meter serial " + serial_string) self.serial_cached = serial_string return self.serial_cached @@ -90,6 +91,8 @@ def get_model(self) -> Optional[str]: elif type_id == 0x0b: type_string = "NO MID, RESET, Wiring selection" meterinfo = "Algodue UEM " + model_string + " (" + type_string + ")" - log.error("Algodue model returning: " + meterinfo) + + # due to caching this appears rarely - but it's nice to have always have it in main log + log.error("Algodue model: " + meterinfo) self.model_cached = meterinfo return self.model_cached From 079ade4a76f42ab28543c3d30966bcb8e923dbed Mon Sep 17 00:00:00 2001 From: Kurt Date: Sat, 19 Oct 2024 18:16:10 +0200 Subject: [PATCH 03/10] change to model string --- packages/modules/common/algodue.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/modules/common/algodue.py b/packages/modules/common/algodue.py index 461b2af9ff..626b322af3 100644 --- a/packages/modules/common/algodue.py +++ b/packages/modules/common/algodue.py @@ -90,7 +90,7 @@ def get_model(self) -> Optional[str]: type_string = "MID no varh, Wiring selection" elif type_id == 0x0b: type_string = "NO MID, RESET, Wiring selection" - meterinfo = "Algodue UEM " + model_string + " (" + type_string + ")" + meterinfo = "Algodue UEM " + model_string + ", " + type_string # due to caching this appears rarely - but it's nice to have always have it in main log log.error("Algodue model: " + meterinfo) From 981bf7aadc13c4ee2dc644656c11470ab0705bd8 Mon Sep 17 00:00:00 2001 From: dj3mu <41773089+dj3mu@users.noreply.github.com> Date: Fri, 15 Nov 2024 16:38:29 +0100 Subject: [PATCH 04/10] Reduce number of returns Co-authored-by: benderl --- packages/modules/common/algodue.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/packages/modules/common/algodue.py b/packages/modules/common/algodue.py index 626b322af3..f03459dca7 100644 --- a/packages/modules/common/algodue.py +++ b/packages/modules/common/algodue.py @@ -28,16 +28,15 @@ def get_frequency(self) -> float: def get_serial_number(self) -> Optional[str]: # serial will never change - at least until power cycle - if self.serial_cached is not None: - return self.serial_cached - - serial_chars = self.client.read_holding_registers(0x500, [ModbusDataType.UINT_8]*10, unit=self.id) - serial_string = "" - for x in serial_chars: - serial_string += chr(x) - # due to caching this appears rarely - but it's nice to have always have it in main log - log.error("Algodue meter serial " + serial_string) - self.serial_cached = serial_string + if self.serial_cached is None: + serial_chars = self.client.read_holding_registers(0x500, [ModbusDataType.UINT_8]*10, unit=self.id) + serial_string = "" + for x in serial_chars: + serial_string += chr(x) + # due to caching this appears rarely - but it's nice to have always have it in main log + with ModifyLoglevelContext(log, logging.DEBUG): + log.debug("Algodue meter serial " + serial_string) + self.serial_cached = serial_string return self.serial_cached def get_currents(self) -> List[float]: From 8bb87ada926137f85732bd36d36773897afde07f Mon Sep 17 00:00:00 2001 From: dj3mu <41773089+dj3mu@users.noreply.github.com> Date: Fri, 15 Nov 2024 16:38:50 +0100 Subject: [PATCH 05/10] Reduce number of returns Co-authored-by: benderl --- packages/modules/common/algodue.py | 77 +++++++++++++++--------------- 1 file changed, 38 insertions(+), 39 deletions(-) diff --git a/packages/modules/common/algodue.py b/packages/modules/common/algodue.py index f03459dca7..fe8bc28f63 100644 --- a/packages/modules/common/algodue.py +++ b/packages/modules/common/algodue.py @@ -55,43 +55,42 @@ def get_voltages(self) -> List[float]: def get_model(self) -> Optional[str]: # model will never change - at least until power cycle - if self.model_cached is not None: - return self.model_cached - - model_id = self.client.read_holding_registers(0x505, ModbusDataType.UINT_16, unit=self.id) - model_string = "unknown" - if model_id == 0x03: - model_string = "6 A, 3 phases, 4 wires" - elif model_id == 0x08: - model_string = "80 A, 3 phases, 4 wires" - elif model_id == 0x0c: - model_string = "80 A, 1 phase, 2 wires" - elif model_id == 0x10: - model_string = "40 A, 1 phase, 2 wires" - elif model_id == 0x12: - model_string = "63 A, 3 phases, 4 wires" - - type_id = self.client.read_holding_registers(0x506, ModbusDataType.UINT_16, unit=self.id) - type_string = "unknown" - if type_id == 0x00: - type_string = "NO MID, RESET" - elif type_id == 0x01: - type_string = "MID" - elif type_id == 0x02: - type_string = "NO MID" - elif type_id == 0x03: - type_string = "NO MID, Wiring selection" - elif type_id == 0x05: - type_string = "MID no varh" - elif type_id == 0x09: - type_string = "MID Wiring selection" - elif type_id == 0x0a: - type_string = "MID no varh, Wiring selection" - elif type_id == 0x0b: - type_string = "NO MID, RESET, Wiring selection" - meterinfo = "Algodue UEM " + model_string + ", " + type_string - - # due to caching this appears rarely - but it's nice to have always have it in main log - log.error("Algodue model: " + meterinfo) - self.model_cached = meterinfo + if self.model_cached is None: + model_id = self.client.read_holding_registers(0x505, ModbusDataType.UINT_16, unit=self.id) + model_string = "unknown" + if model_id == 0x03: + model_string = "6 A, 3 phases, 4 wires" + elif model_id == 0x08: + model_string = "80 A, 3 phases, 4 wires" + elif model_id == 0x0c: + model_string = "80 A, 1 phase, 2 wires" + elif model_id == 0x10: + model_string = "40 A, 1 phase, 2 wires" + elif model_id == 0x12: + model_string = "63 A, 3 phases, 4 wires" + + type_id = self.client.read_holding_registers(0x506, ModbusDataType.UINT_16, unit=self.id) + type_string = "unknown" + if type_id == 0x00: + type_string = "NO MID, RESET" + elif type_id == 0x01: + type_string = "MID" + elif type_id == 0x02: + type_string = "NO MID" + elif type_id == 0x03: + type_string = "NO MID, Wiring selection" + elif type_id == 0x05: + type_string = "MID no varh" + elif type_id == 0x09: + type_string = "MID Wiring selection" + elif type_id == 0x0a: + type_string = "MID no varh, Wiring selection" + elif type_id == 0x0b: + type_string = "NO MID, RESET, Wiring selection" + meterinfo = "Algodue UEM " + model_string + ", " + type_string + + # due to caching this appears rarely - but it's nice to have always have it in main log + with ModifyLoglevelContext(log, logging.DEBUG): + log.debug("Algodue model: " + meterinfo) + self.model_cached = meterinfo return self.model_cached From 6da192f4db586ab2965d21870a645e6b27e26a90 Mon Sep 17 00:00:00 2001 From: dj3mu <41773089+dj3mu@users.noreply.github.com> Date: Fri, 15 Nov 2024 16:39:22 +0100 Subject: [PATCH 06/10] Revert logging to error because level is reduce here Co-authored-by: benderl --- packages/modules/internal_chargepoint_handler/clients.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/modules/internal_chargepoint_handler/clients.py b/packages/modules/internal_chargepoint_handler/clients.py index b74629643f..0bb26615cc 100644 --- a/packages/modules/internal_chargepoint_handler/clients.py +++ b/packages/modules/internal_chargepoint_handler/clients.py @@ -73,7 +73,7 @@ def find_meter_client(meters: List[meter_config], client: Union[ModbusSerialClie try: if meter_client.get_voltages()[0] > 200: with ModifyLoglevelContext(log, logging.DEBUG): - log.error("Verbauter Zähler: "+str(meter_type)+" mit Modbus-ID: "+str(modbus_id)) + log.debug("Verbauter Zähler: "+str(meter_type)+" mit Modbus-ID: "+str(modbus_id)) return meter_client except Exception: log.debug(client) From 6dacea1df18ebc2c1e8b36943deb1336f7332c11 Mon Sep 17 00:00:00 2001 From: dj3mu <41773089+dj3mu@users.noreply.github.com> Date: Fri, 15 Nov 2024 16:39:47 +0100 Subject: [PATCH 07/10] Import to adjust log level Co-authored-by: benderl --- packages/modules/common/algodue.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/modules/common/algodue.py b/packages/modules/common/algodue.py index fe8bc28f63..3370a78944 100644 --- a/packages/modules/common/algodue.py +++ b/packages/modules/common/algodue.py @@ -2,6 +2,8 @@ import logging from typing import List, Tuple, Optional +from helpermodules.logger import ModifyLoglevelContext + from modules.common import modbus from modules.common.abstract_counter import AbstractCounter from modules.common.modbus import ModbusDataType From d54c21a544b9631b01618b7560f7faa0e100f5d4 Mon Sep 17 00:00:00 2001 From: dj3mu Date: Fri, 15 Nov 2024 17:03:19 +0100 Subject: [PATCH 08/10] Add Algodue as EVU-Kit --- packages/modules/devices/algodue/__init__.py | 0 .../devices/algodue/algodue/__init__.py | 0 .../modules/devices/algodue/algodue/config.py | 38 +++++++++++++ .../devices/algodue/algodue/counter.py | 55 +++++++++++++++++++ .../modules/devices/algodue/algodue/device.py | 39 +++++++++++++ packages/modules/devices/algodue/vendor.py | 14 +++++ 6 files changed, 146 insertions(+) create mode 100644 packages/modules/devices/algodue/__init__.py create mode 100644 packages/modules/devices/algodue/algodue/__init__.py create mode 100644 packages/modules/devices/algodue/algodue/config.py create mode 100644 packages/modules/devices/algodue/algodue/counter.py create mode 100644 packages/modules/devices/algodue/algodue/device.py create mode 100644 packages/modules/devices/algodue/vendor.py diff --git a/packages/modules/devices/algodue/__init__.py b/packages/modules/devices/algodue/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/modules/devices/algodue/algodue/__init__.py b/packages/modules/devices/algodue/algodue/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/modules/devices/algodue/algodue/config.py b/packages/modules/devices/algodue/algodue/config.py new file mode 100644 index 0000000000..130719974f --- /dev/null +++ b/packages/modules/devices/algodue/algodue/config.py @@ -0,0 +1,38 @@ +from typing import Optional + +from modules.common.component_setup import ComponentSetup +from ..vendor import vendor_descriptor + + +class AlgodueConfiguration: + 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 Algodue: + def __init__(self, + name: str = "Algodue", + type: str = "Algodue", + id: int = 0, + configuration: AlgodueConfiguration = None) -> None: + self.name = name + self.type = type + self.vendor = vendor_descriptor.configuration_factory().type + self.id = id + self.configuration = configuration or AlgodueConfiguration() + + +class AlgodueCounterConfiguration: + def __init__(self): + pass + + +class AlgodueCounterSetup(ComponentSetup[AlgodueCounterConfiguration]): + def __init__(self, + name: str = "Algodue Zähler", + type: str = "counter", + id: int = 0, + configuration: AlgodueCounterConfiguration = None) -> None: + super().__init__(name, type, id, configuration or AlgodueCounterConfiguration()) diff --git a/packages/modules/devices/algodue/algodue/counter.py b/packages/modules/devices/algodue/algodue/counter.py new file mode 100644 index 0000000000..4d6d161eae --- /dev/null +++ b/packages/modules/devices/algodue/algodue/counter.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +from typing import Dict, Union + +from pymodbus.constants import Endian + +from dataclass_utils import dataclass_from_dict +from modules.devices.algodue.algodue.config import AlgodueCounterSetup +from modules.common import modbus +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 +from modules.common.simcount import SimCounter +from modules.common.store import get_counter_value_store + + +class AlgodueCounter(AbstractCounter): + def __init__(self, + device_id: int, + component_config: Union[Dict, AlgodueCounterSetup], + tcp_client: modbus.ModbusTcpClient_, + modbus_id: int) -> None: + self.__device_id = device_id + self.component_config = dataclass_from_dict(AlgodueCounterSetup, component_config) + self.__tcp_client = tcp_client + self.__modbus_id = modbus_id + 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): + with self.__tcp_client: + + frequency = self.__tcp_client.read_input_registers(0x1038, ModbusDataType.FLOAT_32, unit=self.id) + currents = self.__tcp_client.read_input_registers(0x100E, [ModbusDataType.FLOAT_32]*3, unit=self.id) + powers = self.__tcp_client.read_input_registers(0x1020, [ModbusDataType.FLOAT_32]*3, unit=self.id) + power = sum(powers) + voltages = self.__tcp_client.read_input_registers(0x1000, [ModbusDataType.FLOAT_32]*3, unit=self.id) + + imported, exported = self.sim_counter.sim_count(power) + + counter_state = CounterState( + voltages=voltages, + currents=currents, + powers=powers, + imported=imported, + exported=exported, + power=power, + frequency=frequency + ) + self.store.set(counter_state) + + +component_descriptor = ComponentDescriptor(configuration_factory=AlgodueCounterSetup) diff --git a/packages/modules/devices/algodue/algodue/device.py b/packages/modules/devices/algodue/algodue/device.py new file mode 100644 index 0000000000..46210779db --- /dev/null +++ b/packages/modules/devices/algodue/algodue/device.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 +import logging +from typing import Iterable + +from modules.common.configurable_device import ComponentFactoryByType, ConfigurableDevice, MultiComponentUpdater +from modules.devices.algodue.algodue import counter +from modules.devices.algodue.algodue.config import Algodue, AlgodueCounterSetup +from modules.common import modbus +from modules.common.abstract_device import DeviceDescriptor +from modules.common.component_context import SingleComponentUpdateContext + +log = logging.getLogger(__name__) + + +def create_device(device_config: Algodue): + def create_counter_component(component_config: AlgodueCounterSetup): + return counter.AlgodueCounter(device_config.id, component_config, client, + device_config.configuration.modbus_id) + + def update_components(components: Iterable[counter.AlgodueCounter]): + with client: + for component in components: + with SingleComponentUpdateContext(component.fault_state): + component.update() + + try: + client = modbus.ModbusTcpClient_(device_config.configuration.ip_address, device_config.configuration.port) + except Exception: + log.exception("Fehler in create_device") + return ConfigurableDevice( + device_config=device_config, + component_factory=ComponentFactoryByType( + counter=create_counter_component + ), + component_updater=MultiComponentUpdater(update_components) + ) + + +device_descriptor = DeviceDescriptor(configuration_factory=Algodue) diff --git a/packages/modules/devices/algodue/vendor.py b/packages/modules/devices/algodue/vendor.py new file mode 100644 index 0000000000..d4970b9763 --- /dev/null +++ b/packages/modules/devices/algodue/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 = "Algodue" + self.group = VendorGroup.VENDORS.value + + +vendor_descriptor = DeviceDescriptor(configuration_factory=Vendor) From fa8498483a669609087fe1d7e32342a90ad92982 Mon Sep 17 00:00:00 2001 From: dj3mu Date: Fri, 15 Nov 2024 17:06:21 +0100 Subject: [PATCH 09/10] de-flaked --- packages/modules/devices/algodue/algodue/counter.py | 2 -- packages/modules/devices/algodue/algodue/device.py | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/modules/devices/algodue/algodue/counter.py b/packages/modules/devices/algodue/algodue/counter.py index 4d6d161eae..ca13f036f1 100644 --- a/packages/modules/devices/algodue/algodue/counter.py +++ b/packages/modules/devices/algodue/algodue/counter.py @@ -1,8 +1,6 @@ #!/usr/bin/env python3 from typing import Dict, Union -from pymodbus.constants import Endian - from dataclass_utils import dataclass_from_dict from modules.devices.algodue.algodue.config import AlgodueCounterSetup from modules.common import modbus diff --git a/packages/modules/devices/algodue/algodue/device.py b/packages/modules/devices/algodue/algodue/device.py index 46210779db..900f4bfde8 100644 --- a/packages/modules/devices/algodue/algodue/device.py +++ b/packages/modules/devices/algodue/algodue/device.py @@ -15,7 +15,7 @@ def create_device(device_config: Algodue): def create_counter_component(component_config: AlgodueCounterSetup): return counter.AlgodueCounter(device_config.id, component_config, client, - device_config.configuration.modbus_id) + device_config.configuration.modbus_id) def update_components(components: Iterable[counter.AlgodueCounter]): with client: From 9bcad16ff06a90a536105ce61c5e360b19763d09 Mon Sep 17 00:00:00 2001 From: Kurt Date: Thu, 6 Feb 2025 16:44:29 +0100 Subject: [PATCH 10/10] Removed detection of Algodue in clients.py as requested --- .../internal_chargepoint_handler/clients.py | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/packages/modules/internal_chargepoint_handler/clients.py b/packages/modules/internal_chargepoint_handler/clients.py index b74629643f..8b4d3ebc25 100644 --- a/packages/modules/internal_chargepoint_handler/clients.py +++ b/packages/modules/internal_chargepoint_handler/clients.py @@ -6,7 +6,7 @@ from modules.common.hardware_check import SeriesHardwareCheckMixin from modules.common.modbus import ModbusSerialClient_, ModbusTcpClient_ -from modules.common import mpm3pm, sdm, algodue +from modules.common import mpm3pm, sdm from modules.common import evse from modules.common import b23 @@ -15,19 +15,13 @@ BUS_SOURCES = ("/dev/ttyUSB0", "/dev/ttyUSB1", "/dev/ttyACM0", "/dev/serial0") -METERS = Union[mpm3pm.Mpm3pm, sdm.Sdm630_72, b23.B23, algodue.Algodue] +METERS = Union[mpm3pm.Mpm3pm, sdm.Sdm630_72, b23.B23] meter_config = NamedTuple("meter_config", [('type', METERS), ('modbus_id', int)]) - -# Note: Algodue meters expect entry of modbus ID in hex. 9b = 155, 9c = 156. -# We code ID in hex here so it's exactly what must be entered in meter. CP0_METERS = [meter_config(mpm3pm.Mpm3pm, modbus_id=5), meter_config(sdm.Sdm630_72, modbus_id=105), - meter_config(b23.B23, modbus_id=201), - meter_config(algodue.Algodue, modbus_id=0x9b)] + meter_config(b23.B23, modbus_id=201)] -CP1_METERS = [meter_config(mpm3pm.Mpm3pm, modbus_id=6), - meter_config(sdm.Sdm630_72, modbus_id=106), - meter_config(algodue.Algodue, modbus_id=0x9c)] +CP1_METERS = [meter_config(mpm3pm.Mpm3pm, modbus_id=6), meter_config(sdm.Sdm630_72, modbus_id=106)] EVSE_ID_CP0 = [1] EVSE_ID_TWO_BUSSES_CP1 = [1, 2] @@ -73,7 +67,7 @@ def find_meter_client(meters: List[meter_config], client: Union[ModbusSerialClie try: if meter_client.get_voltages()[0] > 200: with ModifyLoglevelContext(log, logging.DEBUG): - log.error("Verbauter Zähler: "+str(meter_type)+" mit Modbus-ID: "+str(modbus_id)) + log.debug("Verbauter Zähler: "+str(meter_type)+" mit Modbus-ID: "+str(modbus_id)) return meter_client except Exception: log.debug(client)