From 247539ae96e328237be7aade2dadeb0a90837b54 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Mon, 7 Apr 2025 15:46:33 +0200 Subject: [PATCH] fix algodue --- packages/modules/common/algodue.py | 98 ------------------- .../devices/algodue/algodue/counter.py | 44 ++++++++- 2 files changed, 40 insertions(+), 102 deletions(-) delete mode 100644 packages/modules/common/algodue.py diff --git a/packages/modules/common/algodue.py b/packages/modules/common/algodue.py deleted file mode 100644 index 3370a78944..0000000000 --- a/packages/modules/common/algodue.py +++ /dev/null @@ -1,98 +0,0 @@ -#!/usr/bin/env python3 -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 - -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 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]: - 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 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 diff --git a/packages/modules/devices/algodue/algodue/counter.py b/packages/modules/devices/algodue/algodue/counter.py index ca13f036f1..6638d46d49 100644 --- a/packages/modules/devices/algodue/algodue/counter.py +++ b/packages/modules/devices/algodue/algodue/counter.py @@ -30,11 +30,13 @@ def __init__(self, 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) + frequency = self.__tcp_client.read_input_registers(0x1038, ModbusDataType.FLOAT_32, unit=self.__modbus_id) + currents = self.__tcp_client.read_input_registers( + 0x100E, [ModbusDataType.FLOAT_32]*3, unit=self.__modbus_id) + powers = self.__tcp_client.read_input_registers(0x1020, [ModbusDataType.FLOAT_32]*3, unit=self.__modbus_id) power = sum(powers) - voltages = self.__tcp_client.read_input_registers(0x1000, [ModbusDataType.FLOAT_32]*3, unit=self.id) + voltages = self.__tcp_client.read_input_registers( + 0x1000, [ModbusDataType.FLOAT_32]*3, unit=self.__modbus_id) imported, exported = self.sim_counter.sim_count(power) @@ -51,3 +53,37 @@ def update(self): component_descriptor = ComponentDescriptor(configuration_factory=AlgodueCounterSetup) + +# serial_chars = self.client.read_holding_registers(0x500, [ModbusDataType.UINT_8]*10, unit=self.id) +# 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