From 2259139242d926bbb335f57ccb1f5a8ddd590629 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Thu, 10 Sep 2026 10:58:52 +0200 Subject: [PATCH 1/4] extra meter only consumer --- .../modules/common/configurable_consumer.py | 2 +- .../consumers/extra_meter_only/__init__.py | 0 .../extra_meter_only/__init__.py | 0 .../extra_meter_only/config.py | 24 +++++++++++++++++++ .../extra_meter_only/consumer.py | 15 ++++++++++++ .../consumers/extra_meter_only/vendor.py | 14 +++++++++++ packages/modules/loadvars.py | 9 +++---- 7 files changed, 57 insertions(+), 7 deletions(-) create mode 100644 packages/modules/consumers/extra_meter_only/__init__.py create mode 100644 packages/modules/consumers/extra_meter_only/extra_meter_only/__init__.py create mode 100644 packages/modules/consumers/extra_meter_only/extra_meter_only/config.py create mode 100644 packages/modules/consumers/extra_meter_only/extra_meter_only/consumer.py create mode 100644 packages/modules/consumers/extra_meter_only/vendor.py diff --git a/packages/modules/common/configurable_consumer.py b/packages/modules/common/configurable_consumer.py index ee4ca3b169..f1d4113ddf 100644 --- a/packages/modules/common/configurable_consumer.py +++ b/packages/modules/common/configurable_consumer.py @@ -30,7 +30,7 @@ def __init__(self, consumer_config: T_CONSUMER, initializer: Optional[Callable] = lambda: None, error_handler: Optional[Callable] = lambda: None, - update: Optional[Callable[[], ConsumerState]] = lambda: None, + update: Optional[Callable[[], ConsumerState]] = None, send_values: Optional[Callable[[CurrentValues], None]] = lambda _values: None, set_power_limit: Optional[Callable] = lambda: None, switch_on: Optional[Callable] = lambda: None, diff --git a/packages/modules/consumers/extra_meter_only/__init__.py b/packages/modules/consumers/extra_meter_only/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/modules/consumers/extra_meter_only/extra_meter_only/__init__.py b/packages/modules/consumers/extra_meter_only/extra_meter_only/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/modules/consumers/extra_meter_only/extra_meter_only/config.py b/packages/modules/consumers/extra_meter_only/extra_meter_only/config.py new file mode 100644 index 0000000000..8ddb8815b3 --- /dev/null +++ b/packages/modules/consumers/extra_meter_only/extra_meter_only/config.py @@ -0,0 +1,24 @@ +from typing import Optional, Tuple +from control.consumer.consumer_data import ConsumerUsage +from helpermodules.auto_str import auto_str +from modules.common.consumer_setup import ConsumerSetup +from ..vendor import vendor_descriptor + + +@auto_str +class ExtraMeterOnlyConfiguration: + def __init__(self) -> None: + pass + + +@auto_str +class ExtraMeterOnly(ConsumerSetup[ExtraMeterOnlyConfiguration]): + def __init__(self, + name: str = "Separater Zähler ohne zu steuernden Verbraucher", + type: str = "extra_meter_only", + id: int = 0, + configuration: Optional[ExtraMeterOnlyConfiguration] = None, + usage: Tuple[ConsumerUsage, ...] = (ConsumerUsage.METER_ONLY,), + **kwargs) -> None: + super().__init__(name, type, id, vendor=vendor_descriptor.configuration_factory( + ).type, configuration=configuration or ExtraMeterOnlyConfiguration(), usage=usage, **kwargs) diff --git a/packages/modules/consumers/extra_meter_only/extra_meter_only/consumer.py b/packages/modules/consumers/extra_meter_only/extra_meter_only/consumer.py new file mode 100644 index 0000000000..467a8aa36e --- /dev/null +++ b/packages/modules/consumers/extra_meter_only/extra_meter_only/consumer.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python3 +import logging + +from modules.common.abstract_device import DeviceDescriptor +from modules.common.configurable_consumer import ConfigurableConsumer +from modules.consumers.extra_meter_only.extra_meter_only.config import ExtraMeterOnly + +log = logging.getLogger(__name__) + + +def create_consumer(config: ExtraMeterOnly): + return ConfigurableConsumer(consumer_config=config) + + +device_descriptor = DeviceDescriptor(configuration_factory=ExtraMeterOnly) diff --git a/packages/modules/consumers/extra_meter_only/vendor.py b/packages/modules/consumers/extra_meter_only/vendor.py new file mode 100644 index 0000000000..7a95a8439b --- /dev/null +++ b/packages/modules/consumers/extra_meter_only/vendor.py @@ -0,0 +1,14 @@ +from pathlib import Path + +from modules.common.abstract_device import DeviceDescriptor +from modules.devices.vendors import VendorGroup + + +class Vendor: + def __init__(self): + self.type = Path(__file__).parent.name + self.vendor = "Separater Zähler ohne zu steuernden Verbraucher" + self.group = VendorGroup.VENDORS.value + + +vendor_descriptor = DeviceDescriptor(configuration_factory=Vendor) diff --git a/packages/modules/loadvars.py b/packages/modules/loadvars.py index 6b17b00452..81e9e6b187 100644 --- a/packages/modules/loadvars.py +++ b/packages/modules/loadvars.py @@ -3,7 +3,6 @@ from typing import List from control import data -from control.consumer.usage import ConsumerUsage from modules.common.abstract_io import AbstractIoDevice from modules.common.store._tariff import get_price_value_store from modules.utils import wait_for_module_update_completed @@ -65,11 +64,9 @@ def _set_values(self) -> List[str]: log.exception(f"Fehler im loadvars-Modul bei Element {cp.num}") for consumer in data.data.consumer_data.values(): try: - if ConsumerUsage.METER_ONLY.value in consumer.module.config.usage: - # Nur Verbraucher mit eingebautem Zähler haben eine update-Funktion. - modules_threads.append(Thread(target=consumer.module.update, - args=(), - name=f"set values consumer{consumer.data.module.id}")) + modules_threads.append(Thread(target=consumer.module.update, + args=(), + name=f"set values consumer{consumer.data.module.id}")) except Exception: log.exception(f"Fehler im loadvars-Modul bei Element {consumer.num}") return joined_thread_handler(modules_threads, data.data.general_data.data.control_interval/3) From a65cf78f4d4cf6a2993b1811d8d77a35409eadc1 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Thu, 10 Sep 2026 11:23:32 +0200 Subject: [PATCH 2/4] review --- packages/modules/common/configurable_consumer.py | 4 ++-- .../extra_meter_only/extra_meter_only/__init__.py | 0 .../modules/consumers/extra_meter_only/vendor.py | 14 -------------- .../{ => generic}/extra_meter_only/__init__.py | 0 .../extra_meter_only/config.py | 2 +- .../extra_meter_only/consumer.py | 2 +- 6 files changed, 4 insertions(+), 18 deletions(-) delete mode 100644 packages/modules/consumers/extra_meter_only/extra_meter_only/__init__.py delete mode 100644 packages/modules/consumers/extra_meter_only/vendor.py rename packages/modules/consumers/{ => generic}/extra_meter_only/__init__.py (100%) rename packages/modules/consumers/{extra_meter_only => generic}/extra_meter_only/config.py (90%) rename packages/modules/consumers/{extra_meter_only => generic}/extra_meter_only/consumer.py (81%) diff --git a/packages/modules/common/configurable_consumer.py b/packages/modules/common/configurable_consumer.py index f1d4113ddf..9b88f685cf 100644 --- a/packages/modules/common/configurable_consumer.py +++ b/packages/modules/common/configurable_consumer.py @@ -73,8 +73,8 @@ def error_handler(self) -> None: Pub().pub(error_timestamp_topic, self.error_timestamp) def update(self): - with SingleComponentUpdateContext(self.fault_state): - if self.module_updater is not None: + if self.module_updater is not None: + with SingleComponentUpdateContext(self.fault_state): consumer_state = self.module_updater() imported, exported = self.peak_filter.check_values( consumer_state.power, diff --git a/packages/modules/consumers/extra_meter_only/extra_meter_only/__init__.py b/packages/modules/consumers/extra_meter_only/extra_meter_only/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/modules/consumers/extra_meter_only/vendor.py b/packages/modules/consumers/extra_meter_only/vendor.py deleted file mode 100644 index 7a95a8439b..0000000000 --- a/packages/modules/consumers/extra_meter_only/vendor.py +++ /dev/null @@ -1,14 +0,0 @@ -from pathlib import Path - -from modules.common.abstract_device import DeviceDescriptor -from modules.devices.vendors import VendorGroup - - -class Vendor: - def __init__(self): - self.type = Path(__file__).parent.name - self.vendor = "Separater Zähler ohne zu steuernden Verbraucher" - self.group = VendorGroup.VENDORS.value - - -vendor_descriptor = DeviceDescriptor(configuration_factory=Vendor) diff --git a/packages/modules/consumers/extra_meter_only/__init__.py b/packages/modules/consumers/generic/extra_meter_only/__init__.py similarity index 100% rename from packages/modules/consumers/extra_meter_only/__init__.py rename to packages/modules/consumers/generic/extra_meter_only/__init__.py diff --git a/packages/modules/consumers/extra_meter_only/extra_meter_only/config.py b/packages/modules/consumers/generic/extra_meter_only/config.py similarity index 90% rename from packages/modules/consumers/extra_meter_only/extra_meter_only/config.py rename to packages/modules/consumers/generic/extra_meter_only/config.py index 8ddb8815b3..c092d3ecfa 100644 --- a/packages/modules/consumers/extra_meter_only/extra_meter_only/config.py +++ b/packages/modules/consumers/generic/extra_meter_only/config.py @@ -14,7 +14,7 @@ def __init__(self) -> None: @auto_str class ExtraMeterOnly(ConsumerSetup[ExtraMeterOnlyConfiguration]): def __init__(self, - name: str = "Separater Zähler ohne zu steuernden Verbraucher", + name: str = "Zähler aus Geräte & Komponenten für separate Leistungsmessung", type: str = "extra_meter_only", id: int = 0, configuration: Optional[ExtraMeterOnlyConfiguration] = None, diff --git a/packages/modules/consumers/extra_meter_only/extra_meter_only/consumer.py b/packages/modules/consumers/generic/extra_meter_only/consumer.py similarity index 81% rename from packages/modules/consumers/extra_meter_only/extra_meter_only/consumer.py rename to packages/modules/consumers/generic/extra_meter_only/consumer.py index 467a8aa36e..ec1c281f57 100644 --- a/packages/modules/consumers/extra_meter_only/extra_meter_only/consumer.py +++ b/packages/modules/consumers/generic/extra_meter_only/consumer.py @@ -3,7 +3,7 @@ from modules.common.abstract_device import DeviceDescriptor from modules.common.configurable_consumer import ConfigurableConsumer -from modules.consumers.extra_meter_only.extra_meter_only.config import ExtraMeterOnly +from modules.consumers.generic.extra_meter_only.config import ExtraMeterOnly log = logging.getLogger(__name__) From e08769d003477dac42e41c55be1618a973014031 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Thu, 10 Sep 2026 11:33:39 +0200 Subject: [PATCH 3/4] review --- packages/modules/common/configurable_consumer.py | 4 ++-- .../modules/consumers/generic/extra_meter_only/consumer.py | 4 ---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/modules/common/configurable_consumer.py b/packages/modules/common/configurable_consumer.py index 9b88f685cf..f1d4113ddf 100644 --- a/packages/modules/common/configurable_consumer.py +++ b/packages/modules/common/configurable_consumer.py @@ -73,8 +73,8 @@ def error_handler(self) -> None: Pub().pub(error_timestamp_topic, self.error_timestamp) def update(self): - if self.module_updater is not None: - with SingleComponentUpdateContext(self.fault_state): + with SingleComponentUpdateContext(self.fault_state): + if self.module_updater is not None: consumer_state = self.module_updater() imported, exported = self.peak_filter.check_values( consumer_state.power, diff --git a/packages/modules/consumers/generic/extra_meter_only/consumer.py b/packages/modules/consumers/generic/extra_meter_only/consumer.py index ec1c281f57..8e6e1660e0 100644 --- a/packages/modules/consumers/generic/extra_meter_only/consumer.py +++ b/packages/modules/consumers/generic/extra_meter_only/consumer.py @@ -1,12 +1,8 @@ #!/usr/bin/env python3 -import logging - from modules.common.abstract_device import DeviceDescriptor from modules.common.configurable_consumer import ConfigurableConsumer from modules.consumers.generic.extra_meter_only.config import ExtraMeterOnly -log = logging.getLogger(__name__) - def create_consumer(config: ExtraMeterOnly): return ConfigurableConsumer(consumer_config=config) From b3d7e390ab066d15ceff789334fc5cb5880c5ab7 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Thu, 10 Sep 2026 12:04:25 +0200 Subject: [PATCH 4/4] naming --- packages/modules/consumers/generic/extra_meter_only/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/modules/consumers/generic/extra_meter_only/config.py b/packages/modules/consumers/generic/extra_meter_only/config.py index c092d3ecfa..d1222a2a73 100644 --- a/packages/modules/consumers/generic/extra_meter_only/config.py +++ b/packages/modules/consumers/generic/extra_meter_only/config.py @@ -14,7 +14,7 @@ def __init__(self) -> None: @auto_str class ExtraMeterOnly(ConsumerSetup[ExtraMeterOnlyConfiguration]): def __init__(self, - name: str = "Zähler aus Geräte & Komponenten für separate Leistungsmessung", + name: str = "Rein passive Messung", type: str = "extra_meter_only", id: int = 0, configuration: Optional[ExtraMeterOnlyConfiguration] = None,