diff --git a/packages/control/algorithm/surplus_controlled.py b/packages/control/algorithm/surplus_controlled.py index e2e894df51..75b26d6f84 100644 --- a/packages/control/algorithm/surplus_controlled.py +++ b/packages/control/algorithm/surplus_controlled.py @@ -31,12 +31,7 @@ def set_surplus_current(self) -> None: for mode_tuple, counter in common.mode_and_counter_generator(CONSIDERED_CHARGE_MODES_SURPLUS): preferenced_chargepoints, preferenced_cps_without_set_current = get_preferenced_chargepoint_charging( get_chargepoints_by_mode_and_counter(mode_tuple, f"counter{counter.num}")) - cp_with_feed_in, cp_without_feed_in = self.filter_by_feed_in_limit(preferenced_chargepoints) - if cp_without_feed_in: - self._set(cp_without_feed_in, 0, mode_tuple, counter) - feed_in_yield = data.data.general_data.data.chargemode_config.pv_charging.feed_in_yield - if cp_with_feed_in: - self._set(cp_with_feed_in, feed_in_yield, mode_tuple, counter) + self._set(preferenced_chargepoints, mode_tuple, counter) if preferenced_cps_without_set_current: for cp in preferenced_cps_without_set_current: cp.data.set.current = cp.data.set.target_current @@ -46,7 +41,6 @@ def set_surplus_current(self) -> None: def _set(self, chargepoints: List[Chargepoint], - feed_in_yield: Optional[int], mode_tuple: Tuple[Optional[str], str, bool], counter: Counter) -> None: log.info(f"Mode-Tuple {mode_tuple[0]} - {mode_tuple[1]} - {mode_tuple[2]}, Zähler {counter.num}") @@ -58,12 +52,11 @@ def _set(self, missing_currents, voltages_mean(cp.data.get.voltages), counter, - cp, - feed_in=feed_in_yield + cp ) cp.data.control_parameter.limit = limit available_for_cp = common.available_current_for_cp(cp, counts, available_currents, missing_currents) - if counter.get_control_range_state(feed_in_yield) == ControlRangeState.MIDDLE: + if counter.get_control_range_state() == ControlRangeState.MIDDLE: pv_charging = data.data.general_data.data.chargemode_config.pv_charging dif_to_old_current = available_for_cp + cp.data.set.target_current - cp.data.set.current_prev # Wenn die Differenz zwischen altem und neuem Soll-Strom größer als der Regelbereich ist, trotzdem @@ -101,14 +94,6 @@ def _set_loadmangement_message(self, chargepoint.set_state_and_log(f"Es kann nicht mit der vorgegebenen Stromstärke geladen werden" f"{limit.message}") - # tested - def filter_by_feed_in_limit(self, chargepoints: List[Chargepoint]) -> Tuple[List[Chargepoint], List[Chargepoint]]: - cp_with_feed_in = list(filter(lambda cp: cp.data.set.charge_template.data.chargemode. - pv_charging.feed_in_limit is True, chargepoints)) - cp_without_feed_in = list(filter(lambda cp: cp.data.set.charge_template.data.chargemode. - pv_charging.feed_in_limit is False, chargepoints)) - return cp_with_feed_in, cp_without_feed_in - def _fix_deviating_evse_current(self, chargepoint: Chargepoint) -> float: """Wenn Autos nicht die volle Ladeleistung nutzen, wird unnötig eingespeist. Dann kann um den noch nicht genutzten Soll-Strom hochgeregelt werden. Wenn Fahrzeuge entgegen der Norm mehr Ladeleistung beziehen, als diff --git a/packages/control/algorithm/surplus_controlled_test.py b/packages/control/algorithm/surplus_controlled_test.py index 962eca835b..d207175757 100644 --- a/packages/control/algorithm/surplus_controlled_test.py +++ b/packages/control/algorithm/surplus_controlled_test.py @@ -30,29 +30,6 @@ def mock_cp3() -> Chargepoint: return Chargepoint(3, None) -@pytest.mark.parametrize("feed_in_limit_1, feed_in_limit_2, feed_in_limit_3, expected_sorted", - [pytest.param(True, True, True, ([mock_cp1, mock_cp2, mock_cp3], [])), - pytest.param(True, False, True, ([mock_cp1, mock_cp3], [mock_cp2])), - pytest.param(False, False, False, ([], [mock_cp1, mock_cp2, mock_cp3]))]) -def test_filter_by_feed_in_limit(feed_in_limit_1: bool, - feed_in_limit_2: bool, - feed_in_limit_3: bool, - expected_sorted: int): - # setup - def setup_cp(cp: Chargepoint, feed_in_limit: bool) -> Chargepoint: - cp.data = ChargepointData() - cp.data.set.charge_template.data.chargemode.pv_charging.feed_in_limit = feed_in_limit - return cp - - cp1 = setup_cp(mock_cp1, feed_in_limit_1) - cp2 = setup_cp(mock_cp2, feed_in_limit_2) - cp3 = setup_cp(mock_cp3, feed_in_limit_3) - # execution - cp_with_feed_in, cp_without_feed_in = SurplusControlled().filter_by_feed_in_limit([cp1, cp2, cp3]) - # evaluation - assert (cp_with_feed_in, cp_without_feed_in) == expected_sorted - - @pytest.mark.parametrize("new_current, expected_current", [ pytest.param(7, 10), @@ -129,16 +106,21 @@ def test_add_unused_evse_current(evse_current: float, @pytest.mark.parametrize( - "submode_1, submode_2, expected_chargepoints", + "submode_1, submode_2, expected_cp_indices", [ - pytest.param(Chargemode.PV_CHARGING, Chargemode.PV_CHARGING, [mock_cp1, mock_cp2]), - pytest.param(Chargemode.INSTANT_CHARGING, Chargemode.PV_CHARGING, [mock_cp2]), + pytest.param(Chargemode.PV_CHARGING, Chargemode.PV_CHARGING, [1, 2]), + pytest.param(Chargemode.INSTANT_CHARGING, Chargemode.PV_CHARGING, [2]), pytest.param(Chargemode.INSTANT_CHARGING, Chargemode.INSTANT_CHARGING, []), ]) def test_get_chargepoints_submode_pv_charging(submode_1: Chargemode, submode_2: Chargemode, - expected_chargepoints: List[Chargepoint]): + expected_cp_indices: List[int], + mock_cp1: Chargepoint, + mock_cp2: Chargepoint): # setup + cp_mapping = {1: mock_cp1, 2: mock_cp2} + expected_chargepoints = [cp_mapping[i] for i in expected_cp_indices] + def setup_cp(cp: Chargepoint, submode: str) -> Chargepoint: cp.data.set.charging_ev_data = Ev(0) cp.data.control_parameter.chargemode = Chargemode.PV_CHARGING diff --git a/packages/control/counter.py b/packages/control/counter.py index b3e6fcddf0..d3cd95971b 100644 --- a/packages/control/counter.py +++ b/packages/control/counter.py @@ -231,9 +231,13 @@ def calc_raw_surplus(self): ranged_surplus = surplus + self._control_range_offset() return ranged_surplus - def get_control_range_state(self, feed_in_yield: int) -> ControlRangeState: + def get_control_range_state(self) -> ControlRangeState: control_range_low = data.data.general_data.data.chargemode_config.pv_charging.control_range[0] control_range_high = data.data.general_data.data.chargemode_config.pv_charging.control_range[1] + if data.data.general_data.data.chargemode_config.pv_charging.feed_in_limit: + feed_in_yield = data.data.general_data.data.chargemode_config.feed_in_yield + else: + feed_in_yield = 0 surplus = data.data.counter_all_data.get_evu_counter().data.get.power + feed_in_yield if control_range_low > surplus: return ControlRangeState.BELOW @@ -270,8 +274,8 @@ def calc_switch_on_power(self, chargepoint: Chargepoint) -> Tuple[float, float]: control_parameter = chargepoint.data.control_parameter pv_config = data.data.general_data.data.chargemode_config.pv_charging - if chargepoint.data.set.charge_template.data.chargemode.pv_charging.feed_in_limit: - threshold = pv_config.feed_in_yield + if data.data.general_data.data.chargemode_config.pv_charging.feed_in_limit: + threshold = data.data.general_data.data.chargemode_config.feed_in_yield else: threshold = pv_config.switch_on_threshold*control_parameter.phases return surplus, threshold @@ -280,8 +284,7 @@ def switch_on_threshold_reached(self, chargepoint: Chargepoint) -> None: try: message = None control_parameter = chargepoint.data.control_parameter - feed_in_limit = chargepoint.data.set.charge_template.data.chargemode.pv_charging.\ - feed_in_limit + feed_in_limit = data.data.general_data.data.chargemode_config.pv_charging.feed_in_limit pv_config = data.data.general_data.data.chargemode_config.pv_charging timestamp_switch_on_off = control_parameter.timestamp_switch_on_off @@ -305,7 +308,7 @@ def switch_on_threshold_reached(self, chargepoint: Chargepoint) -> None: message = self.SWITCH_ON_WAITING.format(timecheck.convert_timestamp_delta_to_time_string( timestamp_switch_on_off, pv_config.switch_on_delay)) if feed_in_limit: - message += "Die Einspeisegrenze wird berücksichtigt." + message += " Die Einspeisegrenze wird berücksichtigt." control_parameter.state = ChargepointState.SWITCH_ON_DELAY else: # Einschaltschwelle nicht erreicht @@ -343,8 +346,8 @@ def switch_on_timer_expired(self, chargepoint: Chargepoint) -> None: msg = self.SWITCH_ON_EXPIRED.format(pv_config.switch_on_threshold) control_parameter.state = ChargepointState.WAIT_FOR_USING_PHASES - if chargepoint.data.set.charge_template.data.chargemode.pv_charging.feed_in_limit: - feed_in_yield = pv_config.feed_in_yield + if pv_config.feed_in_limit: + feed_in_yield = data.data.general_data.data.chargemode_config.feed_in_yield else: feed_in_yield = 0 ev_template = charging_ev_data.ev_template @@ -391,11 +394,11 @@ def switch_off_check_timer(self, chargepoint: Chargepoint) -> None: def calc_switch_off_threshold(self, chargepoint: Chargepoint) -> float: pv_config = data.data.general_data.data.chargemode_config.pv_charging control_parameter = chargepoint.data.control_parameter - if chargepoint.data.set.charge_template.data.chargemode.pv_charging.feed_in_limit: + if pv_config.feed_in_limit: # Der EVU-Überschuss muss ggf um die Einspeisegrenze bereinigt werden. # Wnn die Leistung nicht Einspeisegrenze + Einschaltschwelle erreicht, darf die Ladung nicht pulsieren. # Abschaltschwelle um Einschaltschwelle reduzieren. - threshold = (-data.data.general_data.data.chargemode_config.pv_charging.feed_in_yield + threshold = (-data.data.general_data.data.chargemode_config.feed_in_yield + pv_config.switch_on_threshold*control_parameter.phases) else: threshold = pv_config.switch_off_threshold diff --git a/packages/control/counter_test.py b/packages/control/counter_test.py index 4b3e59466a..c480715d1c 100644 --- a/packages/control/counter_test.py +++ b/packages/control/counter_test.py @@ -122,7 +122,7 @@ class Params: -681, 15000, 1652683250.0, ChargepointState.SWITCH_ON_DELAY, Counter.SWITCH_ON_FALLEN_BELOW.format(1500), None, 0), Params("Feed_in_limit, Timer starten", True, 0, 15001, 15000, None, ChargepointState.NO_CHARGING_ALLOWED, - Counter.SWITCH_ON_WAITING.format("30 Sek."), 1652683252.0, 1500), + Counter.SWITCH_ON_WAITING.format("30 Sek.")+" Die Einspeisegrenze wird berücksichtigt.", 1652683252.0, 1500), Params("Feed_in_limit, Einschaltschwelle nicht erreicht", True, 0, 14999, 15000, None, ChargepointState.NO_CHARGING_ALLOWED, Counter.SWITCH_ON_NOT_EXCEEDED.format(1500), None, 0), Params("Feed_in_limit, Einschaltschwelle läuft", True, 1500, 15001, @@ -141,7 +141,7 @@ def test_switch_on_threshold_reached(params: Params, caplog, general_data_fixtur cp.data.control_parameter.state = params.state cp.data.control_parameter.timestamp_switch_on_off = params.timestamp_switch_on_off ev.data.charge_template = ChargeTemplate() - ev.data.charge_template.data.chargemode.pv_charging.feed_in_limit = params.feed_in_limit + data.data.general_data.data.chargemode_config.pv_charging.feed_in_limit = params.feed_in_limit cp.data.set.charging_ev_data = ev mock_calc_switch_on_power = Mock(return_value=[params.surplus, params.threshold]) monkeypatch.setattr(Counter, "calc_switch_on_power", mock_calc_switch_on_power) diff --git a/packages/control/ev/charge_template.py b/packages/control/ev/charge_template.py index 11c66be9d5..30eb3b7c15 100644 --- a/packages/control/ev/charge_template.py +++ b/packages/control/ev/charge_template.py @@ -64,7 +64,6 @@ class InstantCharging: class PvCharging: dc_min_current: float = 145 dc_min_soc_current: float = 145 - feed_in_limit: bool = False limit: Limit = field(default_factory=limit_factory) min_current: int = 0 min_soc_current: int = 10 diff --git a/packages/control/ev/ev.py b/packages/control/ev/ev.py index ae2d1aa02b..346fc7a55c 100644 --- a/packages/control/ev/ev.py +++ b/packages/control/ev/ev.py @@ -267,8 +267,8 @@ def _check_phase_switch_conditions(self, phases_in_use = control_parameter.phases pv_config = data.data.general_data.data.chargemode_config.pv_charging max_phases_ev = self.ev_template.data.max_phases - if charge_template.data.chargemode.pv_charging.feed_in_limit: - feed_in_yield = pv_config.feed_in_yield + if pv_config.feed_in_limit: + feed_in_yield = data.data.general_data.data.chargemode_config.feed_in_yield else: feed_in_yield = 0 all_surplus = data.data.counter_all_data.get_evu_counter().get_usable_surplus(feed_in_yield) @@ -311,8 +311,8 @@ def auto_phase_switch(self, phases_to_use = control_parameter.phases phases_in_use = control_parameter.phases pv_config = data.data.general_data.data.chargemode_config.pv_charging - if charge_template.data.chargemode.pv_charging.feed_in_limit: - feed_in_yield = pv_config.feed_in_yield + if pv_config.feed_in_limit: + feed_in_yield = data.data.general_data.data.chargemode_config.feed_in_yield else: feed_in_yield = 0 all_surplus = data.data.counter_all_data.get_evu_counter().get_usable_surplus(feed_in_yield) diff --git a/packages/control/general.py b/packages/control/general.py index 388e83514a..de4d93bb9c 100644 --- a/packages/control/general.py +++ b/packages/control/general.py @@ -24,8 +24,8 @@ class PvCharging: "topic": "chargemode_config/pv_charging/bat_power_reserve_active"}) control_range: List = field(default_factory=control_range_factory, metadata={ "topic": "chargemode_config/pv_charging/control_range"}) - feed_in_yield: int = field(default=15000, metadata={ - "topic": "chargemode_config/pv_charging/feed_in_yield"}) + feed_in_limit: bool = field(default=False, metadata={ + "topic": "chargemode_config/pv_charging/feed_in_limit"}) phase_switch_delay: int = field(default=7, metadata={ "topic": "chargemode_config/pv_charging/phase_switch_delay"}) bat_power_discharge: int = field(default=1500, metadata={ @@ -57,6 +57,8 @@ def pv_charging_factory() -> PvCharging: @dataclass class ChargemodeConfig: + feed_in_yield: int = field(default=15000, metadata={ + "topic": "chargemode_config/feed_in_yield"}) pv_charging: PvCharging = field(default_factory=pv_charging_factory) unbalanced_load_limit: int = field( default=18, metadata={"topic": "chargemode_config/unbalanced_load_limit"}) diff --git a/packages/control/loadmanagement.py b/packages/control/loadmanagement.py index a1567b32ff..c58201cb76 100644 --- a/packages/control/loadmanagement.py +++ b/packages/control/loadmanagement.py @@ -17,8 +17,7 @@ class Loadmanagement: def get_available_currents(self, missing_currents: List[float], counter: Counter, - cp: Chargepoint, - feed_in: int = 0) -> Tuple[List[float], LoadmanagementLimit]: + cp: Chargepoint) -> Tuple[List[float], LoadmanagementLimit]: raw_currents_left = counter.data.set.raw_currents_left try: available_currents, limit = self._limit_by_dimming_via_direct_control(missing_currents, cp) @@ -36,7 +35,7 @@ def get_available_currents(self, limit = new_limit if new_limit.limiting_value is not None else limit available_currents, new_limit = self._limit_by_power( - counter, available_currents, voltages_mean(cp.data.get.voltages), counter.data.set.raw_power_left, feed_in) + counter, available_currents, voltages_mean(cp.data.get.voltages), counter.data.set.raw_power_left) limit = new_limit if new_limit.limiting_value is not None else limit if f"counter{counter.num}" == data.data.counter_all_data.get_evu_counter_str(): @@ -50,8 +49,7 @@ def get_available_currents_surplus(self, missing_currents: List[float], cp_voltage: float, counter: Counter, - cp: Chargepoint, - feed_in: int = 0) -> Tuple[List[float], LoadmanagementLimit]: + cp: Chargepoint) -> Tuple[List[float], LoadmanagementLimit]: raw_currents_left = counter.data.set.raw_currents_left available_currents, limit = self._limit_by_dimming_via_direct_control(missing_currents, cp) @@ -62,7 +60,7 @@ def get_available_currents_surplus(self, limit = new_limit if new_limit.limiting_value is not None else limit available_currents, new_limit = self._limit_by_power( - counter, available_currents, cp_voltage, counter.data.set.surplus_power_left, feed_in) + counter, available_currents, cp_voltage, counter.data.set.surplus_power_left) limit = new_limit if new_limit.limiting_value is not None else limit if f"counter{counter.num}" == data.data.counter_all_data.get_evu_counter_str(): @@ -96,15 +94,14 @@ def _limit_by_power(self, counter: Counter, available_currents: List[float], cp_voltage: float, - raw_power_left: Optional[float], - feed_in: Optional[float]) -> Tuple[List[float], LoadmanagementLimit]: + raw_power_left: Optional[float]) -> Tuple[List[float], LoadmanagementLimit]: # Mittelwert der Spannungen verwenden, um Phasenverdrehung zu kompensieren # (Probleme bei einphasig angeschlossenen Wallboxen) currents = available_currents.copy() limit = LoadmanagementLimit(None, None) if raw_power_left: - if feed_in: - raw_power_left = raw_power_left - feed_in + if data.data.general_data.data.chargemode_config.pv_charging.feed_in_limit: + raw_power_left = raw_power_left - data.data.general_data.data.chargemode_config.feed_in_yield log.debug(f"Verbleibende Leistung unter Berücksichtigung der Einspeisegrenze: {raw_power_left}W") if sum([c * cp_voltage for c in available_currents]) > raw_power_left: for i in range(0, 3): diff --git a/packages/control/loadmanagement_test.py b/packages/control/loadmanagement_test.py index 04a3d2a8dd..d2e9dbf18e 100644 --- a/packages/control/loadmanagement_test.py +++ b/packages/control/loadmanagement_test.py @@ -30,7 +30,7 @@ def test_limit_by_power(available_currents: List[float], counter_name_mock = Mock(return_value=COUNTER_NAME) monkeypatch.setattr(loadmanagement, "get_component_name_by_id", counter_name_mock) # evaluation - currents = Loadmanagement()._limit_by_power(Counter(0), available_currents, 230, raw_power_left, None) + currents = Loadmanagement()._limit_by_power(Counter(0), available_currents, 230, raw_power_left) # assertion assert currents == expected_currents diff --git a/packages/helpermodules/create_debug.py b/packages/helpermodules/create_debug.py index 5828705015..15b9253e82 100644 --- a/packages/helpermodules/create_debug.py +++ b/packages/helpermodules/create_debug.py @@ -35,8 +35,8 @@ def get_common_data(): ip_address = None try: updateAvailable = subdata.SubData.system_data["system"].data["current_branch_commit"] and \ - subdata.SubData.system_data["system"].data["current_branch_commit"] != \ - subdata.SubData.system_data["system"].data["current_commit"] + subdata.SubData.system_data["system"].data["current_branch_commit"] != \ + subdata.SubData.system_data["system"].data["current_commit"] except Exception: updateAvailable = False @@ -120,7 +120,8 @@ def config_and_state(): f"Switch_On_Delay: {chargemode_config.pv_charging.switch_on_delay}s\n" f"Switch_Off_Threshold: {chargemode_config.pv_charging.switch_off_threshold}W\n" f"Switch_Off_Delay: {chargemode_config.pv_charging.switch_off_delay}s\n" - f"Feed_In_Yield: {chargemode_config.pv_charging.feed_in_yield}W\n" + f"Feed_In_Yield: {chargemode_config.feed_in_yield}W\n" + f"Feed_In_Limit_Vehicle: {chargemode_config.pv_charging.feed_in_limit}W\n" f"Bat_Mode: {chargemode_config.pv_charging.bat_mode}\n" f"Min_Bat_SoC: {chargemode_config.pv_charging.min_bat_soc}%\n" f"Bat_Power_Reserve_Active: {chargemode_config.pv_charging.bat_power_reserve_active}\n" diff --git a/packages/helpermodules/setdata.py b/packages/helpermodules/setdata.py index 1454527dba..67259d6370 100644 --- a/packages/helpermodules/setdata.py +++ b/packages/helpermodules/setdata.py @@ -734,11 +734,12 @@ def process_general_topic(self, msg: mqtt.MQTTMessage): elif "openWB/set/general/chargemode_config/unbalanced_load_limit" in msg.topic: self._validate_value(msg, int, [(10, 32)]) elif ("openWB/set/general/chargemode_config/unbalanced_load" in msg.topic or + "openWB/set/general/chargemode_config/pv_charging/feed_in_limit" in msg.topic or "openWB/set/general/chargemode_config/pv_charging/retry_failed_phase_switches" in msg.topic or "openWB/set/general/chargemode_config/pv_charging/bat_power_discharge_active" in msg.topic or "openWB/set/general/chargemode_config/pv_charging/bat_power_reserve_active" in msg.topic): self._validate_value(msg, bool) - elif ("openWB/set/general/chargemode_config/pv_charging/feed_in_yield" in msg.topic or + elif ("openWB/set/general/chargemode_config/feed_in_yield" in msg.topic or "openWB/set/general/chargemode_config/pv_charging/switch_on_threshold" in msg.topic or "openWB/set/general/chargemode_config/pv_charging/switch_on_delay" in msg.topic or "openWB/set/general/chargemode_config/pv_charging/switch_off_delay" in msg.topic): diff --git a/packages/helpermodules/update_config.py b/packages/helpermodules/update_config.py index 15530c627d..7083195c68 100644 --- a/packages/helpermodules/update_config.py +++ b/packages/helpermodules/update_config.py @@ -57,7 +57,7 @@ class UpdateConfig: - DATASTORE_VERSION = 107 + DATASTORE_VERSION = 108 valid_topic = [ "^openWB/bat/config/bat_control_permitted$", @@ -223,7 +223,8 @@ class UpdateConfig: "^openWB/general/chargemode_config/unbalanced_load_limit$", "^openWB/general/chargemode_config/unbalanced_load$", "^openWB/general/chargemode_config/pv_charging/bat_mode$", - "^openWB/general/chargemode_config/pv_charging/feed_in_yield$", + "^openWB/general/chargemode_config/feed_in_yield$", + "^openWB/general/chargemode_config/pv_charging/feed_in_limit$", "^openWB/general/chargemode_config/pv_charging/switch_on_threshold$", "^openWB/general/chargemode_config/pv_charging/switch_on_delay$", "^openWB/general/chargemode_config/pv_charging/switch_off_threshold$", @@ -536,6 +537,7 @@ class UpdateConfig: ("openWB/general/chargemode_config/pv_charging/bat_mode", BatConsiderationMode.EV_MODE.value), ("openWB/general/chargemode_config/pv_charging/bat_power_discharge", 1000), ("openWB/general/chargemode_config/pv_charging/bat_power_discharge_active", True), + ("openWB/general/chargemode_config/pv_charging/feed_in_limit", False), ("openWB/general/chargemode_config/pv_charging/min_bat_soc", 50), ("openWB/general/chargemode_config/pv_charging/max_bat_soc", 70), ("openWB/general/chargemode_config/pv_charging/bat_power_reserve", 200), @@ -545,7 +547,7 @@ class UpdateConfig: ("openWB/general/chargemode_config/pv_charging/switch_off_delay", 60), ("openWB/general/chargemode_config/pv_charging/switch_on_delay", 30), ("openWB/general/chargemode_config/pv_charging/switch_on_threshold", 1500), - ("openWB/general/chargemode_config/pv_charging/feed_in_yield", 0), + ("openWB/general/chargemode_config/feed_in_yield", 0), ("openWB/general/chargemode_config/pv_charging/phase_switch_delay", 7), ("openWB/general/chargemode_config/pv_charging/retry_failed_phase_switches", PvCharging().retry_failed_phase_switches), @@ -2701,3 +2703,23 @@ def upgrade(topic: str, payload) -> None: return {topic: provider} self._loop_all_received_topics(upgrade) self._append_datastore_version(107) + + def upgrade_datastore_108(self) -> None: + def upgrade(topic: str, payload) -> None: + if re.search("openWB/general/chargemode_config/pv_charging/feed_in_yield$", topic) is not None: + payload = decode_payload(payload) + return {"openWB/general/chargemode_config/feed_in_yield": payload} + self._loop_all_received_topics(upgrade) + feed_in_limit = False + for topic, payload in self.all_received_topics.items(): + try: + if re.search("openWB/vehicle/template/charge_template/[0-9]+$", topic) is not None: + payload = decode_payload(payload) + if payload["chargemode"]["pv_charging"].get("feed_in_limit") is True: + feed_in_limit = True + payload["chargemode"]["pv_charging"].pop("feed_in_limit", None) + self.__update_topic(topic, payload) + except KeyError: + log.exception(f"Fehler beim Lesen des feed_in_limit im Fahrzeugtemplate {payload}") + self.__update_topic("openWB/general/chargemode_config/pv_charging/feed_in_limit", feed_in_limit) + self._append_datastore_version(108)