diff --git a/packages/control/bat_all.py b/packages/control/bat_all.py index 4cc61cf35d..990f9419fb 100644 --- a/packages/control/bat_all.py +++ b/packages/control/bat_all.py @@ -20,7 +20,7 @@ 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 @@ -28,6 +28,7 @@ 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__) @@ -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 @@ -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() @@ -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) @@ -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") @@ -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 diff --git a/packages/control/bat_all_test.py b/packages/control/bat_all_test.py index ee9cf5fe4e..9fdfc946a2 100644 --- a/packages/control/bat_all_test.py +++ b/packages/control/bat_all_test.py @@ -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) @@ -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) diff --git a/packages/control/process.py b/packages/control/process.py index bfd0f407eb..2fadf4987a 100644 --- a/packages/control/process.py +++ b/packages/control/process.py @@ -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 @@ -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,