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
38 changes: 24 additions & 14 deletions packages/control/bat_all.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,15 @@
from dataclasses import dataclass, field
from enum import Enum
import logging
from typing import List, Optional
from typing import List, Optional, Tuple

from control import data
from control.algorithm.chargemodes import CONSIDERED_CHARGE_MODES_CHARGING
from control.algorithm.filter_chargepoints import get_chargepoints_with_required_current_by_chargemode
from control.pv import Pv
from helpermodules.constants import NO_ERROR
from modules.common.abstract_device import AbstractDevice
from modules.common.component_context import SingleComponentUpdateContext

log = logging.getLogger(__name__)

Expand Down Expand Up @@ -230,7 +231,7 @@ def _limit_bat_power_discharge(self, required_power):
return required_power

def _set_bat_power_active_control(self, power):
controllable_bat_components = get_controllable_bat_components()
controllable_bat_components, _ = get_bat_components_by_controllability()
# maximal mögliche Lade- und Entladeleistung des Systems unter Einbeziehung
# der erlaubten Lade-/ Entladeleistung und SoC der regelbaren Speicher ermitteln
max_charge_power_total = 0
Expand Down Expand Up @@ -317,8 +318,8 @@ def setup_bat(self):
"""
try:
if self.data.config.configured is True:
self.set_power_limit_controllable_state()
if self.data.get.fault_state == 0:
self.set_power_limit_controllable()
self.get_power_limit()
self._set_bat_power_active_control(self.data.set.power_limit)
self._get_charging_power_left()
Expand Down Expand Up @@ -441,15 +442,18 @@ def power_for_bat_charging(self):
log.exception("Fehler im Bat-Modul")
return 0

def set_power_limit_controllable(self):
controllable_bat_components = get_controllable_bat_components()
if len(controllable_bat_components) > 0:
def set_power_limit_controllable_state(self):
bat_components_controllable, bat_components_not_controllable = get_bat_components_by_controllability()
if len(bat_components_controllable) > 0:
self.data.get.power_limit_controllable = True
for bat in controllable_bat_components:
data.data.bat_data[f"bat{bat.component_config.id}"].data.get.power_limit_controllable = True
else:
self.data.get.power_limit_controllable = False

for bat in bat_components_controllable:
data.data.bat_data[f"bat{bat.component_config.id}"].data.get.power_limit_controllable = True
for bat in bat_components_not_controllable:
data.data.bat_data[f"bat{bat.component_config.id}"].data.get.power_limit_controllable = False

def get_charge_mode_vehicle_charge(self):
chargepoint_by_chargemodes = get_chargepoints_with_required_current_by_chargemode(
CONSIDERED_CHARGE_MODES_CHARGING)
Expand Down Expand Up @@ -568,7 +572,7 @@ def get_power_limit(self):
charge_mode = self.get_charge_mode_scheduled()

# calculate power_limit
controllable_bat_components = get_controllable_bat_components()
controllable_bat_components, _ = get_bat_components_by_controllability()
if charge_mode == BatChargeMode.BAT_SELF_REGULATION:
self.data.set.power_limit = None
log.debug("Speicher-Leistung nicht begrenzen")
Expand Down Expand Up @@ -609,12 +613,18 @@ def get_power_limit(self):
self.data.set.current_state = CurrentState.ACTIVE.value


def get_controllable_bat_components() -> List:
bat_components = []
def get_bat_components_by_controllability() -> Tuple[List, List]:
bat_components_controllable, bat_components_not_controllable = [], []
for value in data.data.system_data.values():
if isinstance(value, AbstractDevice):
for comp_value in value.components.values():
if "bat" in comp_value.component_config.type:
if comp_value.power_limit_controllable():
bat_components.append(comp_value)
return bat_components
try:
with SingleComponentUpdateContext(comp_value.fault_state, update_always=False, reraise=True):
if comp_value.power_limit_controllable():
bat_components_controllable.append(comp_value)
else:
bat_components_not_controllable.append(comp_value)
except Exception:
bat_components_not_controllable.append(comp_value)
return bat_components_controllable, bat_components_not_controllable
10 changes: 6 additions & 4 deletions packages/control/bat_all_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -275,11 +275,12 @@ def test_active_bat_control(params: BatControlParams, data_, monkeypatch):
get_chargepoints_with_required_current_by_chargemode_mock)
get_evu_counter_mock = Mock(return_value=data.data.counter_data["counter0"])
monkeypatch.setattr(data.data.counter_all_data, "get_evu_counter", get_evu_counter_mock)
get_controllable_bat_components_mock = Mock(return_value=[MqttBat(MqttBatSetup(id=2), device_id=0)])
get_bat_components_by_controllability_mock = Mock(return_value=([MqttBat(MqttBatSetup(id=2), device_id=0)], []))
data.data.bat_data["bat2"].data.get.soc = params.bat_soc
data.data.bat_data["bat2"].data.get.max_charge_power = params.max_charge_power
data.data.bat_data["bat2"].data.get.max_discharge_power = params.max_discharge_power
monkeypatch.setattr(bat_all, "get_controllable_bat_components", get_controllable_bat_components_mock)
monkeypatch.setattr(bat_all, "get_bat_components_by_controllability",
get_bat_components_by_controllability_mock)

data.data.bat_all_data.get_power_limit()
data.data.bat_all_data._set_bat_power_active_control(data.data.bat_all_data.data.set.power_limit)
Expand Down Expand Up @@ -357,11 +358,12 @@ def test_control_price_limit(params: BatControlParams, data_, monkeypatch):
get_chargepoints_with_required_current_by_chargemode_mock)
get_evu_counter_mock = Mock(return_value=data.data.counter_data["counter0"])
monkeypatch.setattr(data.data.counter_all_data, "get_evu_counter", get_evu_counter_mock)
get_controllable_bat_components_mock = Mock(return_value=[MqttBat(MqttBatSetup(id=2), device_id=0)])
get_bat_components_by_controllability_mock = Mock(return_value=([MqttBat(MqttBatSetup(id=2), device_id=0)], []))
data.data.bat_data["bat2"].data.get.soc = params.bat_soc
data.data.bat_data["bat2"].data.get.max_charge_power = params.max_charge_power
data.data.bat_data["bat2"].data.get.max_discharge_power = params.max_discharge_power
monkeypatch.setattr(bat_all, "get_controllable_bat_components", get_controllable_bat_components_mock)
monkeypatch.setattr(bat_all, "get_bat_components_by_controllability",
get_bat_components_by_controllability_mock)

data.data.bat_all_data.get_power_limit()
data.data.bat_all_data._set_bat_power_active_control(data.data.bat_all_data.data.set.power_limit)
Expand Down
4 changes: 2 additions & 2 deletions packages/control/process.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from threading import Thread
from typing import List

from control.bat_all import get_controllable_bat_components
from control.bat_all import get_bat_components_by_controllability
from control.chargelog import chargelog
from control.chargepoint import chargepoint
from control import data
Expand Down Expand Up @@ -63,7 +63,7 @@ def process_algorithm_results(self) -> None:
except Exception:
log.exception("Fehler im Process-Modul für Ladepunkt "+str(cp))
if data.data.bat_all_data.data.set.set_limit:
for bat_component in get_controllable_bat_components():
for bat_component in get_bat_components_by_controllability()[0]:
modules_threads.append(
Thread(
target=set_power_limit_wrapper,
Expand Down
Loading