diff --git a/packages/control/consumer/consumer.py b/packages/control/consumer/consumer.py index 0134bed4c3..fa5f5e0343 100644 --- a/packages/control/consumer/consumer.py +++ b/packages/control/consumer/consumer.py @@ -48,10 +48,12 @@ def update(self): if self.data.usage.type in NOT_CONTROLLED: return else: - if self.data.get.voltages is None: - self.data.get.voltages = [230 for i in range(0, self.data.config.connected_phases)] - if self.data.get.currents is None: - self.data.get.currents = [0]*3 + # Gegen den Default statt auf None prüfen, sonst bleibt ein Array mit der alten Phasenzahl stehen, + # wenn connected_phases nachträglich geändert wird (zB 3 auf 1 Phase). + if self.data.get.voltages == [230.0]*3: + self.data.get.voltages = [230 if i < self.data.config.connected_phases else 0 + for i in range(0, 3)] + if self.data.get.currents == [0.0]*3: for i in range(0, self.data.config.connected_phases): self.data.get.currents[i] = (self.data.get.power / self.data.config.connected_phases / diff --git a/packages/control/consumer/consumer_data.py b/packages/control/consumer/consumer_data.py index 99aaefa9f4..482a1a7ce7 100644 --- a/packages/control/consumer/consumer_data.py +++ b/packages/control/consumer/consumer_data.py @@ -4,7 +4,7 @@ from control.chargemode import Chargemode from control.chargepoint.control_parameter import ControlParameter, control_parameter_factory from control.consumer.usage import ConsumerUsage -from dataclass_utils.factories import empty_list_factory, voltages_list_factory +from dataclass_utils.factories import currents_list_factory, empty_list_factory, voltages_list_factory from helpermodules.abstract_plans import ScheduledPlanConsumer, TimeChargingPlanConsumer, TimepointPlan from helpermodules.constants import NO_ERROR from modules.common.consumer_setup import ConsumerSetup @@ -63,7 +63,7 @@ class ConsumerConfig: @dataclass class Get: charge_state: bool = False - currents: Optional[List[Optional[float]]] = None + currents: List[float] = field(default_factory=currents_list_factory) daily_imported: float = field(default=0, metadata={"topic": "get/daily_imported"}) error_timestamp: int = 0 exported: float = 0 diff --git a/packages/control/consumer/consumer_test.py b/packages/control/consumer/consumer_test.py index a871b55f38..e0f8b47c1b 100644 --- a/packages/control/consumer/consumer_test.py +++ b/packages/control/consumer/consumer_test.py @@ -590,3 +590,45 @@ def test_reset_chargemode_at_time( assert check_end_time_mock.call_count == expected_check_end_time_calls if expected_check_end_time_calls: check_end_time_mock.assert_called_once_with(consumer.data.usage.reset_chargemode) + + +@pytest.mark.parametrize( + "connected_phases, previous_voltages, previous_currents, power, expected_voltages, expected_currents", + [ + pytest.param(1, [230.0]*3, [0.0]*3, 0, [230, 0, 0], [0.0, 0.0, 0.0], + id="noch beim Default (3 Phasen): Spannung wird auf 1 Phase neu berechnet"), + pytest.param(1, [230.0]*3, [0.0]*3, 230, [230, 0, 0], [1.0, 0.0, 0.0], + id="Neuberechnung respektiert die tatsächliche Leistung"), + pytest.param(1, [230, 0, 0], [0.0, 1.0, 0.0], 0, [230, 0, 0], [0.0, 1.0, 0.0], + id="bereits korrekt (nicht beim Default): keine Neuberechnung nötig, bleibt stabil"), + ], +) +def test_update_recalculates_voltages_and_currents_when_still_at_default( + consumer: Consumer, + connected_phases: int, + previous_voltages: List[float], + previous_currents: List[float], + power: float, + expected_voltages: List[float], + expected_currents: List[float], + monkeypatch): + """ Neuberechnung muss gegen den Default-Wert prüfen, nicht gegen None - sonst bleibt ein Array mit der alten + Phasenzahl stehen, wenn connected_phases nachträglich geändert wird (zB 3 auf 1 Phase). """ + # setup + consumer.data.config.connected_phases = connected_phases + consumer.data.get.voltages = previous_voltages + consumer.data.get.currents = previous_currents + consumer.data.get.power = power + monkeypatch.setattr(consumer, "reset_chargemode_at_time", Mock()) + monkeypatch.setattr(consumer, "is_switch_interval_elapsed", Mock()) + monkeypatch.setattr(consumer, "get_parameter", Mock(return_value=(0, None, None, None))) + monkeypatch.setattr(consumer, "set_mode_changed", Mock()) + monkeypatch.setattr(consumer, "set_control_parameter", Mock()) + data.data.counter_all_data = Mock() + + # execution + consumer.update() + + # evaluation + assert consumer.data.get.voltages == expected_voltages + assert consumer.data.get.currents == expected_currents