From 653b8ccd3ec38cdd727ecb4bcb053fc3c0763c82 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Tue, 7 Jul 2026 16:36:26 +0200 Subject: [PATCH 1/7] remove obsolet ramdisk code --- packages/helpermodules/constants.py | 3 + packages/helpermodules/logger.py | 23 +- packages/modules/common/powerwall.py | 2 +- packages/modules/common/store/__init__.py | 2 - packages/modules/common/store/_battery.py | 17 +- packages/modules/common/store/_car.py | 14 +- packages/modules/common/store/_chargepoint.py | 20 +- packages/modules/common/store/_counter.py | 20 +- packages/modules/common/store/_inverter.py | 21 +- .../modules/common/store/ramdisk/__init__.py | 0 .../modules/common/store/ramdisk/files.py | 231 ------------------ .../common/store/ramdisk/files_test.py | 130 ---------- packages/modules/common/store/ramdisk/io.py | 44 ---- .../devices/fronius/fronius/bat_test.py | 11 +- .../fronius/fronius/counter_s0_test.py | 11 +- .../fronius/fronius/counter_sm_test.py | 17 +- .../fronius/inverter_production_meter_test.py | 9 - packages/modules/devices/lg/lg/lg_test.py | 6 - .../devices/sma/sma_shm/counter_test.py | 36 +-- packages/modules/vehicles/kia/api.py | 48 ++-- packages/modules/vehicles/polestar/auth.py | 4 +- packages/modules/vehicles/vwgroup/vwgroup.py | 2 +- packages/modules/vehicles/vwid/libeuda.py | 2 +- packages/test_utils/mock_ramdisk.py | 42 ---- 24 files changed, 66 insertions(+), 649 deletions(-) delete mode 100644 packages/modules/common/store/ramdisk/__init__.py delete mode 100644 packages/modules/common/store/ramdisk/files.py delete mode 100644 packages/modules/common/store/ramdisk/files_test.py delete mode 100644 packages/modules/common/store/ramdisk/io.py delete mode 100644 packages/test_utils/mock_ramdisk.py diff --git a/packages/helpermodules/constants.py b/packages/helpermodules/constants.py index ba324e7834..e493371fd5 100644 --- a/packages/helpermodules/constants.py +++ b/packages/helpermodules/constants.py @@ -1,8 +1,11 @@ from enum import Enum +from pathlib import Path NO_ERROR = "Kein Fehler." +RAMDISK_PATH = Path(__file__).resolve().parents[2] / "ramdisk" + class DEFAULT_COLORS(Enum): CHARGEPOINT = "#007bff" diff --git a/packages/helpermodules/logger.py b/packages/helpermodules/logger.py index cdffc44691..9928c7249f 100644 --- a/packages/helpermodules/logger.py +++ b/packages/helpermodules/logger.py @@ -10,9 +10,10 @@ import os import shutil +from helpermodules.constants import RAMDISK_PATH + FORMAT_STR_DETAILED = '%(asctime)s - {%(name)s:%(lineno)s} - {%(levelname)s:%(threadName)s} - %(message)s' FORMAT_STR_SHORT = '%(asctime)s - %(message)s' -RAMDISK_PATH = str(Path(__file__).resolve().parents[2]) + '/ramdisk/' PERSISTENT_LOG_PATH = str(Path(__file__).resolve().parents[2]) + '/data/log/' NUMBER_OF_LOGFILES = 3 @@ -230,7 +231,7 @@ def mb_to_bytes(megabytes: int) -> int: # to do: add smarthome and soc to in_memory_log_handlers, needs updates in individual thread calls # Main logger - main_file_handler = RotatingFileHandler(RAMDISK_PATH + 'main.log', maxBytes=mb_to_bytes(5), backupCount=4) + main_file_handler = RotatingFileHandler(RAMDISK_PATH / 'main.log', maxBytes=mb_to_bytes(5), backupCount=4) main_file_handler.setFormatter(logging.Formatter(FORMAT_STR_DETAILED)) main_file_handler.addFilter(RedactingFilter()) in_memory_log_handlers["main"] = InMemoryLogHandler(main_file_handler) @@ -244,7 +245,7 @@ def mb_to_bytes(megabytes: int) -> int: chargelog_log = logging.getLogger("chargelog") chargelog_log.propagate = False chargelog_file_handler = RotatingFileHandler( - RAMDISK_PATH + 'chargelog.log', maxBytes=mb_to_bytes(2), backupCount=1) + RAMDISK_PATH / 'chargelog.log', maxBytes=mb_to_bytes(2), backupCount=1) chargelog_file_handler.setFormatter(logging.Formatter(FORMAT_STR_SHORT)) chargelog_file_handler.addFilter(RedactingFilter()) chargelog_log.addHandler(chargelog_file_handler) @@ -261,7 +262,7 @@ def mb_to_bytes(megabytes: int) -> int: # MQTT logger mqtt_log = logging.getLogger("mqtt") mqtt_log.propagate = False - mqtt_file_handler = RotatingFileHandler(RAMDISK_PATH + 'mqtt.log', maxBytes=mb_to_bytes(3), backupCount=1) + mqtt_file_handler = RotatingFileHandler(RAMDISK_PATH / 'mqtt.log', maxBytes=mb_to_bytes(3), backupCount=1) mqtt_file_handler.setFormatter(logging.Formatter(FORMAT_STR_SHORT)) mqtt_file_handler.addFilter(RedactingFilter()) mqtt_log.addHandler(mqtt_file_handler) @@ -278,7 +279,7 @@ def mb_to_bytes(megabytes: int) -> int: garbage_collector_log = logging.getLogger("garbage_collector") garbage_collector_log.propagate = False garbage_collector_file_handler = RotatingFileHandler( - RAMDISK_PATH + 'garbage_collector.log', maxBytes=mb_to_bytes(0.5), backupCount=1) + RAMDISK_PATH / 'garbage_collector.log', maxBytes=mb_to_bytes(0.5), backupCount=1) garbage_collector_file_handler.setFormatter(logging.Formatter(FORMAT_STR_SHORT)) garbage_collector_log.addHandler(garbage_collector_file_handler) @@ -286,19 +287,19 @@ def mb_to_bytes(megabytes: int) -> int: tracemalloc_log = logging.getLogger("tracemalloc") tracemalloc_log.propagate = False tracemalloc_file_handler = RotatingFileHandler( - RAMDISK_PATH + 'tracemalloc.log', maxBytes=mb_to_bytes(0.5), backupCount=1) + RAMDISK_PATH / 'tracemalloc.log', maxBytes=mb_to_bytes(0.5), backupCount=1) tracemalloc_file_handler.setFormatter(logging.Formatter(FORMAT_STR_SHORT)) tracemalloc_log.addHandler(tracemalloc_file_handler) # Smarthome logger - smarthome_log_handler = RotatingFileHandler(RAMDISK_PATH + 'smarthome.log', maxBytes=mb_to_bytes(1), backupCount=1) + smarthome_log_handler = RotatingFileHandler(RAMDISK_PATH / 'smarthome.log', maxBytes=mb_to_bytes(1), backupCount=1) smarthome_log_handler.setFormatter(logging.Formatter(FORMAT_STR_SHORT)) smarthome_log_handler.addFilter(functools.partial(filter_pos, "smarthome")) smarthome_log_handler.addFilter(RedactingFilter()) logging.getLogger().addHandler(smarthome_log_handler) # SoC logger - soc_log_handler = RotatingFileHandler(RAMDISK_PATH + 'soc.log', maxBytes=mb_to_bytes(2), backupCount=1) + soc_log_handler = RotatingFileHandler(RAMDISK_PATH / 'soc.log', maxBytes=mb_to_bytes(2), backupCount=1) soc_log_handler.setFormatter(logging.Formatter(FORMAT_STR_DETAILED)) soc_log_handler.addFilter(functools.partial(filter_pos, "soc")) soc_log_handler.addFilter(RedactingFilter()) @@ -308,7 +309,7 @@ def mb_to_bytes(megabytes: int) -> int: logging.getLogger().addHandler(in_memory_log_handlers["soc"]) # Internal chargepoint logger - internal_chargepoint_log_handler = RotatingFileHandler(RAMDISK_PATH + 'internal_chargepoint.log', + internal_chargepoint_log_handler = RotatingFileHandler(RAMDISK_PATH / 'internal_chargepoint.log', maxBytes=mb_to_bytes(1), backupCount=1) internal_chargepoint_log_handler.setFormatter(logging.Formatter(FORMAT_STR_DETAILED)) @@ -322,7 +323,7 @@ def mb_to_bytes(megabytes: int) -> int: # urllib3 logger urllib3_log = logging.getLogger("urllib3.connectionpool") urllib3_log.propagate = True - urllib3_file_handler = RotatingFileHandler(RAMDISK_PATH + 'soc.log', maxBytes=mb_to_bytes(2), backupCount=1) + urllib3_file_handler = RotatingFileHandler(RAMDISK_PATH / 'soc.log', maxBytes=mb_to_bytes(2), backupCount=1) urllib3_file_handler.setFormatter(logging.Formatter(FORMAT_STR_DETAILED)) urllib3_file_handler.addFilter(RedactingFilter()) urllib3_file_handler.addFilter(functools.partial(filter_pos, "soc")) @@ -332,7 +333,7 @@ def mb_to_bytes(megabytes: int) -> int: logging.getLogger("uModbus").setLevel(logging.WARNING) logging.getLogger("websockets").setLevel(logging.WARNING) - thread_errors_path = Path(RAMDISK_PATH+"thread_errors.log") + thread_errors_path = Path(RAMDISK_PATH / "thread_errors.log") with thread_errors_path.open("w") as f: f.write("") diff --git a/packages/modules/common/powerwall.py b/packages/modules/common/powerwall.py index b4f13c76ab..98c3c38c4a 100644 --- a/packages/modules/common/powerwall.py +++ b/packages/modules/common/powerwall.py @@ -7,7 +7,7 @@ from requests import HTTPError from modules.common.req import get_http_session -from modules.common.store import RAMDISK_PATH +from helpermodules.constants import RAMDISK_PATH COOKIE_FILE = RAMDISK_PATH / "powerwall_cookie.txt" log = logging.getLogger(__name__) diff --git a/packages/modules/common/store/__init__.py b/packages/modules/common/store/__init__.py index 4c76f0c1fd..237f345940 100644 --- a/packages/modules/common/store/__init__.py +++ b/packages/modules/common/store/__init__.py @@ -7,5 +7,3 @@ from modules.common.store._inverter import get_inverter_value_store from modules.common.store._io import get_io_value_store from modules.common.store._tariff import get_flexible_tariff_value_store, get_grid_fee_value_store -from modules.common.store.ramdisk.io import ramdisk_write, ramdisk_read, ramdisk_read_float, ramdisk_read_int, \ - RAMDISK_PATH diff --git a/packages/modules/common/store/_battery.py b/packages/modules/common/store/_battery.py index c8a60c2298..7aaf5ff291 100644 --- a/packages/modules/common/store/_battery.py +++ b/packages/modules/common/store/_battery.py @@ -1,20 +1,7 @@ -from helpermodules import compatibility from modules.common.component_state import BatState from modules.common.store import ValueStore from modules.common.store._api import LoggingValueStore from modules.common.store._broker import pub_to_broker -from modules.common.store.ramdisk import files - - -class BatteryValueStoreRamdisk(ValueStore[BatState]): - def __init__(self, component_num: int) -> None: - self.num = component_num - - def set(self, bat_state: BatState): - files.battery.power.write(bat_state.power) - files.battery.soc.write(bat_state.soc) - files.battery.energy_imported.write(bat_state.imported) - files.battery.energy_exported.write(bat_state.exported) class BatteryValueStoreBroker(ValueStore[BatState]): @@ -47,6 +34,4 @@ def update(self) -> None: def get_bat_value_store(component_num: int) -> ValueStore[BatState]: - return PurgeBatteryState(LoggingValueStore( - (BatteryValueStoreRamdisk if compatibility.is_ramdisk_in_use() else BatteryValueStoreBroker)(component_num) - )) + return PurgeBatteryState(LoggingValueStore(BatteryValueStoreBroker(component_num))) diff --git a/packages/modules/common/store/_car.py b/packages/modules/common/store/_car.py index 499e052323..4100ae97a4 100644 --- a/packages/modules/common/store/_car.py +++ b/packages/modules/common/store/_car.py @@ -1,17 +1,7 @@ -from helpermodules import compatibility from modules.common.component_state import CarState from modules.common.store import ValueStore from modules.common.store._api import LoggingValueStore from modules.common.store._broker import pub_to_broker -from modules.common.store.ramdisk import files - - -class CarValueStoreRamdisk(ValueStore[CarState]): - def __init__(self, charge_point: int): - self.file = files.charge_points[charge_point - 1].soc - - def set(self, state: CarState) -> None: - self.file.write(int(state.soc)) class CarValueStoreBroker(ValueStore[CarState]): @@ -29,6 +19,4 @@ def update(self): def get_car_value_store(id: int) -> ValueStore[CarState]: - return LoggingValueStore( - CarValueStoreRamdisk(id) if compatibility.is_ramdisk_in_use() else CarValueStoreBroker(id) - ) + return LoggingValueStore(CarValueStoreBroker(id)) diff --git a/packages/modules/common/store/_chargepoint.py b/packages/modules/common/store/_chargepoint.py index c2f8c0664e..292887f31b 100644 --- a/packages/modules/common/store/_chargepoint.py +++ b/packages/modules/common/store/_chargepoint.py @@ -2,22 +2,6 @@ from modules.common.store import ValueStore from modules.common.store._api import LoggingValueStore from modules.common.store._broker import pub_to_broker -from modules.common.store.ramdisk import files -from helpermodules import compatibility - - -class ChargepointValueStoreRamdisk(ValueStore[ChargepointState]): - def __init__(self, cp_id: int): - self.num = cp_id - - def set(self, cp_state: ChargepointState): - charge_point = files.charge_points[self.num] - charge_point.is_charging.write(cp_state.charge_state) - charge_point.voltages.write(cp_state.voltages) - charge_point.currents.write(cp_state.currents) - charge_point.energy.write(cp_state.imported/1000) - charge_point.is_plugged.write(cp_state.plug_state) - charge_point.power.write(int(cp_state.power)) class ChargepointValueStoreBroker(ValueStore[ChargepointState]): @@ -68,6 +52,4 @@ def update(self): def get_chargepoint_value_store(id: int) -> ValueStore[ChargepointState]: - return LoggingValueStore( - ChargepointValueStoreRamdisk(id) if compatibility.is_ramdisk_in_use() else ChargepointValueStoreBroker(id) - ) + return LoggingValueStore(ChargepointValueStoreBroker(id)) diff --git a/packages/modules/common/store/_counter.py b/packages/modules/common/store/_counter.py index 060acabe81..8905912fe9 100644 --- a/packages/modules/common/store/_counter.py +++ b/packages/modules/common/store/_counter.py @@ -3,7 +3,6 @@ from typing import Dict, Optional from control import data -from helpermodules import compatibility from helpermodules.phase_handling import convert_cp_currents_to_evu_currents from modules.common.component_state import CounterState from modules.common.component_type import ComponentType @@ -11,25 +10,11 @@ from modules.common.store import ValueStore from modules.common.store._api import LoggingValueStore from modules.common.store._broker import pub_to_broker -from modules.common.store.ramdisk import files from modules.common.utils.component_parser import get_component_obj_by_id log = logging.getLogger(__name__) -class CounterValueStoreRamdisk(ValueStore[CounterState]): - def set(self, counter_state: CounterState): - files.evu.voltages.write(counter_state.voltages) - if counter_state.currents: - files.evu.currents.write(counter_state.currents) - files.evu.powers_import.write([int(p) for p in counter_state.powers]) - files.evu.power_factors.write(counter_state.power_factors) - files.evu.energy_import.write(counter_state.imported) - files.evu.energy_export.write(counter_state.exported) - files.evu.power_import.write(int(counter_state.power)) - files.evu.frequency.write(counter_state.frequency) - - class CounterValueStoreBroker(ValueStore[CounterState]): def __init__(self, component_num: int) -> None: self.num = component_num @@ -172,8 +157,5 @@ def calc_uncounted_consumption(self) -> CounterState: def get_counter_value_store(component_num: int, add_child_values: bool = False, simcounter: Optional[SimCounter] = None) -> PurgeCounterState: - if compatibility.is_ramdisk_in_use(): - delegate = CounterValueStoreRamdisk() - else: - delegate = CounterValueStoreBroker(component_num) + delegate = CounterValueStoreBroker(component_num) return PurgeCounterState(LoggingValueStore(delegate), add_child_values, simcounter) diff --git a/packages/modules/common/store/_inverter.py b/packages/modules/common/store/_inverter.py index 72e9d13197..d52c5a6750 100644 --- a/packages/modules/common/store/_inverter.py +++ b/packages/modules/common/store/_inverter.py @@ -1,31 +1,14 @@ import logging from control import data -from helpermodules import compatibility from modules.common.component_state import InverterState from modules.common.store import ValueStore from modules.common.store._api import LoggingValueStore from modules.common.store._broker import pub_to_broker -from modules.common.store.ramdisk import files log = logging.getLogger(__name__) -class InverterValueStoreRamdisk(ValueStore[InverterState]): - def __init__(self, component_num: int) -> None: - self.__pv = files.pv[component_num - 1] - - def set(self, inverter_state: InverterState): - self.__pv.power.write(int(inverter_state.power)) - if inverter_state.exported is not None: - self.__pv.energy.write(inverter_state.exported) - self.__pv.energy_k.write(inverter_state.exported / 1000) - else: - log.debug("Kein gültiger Zählerstand. Wert wird nicht aktualisiert.") - if inverter_state.currents: - self.__pv.currents.write(inverter_state.currents) - - class InverterValueStoreBroker(ValueStore[InverterState]): def __init__(self, component_num: int) -> None: self.num = component_num @@ -88,6 +71,4 @@ def fix_hybrid_values(self, state: InverterState) -> InverterState: def get_inverter_value_store(component_num: int) -> PurgeInverterState: - return PurgeInverterState(LoggingValueStore( - (InverterValueStoreRamdisk if compatibility.is_ramdisk_in_use() else InverterValueStoreBroker)(component_num) - )) + return PurgeInverterState(LoggingValueStore(InverterValueStoreBroker(component_num))) diff --git a/packages/modules/common/store/ramdisk/__init__.py b/packages/modules/common/store/ramdisk/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/modules/common/store/ramdisk/files.py b/packages/modules/common/store/ramdisk/files.py deleted file mode 100644 index a749fba43e..0000000000 --- a/packages/modules/common/store/ramdisk/files.py +++ /dev/null @@ -1,231 +0,0 @@ -from builtins import property -from typing import Generic, TypeVar, Callable, Sequence, List, Iterable, Union - -from modules.common.store.ramdisk.io import ramdisk_write, ramdisk_read - -_T = TypeVar("_T") - - -class _Coder(Generic[_T]): - def __init__(self, decoder: Callable[[str], _T], encoder: Callable[[_T], str] = str): - self.encoder = encoder - self.decoder = decoder - - -def _encode_int(value: Union[int, float]): - return str(int(value)) - - -_int_coder = _Coder(int, _encode_int) -_float_coder = _Coder(float) -_bool_coder = _Coder(lambda value: value == "1", lambda value: "1" if value else "0") - - -class _RamdiskFile(Generic[_T]): - def __init__(self, filename: str, coder: _Coder[_T]): - self.filename = filename - self.coder = coder - - def read(self) -> _T: - return self.coder.decoder(ramdisk_read(self.filename)) - - def write(self, value: _T): - ramdisk_write(self.filename, self.coder.encoder(value)) - - def get_filename(self): - return self.filename - - -class _RamdiskIndexFile(Generic[_T]): - def __init__(self, filename_formatter: Callable[[int], str], coder: _Coder[_T]): - self.filename_formatter = filename_formatter - self.coder = coder - - @staticmethod - def for_prefix(prefix: str, coder: _Coder[_T]): - return _RamdiskIndexFile(lambda index: prefix + str(index + 1), coder) - - def __getitem__(self, index: int) -> _RamdiskFile[_T]: - return _RamdiskFile(self.filename_formatter(index), self.coder) - - def read(self, range: Sequence) -> List[_T]: - return [self[index].read() for index in range] - - def write(self, values: Iterable[_T]): - for index, value in enumerate(values): - self[index].write(value) - - -def _build_filename_charge_point_phase(prefix: str, charge_point_index: int): - def result(phase_index: int): - if charge_point_index == 0: - return prefix + str(phase_index + 1) - if charge_point_index <= 2: - return "{}s{}{}".format(prefix, charge_point_index, phase_index + 1) - return "{}{}lp{}".format(prefix, phase_index + 1, charge_point_index + 1) - - return result - - -def _build_filename_charge_point(prefix: str, charge_point_index: int, s_limit=2): - if charge_point_index == 0: - return prefix - if charge_point_index <= s_limit: - return "{}s{}".format(prefix, charge_point_index) - return "{}lp{}".format(prefix, charge_point_index + 1) - - -class _ChargePoint: - def __init__(self, charge_point_index: int): - self.charge_point_index = charge_point_index - - @property - def is_charging(self): - return self.__create_ramdisk_file("chargestat", _bool_coder, s_limit=1) - - @property - def voltages(self): - return self.__create_ramdisk_phase_file("llv", _float_coder) - - @property - def currents(self): - return self.__create_ramdisk_phase_file("lla", _float_coder) - - @property - def current_target(self): - return self.__create_ramdisk_file("llsoll", _int_coder) - - @property - def energy(self): - """Total energy charged in Wh""" - return self.__create_ramdisk_file("llkwh", _float_coder) - - @property - def is_plugged(self): - filename = "plugstat" - if self.charge_point_index == 1: - filename += "s1" - elif self.charge_point_index > 1: - filename += "lp" + str(self.charge_point_index + 1) - return _RamdiskFile(filename, _bool_coder) - - @property - def power(self): - return self.__create_ramdisk_file("llaktuell", _float_coder) - - @property - def frequency(self): - return self.__create_ramdisk_file("llhz", _float_coder) - - @property - def power_factors(self): - return self.__create_ramdisk_phase_file("llpf", _float_coder) - - @property - def soc(self): - return _RamdiskFile("soc" if self.charge_point_index == 0 else "soc" + str(self.charge_point_index), _int_coder) - - def __create_ramdisk_file(self, prefix: str, coder: _Coder, s_limit=2): - return _RamdiskFile(_build_filename_charge_point(prefix, self.charge_point_index, s_limit), coder) - - def __create_ramdisk_phase_file(self, prefix: str, coder: _Coder): - return _RamdiskIndexFile(_build_filename_charge_point_phase(prefix, self.charge_point_index), coder) - - -class _PV: - def __init__(self, index: int): - self.prefix = "pv" if index == 0 else "pv" + str(index + 1) - - @property - def currents(self): - return _RamdiskIndexFile.for_prefix(self.prefix + "a", _float_coder) - - @property - def power(self): - return _RamdiskFile(self.prefix + "watt", _int_coder) - - @property - def energy(self): - """Total energy produced in Wh""" - return _RamdiskFile(self.prefix + "kwh", _float_coder) - - @property - def energy_k(self): - """Total energy produced in kWh""" - return _RamdiskFile(self.prefix + "kwhk", _float_coder) - - -class _Battery: - @property - def power(self): - return _RamdiskFile("speicherleistung", _int_coder) - - @property - def soc(self): - """battery state of charge. 0=empty, 100=full""" - return _RamdiskFile("speichersoc", _int_coder) - - @property - def energy_imported(self): - """total energy imported in Wh""" - return _RamdiskFile("speicherikwh", _float_coder) - - @property - def energy_exported(self): - """total energy exported in Wh""" - return _RamdiskFile("speicherekwh", _float_coder) - - -class _Counter: - @property - def voltages(self): - return _RamdiskIndexFile.for_prefix("evuv", _float_coder) - - @property - def currents(self): - return _RamdiskIndexFile.for_prefix("bezuga", _float_coder) - - @property - def powers_import(self): - return _RamdiskIndexFile.for_prefix("bezugw", _int_coder) - - @property - def power_factors(self): - return _RamdiskIndexFile.for_prefix("evupf", _float_coder) - - @property - def energy_import(self): - """Total energy imported in Wh""" - return _RamdiskFile("bezugkwh", _float_coder) - - @property - def energy_export(self): - """Total energy exported in Wh""" - return _RamdiskFile("einspeisungkwh", _float_coder) - - @property - def power_import(self): - return _RamdiskFile("wattbezug", _int_coder) - - @property - def frequency(self): - return _RamdiskFile("evuhz", _float_coder) - - -class _RootIndex(Generic[_T]): - def __init__(self, factory: Callable[[int], _T]): - self.factory = factory - - def __getitem__(self, item): - return self.factory(item) - - -class _ChargePoints: - def __getitem__(self, charge_point_index: int): - return _ChargePoint(charge_point_index) - - -charge_points = _RootIndex(_ChargePoint) -pv = _RootIndex(_PV) -battery = _Battery() -evu = _Counter() diff --git a/packages/modules/common/store/ramdisk/files_test.py b/packages/modules/common/store/ramdisk/files_test.py deleted file mode 100644 index 77ec3b98f0..0000000000 --- a/packages/modules/common/store/ramdisk/files_test.py +++ /dev/null @@ -1,130 +0,0 @@ -from modules.common.store.ramdisk import files - - -def test_get_file_path(): - # Battery - # ------- - assert files.battery.energy_exported.filename == "speicherekwh" - assert files.battery.energy_imported.filename == "speicherikwh" - assert files.battery.power.filename == "speicherleistung" - assert files.battery.soc.filename == "speichersoc" - - # Charge points - # ------------- - assert files.charge_points[0].current_target.filename == "llsoll" - assert files.charge_points[1].current_target.filename == "llsolls1" - assert files.charge_points[2].current_target.filename == "llsolls2" - assert files.charge_points[3].current_target.filename == "llsolllp4" - assert files.charge_points[4].current_target.filename == "llsolllp5" - - assert files.charge_points[0].currents[0].filename == "lla1" - assert files.charge_points[0].currents[1].filename == "lla2" - assert files.charge_points[0].currents[2].filename == "lla3" - assert files.charge_points[1].currents[0].filename == "llas11" - assert files.charge_points[1].currents[1].filename == "llas12" - assert files.charge_points[1].currents[2].filename == "llas13" - assert files.charge_points[2].currents[0].filename == "llas21" - assert files.charge_points[2].currents[1].filename == "llas22" - assert files.charge_points[2].currents[2].filename == "llas23" - assert files.charge_points[3].currents[0].filename == "lla1lp4" - assert files.charge_points[3].currents[1].filename == "lla2lp4" - assert files.charge_points[3].currents[2].filename == "lla3lp4" - assert files.charge_points[4].currents[0].filename == "lla1lp5" - assert files.charge_points[4].currents[1].filename == "lla2lp5" - assert files.charge_points[4].currents[2].filename == "lla3lp5" - - assert files.charge_points[0].energy.filename == "llkwh" - assert files.charge_points[1].energy.filename == "llkwhs1" - assert files.charge_points[2].energy.filename == "llkwhs2" - assert files.charge_points[3].energy.filename == "llkwhlp4" - assert files.charge_points[4].energy.filename == "llkwhlp5" - - assert files.charge_points[0].frequency.filename == "llhz" - assert files.charge_points[1].frequency.filename == "llhzs1" - assert files.charge_points[2].frequency.filename == "llhzs2" - - assert files.charge_points[0].is_charging.filename == "chargestat" - assert files.charge_points[1].is_charging.filename == "chargestats1" - assert files.charge_points[2].is_charging.filename == "chargestatlp3" - assert files.charge_points[3].is_charging.filename == "chargestatlp4" - assert files.charge_points[4].is_charging.filename == "chargestatlp5" - - assert files.charge_points[0].is_plugged.filename == "plugstat" - assert files.charge_points[1].is_plugged.filename == "plugstats1" - assert files.charge_points[2].is_plugged.filename == "plugstatlp3" - assert files.charge_points[3].is_plugged.filename == "plugstatlp4" - assert files.charge_points[4].is_plugged.filename == "plugstatlp5" - - assert files.charge_points[0].power.filename == "llaktuell" - assert files.charge_points[1].power.filename == "llaktuells1" - assert files.charge_points[2].power.filename == "llaktuells2" - assert files.charge_points[3].power.filename == "llaktuelllp4" - assert files.charge_points[4].power.filename == "llaktuelllp5" - - assert files.charge_points[0].power_factors[0].filename == "llpf1" - assert files.charge_points[0].power_factors[1].filename == "llpf2" - assert files.charge_points[0].power_factors[2].filename == "llpf3" - assert files.charge_points[1].power_factors[0].filename == "llpfs11" - assert files.charge_points[1].power_factors[1].filename == "llpfs12" - assert files.charge_points[1].power_factors[2].filename == "llpfs13" - assert files.charge_points[2].power_factors[0].filename == "llpfs21" - assert files.charge_points[2].power_factors[1].filename == "llpfs22" - assert files.charge_points[2].power_factors[2].filename == "llpfs23" - - assert files.charge_points[0].soc.filename == "soc" - assert files.charge_points[1].soc.filename == "soc1" - - assert files.charge_points[0].voltages[0].filename == "llv1" - assert files.charge_points[0].voltages[1].filename == "llv2" - assert files.charge_points[0].voltages[2].filename == "llv3" - assert files.charge_points[1].voltages[0].filename == "llvs11" - assert files.charge_points[1].voltages[1].filename == "llvs12" - assert files.charge_points[1].voltages[2].filename == "llvs13" - assert files.charge_points[2].voltages[0].filename == "llvs21" - assert files.charge_points[2].voltages[1].filename == "llvs22" - assert files.charge_points[2].voltages[2].filename == "llvs23" - assert files.charge_points[3].voltages[0].filename == "llv1lp4" - assert files.charge_points[3].voltages[1].filename == "llv2lp4" - assert files.charge_points[3].voltages[2].filename == "llv3lp4" - assert files.charge_points[4].voltages[0].filename == "llv1lp5" - assert files.charge_points[4].voltages[1].filename == "llv2lp5" - assert files.charge_points[4].voltages[2].filename == "llv3lp5" - - # EVU - # --- - assert files.evu.currents[0].filename == "bezuga1" - assert files.evu.currents[1].filename == "bezuga2" - assert files.evu.currents[2].filename == "bezuga3" - - assert files.evu.energy_export.filename == "einspeisungkwh" - assert files.evu.energy_import.filename == "bezugkwh" - assert files.evu.frequency.filename == "evuhz" - - assert files.evu.power_factors[0].filename == "evupf1" - assert files.evu.power_factors[1].filename == "evupf2" - assert files.evu.power_factors[2].filename == "evupf3" - - assert files.evu.power_import.filename == "wattbezug" - - assert files.evu.powers_import[0].filename == "bezugw1" - assert files.evu.powers_import[1].filename == "bezugw2" - assert files.evu.powers_import[2].filename == "bezugw3" - - assert files.evu.voltages[0].filename == "evuv1" - assert files.evu.voltages[1].filename == "evuv2" - assert files.evu.voltages[2].filename == "evuv3" - - # PV - # -- - assert files.pv[0].currents[0].filename == "pva1" - assert files.pv[0].currents[1].filename == "pva2" - assert files.pv[0].currents[2].filename == "pva3" - assert files.pv[1].currents[0].filename == "pv2a1" - assert files.pv[1].currents[1].filename == "pv2a2" - assert files.pv[1].currents[2].filename == "pv2a3" - - assert files.pv[0].energy.filename == "pvkwh" - assert files.pv[1].energy.filename == "pv2kwh" - - assert files.pv[0].power.filename == "pvwatt" - assert files.pv[1].power.filename == "pv2watt" diff --git a/packages/modules/common/store/ramdisk/io.py b/packages/modules/common/store/ramdisk/io.py deleted file mode 100644 index 85f2fd6307..0000000000 --- a/packages/modules/common/store/ramdisk/io.py +++ /dev/null @@ -1,44 +0,0 @@ -from pathlib import Path -from typing import Iterable, Optional, TypeVar, Callable - -from modules.common.store._util import get_rounding_function_by_digits - -RAMDISK_PATH = Path(__file__).resolve().parents[5] / "ramdisk" - -T = TypeVar('T') - - -class RamdiskReadError(Exception): - def __init__(self, file: str, content: str, message: str): - super().__init__("Error reading ramdisk file <{}>, content=<{}>: {}".format(file, content, message)) - - -def ramdisk_write_to_files(prefix: str, values: Iterable, digits: int = None): - for index, value in enumerate(values): - ramdisk_write(prefix + str(index + 1), value, digits) - - -def ramdisk_write(file: str, value, digits: Optional[int] = None) -> None: - (RAMDISK_PATH / file).write_text(str(get_rounding_function_by_digits(digits)(value))) - - -def ramdisk_read(file: str) -> str: - # Using `strip`, because oftentimes values are written from bash like `echo value > file` which adds a newline at - # the end of file - return (RAMDISK_PATH / file).read_text().strip() - - -def ramdisk_read_mapping(file: str, mapper: Callable[[str], T], error_message: str) -> T: - file_content = ramdisk_read(file) - try: - return mapper(file_content) - except ValueError as e: - raise RamdiskReadError(file, file_content, error_message) from e - - -def ramdisk_read_int(file: str) -> int: - return ramdisk_read_mapping(file, int, "expected int") - - -def ramdisk_read_float(file: str) -> float: - return ramdisk_read_mapping(file, float, "expected float") diff --git a/packages/modules/devices/fronius/fronius/bat_test.py b/packages/modules/devices/fronius/fronius/bat_test.py index 64d43e19ce..0f6571a9e1 100644 --- a/packages/modules/devices/fronius/fronius/bat_test.py +++ b/packages/modules/devices/fronius/fronius/bat_test.py @@ -1,24 +1,15 @@ from unittest.mock import Mock -import pytest import requests_mock from dataclass_utils import dataclass_from_dict -from helpermodules import compatibility from modules.common.store._api import LoggingValueStore from modules.conftest import SAMPLE_IP from modules.devices.fronius.fronius import bat from modules.devices.fronius.fronius.config import FroniusBatSetup, FroniusConfiguration -from test_utils.mock_ramdisk import MockRamdisk -@pytest.fixture -def mock_ramdisk(monkeypatch): - monkeypatch.setattr(compatibility, "is_ramdisk_in_use", lambda: True) - return MockRamdisk(monkeypatch) - - -def test_update(monkeypatch, requests_mock: requests_mock.Mocker, mock_ramdisk, mock_simcount): +def test_update(monkeypatch, requests_mock: requests_mock.Mocker, mock_simcount): component_config = FroniusBatSetup() device_config = FroniusConfiguration() device_config.ip_address = SAMPLE_IP diff --git a/packages/modules/devices/fronius/fronius/counter_s0_test.py b/packages/modules/devices/fronius/fronius/counter_s0_test.py index e29f815e0c..235eea30c3 100644 --- a/packages/modules/devices/fronius/fronius/counter_s0_test.py +++ b/packages/modules/devices/fronius/fronius/counter_s0_test.py @@ -1,24 +1,15 @@ from unittest.mock import Mock -import pytest import requests_mock from dataclass_utils import dataclass_from_dict -from helpermodules import compatibility from modules.common.store._api import LoggingValueStore from modules.conftest import SAMPLE_IP from modules.devices.fronius.fronius import counter_s0 from modules.devices.fronius.fronius.config import FroniusConfiguration, FroniusS0CounterSetup -from test_utils.mock_ramdisk import MockRamdisk -@pytest.fixture -def mock_ramdisk(monkeypatch): - monkeypatch.setattr(compatibility, "is_ramdisk_in_use", lambda: True) - return MockRamdisk(monkeypatch) - - -def test_update(monkeypatch, requests_mock: requests_mock.Mocker, mock_ramdisk, mock_simcount): +def test_update(monkeypatch, requests_mock: requests_mock.Mocker, mock_simcount): component_config = FroniusS0CounterSetup() device_config = FroniusConfiguration() device_config.ip_address = SAMPLE_IP diff --git a/packages/modules/devices/fronius/fronius/counter_sm_test.py b/packages/modules/devices/fronius/fronius/counter_sm_test.py index 1dfc235b44..e48460dd9b 100644 --- a/packages/modules/devices/fronius/fronius/counter_sm_test.py +++ b/packages/modules/devices/fronius/fronius/counter_sm_test.py @@ -1,24 +1,15 @@ from unittest.mock import Mock -import pytest import requests_mock from dataclass_utils import dataclass_from_dict -from helpermodules import compatibility from modules.common.store._api import LoggingValueStore from modules.conftest import SAMPLE_IP from modules.devices.fronius.fronius import counter_sm from modules.devices.fronius.fronius.config import FroniusConfiguration, FroniusSmCounterSetup -from test_utils.mock_ramdisk import MockRamdisk -@pytest.fixture -def mock_ramdisk(monkeypatch): - monkeypatch.setattr(compatibility, "is_ramdisk_in_use", lambda: True) - return MockRamdisk(monkeypatch) - - -def test_update_grid(monkeypatch, requests_mock: requests_mock.Mocker, mock_ramdisk, mock_simcount): +def test_update_grid(monkeypatch, requests_mock: requests_mock.Mocker, mock_simcount): component_config = FroniusSmCounterSetup() assert component_config.configuration.variant == 0 device_config = FroniusConfiguration() @@ -50,7 +41,7 @@ def test_update_grid(monkeypatch, requests_mock: requests_mock.Mocker, mock_ramd assert counter_state.power == sum(counter_state.powers) -def test_update_grid_var2(monkeypatch, requests_mock: requests_mock.Mocker, mock_ramdisk, mock_simcount): +def test_update_grid_var2(monkeypatch, requests_mock: requests_mock.Mocker, mock_simcount): component_config = FroniusSmCounterSetup() component_config.configuration.variant = 2 device_config = FroniusConfiguration() @@ -81,7 +72,7 @@ def test_update_grid_var2(monkeypatch, requests_mock: requests_mock.Mocker, mock assert counter_state.voltages == [232.3, 231.5, 233.4] -def test_update_external_var2(monkeypatch, requests_mock: requests_mock.Mocker, mock_ramdisk, mock_simcount): +def test_update_external_var2(monkeypatch, requests_mock: requests_mock.Mocker, mock_simcount): component_config = FroniusSmCounterSetup() component_config.configuration.variant = 2 device_config = FroniusConfiguration() @@ -112,7 +103,7 @@ def test_update_external_var2(monkeypatch, requests_mock: requests_mock.Mocker, assert counter_state.voltages == [229.3, 228.8, 229.4] -def test_update_load(monkeypatch, requests_mock: requests_mock.Mocker, mock_ramdisk, mock_simcount): +def test_update_load(monkeypatch, requests_mock: requests_mock.Mocker, mock_simcount): component_config = FroniusSmCounterSetup() assert component_config.configuration.variant == 0 device_config = FroniusConfiguration() diff --git a/packages/modules/devices/fronius/fronius/inverter_production_meter_test.py b/packages/modules/devices/fronius/fronius/inverter_production_meter_test.py index 8fddaafb65..fe7e6fc285 100644 --- a/packages/modules/devices/fronius/fronius/inverter_production_meter_test.py +++ b/packages/modules/devices/fronius/fronius/inverter_production_meter_test.py @@ -1,21 +1,12 @@ from unittest.mock import Mock -import pytest import requests_mock from dataclass_utils import dataclass_from_dict -from helpermodules import compatibility from modules.conftest import SAMPLE_IP from modules.common.component_state import InverterState from modules.devices.fronius.fronius import inverter_production_meter from modules.devices.fronius.fronius.config import FroniusConfiguration, FroniusProductionMeterSetup -from test_utils.mock_ramdisk import MockRamdisk - - -@pytest.fixture -def mock_ramdisk(monkeypatch): - monkeypatch.setattr(compatibility, "is_ramdisk_in_use", lambda: True) - return MockRamdisk(monkeypatch) def test_production_count(monkeypatch, requests_mock: requests_mock.mock): diff --git a/packages/modules/devices/lg/lg/lg_test.py b/packages/modules/devices/lg/lg/lg_test.py index 91605ccfcc..0124602874 100644 --- a/packages/modules/devices/lg/lg/lg_test.py +++ b/packages/modules/devices/lg/lg/lg_test.py @@ -8,12 +8,6 @@ from modules.devices.lg.lg import device from modules.devices.lg.lg.device import create_device from modules.devices.lg.lg.config import LG, LgConfiguration -from test_utils.mock_ramdisk import MockRamdisk - - -@pytest.fixture -def mock_ramdisk(monkeypatch): - return MockRamdisk(monkeypatch) @pytest.fixture diff --git a/packages/modules/devices/sma/sma_shm/counter_test.py b/packages/modules/devices/sma/sma_shm/counter_test.py index 33fc7ee062..2d9c31700b 100644 --- a/packages/modules/devices/sma/sma_shm/counter_test.py +++ b/packages/modules/devices/sma/sma_shm/counter_test.py @@ -1,9 +1,7 @@ import base64 -import pytest -from helpermodules import compatibility +from modules.common.component_state import CounterState from modules.devices.sma.sma_shm import counter, speedwiredecoder -from test_utils.mock_ramdisk import MockRamdisk # This sample was collected from an SMA Energy Meter with Firmware 2.0.18.R on 2021-12-22: SAMPLE_SMA_ENERGY_EM = """ @@ -21,13 +19,7 @@ """ -@pytest.fixture -def mock_ramdisk(monkeypatch): - monkeypatch.setattr(compatibility, "is_ramdisk_in_use", lambda: True) - return MockRamdisk(monkeypatch) - - -def test_process_datagram_energy_meter(mock_ramdisk): +def test_process_datagram_energy_meter(): # setup data = base64.b64decode(SAMPLE_SMA_ENERGY_EM) sma_data = speedwiredecoder.decode_speedwire(data) @@ -38,18 +30,12 @@ def test_process_datagram_energy_meter(mock_ramdisk): sma_counter.read_datagram(sma_data) # evaluation - assert mock_ramdisk.files["wattbezug"] == "-11967" - assert mock_ramdisk.files["einspeisungkwh"] == "86688627.0" - assert mock_ramdisk.files["bezugkwh"] == "7500240.0" - assert mock_ramdisk.files["bezugw1"] == "-4077" - assert mock_ramdisk.files["bezugw2"] == "-4077" - assert mock_ramdisk.files["bezugw3"] == "-3813" - assert mock_ramdisk.files["bezuga1"] == "-17.16" - assert mock_ramdisk.files["bezuga2"] == "-17.1" - assert mock_ramdisk.files["bezuga3"] == "-16.02" - assert mock_ramdisk.files["evuv1"] == "238.438" - assert mock_ramdisk.files["evuv2"] == "239.298" - assert mock_ramdisk.files["evuv3"] == "238.738" - assert mock_ramdisk.files["evupf1"] == "0.999" - assert mock_ramdisk.files["evupf2"] == "0.999" - assert mock_ramdisk.files["evupf3"] == "1.0" + assert vars(sma_counter.store.delegate.delegate.state) == vars(CounterState(currents=[-17.16, -17.1, -16.02], + powers=[-4077.0, -4077.0, -3813.0], + voltages=[238.438, 239.298, 238.738], + power_factors=[0.999, 0.999, 1.0], + imported=7500240.0, + exported=86688627.0, + power=-11967.0, + frequency=50, + serial_number=None)) diff --git a/packages/modules/vehicles/kia/api.py b/packages/modules/vehicles/kia/api.py index ebb73d8400..1ab7b8fea4 100644 --- a/packages/modules/vehicles/kia/api.py +++ b/packages/modules/vehicles/kia/api.py @@ -12,7 +12,7 @@ import logging from modules.common.component_state import CarState -from modules.common.store import RAMDISK_PATH +from helpermodules.constants import RAMDISK_PATH log = logging.getLogger(__name__) @@ -297,7 +297,7 @@ def loadToken(user_id: str, password: str, vehicle: int) -> dict: log.exception("kia.loadToken: token file error: ") token = { "userHash": "" - } + } pass try: @@ -311,7 +311,7 @@ def loadToken(user_id: str, password: str, vehicle: int) -> dict: "refreshToken": "", "gcmClientId": "", "tokenType": "" - } + } except Exception: log.exception("kia.loadToken: token error") raise @@ -338,10 +338,10 @@ def getCookies(brand: str) -> dict: try: url = getString("base_url", brand) + \ - '/api/v1/user/oauth2/authorize?' + \ - 'response_type=code&state=test&client_id=' + \ - getString("client_id", brand) + '&redirect_uri=' + \ - getString("base_url", brand) + '/api/v1/user/oauth2/redirect' + '/api/v1/user/oauth2/authorize?' + \ + 'response_type=code&state=test&client_id=' + \ + getString("client_id", brand) + '&redirect_uri=' + \ + getString("base_url", brand) + '/api/v1/user/oauth2/redirect' cookies = getHTTPCookies(url) url = getString("base_url", brand) + '/api/v1/user/session' @@ -377,7 +377,7 @@ def getDeviceId(brand: str) -> dict: "pushRegId": getString("gcm_sender_id", brand), "pushType": "GCM", "uuid": str(uuid.uuid4()) - } + } headers = { 'Authorization': '', 'Ccsp-Device-Id': '', @@ -394,7 +394,7 @@ def getDeviceId(brand: str) -> dict: 'Accept-Encoding': 'gzip, deflate', 'User-Agent': 'okhttp/3.12.12', 'Stamp': getStamp(brand) - } + } response = postHTTP(url=url, data=data, headers=headers) response_dict = json.loads(response) @@ -417,7 +417,7 @@ def getDeviceId(brand: str) -> dict: "phoneType": 'SM-G988N', "osType": 'android', "osVer": '7.1.2' - } + } headers = { 'Ccsp-Device-Id': token["deviceId"], 'Ccsp-Service-Id': getString("client_id", brand), @@ -433,7 +433,7 @@ def getDeviceId(brand: str) -> dict: 'Accept-Encoding': 'gzip, deflate', 'User-Agent': 'okhttp/3.12.12', 'Stamp': getStamp(brand) - } + } response = postHTTP(url=url, data=data, headers=headers) except Exception: log.exception("kia.getDeviceId: Set version info failed: " + @@ -485,7 +485,7 @@ def getAuthCode(username: str, password: str, brand: str, 'Build/JRO03C) AppleWebKit/535.19 (KHTML, ' + 'like Gecko) Chrome/18.0.1025.166 Mobile ' + 'Safari/535.19_CCS_APP_AOS' - } + } cookies['AUTH_SESSION_ID'] = last_cookies['AUTH_SESSION_ID'] response = postHTTP(url=url, data=data, headers=headers, cookies=cookies, allow_redirects=False) @@ -536,7 +536,7 @@ def getAuthToken(auth_code: str, token: dict, brand: str) -> dict: 'Accept-Encoding': 'gzip, deflate', 'User-Agent': 'okhttp/3.12.12', 'Stamp': getStamp(brand) - } + } response = postHTTP(url=url, headers=headers, data=data) access_token = json.loads(response) @@ -558,7 +558,7 @@ def registerDevice(token: dict, brand: str) -> None: try: url = getString("base_url", brand) + '/api/v1/spa/notifications/' + \ - token["deviceId"] + '/register' + token["deviceId"] + '/register' data = {} headers = { 'Authorization': token["tokenType"] + ' ' + token["accessToken"], @@ -575,7 +575,7 @@ def registerDevice(token: dict, brand: str) -> None: 'Accept-Encoding': 'gzip, deflate', 'User-Agent': 'okhttp/3.12.12', 'Stamp': getStamp(brand) - } + } response = postHTTP(url=url, data=data, headers=headers) except Exception: log.exception("kia.getAuthToken: Login failed: " + response) @@ -627,7 +627,7 @@ def refreshToken(token: dict, brand: str) -> dict: 'Accept-Encoding': 'gzip, deflate', 'User-Agent': 'okhttp/3.12.12', 'Stamp': getStamp(brand) - } + } response = postHTTP(url=url, headers=headers, data=data) @@ -660,7 +660,7 @@ def getControlToken(pin: str, token: dict, brand: str) -> str: 'Connection': 'close', 'Accept-Encoding': 'gzip, deflate', 'User-Agent': 'okhttp/3.12.12' - } + } response = putHTTP(url=url, data=data, headers=headers) response_dict = json.loads(response) @@ -697,7 +697,7 @@ def getVehicleId(vin: str, token: dict, brand: str) -> str: 'Accept-Encoding': 'gzip, deflate', 'User-Agent': 'okhttp/3.12.12', 'Stamp': getStamp(brand) - } + } response = getHTTP(url=url, headers=headers) vehicle_id = "" @@ -726,7 +726,7 @@ def doPrewakeup(vehicle_id: str, token: dict, brand: str) -> None: try: url = getString("base_url", brand) + '/api/v1/spa/vehicles/' +\ - vehicle_id + '/control/engine' + vehicle_id + '/control/engine' data = {"action": "prewakeup", "deviceId": token["deviceId"]} headers = { 'Authorization': token["tokenType"] + ' ' + token["accessToken"], @@ -741,7 +741,7 @@ def doPrewakeup(vehicle_id: str, token: dict, brand: str) -> None: 'Accept-Encoding': 'gzip, deflate', 'User-Agent': 'okhttp/3.12.12', 'Stamp': getStamp(brand) - } + } response = postHTTP(url=url, data=data, headers=headers, timeout=125) except Exception: log.exception("kia.doPrewakeup: error: " + response) @@ -756,7 +756,7 @@ def getStatusFull(vehicle_id: str, control_token: str, try: url = getString("base_url", brand) + '/api/v2/spa/vehicles/' + \ - vehicle_id + '/ccs2/carstatus' + vehicle_id + '/ccs2/carstatus' headers = { 'Authorization': control_token, 'Ccsp-Device-Id': token["deviceId"], @@ -771,7 +771,7 @@ def getStatusFull(vehicle_id: str, control_token: str, 'Accept-Encoding': 'gzip, deflate', 'User-Agent': 'okhttp/3.12.12', 'Stamp': getStamp(brand) - } + } response = getHTTP(url=url, headers=headers, timeout=125) except Exception: log.exception("kia.getStatusFull: triggering update error: " + @@ -785,7 +785,7 @@ def getStatusFull(vehicle_id: str, control_token: str, try: url = getString("base_url", brand) + '/api/v1/spa/vehicles/' + \ - vehicle_id + '/ccs2/carstatus/latest' + vehicle_id + '/ccs2/carstatus/latest' headers = { 'Authorization': token["tokenType"] + ' ' + token["accessToken"], 'Ccsp-Device-Id': token["deviceId"], @@ -800,7 +800,7 @@ def getStatusFull(vehicle_id: str, control_token: str, 'Accept-Encoding': 'gzip, deflate', 'User-Agent': 'okhttp/3.12.12', 'Stamp': getStamp(brand) - } + } response = getHTTP(url=url, headers=headers) response_dict = json.loads(response) diff --git a/packages/modules/vehicles/polestar/auth.py b/packages/modules/vehicles/polestar/auth.py index 9e81c132e9..add13aaff6 100755 --- a/packages/modules/vehicles/polestar/auth.py +++ b/packages/modules/vehicles/polestar/auth.py @@ -6,7 +6,7 @@ from datetime import datetime, timedelta import base64 import hashlib -from modules.common.store import RAMDISK_PATH +from helpermodules.constants import RAMDISK_PATH from typing import Optional AUTH_CLIENT_ID = 'l3oopkc_10' @@ -168,7 +168,7 @@ def _get_auth_code(self) -> Optional[str]: params = { "grant_type": "authorization_code", 'client_id': AUTH_CLIENT_ID, - } + } data = { 'pf.username': self.username, 'pf.pass': self.password diff --git a/packages/modules/vehicles/vwgroup/vwgroup.py b/packages/modules/vehicles/vwgroup/vwgroup.py index 35a92d0d94..f6b4307363 100644 --- a/packages/modules/vehicles/vwgroup/vwgroup.py +++ b/packages/modules/vehicles/vwgroup/vwgroup.py @@ -5,7 +5,7 @@ import logging from time import mktime, time from typing import Union -from modules.common.store import RAMDISK_PATH +from helpermodules.constants import RAMDISK_PATH from modules.vehicles.vwgroup.socutils import socUtils date_fmt = '%Y-%m-%d %H:%M:%S' diff --git a/packages/modules/vehicles/vwid/libeuda.py b/packages/modules/vehicles/vwid/libeuda.py index e0f21a25d0..adfa8fa286 100755 --- a/packages/modules/vehicles/vwid/libeuda.py +++ b/packages/modules/vehicles/vwid/libeuda.py @@ -24,7 +24,7 @@ import os.path from pathlib import Path from collections import deque -from modules.common.store import RAMDISK_PATH +from helpermodules.constants import RAMDISK_PATH from modules.common.abstract_vehicle import VehicleUpdateData from modules.vehicles.vwid.config import VWId diff --git a/packages/test_utils/mock_ramdisk.py b/packages/test_utils/mock_ramdisk.py deleted file mode 100644 index bd68a2e999..0000000000 --- a/packages/test_utils/mock_ramdisk.py +++ /dev/null @@ -1,42 +0,0 @@ -from pathlib import Path - -from modules.common.store import RAMDISK_PATH - - -class MockRamdisk: - def __init__(self, monkeypatch): - self.files = {} - original_read_text = Path.read_text - original_write_text = Path.write_text - - def mock_read_text(file: Path): - try: - relative = file.relative_to(RAMDISK_PATH) - except ValueError: - return original_read_text(file) - return self[str(relative)] - - def mock_write_text(file: Path, content: str): - try: - relative = file.relative_to(RAMDISK_PATH) - except ValueError: - original_write_text(file, content) - return - self[str(relative)] = content - - monkeypatch.setattr(Path, 'read_text', mock_read_text) - monkeypatch.setattr(Path, 'write_text', mock_write_text) - - def __setitem__(self, key, value): - if not isinstance(value, str): - raise TypeError("only strings are allowed") - self.files[key] = value - - def __getitem__(self, item): - try: - return self.files.__getitem__(item) - except KeyError: - raise FileNotFoundError() - - def __str__(self): - return "Mock ramdisk: " + str(self.files) From fe99b3258181dcdcf8f052f253fbdab1ccaac5c4 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Tue, 7 Jul 2026 16:45:51 +0200 Subject: [PATCH 2/7] remove module legacy code --- .../modules/devices/batterx/batterx/device.py | 69 +------------ packages/modules/devices/deye/deye/device.py | 40 +------- .../discovergy/discovergy/device test.py | 81 --------------- .../devices/discovergy/discovergy/device.py | 24 ----- packages/modules/devices/e3dc/e3dc/device.py | 99 ++----------------- .../modules/devices/fems/fems/device test.py | 26 ----- packages/modules/devices/fems/fems/device.py | 40 +------- .../modules/devices/generic/http/device.py | 80 +-------------- .../modules/devices/generic/json/device.py | 48 +-------- .../devices/kostal/kostal_piko_old/device.py | 34 +------ .../devices/powerfox/powerfox/device.py | 20 +--- packages/modules/devices/rct/rct/device.py | 36 +------ .../modules/devices/sma/sma_shm/device.py | 30 +----- .../devices/smart_me/smart_me/device.py | 22 +---- .../devices/smartfox/smartfox/device.py | 15 +-- .../devices/solar_log/solar_log/device.py | 35 +------ .../devices/solar_view/solar_view/device.py | 24 +---- .../devices/solar_watt/solar_watt/device.py | 40 +------- .../devices/solar_world/solar_world/device.py | 34 +------ .../devices/solarmax/solarmax/device.py | 32 +----- .../modules/devices/youless/youless/device.py | 35 +------ packages/modules/vehicles/tesla/soc.py | 29 +----- 22 files changed, 36 insertions(+), 857 deletions(-) delete mode 100644 packages/modules/devices/discovergy/discovergy/device test.py diff --git a/packages/modules/devices/batterx/batterx/device.py b/packages/modules/devices/batterx/batterx/device.py index 7bc302d5ad..631d7ad4b8 100644 --- a/packages/modules/devices/batterx/batterx/device.py +++ b/packages/modules/devices/batterx/batterx/device.py @@ -1,12 +1,10 @@ #!/usr/bin/env python3 import logging -from typing import Iterable, Optional, Union, List +from typing import Iterable, Union -from helpermodules.cli import run_using_positional_cli_args from modules.common.abstract_device import DeviceDescriptor -from modules.common.component_context import MultiComponentUpdateContext, SingleComponentUpdateContext +from modules.common.component_context import SingleComponentUpdateContext from modules.common.configurable_device import ComponentFactoryByType, ConfigurableDevice, MultiComponentUpdater -from modules.common.store import get_inverter_value_store from modules.devices.batterx.batterx import bat, external_inverter from modules.devices.batterx.batterx import counter from modules.devices.batterx.batterx import inverter @@ -56,68 +54,5 @@ def update_components(components: Iterable[batterx_component_classes]): ) -COMPONENT_TYPE_TO_MODULE = { - "bat": bat, - "counter": counter, - "inverter": inverter, - "external_inverter": external_inverter -} - - -def read_legacy( - component_type: str, - ip_address: str, - num: Optional[int] = None, - evu_counter: Optional[str] = None, - bat_module: Optional[str] = None, - ext_inverter: int = 0) -> None: - - device_config = BatterX() - device_config.configuration.ip_address = ip_address - dev = create_device(device_config) - dev = _add_component(dev, component_type, num) - if evu_counter == "bezug_batterx": - dev = _add_component(dev, "counter", 0) - if bat_module == "speicher_batterx": - dev = _add_component(dev, "bat", 3) - - log.debug('BatterX IP-Adresse: ' + ip_address) - log.debug('BatterX externer WR: ' + str(ext_inverter)) - - with MultiComponentUpdateContext(dev.components): - resp_json = req.get_http_session().get( - 'http://' + ip_address + '/api.php?get=currentstate', - timeout=5).json() - for component in dev.components.values(): - if isinstance(component, (bat.BatterXBat, counter.BatterXCounter)): - component.update(resp_json) - elif isinstance(component, inverter.BatterXInverter): - if ext_inverter == 0: - component.update(resp_json) - else: - dev = _add_component(dev, "external_inverter", 4) - power = component.get_power(resp_json) - power_ext = dev.components["component4"].get_power(resp_json) - state = component.get_inverter_state(power+power_ext) - get_inverter_value_store(num).set(state) - - -def _add_component(dev: ConfigurableDevice, component_type: str, num: Optional[int]) -> ConfigurableDevice: - if component_type in COMPONENT_TYPE_TO_MODULE: - component_config = COMPONENT_TYPE_TO_MODULE[component_type].component_descriptor.configuration_factory() - else: - raise Exception( - "illegal component type " + component_type + ". Allowed values: " + - ','.join(COMPONENT_TYPE_TO_MODULE.keys()) - ) - component_config.id = num - dev.add_component(component_config) - return dev - - -def main(argv: List[str]) -> None: - run_using_positional_cli_args(read_legacy, argv) - - device_descriptor = DeviceDescriptor(configuration_factory=BatterX, compatibility_bat_note="Kann Entladung nur komplett sperren.") diff --git a/packages/modules/devices/deye/deye/device.py b/packages/modules/devices/deye/deye/device.py index feba6592da..a58fd91513 100644 --- a/packages/modules/devices/deye/deye/device.py +++ b/packages/modules/devices/deye/deye/device.py @@ -1,8 +1,7 @@ #!/usr/bin/env python3 import logging -from typing import Iterable, Optional, List, Union +from typing import Iterable, Union -from helpermodules.cli import run_using_positional_cli_args from modules.common.abstract_device import DeviceDescriptor from modules.common.component_context import SingleComponentUpdateContext from modules.common.configurable_device import ConfigurableDevice, ComponentFactoryByType, MultiComponentUpdater @@ -10,8 +9,7 @@ from modules.devices.deye.deye.bat import DeyeBat from modules.devices.deye.deye.counter import DeyeCounter from modules.devices.deye.deye.inverter import DeyeInverter -from modules.devices.deye.deye import bat, counter, inverter -from modules.devices.deye.deye.config import Deye, DeyeBatSetup, DeyeConfiguration, DeyeCounterSetup, DeyeInverterSetup +from modules.devices.deye.deye.config import Deye, DeyeBatSetup, DeyeCounterSetup, DeyeInverterSetup log = logging.getLogger(__name__) @@ -50,40 +48,6 @@ def initializer(): ) -COMPONENT_TYPE_TO_MODULE = { - "bat": bat, - "counter": counter, - "inverter": inverter -} - - -def read_legacy(component_type: str, ip_address: str, port: int, modbus_id: int, num: Optional[int] = None) -> None: - device_config = Deye(configuration=DeyeConfiguration( - port=port, ip_address=ip_address)) - - dev = create_device(device_config) - if component_type in COMPONENT_TYPE_TO_MODULE: - component_config = COMPONENT_TYPE_TO_MODULE[component_type].component_descriptor.configuration_factory() - else: - raise Exception( - "illegal component type " + component_type + ". Allowed values: " + - ','.join(COMPONENT_TYPE_TO_MODULE.keys()) - ) - component_config.configuration.modbus_id = modbus_id - component_config.id = num - dev.add_component(component_config) - - log.debug('Deye Port: ' + str(port)) - log.debug('Deye ID: ' + str(modbus_id)) - log.debug('Deye IP-Adresse: ' + ip_address) - - dev.update() - - -def main(argv: List[str]): - run_using_positional_cli_args(read_legacy, argv) - - device_descriptor = DeviceDescriptor( configuration_factory=Deye, compatibility_device_note="Einige Versionen des LSE3 Dongles sind kompatibel. Die Auslesung über den LSW3 ist " diff --git a/packages/modules/devices/discovergy/discovergy/device test.py b/packages/modules/devices/discovergy/discovergy/device test.py deleted file mode 100644 index eefe1576fb..0000000000 --- a/packages/modules/devices/discovergy/discovergy/device test.py +++ /dev/null @@ -1,81 +0,0 @@ -from unittest.mock import Mock - -import pytest - -from modules.common.component_state import CounterState -from modules.common.component_state import InverterState -from modules.devices.discovergy.discovergy import api, counter, inverter -from modules.devices.discovergy.discovergy.device import read_legacy - -SAMPLE_COUNTER_STATE = CounterState( - imported=1, - exported=2, - power=3, - voltages=[4, 5, 6], - currents=[7, 8, 9], - powers=[10, 11, 12], -) -SAMPLE_INVERTER_STATE = InverterState( - exported=2, - power=3, - currents=[7, 8, 9], -) -SAMPLE_USER = "some username" -SAMPLE_PASSWORD = "some password" -SAMPLE_COUNTER_METER_ID = "some counter meter id" -SAMPLE_INVERTER_METER_ID = "some inverter meter id" - - -class TestDiscovergyDevice: - @pytest.fixture(autouse=True) - def setup(self, monkeypatch): - self.mock_counter_value_store = Mock() - self.mock_inverter_value_store = Mock() - self.mock_get_last_reading = Mock(return_value=SAMPLE_COUNTER_STATE) - monkeypatch.setattr(counter, 'get_counter_value_store', Mock(return_value=self.mock_counter_value_store)) - monkeypatch.setattr(inverter, 'get_inverter_value_store', Mock(return_value=self.mock_inverter_value_store)) - monkeypatch.setattr(api, 'get_last_reading', self.mock_get_last_reading) - - def test_read_legacy_reads_counter(self, monkeypatch): - # execution - read_legacy(SAMPLE_USER, SAMPLE_PASSWORD, SAMPLE_COUNTER_METER_ID, "") - - # evaluation - self.assert_get_last_reading_called(SAMPLE_COUNTER_METER_ID) - self.assert_counter_state_set() - - def test_read_legacy_reads_inverter(self): - # execution - read_legacy(SAMPLE_USER, SAMPLE_PASSWORD, "", SAMPLE_INVERTER_METER_ID) - - # evaluation - self.assert_get_last_reading_called(SAMPLE_INVERTER_METER_ID) - self.assert_inverter_state_set() - - def test_read_legacy_reads_counter_and_inverter(self): - # execution - read_legacy(SAMPLE_USER, SAMPLE_PASSWORD, SAMPLE_COUNTER_METER_ID, SAMPLE_INVERTER_METER_ID) - - # evaluation - self.assert_get_last_reading_called(SAMPLE_COUNTER_METER_ID, SAMPLE_INVERTER_METER_ID) - self.assert_inverter_state_set() - self.assert_counter_state_set() - - def assert_get_last_reading_called(self, *meter_ids): - assert self.mock_get_last_reading.call_count == len(meter_ids) - # Check that one call was made for each meter_id, ignoring order: - assert sorted(call_args[0][1] for call_args in self.mock_get_last_reading.call_args_list) == sorted(meter_ids) - # Check that credentials were passed along each call: - for call_args in self.mock_get_last_reading.call_args_list: - assert call_args[0][0].auth == (SAMPLE_USER, SAMPLE_PASSWORD) - - def assert_counter_state_set(self): - assert self.mock_counter_value_store.set.call_count == 1 - assert self.mock_counter_value_store.set.call_args[0][0] is SAMPLE_COUNTER_STATE - - def assert_inverter_state_set(self): - assert self.mock_inverter_value_store.set.call_count == 1 - inverter_state = self.mock_inverter_value_store.set.call_args[0][0] # type: InverterState - assert inverter_state.power == SAMPLE_INVERTER_STATE.power - assert inverter_state.currents == SAMPLE_INVERTER_STATE.currents - assert inverter_state.exported == SAMPLE_INVERTER_STATE.exported diff --git a/packages/modules/devices/discovergy/discovergy/device.py b/packages/modules/devices/discovergy/discovergy/device.py index c9bb1f125b..75d237ab71 100644 --- a/packages/modules/devices/discovergy/discovergy/device.py +++ b/packages/modules/devices/discovergy/discovergy/device.py @@ -1,17 +1,12 @@ import logging -from typing import List -from helpermodules.cli import run_using_positional_cli_args from modules.common.abstract_device import DeviceDescriptor from modules.common.configurable_device import ConfigurableDevice, ComponentFactoryByType, IndependentComponentUpdater from modules.common.req import get_http_session from modules.devices.discovergy.discovergy import counter, inverter from modules.devices.discovergy.discovergy.config import ( Discovergy, - DiscovergyConfiguration, - DiscovergyCounterConfiguration, DiscovergyCounterSetup, - DiscovergyInverterConfiguration, DiscovergyInverterSetup) log = logging.getLogger(__name__) @@ -39,23 +34,4 @@ def initializer(): ) -def read_legacy(user: str, password: str, meter_id_counter: str, meter_id_inverter: str): - log.debug("Beginning update") - device = create_device(Discovergy(configuration=DiscovergyConfiguration(user=user, password=password))) - if meter_id_counter: - device.add_component(DiscovergyCounterSetup( - id=None, configuration=DiscovergyCounterConfiguration(meter_id=meter_id_counter) - )) - if meter_id_inverter: - device.add_component(DiscovergyInverterSetup( - id=1, configuration=DiscovergyInverterConfiguration(meter_id=meter_id_inverter) - )) - device.update() - log.debug("Update completed") - - -def main(argv: List[str]): - run_using_positional_cli_args(read_legacy, argv) - - device_descriptor = DeviceDescriptor(configuration_factory=Discovergy) diff --git a/packages/modules/devices/e3dc/e3dc/device.py b/packages/modules/devices/e3dc/e3dc/device.py index cc56477ed9..befe5f8bcc 100644 --- a/packages/modules/devices/e3dc/e3dc/device.py +++ b/packages/modules/devices/e3dc/e3dc/device.py @@ -1,24 +1,19 @@ #!/usr/bin/env python3 import logging -from typing import List, Union, Iterable +from typing import Union, Iterable -from helpermodules.cli import run_using_positional_cli_args 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 import modbus -from modules.devices.e3dc.e3dc.bat import E3dcBat, read_bat -from modules.devices.e3dc.e3dc.inverter import E3dcInverter, read_inverter -from modules.devices.e3dc.e3dc.external_inverter import E3dcExternalInverter, read_external_inverter +from modules.devices.e3dc.e3dc.bat import E3dcBat +from modules.devices.e3dc.e3dc.inverter import E3dcInverter +from modules.devices.e3dc.e3dc.external_inverter import E3dcExternalInverter from modules.devices.e3dc.e3dc.counter import E3dcCounter -from modules.devices.e3dc.e3dc.config import E3dc, E3dcConfiguration +from modules.devices.e3dc.e3dc.config import E3dc from modules.devices.e3dc.e3dc.config import E3dcBatSetup -from modules.devices.e3dc.e3dc.config import E3dcCounterSetup, E3dcCounterConfiguration +from modules.devices.e3dc.e3dc.config import E3dcCounterSetup from modules.devices.e3dc.e3dc.config import E3dcInverterSetup, E3dcExternalInverterSetup -from modules.common.store.ramdisk import files -from modules.common.simcount import sim_count -from modules.common.store import get_inverter_value_store, get_bat_value_store -from modules.common.component_state import InverterState, BatState log = logging.getLogger(__name__) @@ -74,86 +69,4 @@ def initializer(): ) -def run_device_legacy(device_config: E3dc, - component_config: Union[E3dcBatSetup, E3dcCounterSetup, E3dcInverterSetup]) -> None: - device = create_device(device_config) - device.add_component(component_config) - # do not log complete config objects as these will contain german umlauts and logging will fail in Version 1.9 - log.debug("E3dc Configuration: %s, Component Configuration: %s", - device_config.configuration, component_config.configuration) - device.update() - - -def create_legacy_device_config(address: str, - num: int) -> E3dc: - device_config = E3dc(configuration=E3dcConfiguration(address=address), - id=num) - log.debug("Config: %s", device_config) - return device_config - - -def read_legacy_counter(address1: str, num: int) -> None: - component_config = E3dcCounterSetup(configuration=E3dcCounterConfiguration()) - component_config.id = num - run_device_legacy(create_legacy_device_config(address1, - num), component_config) - - -def read_legacy_bat(address1: str, - address2: str, read_ext_input: int, - pv_module: str, - num: int) -> None: - # für Openwb Version 1.9 können mit der bisherigen Parametrisierung zwei IP-Adressen ausgelesen werden - # ebenso wird bei Speicheraufruf Speicher und PV ausgelesen - # in openwb v2.0 geht nur noch eine IP Adresse und die Pv muss separat ausgelesen werden - addresses = [address for address in [address1, address2] if address != "none"] - read_ext = (read_ext_input == 1) - log.debug('e3dc IP-Adresse1: %s', address1) - log.debug('e3dc IP-Adresse2: %s', address2) - log.debug('e3dc read_ext: %s', read_ext) - log.debug('e3dc pv_module: %s', pv_module) - log.debug('e3dc id: %d', num) - soc = 0 # type: Union[int, float] - power = 0 - pv_external = 0 - pv = 0 - pv_other = pv_module != "none" - for address in addresses: - log.debug("Ip: %s, read_external %s pv_other %s", address, read_ext, pv_other) - with modbus.ModbusTcpClient_(address, port=502) as client: - soc_tmp, power_tmp = read_bat(client, 1) - soc += soc_tmp - power += power_tmp - pv_tmp = read_inverter(client, 1) - if read_ext: - pv_external_tmp = read_external_inverter(client, 1) - else: - pv_external_tmp = 0 - pv += pv_tmp - pv_external += pv_external_tmp - soc /= len(addresses) - log.debug("Soc %d power %d pv %d pv_external %d", - soc, power, pv, pv_external) - counter_import, counter_export = sim_count(power, prefix="speicher") - get_bat_value_store(1).set(BatState(power=power, soc=soc, imported=counter_import, exported=counter_export)) - # pv_other sagt aus, ob WR definiert ist, und dessen PV Leistung auch gilt - # wenn 0 gilt nur PV und pv_external aus e3dc - pv_total = pv + pv_external - # Wenn wr1 nicht definiert ist, gilt nur die PV Leistung die hier im Modul ermittelt wurde - # als gesamte PV Leistung für wr1 - # Wenn wr1 definiert ist, gilt die bestehende PV Leistung aus Wr1 und das was hier im Modul ermittelt wurde - # als gesamte PV Leistung für wr1 - if pv_other: - pv_total = pv_total + files.pv[0].power.read() - log.debug("wr update pv_other %s pv_total %d", pv_other, pv_total) - _, exported_pv = sim_count(pv_total, prefix="pv") - get_inverter_value_store(num).set(InverterState(exported=exported_pv, power=pv_total)) - - -def main(argv: List[str]) -> None: - run_using_positional_cli_args( - {"bat": read_legacy_bat, "counter": read_legacy_counter}, argv - ) - - device_descriptor = DeviceDescriptor(configuration_factory=E3dc) diff --git a/packages/modules/devices/fems/fems/device test.py b/packages/modules/devices/fems/fems/device test.py index eefe1576fb..49edefab69 100644 --- a/packages/modules/devices/fems/fems/device test.py +++ b/packages/modules/devices/fems/fems/device test.py @@ -5,7 +5,6 @@ from modules.common.component_state import CounterState from modules.common.component_state import InverterState from modules.devices.discovergy.discovergy import api, counter, inverter -from modules.devices.discovergy.discovergy.device import read_legacy SAMPLE_COUNTER_STATE = CounterState( imported=1, @@ -36,31 +35,6 @@ def setup(self, monkeypatch): monkeypatch.setattr(inverter, 'get_inverter_value_store', Mock(return_value=self.mock_inverter_value_store)) monkeypatch.setattr(api, 'get_last_reading', self.mock_get_last_reading) - def test_read_legacy_reads_counter(self, monkeypatch): - # execution - read_legacy(SAMPLE_USER, SAMPLE_PASSWORD, SAMPLE_COUNTER_METER_ID, "") - - # evaluation - self.assert_get_last_reading_called(SAMPLE_COUNTER_METER_ID) - self.assert_counter_state_set() - - def test_read_legacy_reads_inverter(self): - # execution - read_legacy(SAMPLE_USER, SAMPLE_PASSWORD, "", SAMPLE_INVERTER_METER_ID) - - # evaluation - self.assert_get_last_reading_called(SAMPLE_INVERTER_METER_ID) - self.assert_inverter_state_set() - - def test_read_legacy_reads_counter_and_inverter(self): - # execution - read_legacy(SAMPLE_USER, SAMPLE_PASSWORD, SAMPLE_COUNTER_METER_ID, SAMPLE_INVERTER_METER_ID) - - # evaluation - self.assert_get_last_reading_called(SAMPLE_COUNTER_METER_ID, SAMPLE_INVERTER_METER_ID) - self.assert_inverter_state_set() - self.assert_counter_state_set() - def assert_get_last_reading_called(self, *meter_ids): assert self.mock_get_last_reading.call_count == len(meter_ids) # Check that one call was made for each meter_id, ignoring order: diff --git a/packages/modules/devices/fems/fems/device.py b/packages/modules/devices/fems/fems/device.py index a5ac9c9c46..93635f8d0b 100644 --- a/packages/modules/devices/fems/fems/device.py +++ b/packages/modules/devices/fems/fems/device.py @@ -1,13 +1,12 @@ #!/usr/bin/env python3 import logging -from typing import Iterable, Optional, List, Union +from typing import Iterable, Union -from helpermodules.cli import run_using_positional_cli_args from modules.common import req from modules.common.abstract_device import DeviceDescriptor from modules.common.configurable_device import ConfigurableDevice, ComponentFactoryByType, MultiComponentUpdater from modules.devices.fems.fems import bat, counter, inverter -from modules.devices.fems.fems.config import Fems, FemsBatSetup, FemsConfiguration, FemsCounterSetup, FemsInverterSetup +from modules.devices.fems.fems.config import Fems, FemsBatSetup, FemsCounterSetup, FemsInverterSetup log = logging.getLogger(__name__) @@ -46,39 +45,4 @@ def initializer(): ) -COMPONENT_TYPE_TO_MODULE = { - "bat": bat, - "counter": counter, - "inverter": inverter, -} - - -def read_legacy(component_type: str, - ip_address: str, - password: str, - bat_num: Optional[int] = None, - num: Optional[int] = None) -> None: - dev = create_device(Fems(configuration=FemsConfiguration(ip_address=ip_address, password=password))) - if component_type in COMPONENT_TYPE_TO_MODULE: - component_config = COMPONENT_TYPE_TO_MODULE[component_type].component_descriptor.configuration_factory() - else: - raise Exception( - "illegal component type " + component_type + ". Allowed values: " + - ','.join(COMPONENT_TYPE_TO_MODULE.keys()) - ) - component_config.id = num - if component_type == "bat": - component_config.configuration.num = bat_num + 1 - dev.add_component(component_config) - - log.debug('Fems IP-Adresse: ' + ip_address) - log.debug('Fems Password: ' + password) - - dev.update() - - -def main(argv: List[str]) -> None: - run_using_positional_cli_args(read_legacy, argv) - - device_descriptor = DeviceDescriptor(configuration_factory=Fems) diff --git a/packages/modules/devices/generic/http/device.py b/packages/modules/devices/generic/http/device.py index 34662d71de..89a67d4ebc 100644 --- a/packages/modules/devices/generic/http/device.py +++ b/packages/modules/devices/generic/http/device.py @@ -1,17 +1,12 @@ #!/usr/bin/env python3 import logging -import re -from typing import Union, List -from helpermodules.cli import run_using_positional_cli_args from modules.common import req from modules.common.abstract_device import DeviceDescriptor from modules.common.configurable_device import ConfigurableDevice, ComponentFactoryByType, IndependentComponentUpdater from modules.devices.generic.http.bat import HttpBat -from modules.devices.generic.http.config import (HTTP, HTTPConfiguration, HttpBatSetup, HttpCounterSetup, - HttpInverterSetup, - HttpBatConfiguration, HttpCounterConfiguration, - HttpInverterConfiguration) +from modules.devices.generic.http.config import (HTTP, HttpBatSetup, HttpCounterSetup, + HttpInverterSetup) from modules.devices.generic.http.counter import HttpCounter from modules.devices.generic.http.inverter import HttpInverter @@ -52,75 +47,4 @@ def initializer(): ) -def create_paths_dict(**kwargs): - regex = re.compile("^(https?://[^/]+)(.*)") - result = {} - host_scheme = None - for key, path in kwargs.items(): - if path != "none" and path != "": - match = regex.search(path) - if match is None: - raise Exception("Invalid URL <" + path + ">: Absolute HTTP or HTTPS URL required") - if host_scheme is None: - host_scheme = match.group(1) - elif host_scheme != match.group(1): - raise Exception("All URLs must have the same scheme and host. However URLs are: " + str(kwargs)) - result[key] = match.group(2) - return result - - -def run_device_legacy(device_config: HTTP, component_config: Union[HttpBatSetup, HttpCounterSetup, HttpInverterSetup]): - device = create_device(device_config) - device.add_component(component_config) - log.debug("HTTP Configuration: %s, Component Configuration: %s", device_config, component_config) - device.update() - - -def create_legacy_device_config(url: str): - regex = re.compile("^(https?://[^/]+)(.*)") - match = regex.search(url) - if match is None: - raise Exception("Invalid URL <" + url + ">: Absolute HTTP or HTTPS URL required") - host_scheme = match.group(1) - device_config = HTTP(configuration=HTTPConfiguration(url=host_scheme)) - return device_config - - -def read_legacy_bat(power_path: str, imported_path: str, exported_path: str, soc_path: str) -> None: - component_config = HttpBatSetup(configuration=HttpBatConfiguration(**create_paths_dict( - power_path=power_path, - imported_path=imported_path, - exported_path=exported_path, - soc_path=soc_path, - ))) - run_device_legacy(create_legacy_device_config(power_path), component_config) - - -def read_legacy_counter(power_path: str, imported_path: str, exported_path: str, current_l1_path: str, - current_l2_path: str, current_l3_path: str): - component_config = HttpCounterSetup(configuration=HttpCounterConfiguration(**create_paths_dict( - power_path=power_path, - imported_path=imported_path, - exported_path=exported_path, - current_l1_path=current_l1_path, - current_l2_path=current_l2_path, - current_l3_path=current_l3_path, - ))) - run_device_legacy(create_legacy_device_config(power_path), component_config) - - -def read_legacy_inverter(power_path: str, exported_path: str, num: int): - component_config = HttpInverterSetup(id=num, configuration=HttpInverterConfiguration(**create_paths_dict( - power_path=power_path, - exported_path=exported_path, - ))) - run_device_legacy(create_legacy_device_config(power_path), component_config) - - -def main(argv: List[str]): - run_using_positional_cli_args( - {"bat": read_legacy_bat, "counter": read_legacy_counter, "inverter": read_legacy_inverter}, argv - ) - - device_descriptor = DeviceDescriptor(configuration_factory=HTTP) diff --git a/packages/modules/devices/generic/json/device.py b/packages/modules/devices/generic/json/device.py index a02c5c8012..0d34c4bc27 100644 --- a/packages/modules/devices/generic/json/device.py +++ b/packages/modules/devices/generic/json/device.py @@ -1,21 +1,15 @@ #!/usr/bin/env python3 import logging -from typing import List, Union, Iterable +from typing import Union, Iterable -from helpermodules.cli import run_using_positional_cli_args from modules.common import req 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.devices.generic.json import bat, counter, inverter from modules.devices.generic.json.bat import JsonBat from modules.devices.generic.json.config import (Json, - JsonBatConfiguration, JsonBatSetup, - JsonConfiguration, - JsonCounterConfiguration, JsonCounterSetup, - JsonInverterConfiguration, JsonInverterSetup) from modules.devices.generic.json.counter import JsonCounter from modules.devices.generic.json.inverter import JsonInverter @@ -47,44 +41,4 @@ def update_components(components: Iterable[JsonComponent]): ) -def read_legacy(url: str, component_config: Union[JsonBatSetup, JsonCounterSetup, JsonInverterSetup]) -> None: - dev = create_device(Json(configuration=JsonConfiguration(url=url))) - dev.add_component(component_config) - dev.update() - - -def read_legacy_bat(ip_address: str, jq_power: str, jq_soc: str): - config = JsonBatConfiguration(jq_power=jq_power, jq_soc=jq_soc) - read_legacy(ip_address, bat.component_descriptor.configuration_factory(id=None, configuration=config)) - - -def read_legacy_counter(ip_address: str, jq_power: str, jq_imported: str, jq_exported: str, - jq_power_l1: str, jq_power_l2: str, jq_power_l3: str, - jq_current_l1: str, jq_current_l2: str, jq_current_l3: str): - config = JsonCounterConfiguration(jq_power=jq_power, - jq_imported=None if jq_imported == "" else jq_imported, - jq_exported=None if jq_exported == "" else jq_exported, - jq_power_l1=None if jq_power_l1 == "" else jq_power_l1, - jq_power_l2=None if jq_power_l2 == "" else jq_power_l2, - jq_power_l3=None if jq_power_l3 == "" else jq_power_l3, - jq_current_l1=None if jq_current_l1 == "" else jq_current_l1, - jq_current_l2=None if jq_current_l2 == "" else jq_current_l2, - jq_current_l3=None if jq_current_l3 == "" else jq_current_l3 - ) - read_legacy( - ip_address, - counter.component_descriptor.configuration_factory(id=None, configuration=config)) - - -def read_legacy_inverter(ip_address: str, jq_power: str, jq_exported: str, num: int): - config = JsonInverterConfiguration(jq_power=jq_power, jq_exported=None if jq_exported == "" else jq_exported) - read_legacy(ip_address, inverter.component_descriptor.configuration_factory(id=num, configuration=config)) - - -def main(argv: List[str]): - run_using_positional_cli_args( - {"bat": read_legacy_bat, "counter": read_legacy_counter, "inverter": read_legacy_inverter}, argv - ) - - device_descriptor = DeviceDescriptor(configuration_factory=Json) diff --git a/packages/modules/devices/kostal/kostal_piko_old/device.py b/packages/modules/devices/kostal/kostal_piko_old/device.py index 79c92daa0a..0a59da86ba 100644 --- a/packages/modules/devices/kostal/kostal_piko_old/device.py +++ b/packages/modules/devices/kostal/kostal_piko_old/device.py @@ -1,16 +1,13 @@ #!/usr/bin/env python3 import logging -import re -from typing import Iterable, Optional, List +from typing import Iterable -from helpermodules.cli import run_using_positional_cli_args from modules.common import req 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.devices.kostal.kostal_piko_old import inverter from modules.devices.kostal.kostal_piko_old.config import (KostalPikoOld, - KostalPikoOldConfiguration, KostalPikoOldInverterSetup) from modules.devices.kostal.kostal_piko_old.inverter import KostalPikoOldInverter @@ -42,33 +39,4 @@ def update_components(components: Iterable[KostalPikoOldInverter]): } -def read_legacy(component_type: str, ip_address: str, user: str, password: str, num: Optional[int]) -> None: - url = ip_address - # add protocol "http://" if not already specified - if not re.search("^https?://", ip_address, re.IGNORECASE): - url = f"http://{ip_address}" - device_config = KostalPikoOld( - configuration=KostalPikoOldConfiguration(url=url, user=user, password=password)) - dev = create_device(device_config) - if component_type in COMPONENT_TYPE_TO_MODULE: - component_config = COMPONENT_TYPE_TO_MODULE[component_type].component_descriptor.configuration_factory() - else: - raise Exception( - "illegal component type " + component_type + ". Allowed values: " + - ','.join(COMPONENT_TYPE_TO_MODULE.keys()) - ) - component_config.id = num - dev.add_component(component_config) - - log.debug('KostalPikoOld URL: ' + url) - log.debug('KostalPikoOld user: ' + user) - log.debug('KostalPikoOld Passwort: ' + password) - - dev.update() - - -def main(argv: List[str]): - run_using_positional_cli_args(read_legacy, argv) - - device_descriptor = DeviceDescriptor(configuration_factory=KostalPikoOld) diff --git a/packages/modules/devices/powerfox/powerfox/device.py b/packages/modules/devices/powerfox/powerfox/device.py index 216e992c37..55290bb598 100644 --- a/packages/modules/devices/powerfox/powerfox/device.py +++ b/packages/modules/devices/powerfox/powerfox/device.py @@ -1,15 +1,11 @@ #!/usr/bin/env python3 import logging -from typing import List -from helpermodules.cli import run_using_positional_cli_args from modules.common.abstract_device import DeviceDescriptor from modules.common.configurable_device import ComponentFactoryByType, ConfigurableDevice, IndependentComponentUpdater from modules.common.req import get_http_session from modules.devices.powerfox.powerfox.counter import PowerfoxCounter -from modules.devices.powerfox.powerfox.config import (Powerfox, PowerfoxConfiguration, - PowerfoxCounterConfiguration, PowerfoxCounterSetup, - PowerfoxInverterConfiguration, PowerfoxInverterSetup) +from modules.devices.powerfox.powerfox.config import Powerfox, PowerfoxCounterSetup, PowerfoxInverterSetup from modules.devices.powerfox.powerfox.inverter import PowerfoxInverter log = logging.getLogger(__name__) @@ -39,18 +35,4 @@ def initializer(): ) -def read_legacy(component_type: str, user: str, password: str, id: str) -> None: - device = create_device(Powerfox(configuration=PowerfoxConfiguration(user=user, password=password))) - if component_type == "counter": - device.add_component(PowerfoxCounterSetup(id=None, configuration=PowerfoxCounterConfiguration(id=id))) - else: - device.add_component(PowerfoxInverterSetup(id=1, configuration=PowerfoxInverterConfiguration(id=id))) - log.debug('Powerfox user: ' + user + ", password: " + password + ", id: " + id) - device.update() - - -def main(argv: List[str]): - run_using_positional_cli_args(read_legacy, argv) - - device_descriptor = DeviceDescriptor(configuration_factory=Powerfox) diff --git a/packages/modules/devices/rct/rct/device.py b/packages/modules/devices/rct/rct/device.py index a4f94e10c7..fa02be41ae 100644 --- a/packages/modules/devices/rct/rct/device.py +++ b/packages/modules/devices/rct/rct/device.py @@ -1,14 +1,13 @@ #!/usr/bin/env python3 import logging import time -from typing import Callable, Optional, List +from typing import Callable -from helpermodules.cli import run_using_positional_cli_args from modules.common.abstract_device import DeviceDescriptor from modules.common.configurable_device import ConfigurableDevice, ComponentFactoryByType, IndependentComponentUpdater -from modules.devices.rct.rct import bat, counter, inverter, rct_lib +from modules.devices.rct.rct import rct_lib from modules.devices.rct.rct.bat import RctBat -from modules.devices.rct.rct.config import Rct, RctConfiguration, RctBatSetup, RctCounterSetup, RctInverterSetup +from modules.devices.rct.rct.config import Rct, RctBatSetup, RctCounterSetup, RctInverterSetup from modules.devices.rct.rct.counter import RctCounter from modules.devices.rct.rct.inverter import RctInverter @@ -47,33 +46,4 @@ def update_component(update_func: Callable[[rct_lib.RCT], None]): ) -COMPONENT_TYPE_TO_MODULE = { - "bat": bat, - "counter": counter, - "inverter": inverter -} - - -def read_legacy(component_type: str, ip_address: str, num: Optional[int]) -> None: - device_config = Rct(configuration=RctConfiguration(ip_address=ip_address)) - dev = create_device(device_config) - if component_type in COMPONENT_TYPE_TO_MODULE: - component_config = COMPONENT_TYPE_TO_MODULE[component_type].component_descriptor.configuration_factory() - else: - raise Exception( - "illegal component type " + component_type + ". Allowed values: " + - ','.join(COMPONENT_TYPE_TO_MODULE.keys()) - ) - component_config.id = num - dev.add_component(component_config) - - log.debug('Rct IP-Adresse: ' + ip_address) - - dev.update() - - -def main(argv: List[str]): - run_using_positional_cli_args(read_legacy, argv) - - device_descriptor = DeviceDescriptor(configuration_factory=Rct) diff --git a/packages/modules/devices/sma/sma_shm/device.py b/packages/modules/devices/sma/sma_shm/device.py index 0315f942df..929379cd60 100644 --- a/packages/modules/devices/sma/sma_shm/device.py +++ b/packages/modules/devices/sma/sma_shm/device.py @@ -2,15 +2,13 @@ import logging import socket import time -from typing import List, Optional, Union +from typing import List -from helpermodules.cli import run_using_positional_cli_args from modules.common.abstract_device import DeviceDescriptor from modules.common.configurable_device import ConfigurableDevice, ComponentFactoryByType, MultiComponentUpdater from modules.devices.sma.sma_shm import counter from modules.devices.sma.sma_shm import inverter -from modules.devices.sma.sma_shm.config import SmaHomeManagerCounterSetup, SmaHomeManagerInverterSetup, Speedwire, \ - SmaHomeManagerCounterConfiguration, SmaHomeManagerInverterConfiguration +from modules.devices.sma.sma_shm.config import Speedwire from modules.devices.sma.sma_shm.speedwire_listener import SpeedwireListener from modules.devices.sma.sma_shm.utils import SpeedwireComponent @@ -42,28 +40,4 @@ def create_device(device_config: Speedwire): ) -def read_legacy(component_configuration: Union[SmaHomeManagerCounterSetup, SmaHomeManagerInverterSetup]): - device = create_device(Speedwire()) - device.add_component(component_configuration) - device.update() - - -def parse_serial(str: str) -> Optional[int]: - return int(str) if str.isnumeric() else None - - -def read_legacy_counter(serial: str): - read_legacy(SmaHomeManagerCounterSetup(configuration=SmaHomeManagerCounterConfiguration(parse_serial(serial)))) - - -def read_legacy_inverter(serial: str, num: int): - read_legacy(SmaHomeManagerInverterSetup( - id=num, configuration=SmaHomeManagerInverterConfiguration(parse_serial(serial)) - )) - - -def main(argv: List[str]): - run_using_positional_cli_args({"counter": read_legacy_counter, "inverter": read_legacy_inverter}, argv) - - device_descriptor = DeviceDescriptor(configuration_factory=Speedwire) diff --git a/packages/modules/devices/smart_me/smart_me/device.py b/packages/modules/devices/smart_me/smart_me/device.py index 50029ccb01..042bf7c096 100644 --- a/packages/modules/devices/smart_me/smart_me/device.py +++ b/packages/modules/devices/smart_me/smart_me/device.py @@ -1,16 +1,13 @@ #!/usr/bin/env python3 import logging -from typing import List -from helpermodules.cli import run_using_positional_cli_args from modules.common.abstract_device import DeviceDescriptor from modules.common.configurable_device import ComponentFactoryByType, ConfigurableDevice, IndependentComponentUpdater from modules.common.req import get_http_session from modules.devices.smart_me.smart_me.counter import SmartMeCounter -from modules.devices.smart_me.smart_me.config import (SmartMe, SmartMeConfiguration, - SmartMeCounterConfiguration, SmartMeCounterSetup, - SmartMeInverterConfiguration, SmartMeInverterSetup) +from modules.devices.smart_me.smart_me.config import SmartMe, SmartMeCounterSetup, SmartMeInverterSetup from modules.devices.smart_me.smart_me.inverter import SmartMeInverter + log = logging.getLogger(__name__) @@ -39,19 +36,4 @@ def initializer(): ) -def read_legacy(component_type: str, user: str, password: str, id_address: str) -> None: - device = create_device(SmartMe(configuration=SmartMeConfiguration(user=user, password=password))) - id = id_address[37:] - if component_type == "counter": - device.add_component(SmartMeCounterSetup(id=None, configuration=SmartMeCounterConfiguration(id=id))) - else: - device.add_component(SmartMeInverterSetup(id=1, configuration=SmartMeInverterConfiguration(id=id))) - log.debug('Smart-me user: ' + user + ", password: " + password + ", id: " + id_address) - device.update() - - -def main(argv: List[str]): - run_using_positional_cli_args(read_legacy, argv) - - device_descriptor = DeviceDescriptor(configuration_factory=SmartMe) diff --git a/packages/modules/devices/smartfox/smartfox/device.py b/packages/modules/devices/smartfox/smartfox/device.py index e8d2eba6b8..97b7f15c85 100644 --- a/packages/modules/devices/smartfox/smartfox/device.py +++ b/packages/modules/devices/smartfox/smartfox/device.py @@ -1,12 +1,10 @@ #!/usr/bin/env python3 import logging -from typing import List -from helpermodules.cli import run_using_positional_cli_args from modules.common.abstract_device import DeviceDescriptor from modules.common.configurable_device import ComponentFactoryByType, ConfigurableDevice, IndependentComponentUpdater from modules.devices.smartfox.smartfox.counter import SmartfoxCounter -from modules.devices.smartfox.smartfox.config import Smartfox, SmartfoxConfiguration, SmartfoxCounterSetup +from modules.devices.smartfox.smartfox.config import Smartfox, SmartfoxCounterSetup log = logging.getLogger(__name__) @@ -23,15 +21,4 @@ def create_counter_component(component_config: SmartfoxCounterSetup): ) -def read_legacy(address: str) -> None: - device = create_device(SmartfoxConfiguration(ip_address=address)) - device.add_component(SmartfoxCounterSetup(id=None)) - log.debug('Smartfox address: ' + address) - device.update() - - -def main(argv: List[str]): - run_using_positional_cli_args(read_legacy, argv) - - device_descriptor = DeviceDescriptor(configuration_factory=Smartfox) diff --git a/packages/modules/devices/solar_log/solar_log/device.py b/packages/modules/devices/solar_log/solar_log/device.py index ab84095125..316bbb3dbe 100644 --- a/packages/modules/devices/solar_log/solar_log/device.py +++ b/packages/modules/devices/solar_log/solar_log/device.py @@ -1,9 +1,8 @@ #!/usr/bin/env python3 import json import logging -from typing import Iterable, List, Optional, Union +from typing import Iterable, Union -from helpermodules.cli import run_using_positional_cli_args from modules.common.abstract_device import DeviceDescriptor from modules.common.component_context import SingleComponentUpdateContext from modules.common.configurable_device import ComponentFactoryByType, ConfigurableDevice, MultiComponentUpdater @@ -11,6 +10,7 @@ from modules.devices.solar_log.solar_log.counter import SolarLogCounter from modules.devices.solar_log.solar_log.config import SolarLog, SolarLogCounterSetup, SolarLogInverterSetup from modules.devices.solar_log.solar_log.inverter import SolarLogInverter + log = logging.getLogger(__name__) @@ -38,35 +38,4 @@ def update_components(components: Iterable[Union[SolarLogCounter, SolarLogInvert ) -def read_legacy(component_type: str, ip_address: str, note_bat: Optional[int] = 0) -> None: - log.debug('Solar-Log ip_address: ' + ip_address) - if component_type == "inverter": - inverter = SolarLogInverter(None, SolarLogInverterSetup(id=1)) - with SingleComponentUpdateContext(inverter.component_info): - response = req.get_http_session().post('http://'+ip_address+'/getjp', - data=json.dumps({"801": {"170": None}}), timeout=5).json() - inverter.update(response) - elif component_type == "counter": - inverter = SolarLogInverter(None, SolarLogInverterSetup(id=1)) - counter = SolarLogCounter(None, SolarLogCounterSetup(id=None)) - with SingleComponentUpdateContext(counter.component_info): - # WR bei WR oder EVU-Modul immer auslesen - response = req.get_http_session().post('http://'+ip_address+'/getjp', - data=json.dumps({"801": {"170": None}}), timeout=5).json() - inverter.update(response) - power = counter.get_power(response) - pv_power = int(float(response["801"]["170"]["101"])) - power = power - pv_power - - if note_bat == 1: - with open("ramdisk/speicherleistung", "r") as f: - speicherleistung = int(float(f.read())) - power = power + speicherleistung - counter.store_values(power) - - -def main(argv: List[str]): - run_using_positional_cli_args(read_legacy, argv) - - device_descriptor = DeviceDescriptor(configuration_factory=SolarLog) diff --git a/packages/modules/devices/solar_view/solar_view/device.py b/packages/modules/devices/solar_view/solar_view/device.py index 0c55b79278..b9c805f94e 100644 --- a/packages/modules/devices/solar_view/solar_view/device.py +++ b/packages/modules/devices/solar_view/solar_view/device.py @@ -1,15 +1,10 @@ #!/usr/bin/env python3 import logging -from typing import List, Optional -from helpermodules.cli import run_using_positional_cli_args from modules.common.abstract_device import DeviceDescriptor from modules.common.configurable_device import ComponentFactoryByType, ConfigurableDevice, IndependentComponentUpdater from modules.devices.solar_view.solar_view.counter import SolarViewCounter -from modules.devices.solar_view.solar_view.config import (SolarView, SolarViewConfiguration, - SolarViewCounterSetup, - SolarViewInverterConfiguration, - SolarViewInverterSetup) +from modules.devices.solar_view.solar_view.config import SolarView, SolarViewCounterSetup, SolarViewInverterSetup from modules.devices.solar_view.solar_view.inverter import SolarViewInverter log = logging.getLogger(__name__) @@ -34,21 +29,4 @@ def create_inverter_component(component_config: SolarViewInverterSetup): ) -def read_legacy(component_type: str, ip_address: str, port: int, timeout: int, command: Optional[str] = None) -> None: - device = create_device(SolarView(configuration=SolarViewConfiguration( - ip_address=ip_address, port=port, timeout=timeout))) - if component_type == "counter": - device.add_component(SolarViewCounterSetup(id=None)) - else: - device.add_component(SolarViewInverterSetup( - id=1, configuration=SolarViewInverterConfiguration(command=command))) - log.debug('SolarView ip_address: ' + ip_address + ", port: " + - str(port) + ", timeout: " + str(timeout) + ", command: " + str(command)) - device.update() - - -def main(argv: List[str]): - run_using_positional_cli_args(read_legacy, argv) - - device_descriptor = DeviceDescriptor(configuration_factory=SolarView) diff --git a/packages/modules/devices/solar_watt/solar_watt/device.py b/packages/modules/devices/solar_watt/solar_watt/device.py index aded618a55..a3000aab24 100644 --- a/packages/modules/devices/solar_watt/solar_watt/device.py +++ b/packages/modules/devices/solar_watt/solar_watt/device.py @@ -1,15 +1,13 @@ #!/usr/bin/env python3 import logging -from typing import Dict, Iterable, List, Optional, Union +from typing import Dict, Iterable, Optional, Union -from helpermodules.cli import run_using_positional_cli_args from modules.common.abstract_device import DeviceDescriptor from modules.common.configurable_device import ComponentFactoryByType, ConfigurableDevice, MultiComponentUpdater from modules.common import req from modules.devices.solar_watt.solar_watt.bat import SolarWattBat from modules.devices.solar_watt.solar_watt.counter import SolarWattCounter from modules.devices.solar_watt.solar_watt.config import (SolarWatt, SolarWattBatSetup, - SolarWattConfiguration, SolarWattCounterSetup, SolarWattInverterSetup) from modules.devices.solar_watt.solar_watt.inverter import SolarWattInverter @@ -68,40 +66,4 @@ def update_components(components: Dict[str, Union[SolarWattBat, SolarWattCounter ) -def read_legacy(component_type: str, - ip_address: str, - ip2_address: Optional[str] = None, - gateway: Optional[int] = None) -> None: - if gateway is not None: - if gateway == 0: - energy_manager = True - else: - energy_manager = False - else: - energy_manager = False - - if component_type == "bat" or component_type == "counter": - if energy_manager: - ip = ip_address - else: - ip = ip2_address - device = create_device(SolarWatt(configuration=SolarWattConfiguration( - ip_address=ip, energy_manager=bool(energy_manager)))) - if component_type == "bat": - device.add_component(SolarWattBatSetup(id=None)) - else: - device.add_component(SolarWattCounterSetup(id=None)) - else: - device = create_device(SolarWatt(configuration=SolarWattConfiguration( - ip_address=ip_address, energy_manager=bool(energy_manager)))) - device.add_component(SolarWattInverterSetup(id=1)) - log.debug('SolarWatt ip_address: ' + ip_address + ', ip2_address: ' + - str(ip2_address) + ", gateway: " + str(gateway)) - device.update() - - -def main(argv: List[str]): - run_using_positional_cli_args(read_legacy, argv) - - device_descriptor = DeviceDescriptor(configuration_factory=SolarWatt) diff --git a/packages/modules/devices/solar_world/solar_world/device.py b/packages/modules/devices/solar_world/solar_world/device.py index 0dc7f812d2..d5c23c2440 100644 --- a/packages/modules/devices/solar_world/solar_world/device.py +++ b/packages/modules/devices/solar_world/solar_world/device.py @@ -1,15 +1,13 @@ #!/usr/bin/env python3 import logging -from typing import Iterable, Optional, Union, List +from typing import Iterable, Union -from helpermodules.cli import run_using_positional_cli_args from modules.common import req 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.devices.solar_world.solar_world import counter, inverter from modules.devices.solar_world.solar_world.config import ( - SolarWorld, SolarWorldConfiguration, SolarWorldCounterSetup, SolarWorldInverterSetup) + SolarWorld, SolarWorldCounterSetup, SolarWorldInverterSetup) from modules.devices.solar_world.solar_world.counter import SolarWorldCounter from modules.devices.solar_world.solar_world.inverter import SolarWorldInverter @@ -40,32 +38,4 @@ def update_components(components: Iterable[Union[SolarWorldCounter, SolarWorldIn ) -COMPONENT_TYPE_TO_MODULE = { - "counter": counter, - "inverter": inverter -} - - -def read_legacy(component_type: str, ip_address: str, num: Optional[int]) -> None: - device_config = SolarWorld(configuration=SolarWorldConfiguration(ip_address=ip_address)) - dev = create_device(device_config) - if component_type in COMPONENT_TYPE_TO_MODULE: - component_config = COMPONENT_TYPE_TO_MODULE[component_type].component_descriptor.configuration_factory() - else: - raise Exception( - "illegal component type " + component_type + ". Allowed values: " + - ','.join(COMPONENT_TYPE_TO_MODULE.keys()) - ) - component_config.id = num - dev.add_component(component_config) - - log.debug('SolarWorld IP-Adresse: ' + ip_address) - - dev.update() - - -def main(argv: List[str]): - run_using_positional_cli_args(read_legacy, argv) - - device_descriptor = DeviceDescriptor(configuration_factory=SolarWorld) diff --git a/packages/modules/devices/solarmax/solarmax/device.py b/packages/modules/devices/solarmax/solarmax/device.py index 3ce95f8239..4141b08869 100644 --- a/packages/modules/devices/solarmax/solarmax/device.py +++ b/packages/modules/devices/solarmax/solarmax/device.py @@ -1,18 +1,16 @@ #!/usr/bin/env python3 import logging -from typing import Iterable, Optional, List, Union +from typing import Iterable, Union -from helpermodules.cli import run_using_positional_cli_args from modules.common import modbus from modules.common.abstract_device import DeviceDescriptor from modules.common.component_context import SingleComponentUpdateContext from modules.common.configurable_device import ComponentFactoryByType, ConfigurableDevice, MultiComponentUpdater -from modules.devices.solarmax.solarmax import inverter from modules.devices.solarmax.solarmax.inverter import SolarmaxInverter from modules.devices.solarmax.solarmax.bat import SolarmaxBat from modules.devices.solarmax.solarmax.counter_maxstorage import SolarmaxMsCounter from modules.devices.solarmax.solarmax.inverter_maxstorage import SolarmaxMsInverter -from modules.devices.solarmax.solarmax.config import (Solarmax, SolarmaxConfiguration, +from modules.devices.solarmax.solarmax.config import (Solarmax, SolarmaxBatSetup, SolarmaxMsCounterSetup, SolarmaxInverterSetup, SolarmaxMsInverterSetup) @@ -59,32 +57,6 @@ def initializer(): ) -COMPONENT_TYPE_TO_MODULE = { - "inverter": inverter -} - - -def read_legacy(component_type: str, ip_address: str, num: Optional[int] = None) -> None: - dev = create_device(Solarmax(configuration=SolarmaxConfiguration(ip_address=ip_address))) - if component_type in COMPONENT_TYPE_TO_MODULE: - component_config = COMPONENT_TYPE_TO_MODULE[component_type].component_descriptor.configuration_factory() - else: - raise Exception( - "illegal component type " + component_type + ". Allowed values: " + - ','.join(COMPONENT_TYPE_TO_MODULE.keys()) - ) - component_config.id = num - dev.add_component(component_config) - - log.debug('Solarmax IP-Adresse: ' + ip_address) - - dev.update() - - -def main(argv: List[str]): - run_using_positional_cli_args(read_legacy, argv) - - device_descriptor = DeviceDescriptor( configuration_factory=Solarmax, compatibility_device_note="Kann nicht aktiv laden. Steuerbar ab Solarmax Firmware 3.4.4. Zur Nutzung muss die " diff --git a/packages/modules/devices/youless/youless/device.py b/packages/modules/devices/youless/youless/device.py index 026b4c8026..05408ad8aa 100644 --- a/packages/modules/devices/youless/youless/device.py +++ b/packages/modules/devices/youless/youless/device.py @@ -1,14 +1,12 @@ #!/usr/bin/env python3 import logging -from typing import Iterable, Optional, List +from typing import Iterable -from helpermodules.cli import run_using_positional_cli_args from modules.common import req 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.devices.youless.youless import inverter -from modules.devices.youless.youless.config import Youless, YoulessConfiguration, YoulessInverterSetup +from modules.devices.youless.youless.config import Youless, YoulessInverterSetup from modules.devices.youless.youless.inverter import YoulessInverter log = logging.getLogger(__name__) @@ -35,33 +33,4 @@ def update_components(components: Iterable[YoulessInverter]): ) -COMPONENT_TYPE_TO_MODULE = { - "inverter": inverter -} - - -def read_legacy(component_type: str, ip_address: str, source_s0: int, num: Optional[int]) -> None: - device_config = Youless(configuration=YoulessConfiguration(ip_address=ip_address)) - dev = create_device(device_config) - if component_type in COMPONENT_TYPE_TO_MODULE: - component_config = COMPONENT_TYPE_TO_MODULE[component_type].component_descriptor.configuration_factory() - else: - raise Exception( - "illegal component type " + component_type + ". Allowed values: " + - ','.join(COMPONENT_TYPE_TO_MODULE.keys()) - ) - component_config.id = num - component_config.configuration.source_s0 = True if source_s0 == 0 else False - dev.add_component(component_config) - - log.debug('Youless IP-Adresse: ' + ip_address) - log.debug('Youless source_s0: ' + str(source_s0)) - - dev.update() - - -def main(argv: List[str]): - run_using_positional_cli_args(read_legacy, argv) - - device_descriptor = DeviceDescriptor(configuration_factory=Youless) diff --git a/packages/modules/vehicles/tesla/soc.py b/packages/modules/vehicles/tesla/soc.py index 25f03a4479..5350926d94 100644 --- a/packages/modules/vehicles/tesla/soc.py +++ b/packages/modules/vehicles/tesla/soc.py @@ -1,17 +1,13 @@ #!/usr/bin/env python3 -import json import logging import time -from typing import List -from dataclass_utils import asdict, dataclass_from_dict -from helpermodules.cli import run_using_positional_cli_args from modules.common.abstract_device import DeviceDescriptor from modules.common.abstract_vehicle import VehicleUpdateData from modules.common.component_state import CarState from modules.common.configurable_vehicle import ConfigurableVehicle from modules.vehicles.tesla import api -from modules.vehicles.tesla.config import TeslaSoc, TeslaSocConfiguration, TeslaSocToken +from modules.vehicles.tesla.config import TeslaSoc log = logging.getLogger(__name__) @@ -56,27 +52,4 @@ def updater(vehicle_update_data: VehicleUpdateData) -> CarState: vehicle=vehicle) -def read_legacy(id: int, - token_file: str, - tesla_ev_num: int, - charge_state: bool): - - log.debug(f"SoC-Module tesla num: {id}") - log.debug(f"SoC-Module tesla token_file: {token_file}") - log.debug(f"SoC-Module tesla tesla_ev_num: {tesla_ev_num}") - log.debug(f"SoC-Module tesla charge_state: {charge_state}") - - with open(token_file, "r") as f: - token = json.load(f) - soc = create_vehicle(TeslaSoc(configuration=TeslaSocConfiguration( - tesla_ev_num=tesla_ev_num, token=dataclass_from_dict(TeslaSocToken, token))), id) - soc.update(VehicleUpdateData(charge_state=charge_state)) - with open(token_file, "w") as f: - f.write(json.dumps(asdict(soc.vehicle_config.configuration.token))) - - -def main(argv: List[str]): - run_using_positional_cli_args(read_legacy, argv) - - device_descriptor = DeviceDescriptor(configuration_factory=TeslaSoc) From b1b2aec6af79f71d5a1e32ebb2bf7113acaf751f Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Wed, 8 Jul 2026 09:01:12 +0200 Subject: [PATCH 3/7] ammend --- .../modules/devices/varta/varta/device.py | 73 +------------------ 1 file changed, 2 insertions(+), 71 deletions(-) diff --git a/packages/modules/devices/varta/varta/device.py b/packages/modules/devices/varta/varta/device.py index 3718668db7..130f36c499 100644 --- a/packages/modules/devices/varta/varta/device.py +++ b/packages/modules/devices/varta/varta/device.py @@ -1,19 +1,15 @@ #!/usr/bin/env python3 import logging -from typing import Iterable, Tuple, Union, List +from typing import Iterable, Union -from helpermodules.cli import run_using_positional_cli_args from modules.common.abstract_device import DeviceDescriptor from modules.common.component_context import SingleComponentUpdateContext -from modules.common.component_state import BatState from modules.common.configurable_device import ConfigurableDevice, ComponentFactoryByType, MultiComponentUpdater from modules.common.modbus import ModbusTcpClient_ from modules.devices.varta.varta.inverter import VartaInverter -from modules.devices.varta.varta import bat_api, counter -from modules.devices.varta.varta import bat_modbus from modules.devices.varta.varta.bat_api import VartaBatApi from modules.devices.varta.varta.bat_modbus import VartaBatModbus -from modules.devices.varta.varta.config import (Varta, VartaConfiguration, VartaBatApiSetup, VartaBatModbusSetup, +from modules.devices.varta.varta.config import (Varta, VartaBatApiSetup, VartaBatModbusSetup, VartaCounterSetup, VartaInverterSetup) from modules.devices.varta.varta.counter import VartaCounter @@ -74,71 +70,6 @@ def initializer(): ) -COMPONENT_TYPE_TO_MODULE = { - "bat_api": bat_api, - "bat_modbus": bat_modbus, - "counter": counter -} - - -def create_device_with_components(component_type: str, ip_address: str): - device_config = Varta(configuration=VartaConfiguration(ip_address=ip_address)) - dev = create_device(device_config) - if component_type in COMPONENT_TYPE_TO_MODULE: - component_config = COMPONENT_TYPE_TO_MODULE[component_type].component_descriptor.configuration_factory() - else: - raise Exception( - "illegal component type " + component_type + ". Allowed values: " + - ','.join(COMPONENT_TYPE_TO_MODULE.keys()) - ) - component_config.id = None - dev.add_component(component_config) - - log.debug('Varta IP-Adresse: ' + ip_address) - return dev - - -def update_counter(ip_address: str): - create_device_with_components("counter", ip_address).update() - - -def update_bat_api(ip_address: str): - create_device_with_components("bat_api", ip_address).update() - - -def create_modbus_bat(ip_address) -> Tuple[ModbusTcpClient_, VartaBatModbus]: - client = ModbusTcpClient_(ip_address, 502) - bat = VartaBatModbus(None, VartaBatModbusSetup()) - log.debug('Varta IP-Adresse: ' + ip_address) - return client, bat - - -def get_modbus_bat_state(client: ModbusTcpClient_, bat: VartaBatModbus) -> BatState: - with client as c: - with SingleComponentUpdateContext(bat.component_info): - return bat.get_state(c) - - -def update_two_batteries(ip_address: str, ip_address2: str) -> None: - client1, bat1 = create_modbus_bat(ip_address) - bat_state_1 = get_modbus_bat_state(client1, bat1) - if ip_address2 != "none": - client2, bat2 = create_modbus_bat(ip_address2) - bat_state_2 = get_modbus_bat_state(client2, bat2) - soc = (bat_state_1.soc + bat_state_2.soc)/2 - power = bat_state_1.power + bat_state_2.power - else: - soc = bat_state_1.soc - power = bat_state_1.power - - bat1.set_state(BatState(soc=soc, power=power)) - - -def main(argv: List[str]): - run_using_positional_cli_args({"bat_api": update_bat_api, - "bat_modbus": update_two_batteries, "counter": update_counter}, argv) - - device_descriptor = DeviceDescriptor( configuration_factory=Varta, compatibility_bat_note="Es kann nur eine maximale Entladeleistung vorgegeben werden. " From 7af155743be561c4675280ea2431e2ba7c1a749e Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Wed, 8 Jul 2026 09:16:58 +0200 Subject: [PATCH 4/7] linting --- packages/modules/devices/rct/rct/device.py | 2 +- packages/modules/devices/solar_world/solar_world/device.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/modules/devices/rct/rct/device.py b/packages/modules/devices/rct/rct/device.py index fa02be41ae..2a483e857a 100644 --- a/packages/modules/devices/rct/rct/device.py +++ b/packages/modules/devices/rct/rct/device.py @@ -7,7 +7,7 @@ from modules.common.configurable_device import ConfigurableDevice, ComponentFactoryByType, IndependentComponentUpdater from modules.devices.rct.rct import rct_lib from modules.devices.rct.rct.bat import RctBat -from modules.devices.rct.rct.config import Rct, RctBatSetup, RctCounterSetup, RctInverterSetup +from modules.devices.rct.rct.config import Rct, RctBatSetup, RctCounterSetup, RctInverterSetup from modules.devices.rct.rct.counter import RctCounter from modules.devices.rct.rct.inverter import RctInverter diff --git a/packages/modules/devices/solar_world/solar_world/device.py b/packages/modules/devices/solar_world/solar_world/device.py index d5c23c2440..66316f51b8 100644 --- a/packages/modules/devices/solar_world/solar_world/device.py +++ b/packages/modules/devices/solar_world/solar_world/device.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 import logging -from typing import Iterable, Union +from typing import Iterable, Union from modules.common import req from modules.common.abstract_device import DeviceDescriptor From b4ee8a3e054130c070ba97ba620ee9f8fb926ff8 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Wed, 8 Jul 2026 09:33:37 +0200 Subject: [PATCH 5/7] review --- packages/helpermodules/compatibility.py | 9 --------- packages/helpermodules/logger.py | 2 +- packages/modules/devices/generic/http/inverter.py | 3 --- 3 files changed, 1 insertion(+), 13 deletions(-) delete mode 100644 packages/helpermodules/compatibility.py diff --git a/packages/helpermodules/compatibility.py b/packages/helpermodules/compatibility.py deleted file mode 100644 index 52da4f20f1..0000000000 --- a/packages/helpermodules/compatibility.py +++ /dev/null @@ -1,9 +0,0 @@ -from pathlib import Path - -RAMDSIK_PATH = Path(__file__).resolve().parents[2] / "ramdisk" - - -def is_ramdisk_in_use() -> bool: - """ prüft, ob die Daten in der Ramdisk liegen (v1.x), sonst wird mit dem Broker (2.x) gearbeitet. - """ - return (RAMDSIK_PATH / "bootinprogress").is_file() diff --git a/packages/helpermodules/logger.py b/packages/helpermodules/logger.py index 9928c7249f..6b38179f36 100644 --- a/packages/helpermodules/logger.py +++ b/packages/helpermodules/logger.py @@ -333,7 +333,7 @@ def mb_to_bytes(megabytes: int) -> int: logging.getLogger("uModbus").setLevel(logging.WARNING) logging.getLogger("websockets").setLevel(logging.WARNING) - thread_errors_path = Path(RAMDISK_PATH / "thread_errors.log") + thread_errors_path = RAMDISK_PATH / "thread_errors.log" with thread_errors_path.open("w") as f: f.write("") diff --git a/packages/modules/devices/generic/http/inverter.py b/packages/modules/devices/generic/http/inverter.py index b54734d824..785b8203fb 100644 --- a/packages/modules/devices/generic/http/inverter.py +++ b/packages/modules/devices/generic/http/inverter.py @@ -39,9 +39,6 @@ def initialize(self) -> None: def update(self, session: Session) -> None: power = self.__get_power(session) - if compatibility.is_ramdisk_in_use(): - # for compatibility: in 1.x power URL values are positive! - power *= -1 exported = self.__get_exported(session) _, exported = self.peak_filter.check_values(power, None, exported) if exported is None: From 5286a10c41d6d794fa0d4d4a657107d3ecf87c98 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Wed, 8 Jul 2026 09:35:46 +0200 Subject: [PATCH 6/7] falke8 --- packages/modules/devices/generic/http/inverter.py | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/modules/devices/generic/http/inverter.py b/packages/modules/devices/generic/http/inverter.py index 785b8203fb..80c8f0181c 100644 --- a/packages/modules/devices/generic/http/inverter.py +++ b/packages/modules/devices/generic/http/inverter.py @@ -3,7 +3,6 @@ from requests import Session -from helpermodules import compatibility from modules.common.abstract_device import AbstractInverter from modules.common.component_state import InverterState from modules.common.component_type import ComponentDescriptor From 886d882868024e7c434fecf5d347c5ed4b3211e6 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Wed, 8 Jul 2026 09:44:56 +0200 Subject: [PATCH 7/7] review --- .../modules/devices/fems/fems/device test.py | 55 ------------------- .../devices/kostal/kostal_piko_old/device.py | 6 -- 2 files changed, 61 deletions(-) delete mode 100644 packages/modules/devices/fems/fems/device test.py diff --git a/packages/modules/devices/fems/fems/device test.py b/packages/modules/devices/fems/fems/device test.py deleted file mode 100644 index 49edefab69..0000000000 --- a/packages/modules/devices/fems/fems/device test.py +++ /dev/null @@ -1,55 +0,0 @@ -from unittest.mock import Mock - -import pytest - -from modules.common.component_state import CounterState -from modules.common.component_state import InverterState -from modules.devices.discovergy.discovergy import api, counter, inverter - -SAMPLE_COUNTER_STATE = CounterState( - imported=1, - exported=2, - power=3, - voltages=[4, 5, 6], - currents=[7, 8, 9], - powers=[10, 11, 12], -) -SAMPLE_INVERTER_STATE = InverterState( - exported=2, - power=3, - currents=[7, 8, 9], -) -SAMPLE_USER = "some username" -SAMPLE_PASSWORD = "some password" -SAMPLE_COUNTER_METER_ID = "some counter meter id" -SAMPLE_INVERTER_METER_ID = "some inverter meter id" - - -class TestDiscovergyDevice: - @pytest.fixture(autouse=True) - def setup(self, monkeypatch): - self.mock_counter_value_store = Mock() - self.mock_inverter_value_store = Mock() - self.mock_get_last_reading = Mock(return_value=SAMPLE_COUNTER_STATE) - monkeypatch.setattr(counter, 'get_counter_value_store', Mock(return_value=self.mock_counter_value_store)) - monkeypatch.setattr(inverter, 'get_inverter_value_store', Mock(return_value=self.mock_inverter_value_store)) - monkeypatch.setattr(api, 'get_last_reading', self.mock_get_last_reading) - - def assert_get_last_reading_called(self, *meter_ids): - assert self.mock_get_last_reading.call_count == len(meter_ids) - # Check that one call was made for each meter_id, ignoring order: - assert sorted(call_args[0][1] for call_args in self.mock_get_last_reading.call_args_list) == sorted(meter_ids) - # Check that credentials were passed along each call: - for call_args in self.mock_get_last_reading.call_args_list: - assert call_args[0][0].auth == (SAMPLE_USER, SAMPLE_PASSWORD) - - def assert_counter_state_set(self): - assert self.mock_counter_value_store.set.call_count == 1 - assert self.mock_counter_value_store.set.call_args[0][0] is SAMPLE_COUNTER_STATE - - def assert_inverter_state_set(self): - assert self.mock_inverter_value_store.set.call_count == 1 - inverter_state = self.mock_inverter_value_store.set.call_args[0][0] # type: InverterState - assert inverter_state.power == SAMPLE_INVERTER_STATE.power - assert inverter_state.currents == SAMPLE_INVERTER_STATE.currents - assert inverter_state.exported == SAMPLE_INVERTER_STATE.exported diff --git a/packages/modules/devices/kostal/kostal_piko_old/device.py b/packages/modules/devices/kostal/kostal_piko_old/device.py index 0a59da86ba..a298399dc2 100644 --- a/packages/modules/devices/kostal/kostal_piko_old/device.py +++ b/packages/modules/devices/kostal/kostal_piko_old/device.py @@ -6,7 +6,6 @@ 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.devices.kostal.kostal_piko_old import inverter from modules.devices.kostal.kostal_piko_old.config import (KostalPikoOld, KostalPikoOldInverterSetup) from modules.devices.kostal.kostal_piko_old.inverter import KostalPikoOldInverter @@ -34,9 +33,4 @@ def update_components(components: Iterable[KostalPikoOldInverter]): ) -COMPONENT_TYPE_TO_MODULE = { - "inverter": inverter -} - - device_descriptor = DeviceDescriptor(configuration_factory=KostalPikoOld)