Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/Neues Modul programmieren.md
Original file line number Diff line number Diff line change
Expand Up @@ -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_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

Expand Down
7 changes: 6 additions & 1 deletion docs/samples/sample_modbus/bat.py
Original file line number Diff line number Diff line change
Expand Up @@ -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_controllable(self) -> bool:
# Wenn der Speicher die Steuerung der Ladeleistung unterstützt, muss True zurückgegeben werden.
return True


component_descriptor = ComponentDescriptor(configuration_factory=SampleBatSetup)
13 changes: 13 additions & 0 deletions docs/samples/sample_request_by_component/bat.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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_controllable(self) -> bool:
# Wenn der Speicher die Steuerung der Ladeleistung unterstützt, muss True zurückgegeben werden.
return True


component_descriptor = ComponentDescriptor(configuration_factory=SampleBatSetup)
13 changes: 13 additions & 0 deletions docs/samples/sample_request_by_device/bat.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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_controllable(self) -> bool:
# Wenn der Speicher die Steuerung der Ladeleistung unterstützt, muss True zurückgegeben werden.
return True


component_descriptor = ComponentDescriptor(configuration_factory=SampleBatSetup)
2 changes: 1 addition & 1 deletion packages/control/bat_all.py
Original file line number Diff line number Diff line change
Expand Up @@ -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_controllable():
bat_components.append(comp_value)
return bat_components
3 changes: 3 additions & 0 deletions packages/modules/common/abstract_device.py
Original file line number Diff line number Diff line change
Expand Up @@ -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_controllable(self) -> bool:
return False


class AbstractCounter:
@abstractmethod
Expand Down
3 changes: 3 additions & 0 deletions packages/modules/devices/generic/mqtt/bat.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,8 @@ def set_power_limit(self, power_limit: Optional[int]) -> None:
# ob der Speicher die Funktion bietet
pass

def power_limit_controllable(self) -> bool:
return self.component_config.configuration.power_limit_controllable


component_descriptor = ComponentDescriptor(configuration_factory=MqttBatSetup)
4 changes: 2 additions & 2 deletions packages/modules/devices/generic/mqtt/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]):
Expand Down