From 70ee5bffeb41f6fba1b8f4afba7098be36de425a Mon Sep 17 00:00:00 2001 From: LKuemmel Date: Mon, 31 Mar 2025 14:42:37 +0200 Subject: [PATCH 1/3] check power limit controlable --- docs/Neues Modul programmieren.md | 2 +- docs/samples/sample_modbus/bat.py | 7 ++++++- docs/samples/sample_request_by_component/bat.py | 13 +++++++++++++ docs/samples/sample_request_by_device/bat.py | 13 +++++++++++++ packages/control/bat_all.py | 2 +- packages/modules/common/abstract_device.py | 3 +++ packages/modules/devices/generic/mqtt/bat.py | 3 +++ 7 files changed, 40 insertions(+), 3 deletions(-) diff --git a/docs/Neues Modul programmieren.md b/docs/Neues Modul programmieren.md index e76061d3a8..0580e8a4e0 100644 --- a/docs/Neues Modul programmieren.md +++ b/docs/Neues Modul programmieren.md @@ -35,7 +35,7 @@ Bei Hybrid-Systemen erfolgt die Verrechnung von Speicher-und PV-Leistung automat #### Schnittstelle für die Speicher-Steuerung -Bei Speichern, die eine aktive Steuerung unterstützen, kann mit der Methode `set_power_limit` die Speicherleistung gesetzt werden. Die Speicher erben von der Klasse `AbstractBat`, die die abstrakte Methode `set_power_limit` beinhaltet. Bei der Implementierung des Speichers kannst Du diese Methode überschreiben. Die Regelung prüft am Ende, ob die Methode für den jeweiligen Speicher implementiert ist und ruft diese auf. Als Variable wird die Speicherleistung in Watt oder `None` übergeben, dann wird der Speicher nicht mehr aktiv von der openWB gesteuert und soll selbst anhand des EVU-Punktes regeln. +Ob ein Speicher die aktive Speichersteuerung unterstützt, wird in der Methode `power_limit_controlable` implementiert. Ist diese Methode nicht im Speicher implementiert, wird die Methode aus der geerbten Klasse `AbstractBat` aufgerufen und die Steuerbarkeit auf `False` gesetzt. Bei Speichern, die eine aktive Steuerung unterstützen, kann mit der Methode `set_power_limit` die Speicherleistung gesetzt werden. Als Variable wird die Speicherleistung in Watt oder `None` übergeben, dann wird der Speicher nicht mehr aktiv von der openWB gesteuert und soll selbst anhand des EVU-Punktes regeln. ### Neues Fahrzeug programmieren diff --git a/docs/samples/sample_modbus/bat.py b/docs/samples/sample_modbus/bat.py index eaee6a3f48..555c22575d 100644 --- a/docs/samples/sample_modbus/bat.py +++ b/docs/samples/sample_modbus/bat.py @@ -33,11 +33,16 @@ def update(self) -> None: self.store.set(bat_state) def set_power_limit(self, power_limit: Optional[int]) -> None: - # Methode entfernen, falls der Speicher keine Steuerung der Ladeleistung unterstützt # Wenn der Speicher die Steuerung der Ladeleistung unterstützt, muss bei Übergabe einer Zahl auf aktive # Speichersteurung umgeschaltet werden, sodass der Speicher mit der übergebenen Leistung lädt/entlädt. Wird # None übergeben, muss der Speicher die Null-Punkt-Ausregelung selbst übernehmen. self.client.write_registers(reg, power_limit) + # Wenn der Speicher keine Steuerung der Ladeleistung unterstützt + pass + + def power_limit_controlable(self) -> bool: + # Wenn der Speicher die Steuerung der Ladeleistung unterstützt, muss True zurückgegeben werden. + return True component_descriptor = ComponentDescriptor(configuration_factory=SampleBatSetup) diff --git a/docs/samples/sample_request_by_component/bat.py b/docs/samples/sample_request_by_component/bat.py index 0623ba06c7..d9b3c58c3e 100644 --- a/docs/samples/sample_request_by_component/bat.py +++ b/docs/samples/sample_request_by_component/bat.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +from typing import Optional from dataclass_utils import dataclass_from_dict from modules.common import req from modules.common.abstract_device import AbstractBat @@ -31,5 +32,17 @@ def update(self) -> None: ) self.store.set(bat_state) + def set_power_limit(self, power_limit: Optional[int]) -> None: + # Wenn der Speicher die Steuerung der Ladeleistung unterstützt, muss bei Übergabe einer Zahl auf aktive + # Speichersteurung umgeschaltet werden, sodass der Speicher mit der übergebenen Leistung lädt/entlädt. Wird + # None übergeben, muss der Speicher die Null-Punkt-Ausregelung selbst übernehmen. + self.client.write_registers(reg, power_limit) + # Wenn der Speicher keine Steuerung der Ladeleistung unterstützt + pass + + def power_limit_controlable(self) -> bool: + # Wenn der Speicher die Steuerung der Ladeleistung unterstützt, muss True zurückgegeben werden. + return True + component_descriptor = ComponentDescriptor(configuration_factory=SampleBatSetup) diff --git a/docs/samples/sample_request_by_device/bat.py b/docs/samples/sample_request_by_device/bat.py index 8c84673029..9e69200e3c 100644 --- a/docs/samples/sample_request_by_device/bat.py +++ b/docs/samples/sample_request_by_device/bat.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +from typing import Optional from dataclass_utils import dataclass_from_dict from modules.common.abstract_device import AbstractBat from modules.common.component_state import BatState @@ -29,5 +30,17 @@ def update(self, response) -> None: ) self.store.set(bat_state) + def set_power_limit(self, power_limit: Optional[int]) -> None: + # Wenn der Speicher die Steuerung der Ladeleistung unterstützt, muss bei Übergabe einer Zahl auf aktive + # Speichersteurung umgeschaltet werden, sodass der Speicher mit der übergebenen Leistung lädt/entlädt. Wird + # None übergeben, muss der Speicher die Null-Punkt-Ausregelung selbst übernehmen. + self.client.write_registers(reg, power_limit) + # Wenn der Speicher keine Steuerung der Ladeleistung unterstützt + pass + + def power_limit_controlable(self) -> bool: + # Wenn der Speicher die Steuerung der Ladeleistung unterstützt, muss True zurückgegeben werden. + return True + component_descriptor = ComponentDescriptor(configuration_factory=SampleBatSetup) diff --git a/packages/control/bat_all.py b/packages/control/bat_all.py index c58c8a396c..7151c24c5f 100644 --- a/packages/control/bat_all.py +++ b/packages/control/bat_all.py @@ -346,6 +346,6 @@ def get_controllable_bat_components() -> List: if isinstance(value, AbstractDevice): for comp_value in value.components.values(): if "bat" in comp_value.component_config.type: - if "set_power_limit" in type(comp_value).__dict__: + if comp_value.power_limit_controlable(): bat_components.append(comp_value) return bat_components diff --git a/packages/modules/common/abstract_device.py b/packages/modules/common/abstract_device.py index 88f33e90b7..0fa337b5c3 100644 --- a/packages/modules/common/abstract_device.py +++ b/packages/modules/common/abstract_device.py @@ -30,6 +30,9 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: # power limit None heißt, auf maximale Speicherleistung setzen = Speicher-Begrenzung aufheben pass + def power_limit_controlable(self) -> bool: + return False + class AbstractCounter: @abstractmethod diff --git a/packages/modules/devices/generic/mqtt/bat.py b/packages/modules/devices/generic/mqtt/bat.py index 5f518c26e7..37fe145de3 100644 --- a/packages/modules/devices/generic/mqtt/bat.py +++ b/packages/modules/devices/generic/mqtt/bat.py @@ -18,5 +18,8 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: # ob der Speicher die Funktion bietet pass + def power_limit_controlable(self) -> bool: + return True + component_descriptor = ComponentDescriptor(configuration_factory=MqttBatSetup) From bb82fa7de1f10a247333c51de0b94ec435186f7a Mon Sep 17 00:00:00 2001 From: Lutz Bender Date: Mon, 7 Apr 2025 08:54:59 +0200 Subject: [PATCH 2/3] fix typo --- docs/Neues Modul programmieren.md | 2 +- docs/samples/sample_modbus/bat.py | 2 +- docs/samples/sample_request_by_component/bat.py | 2 +- docs/samples/sample_request_by_device/bat.py | 2 +- packages/control/bat_all.py | 2 +- packages/modules/common/abstract_device.py | 2 +- packages/modules/devices/generic/mqtt/bat.py | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/Neues Modul programmieren.md b/docs/Neues Modul programmieren.md index 0580e8a4e0..98e6159a20 100644 --- a/docs/Neues Modul programmieren.md +++ b/docs/Neues Modul programmieren.md @@ -35,7 +35,7 @@ Bei Hybrid-Systemen erfolgt die Verrechnung von Speicher-und PV-Leistung automat #### Schnittstelle für die Speicher-Steuerung -Ob ein Speicher die aktive Speichersteuerung unterstützt, wird in der Methode `power_limit_controlable` implementiert. Ist diese Methode nicht im Speicher implementiert, wird die Methode aus der geerbten Klasse `AbstractBat` aufgerufen und die Steuerbarkeit auf `False` gesetzt. Bei Speichern, die eine aktive Steuerung unterstützen, kann mit der Methode `set_power_limit` die Speicherleistung gesetzt werden. Als Variable wird die Speicherleistung in Watt oder `None` übergeben, dann wird der Speicher nicht mehr aktiv von der openWB gesteuert und soll selbst anhand des EVU-Punktes regeln. +Ob ein Speicher die aktive Speichersteuerung unterstützt, wird in der Methode `power_limit_controllable` implementiert. Ist diese Methode nicht im Speicher implementiert, wird die Methode aus der geerbten Klasse `AbstractBat` aufgerufen und die Steuerbarkeit auf `False` gesetzt. Bei Speichern, die eine aktive Steuerung unterstützen, kann mit der Methode `set_power_limit` die Speicherleistung gesetzt werden. Als Variable wird die Speicherleistung in Watt oder `None` übergeben, dann wird der Speicher nicht mehr aktiv von der openWB gesteuert und soll selbst anhand des EVU-Punktes regeln. ### Neues Fahrzeug programmieren diff --git a/docs/samples/sample_modbus/bat.py b/docs/samples/sample_modbus/bat.py index 555c22575d..3f8a9642a2 100644 --- a/docs/samples/sample_modbus/bat.py +++ b/docs/samples/sample_modbus/bat.py @@ -40,7 +40,7 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: # Wenn der Speicher keine Steuerung der Ladeleistung unterstützt pass - def power_limit_controlable(self) -> bool: + def power_limit_controllable(self) -> bool: # Wenn der Speicher die Steuerung der Ladeleistung unterstützt, muss True zurückgegeben werden. return True diff --git a/docs/samples/sample_request_by_component/bat.py b/docs/samples/sample_request_by_component/bat.py index d9b3c58c3e..a435f67fda 100644 --- a/docs/samples/sample_request_by_component/bat.py +++ b/docs/samples/sample_request_by_component/bat.py @@ -40,7 +40,7 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: # Wenn der Speicher keine Steuerung der Ladeleistung unterstützt pass - def power_limit_controlable(self) -> bool: + def power_limit_controllable(self) -> bool: # Wenn der Speicher die Steuerung der Ladeleistung unterstützt, muss True zurückgegeben werden. return True diff --git a/docs/samples/sample_request_by_device/bat.py b/docs/samples/sample_request_by_device/bat.py index 9e69200e3c..469d1e5f46 100644 --- a/docs/samples/sample_request_by_device/bat.py +++ b/docs/samples/sample_request_by_device/bat.py @@ -38,7 +38,7 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: # Wenn der Speicher keine Steuerung der Ladeleistung unterstützt pass - def power_limit_controlable(self) -> bool: + def power_limit_controllable(self) -> bool: # Wenn der Speicher die Steuerung der Ladeleistung unterstützt, muss True zurückgegeben werden. return True diff --git a/packages/control/bat_all.py b/packages/control/bat_all.py index 7151c24c5f..c84cd5aed0 100644 --- a/packages/control/bat_all.py +++ b/packages/control/bat_all.py @@ -346,6 +346,6 @@ def get_controllable_bat_components() -> List: if isinstance(value, AbstractDevice): for comp_value in value.components.values(): if "bat" in comp_value.component_config.type: - if comp_value.power_limit_controlable(): + if comp_value.power_limit_controllable(): bat_components.append(comp_value) return bat_components diff --git a/packages/modules/common/abstract_device.py b/packages/modules/common/abstract_device.py index 0fa337b5c3..7956a7d59f 100644 --- a/packages/modules/common/abstract_device.py +++ b/packages/modules/common/abstract_device.py @@ -30,7 +30,7 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: # power limit None heißt, auf maximale Speicherleistung setzen = Speicher-Begrenzung aufheben pass - def power_limit_controlable(self) -> bool: + def power_limit_controllable(self) -> bool: return False diff --git a/packages/modules/devices/generic/mqtt/bat.py b/packages/modules/devices/generic/mqtt/bat.py index 37fe145de3..d5e64ea794 100644 --- a/packages/modules/devices/generic/mqtt/bat.py +++ b/packages/modules/devices/generic/mqtt/bat.py @@ -18,7 +18,7 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: # ob der Speicher die Funktion bietet pass - def power_limit_controlable(self) -> bool: + def power_limit_controllable(self) -> bool: return True From 1a310352d4b806757c10dc128150078ccc806431 Mon Sep 17 00:00:00 2001 From: Lutz Bender Date: Mon, 7 Apr 2025 08:55:31 +0200 Subject: [PATCH 3/3] add power limit controllable to mqtt bat configuration --- packages/modules/devices/generic/mqtt/bat.py | 2 +- packages/modules/devices/generic/mqtt/config.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/modules/devices/generic/mqtt/bat.py b/packages/modules/devices/generic/mqtt/bat.py index d5e64ea794..252a1483f4 100644 --- a/packages/modules/devices/generic/mqtt/bat.py +++ b/packages/modules/devices/generic/mqtt/bat.py @@ -19,7 +19,7 @@ def set_power_limit(self, power_limit: Optional[int]) -> None: pass def power_limit_controllable(self) -> bool: - return True + return self.component_config.configuration.power_limit_controllable component_descriptor = ComponentDescriptor(configuration_factory=MqttBatSetup) diff --git a/packages/modules/devices/generic/mqtt/config.py b/packages/modules/devices/generic/mqtt/config.py index cda7d72ca0..aa14d4ad4b 100644 --- a/packages/modules/devices/generic/mqtt/config.py +++ b/packages/modules/devices/generic/mqtt/config.py @@ -22,8 +22,8 @@ def __init__(self, class MqttBatConfiguration: - def __init__(self): - pass + def __init__(self, power_limit_controllable: bool = False): + self.power_limit_controllable = power_limit_controllable class MqttBatSetup(ComponentSetup[MqttBatConfiguration]):