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 654f2ab1c5..e25b462dba 100644 --- a/packages/modules/consumers/generic/dac/consumer.py +++ b/packages/modules/consumers/generic/dac/consumer.py @@ -2,8 +2,8 @@ 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.modbus import ModbusTcpClient_ +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 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(): @@ -23,31 +23,26 @@ def initializer(): 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) + 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 / data.max_power, ModbusDataType.INT_16, unit=modbus_id) + elif config.configuration.model == Model.DA02: + 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 / 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) / 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..0ab039c769 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) - + 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, - 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)