From 0a848921319a4c5a94e70b7271c0ae0a2f5fde30 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Tue, 25 Aug 2026 14:13:07 +0200 Subject: [PATCH 1/3] draft dac --- .../modules/consumers/generic/dac/consumer.py | 37 ++++++++----------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/packages/modules/consumers/generic/dac/consumer.py b/packages/modules/consumers/generic/dac/consumer.py index 654f2ab1c5..dd4a4dfd53 100644 --- a/packages/modules/consumers/generic/dac/consumer.py +++ b/packages/modules/consumers/generic/dac/consumer.py @@ -3,7 +3,7 @@ from modules.common.abstract_device import DeviceDescriptor from modules.common.component_type import ComponentType from modules.common.configurable_consumer import ConfigurableConsumer -from modules.common.modbus import ModbusTcpClient_ +from modules.common.modbus import ModbusDataType, ModbusTcpClient_ from modules.common.simcount._simcounter import SimCounterConsumer from modules.consumers.generic.dac.config import Dac from modules.consumers.generic.dac.model import Model @@ -12,7 +12,7 @@ def create_consumer(config: Dac): - client = None + client: ModbusTcpClient_ = None sim_counter = None def initializer(): @@ -24,25 +24,20 @@ def error_handler() -> None: initializer() def set_limit(power_limit: float) -> None: - if config.configuration.model == Model.N4Dac02 or config.configuration.model == Model.M120T: - # pwoer_limit -= power - pass - - # power_limit = max(power_limit, 0) - # if config.configuration.model == Model.N4Dac02: - # client.write_register(1, power_limit * 1000 / max_power, ModbusDataType.INT_16, - # unit=config.configuration.modbus_id) - # elif config.configuration.model == Model.DA02: - # client.write_register(0x01f4, power_limit * 4000 / max_power, - # ModbusDataType.INT_16, unit=config.configuration.modbus_id) - # elif config.configuration.model == Model.M120T: - # # ausgabe nicht kleiner 0,9V sonst Leistungsregelung der WP aus - # power_limit = max(power_limit * 4095 / max_power, 370) - # client.write_register(0x01f4, power_limit, ModbusDataType.INT_16, unit=config.configuration.modbus_id) - # elif config.configuration.model == Model.AA02B: - # power_limit = max((power_limit * (4095-820) / max_power)+820, 820) - # # ausgabe nicht kleiner 4ma sonst Leistungsregelung der WP aus - # client.write_register(0x01f4, power_limit, ModbusDataType.INT_16, unit=config.configuration.modbus_id) + power_limit = max(power_limit, 0) + modbus_id = config.configuration.modbus_id + if config.configuration.model == Model.N4Dac02: + client.write_register(1, power_limit * 1000 / max_power, ModbusDataType.INT_16, unit=modbus_id) + elif config.configuration.model == Model.DA02: + client.write_register(0x01f4, power_limit * 4000 / max_power, ModbusDataType.INT_16, unit=modbus_id) + elif config.configuration.model == Model.M120T: + # ausgabe nicht kleiner 0,9V sonst Leistungsregelung der WP aus + power_limit = max(power_limit * 4095 / max_power, 370) + client.write_register(0x01f4, power_limit, ModbusDataType.INT_16, unit=modbus_id) + elif config.configuration.model == Model.AA02B: + power_limit = max((power_limit * (4095-820) / max_power)+820, 820) + # ausgabe nicht kleiner 4ma sonst Leistungsregelung der WP aus + client.write_register(0x01f4, power_limit, ModbusDataType.INT_16, unit=modbus_id) return ConfigurableConsumer(consumer_config=config, initializer=initializer, From 6e690812a6b355e33dbdc024e2f86e70cfe954d3 Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Tue, 25 Aug 2026 16:34:36 +0200 Subject: [PATCH 2/3] add dataclass object for set_power_limit --- .../sample_consumer/sample_consumer/consumer.py | 6 +++--- .../modules/consumers/askoma/askoheat/consumer.py | 6 +++--- packages/modules/consumers/generic/dac/consumer.py | 14 +++++++------- .../modules/consumers/generic/http/consumer.py | 4 ++-- .../modules/consumers/generic/json/consumer.py | 4 ++-- packages/modules/consumers/idm/idm/consumer.py | 6 +++--- .../modules/consumers/lambda_/lambda_/consumer.py | 6 +++--- .../modules/consumers/my_pv/acthor/consumer.py | 6 +++--- .../modules/consumers/my_pv/elwa_e/consumer.py | 6 +++--- packages/modules/consumers/ovum/ovum/consumer.py | 6 +++--- .../consumers/ratiotherm/ratiotherm/consumer.py | 6 +++--- .../consumers/solarfocus/vampair/consumer.py | 4 ++-- 12 files changed, 37 insertions(+), 37 deletions(-) diff --git a/docs/samples/sample_consumer/sample_consumer/consumer.py b/docs/samples/sample_consumer/sample_consumer/consumer.py index fb94155b6a..5d7939788d 100644 --- a/docs/samples/sample_consumer/sample_consumer/consumer.py +++ b/docs/samples/sample_consumer/sample_consumer/consumer.py @@ -5,7 +5,7 @@ from modules.common.abstract_device import DeviceDescriptor from modules.common.component_state import ConsumerState from modules.common.component_type import ComponentType -from modules.common.configurable_consumer import ConfigurableConsumer +from modules.common.configurable_consumer import ConfigurableConsumer, SetLimitData from modules.common.modbus import ModbusDataType, ModbusTcpClient_ from modules.common.simcount._simcounter import SimCounterConsumer from modules.consumers.sample.sample.config import SampleConsumer @@ -55,7 +55,7 @@ def update() -> ConsumerState: ) # ConsumerUsage.SUSPENDABLE_TUNABLE - def set_limit(power_limit: float) -> None: + def set_power_limit(power_limit: float, data: SetLimitData) -> None: nonlocal client client.write_registers(1000, power_limit, unit=config.configuration.modbus_id) @@ -80,7 +80,7 @@ def send_values(values: CurrentValues) -> None: error_handler=error_handler, update=update, send_values=send_values, - set_power_limit=set_limit, + set_power_limit=set_power_limit, switch_on=switch_on, switch_off=switch_off) diff --git a/packages/modules/consumers/askoma/askoheat/consumer.py b/packages/modules/consumers/askoma/askoheat/consumer.py index 71d9728a2b..535c05bf30 100644 --- a/packages/modules/consumers/askoma/askoheat/consumer.py +++ b/packages/modules/consumers/askoma/askoheat/consumer.py @@ -3,7 +3,7 @@ from modules.common.abstract_device import DeviceDescriptor from modules.common.component_state import ConsumerState from modules.common.component_type import ComponentType -from modules.common.configurable_consumer import ConfigurableConsumer +from modules.common.configurable_consumer import ConfigurableConsumer, SetLimitData from modules.common.modbus import ModbusDataType, ModbusTcpClient_ from modules.common.simcount._simcounter import SimCounterConsumer from modules.consumers.askoma.askoheat.config import Askoheat @@ -33,14 +33,14 @@ def update() -> ConsumerState: temperatures=[client.read_input_registers(638, ModbusDataType.INT_16, unit=config.configuration.modbus_id)] ) - def set_limit(power_limit: float) -> None: + def set_power_limit(power_limit: float, data: SetLimitData) -> None: client.write_register(201, power_limit, unit=config.configuration.modbus_id) return ConfigurableConsumer(consumer_config=config, initializer=initializer, error_handler=error_handler, update=update, - set_power_limit=set_limit,) + set_power_limit=set_power_limit,) device_descriptor = DeviceDescriptor(configuration_factory=Askoheat) diff --git a/packages/modules/consumers/generic/dac/consumer.py b/packages/modules/consumers/generic/dac/consumer.py index dd4a4dfd53..e25b462dba 100644 --- a/packages/modules/consumers/generic/dac/consumer.py +++ b/packages/modules/consumers/generic/dac/consumer.py @@ -2,7 +2,7 @@ import logging from modules.common.abstract_device import DeviceDescriptor from modules.common.component_type import ComponentType -from modules.common.configurable_consumer import ConfigurableConsumer +from modules.common.configurable_consumer import ConfigurableConsumer, SetLimitData from modules.common.modbus import ModbusDataType, ModbusTcpClient_ from modules.common.simcount._simcounter import SimCounterConsumer from modules.consumers.generic.dac.config import Dac @@ -23,26 +23,26 @@ def initializer(): def error_handler() -> None: initializer() - def set_limit(power_limit: float) -> None: + def set_power_limit(power_limit: float, data: SetLimitData) -> None: power_limit = max(power_limit, 0) modbus_id = config.configuration.modbus_id if config.configuration.model == Model.N4Dac02: - client.write_register(1, power_limit * 1000 / max_power, ModbusDataType.INT_16, unit=modbus_id) + client.write_register(1, power_limit * 1000 / data.max_power, ModbusDataType.INT_16, unit=modbus_id) elif config.configuration.model == Model.DA02: - client.write_register(0x01f4, power_limit * 4000 / max_power, ModbusDataType.INT_16, unit=modbus_id) + client.write_register(0x01f4, power_limit * 4000 / data.max_power, ModbusDataType.INT_16, unit=modbus_id) elif config.configuration.model == Model.M120T: # ausgabe nicht kleiner 0,9V sonst Leistungsregelung der WP aus - power_limit = max(power_limit * 4095 / max_power, 370) + power_limit = max(power_limit * 4095 / data.max_power, 370) client.write_register(0x01f4, power_limit, ModbusDataType.INT_16, unit=modbus_id) elif config.configuration.model == Model.AA02B: - power_limit = max((power_limit * (4095-820) / max_power)+820, 820) + power_limit = max((power_limit * (4095-820) / data.max_power)+820, 820) # ausgabe nicht kleiner 4ma sonst Leistungsregelung der WP aus client.write_register(0x01f4, power_limit, ModbusDataType.INT_16, unit=modbus_id) return ConfigurableConsumer(consumer_config=config, initializer=initializer, error_handler=error_handler, - set_power_limit=set_limit,) + set_power_limit=set_power_limit,) device_descriptor = DeviceDescriptor(configuration_factory=Dac) diff --git a/packages/modules/consumers/generic/http/consumer.py b/packages/modules/consumers/generic/http/consumer.py index 080e4983ad..020c7bf3bb 100644 --- a/packages/modules/consumers/generic/http/consumer.py +++ b/packages/modules/consumers/generic/http/consumer.py @@ -5,7 +5,7 @@ from modules.common.abstract_device import DeviceDescriptor from modules.common.component_state import ConsumerState from modules.common.component_type import ComponentType -from modules.common.configurable_consumer import ConfigurableConsumer +from modules.common.configurable_consumer import ConfigurableConsumer, SetLimitData from modules.common.simcount._simcounter import SimCounterConsumer from modules.consumers.generic.http.config import Http from modules.devices.generic.http.api import (create_post_function, create_request_function, @@ -71,7 +71,7 @@ def switch_off(): # Authorization? post_switch_off(session, params={"state": False}) - def set_power_limit(power_limit: int): + def set_power_limit(power_limit: float, data: SetLimitData) -> None: # Authorization? post_set_power_limit(session, params={"power_limit": power_limit}) diff --git a/packages/modules/consumers/generic/json/consumer.py b/packages/modules/consumers/generic/json/consumer.py index 71b737bac2..34caecd075 100644 --- a/packages/modules/consumers/generic/json/consumer.py +++ b/packages/modules/consumers/generic/json/consumer.py @@ -7,7 +7,7 @@ from modules.common.abstract_device import DeviceDescriptor from modules.common.component_state import ConsumerState from modules.common.component_type import ComponentType -from modules.common.configurable_consumer import ConfigurableConsumer +from modules.common.configurable_consumer import ConfigurableConsumer, SetLimitData from modules.common.simcount._simcounter import SimCounterConsumer from modules.consumers.generic.json.config import Json @@ -84,7 +84,7 @@ def switch_off(): # Authorization? jq_switch_off({"state": False}) - def set_power_limit(power_limit: int): + def set_power_limit(power_limit: float, data: SetLimitData) -> None: # Authorization? jq_set_power_limit({"power_limit": power_limit}) diff --git a/packages/modules/consumers/idm/idm/consumer.py b/packages/modules/consumers/idm/idm/consumer.py index d3a6b27d38..f32116ce64 100644 --- a/packages/modules/consumers/idm/idm/consumer.py +++ b/packages/modules/consumers/idm/idm/consumer.py @@ -6,7 +6,7 @@ from modules.common.abstract_device import DeviceDescriptor from modules.common.component_state import ConsumerState from modules.common.component_type import ComponentType -from modules.common.configurable_consumer import ConfigurableConsumer +from modules.common.configurable_consumer import ConfigurableConsumer, SetLimitData from modules.common.modbus import ModbusDataType, ModbusTcpClient_ from modules.common.simcount._simcounter import SimCounterConsumer from modules.consumers.idm.idm.config import Idm @@ -71,7 +71,7 @@ def update() -> ConsumerState: exported=exported ) - def set_limit(power_limit: float) -> None: + def set_power_limit(power_limit: float, data: SetLimitData) -> None: # Schreibt den von openWB berechneten Überschuss in Register 74 (PV-Überschuss [kW]). # Keine echte Leistungsvorgabe - die IDM-Regelung berechnet ihre Strategie selbst anhand dieses Wertes. # Hinweis: Dies überschreibt den intern berechneten PV-Überschuss der IDM-Regelung und kann @@ -84,7 +84,7 @@ def set_limit(power_limit: float) -> None: error_handler=error_handler, update=update, send_values=send_values, - set_power_limit=set_limit) + set_power_limit=set_power_limit) device_descriptor = DeviceDescriptor(configuration_factory=Idm) diff --git a/packages/modules/consumers/lambda_/lambda_/consumer.py b/packages/modules/consumers/lambda_/lambda_/consumer.py index d31a3f9375..b65248d1f4 100644 --- a/packages/modules/consumers/lambda_/lambda_/consumer.py +++ b/packages/modules/consumers/lambda_/lambda_/consumer.py @@ -6,7 +6,7 @@ from modules.common.abstract_device import DeviceDescriptor from modules.common.component_state import ConsumerState from modules.common.component_type import ComponentType -from modules.common.configurable_consumer import ConfigurableConsumer +from modules.common.configurable_consumer import ConfigurableConsumer, SetLimitData from modules.common.modbus import ModbusDataType, ModbusTcpClient_ from modules.common.simcount._simcounter import SimCounterConsumer from modules.consumers.lambda_.lambda_.config import Lambda @@ -45,7 +45,7 @@ def update() -> ConsumerState: exported=exported ) - def set_limit(power_limit: float) -> None: + def set_power_limit(power_limit: float, data: SetLimitData) -> None: # Schreibt den von openWB berechneten Überschuss in Register 102 (E-Manager Bezug/Einspeisung). # Keine echte Leistungsvorgabe - die Wärmepumpe regelt weiterhin selbst anhand dieses Wertes. client.write_register(102, @@ -58,7 +58,7 @@ def set_limit(power_limit: float) -> None: error_handler=error_handler, update=update, send_values=send_values, - set_power_limit=set_limit,) + set_power_limit=set_power_limit,) device_descriptor = DeviceDescriptor(configuration_factory=Lambda) diff --git a/packages/modules/consumers/my_pv/acthor/consumer.py b/packages/modules/consumers/my_pv/acthor/consumer.py index f35b96d8dc..f35e63cab7 100644 --- a/packages/modules/consumers/my_pv/acthor/consumer.py +++ b/packages/modules/consumers/my_pv/acthor/consumer.py @@ -4,7 +4,7 @@ from modules.common.abstract_device import DeviceDescriptor from modules.common.component_state import ConsumerState from modules.common.component_type import ComponentType -from modules.common.configurable_consumer import ConfigurableConsumer +from modules.common.configurable_consumer import ConfigurableConsumer, SetLimitData from modules.common.modbus import ModbusDataType, ModbusTcpClient_ from modules.common.simcount._simcounter import SimCounterConsumer from modules.consumers.my_pv.acthor.config import Acthor @@ -61,14 +61,14 @@ def update() -> ConsumerState: temperatures=[resp[Register.TEMP0]/10, resp[Register.TEMP1]/10, resp[Register.TEMP2]/10] ) - def set_limit(power_limit: float) -> None: + def set_power_limit(power_limit: float, data: SetLimitData) -> None: power_limit = power_limit * FACTORS.get(config.configuration.model, 9000)/config.configuration.max_power client.write_registers(1000, power_limit, unit=config.configuration.modbus_id) return ConfigurableConsumer(consumer_config=config, initializer=initializer, error_handler=error_handler, update=update, - set_power_limit=set_limit,) + set_power_limit=set_power_limit,) device_descriptor = DeviceDescriptor(configuration_factory=Acthor) diff --git a/packages/modules/consumers/my_pv/elwa_e/consumer.py b/packages/modules/consumers/my_pv/elwa_e/consumer.py index 2fc0312bfb..f5c7cfd598 100644 --- a/packages/modules/consumers/my_pv/elwa_e/consumer.py +++ b/packages/modules/consumers/my_pv/elwa_e/consumer.py @@ -4,7 +4,7 @@ from modules.common.abstract_device import DeviceDescriptor from modules.common.component_state import ConsumerState from modules.common.component_type import ComponentType -from modules.common.configurable_consumer import ConfigurableConsumer +from modules.common.configurable_consumer import ConfigurableConsumer, SetLimitData from modules.common.modbus import ModbusDataType, ModbusTcpClient_ from modules.common.simcount._simcounter import SimCounterConsumer from modules.consumers.my_pv.elwa_e.config import Elwa @@ -70,7 +70,7 @@ def update() -> ConsumerState: temperatures=[resp[Register.TEMP0]/10] ) - def set_limit(power_limit: float) -> None: + def set_power_limit(power_limit: float, data: SetLimitData) -> None: if status == 4: log.debug("Elwa-E im Boost-Heat Modus, keine Leistungsvorgabe möglich") return @@ -84,7 +84,7 @@ def set_limit(power_limit: float) -> None: initializer=initializer, error_handler=error_handler, update=update, - set_power_limit=set_limit,) + set_power_limit=set_power_limit,) device_descriptor = DeviceDescriptor(configuration_factory=Elwa) diff --git a/packages/modules/consumers/ovum/ovum/consumer.py b/packages/modules/consumers/ovum/ovum/consumer.py index 48b6e9c5ce..3961f4ac53 100644 --- a/packages/modules/consumers/ovum/ovum/consumer.py +++ b/packages/modules/consumers/ovum/ovum/consumer.py @@ -6,7 +6,7 @@ from modules.common.abstract_device import DeviceDescriptor from modules.common.component_state import ConsumerState from modules.common.component_type import ComponentType -from modules.common.configurable_consumer import ConfigurableConsumer +from modules.common.configurable_consumer import ConfigurableConsumer, SetLimitData from modules.common.modbus import ModbusDataType, ModbusTcpClient_ from modules.common.simcount._simcounter import SimCounterConsumer from modules.consumers.ovum.ovum.config import Ovum @@ -54,7 +54,7 @@ def update() -> ConsumerState: exported=exported ) - def set_limit(power_limit: Optional[float]) -> None: + def set_power_limit(power_limit: Optional[float], data: SetLimitData) -> None: # ConsumerUsage.SUSPENDABLE_TUNABLE: externe Leistungsvorgabe. Ist-Modus wird vor dem # Schreiben gelesen, um unnötige Moduswechsel-Befehle zu vermeiden. unit = config.configuration.modbus_id @@ -119,7 +119,7 @@ def switch_off() -> None: error_handler=error_handler, update=update, send_values=send_values, - set_power_limit=set_limit, + set_power_limit=set_power_limit, switch_on=switch_on, switch_off=switch_off) diff --git a/packages/modules/consumers/ratiotherm/ratiotherm/consumer.py b/packages/modules/consumers/ratiotherm/ratiotherm/consumer.py index cd8cd4f06c..a4ef0573b9 100644 --- a/packages/modules/consumers/ratiotherm/ratiotherm/consumer.py +++ b/packages/modules/consumers/ratiotherm/ratiotherm/consumer.py @@ -2,7 +2,7 @@ import logging from modules.common.abstract_device import DeviceDescriptor from modules.common.component_type import ComponentType -from modules.common.configurable_consumer import ConfigurableConsumer +from modules.common.configurable_consumer import ConfigurableConsumer, SetLimitData from modules.common.modbus import ModbusDataType, ModbusTcpClient_ from modules.common.simcount._simcounter import SimCounterConsumer from modules.consumers.ratiotherm.ratiotherm.config import Ratiotherm @@ -22,14 +22,14 @@ def initializer(): def error_handler() -> None: initializer() - def set_limit(power_limit: float) -> None: + def set_power_limit(power_limit: float, data: SetLimitData) -> None: # Absturz bei negativen Zahlen client.write_register(100, max(power_limit, 0), ModbusDataType.INT_16, unit=config.configuration.modbus_id) return ConfigurableConsumer(consumer_config=config, initializer=initializer, error_handler=error_handler, - set_power_limit=set_limit,) + set_power_limit=set_power_limit,) device_descriptor = DeviceDescriptor(configuration_factory=Ratiotherm) diff --git a/packages/modules/consumers/solarfocus/vampair/consumer.py b/packages/modules/consumers/solarfocus/vampair/consumer.py index 20b0440799..812571a634 100644 --- a/packages/modules/consumers/solarfocus/vampair/consumer.py +++ b/packages/modules/consumers/solarfocus/vampair/consumer.py @@ -3,7 +3,7 @@ from modules.common.abstract_device import DeviceDescriptor from modules.common.component_state import ConsumerState from modules.common.component_type import ComponentType -from modules.common.configurable_consumer import ConfigurableConsumer +from modules.common.configurable_consumer import ConfigurableConsumer, SetLimitData from modules.common.modbus import ModbusDataType, ModbusTcpClient_ from modules.common.simcount._simcounter import SimCounterConsumer from modules.consumers.solarfocus.vampair.config import Vampair @@ -30,7 +30,7 @@ def update() -> ConsumerState: exported=exported ) - def set_power_limit(power_limit: float) -> None: + def set_power_limit(power_limit: float, data: SetLimitData) -> None: # Elektrische Sollleistung HEMS (PV) client.write_register(33415, power_limit, unit=config.configuration.modbus_id) client.write_register(33409, power_limit * -1, unit=config.configuration.modbus_id) From 5987efec7067c0879f3192102d538c44e71b53c1 Mon Sep 17 00:00:00 2001 From: LKuemmel <76958050+LKuemmel@users.noreply.github.com> Date: Wed, 26 Aug 2026 10:01:44 +0200 Subject: [PATCH 3/3] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- packages/modules/consumers/ratiotherm/ratiotherm/consumer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/modules/consumers/ratiotherm/ratiotherm/consumer.py b/packages/modules/consumers/ratiotherm/ratiotherm/consumer.py index a4ef0573b9..0ab039c769 100644 --- a/packages/modules/consumers/ratiotherm/ratiotherm/consumer.py +++ b/packages/modules/consumers/ratiotherm/ratiotherm/consumer.py @@ -24,8 +24,8 @@ def error_handler() -> None: def set_power_limit(power_limit: float, data: SetLimitData) -> None: # Absturz bei negativen Zahlen - client.write_register(100, max(power_limit, 0), ModbusDataType.INT_16, unit=config.configuration.modbus_id) - + raw_value = int(round(max(power_limit, 0))) + client.write_register(100, raw_value, ModbusDataType.INT_16, unit=config.configuration.modbus_id) return ConfigurableConsumer(consumer_config=config, initializer=initializer, error_handler=error_handler,