Skip to content

Commit 7c29d92

Browse files
committed
Fix Minimal-Strom bei An/Aus-Geräten in control_parameter
1 parent f6367ae commit 7c29d92

3 files changed

Lines changed: 54 additions & 17 deletions

File tree

‎packages/control/consumer/consumer.py‎

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from typing import Callable, Dict, List, Optional, Tuple
44

55
from control import data
6-
from control.consumer.usage import NOT_CONTROLLED
6+
from control.consumer.usage import NOT_CONTROLLED, ON_OFF
77
from control.algorithm.utils import get_medium_charging_current
88
from control.chargemode import Chargemode
99
from control.chargepoint.chargepoint_state import CHARGING_STATES, ChargepointState
@@ -60,11 +60,11 @@ def update(self):
6060
self.data.get.charge_state = True if self.data.get.power > 0 else False
6161
self.reset_chargemode_at_time()
6262
self.is_switch_interval_elapsed()
63-
min_current, required_current, message, mode, submode = self.get_parameter()
63+
required_current, message, mode, submode = self.get_parameter()
6464
self.set_mode_changed(submode, mode)
6565
if self.chargemode_changed or self.submode_changed:
6666
data.data.counter_all_data.get_evu_counter().reset_switch_on_off(self)
67-
self.set_control_parameter(min_current, required_current,
67+
self.set_control_parameter(required_current,
6868
self.data.config.connected_phases, submode, mode)
6969
self.set_state_and_log(message)
7070
self.process_on_time()
@@ -74,6 +74,15 @@ def update(self):
7474
except Exception:
7575
log.exception(f"Fehler bei Verbraucher {self.num}")
7676

77+
def _get_min_current(self):
78+
if self.data.usage.type == ConsumerUsage.SUSPENDABLE_TUNABLE:
79+
return self.data.config.min_current
80+
else:
81+
if self.data.get.charge_state:
82+
return get_medium_charging_current(self.data.get.currents)
83+
else:
84+
return self._convert_power_to_current(self.data.config.max_power)
85+
7786
def process_on_time(self):
7887
if self.data.get.charge_state:
7988
now = timecheck.create_timestamp()
@@ -105,7 +114,7 @@ def is_switch_interval_elapsed(self):
105114
SURPLUS_CONTINOUS_STILL_RUNNING = ("Verbraucher läuft ggf auch ohne ausreichend Überschuss weiter, da der "
106115
"Verbraucher nicht abgeschaltet werden darf.")
107116

108-
def get_parameter(self) -> Tuple[float, float, Optional[str], Optional[Chargemode], Chargemode]:
117+
def get_parameter(self) -> Tuple[float, Optional[str], Optional[Chargemode], Chargemode]:
109118
if self.data.set.switch_interval_elapsed is False:
110119
log.debug("Intervall für neuen Schaltbefehl nicht abgelaufen.")
111120
return (0,
@@ -114,10 +123,6 @@ def get_parameter(self) -> Tuple[float, float, Optional[str], Optional[Chargemod
114123
self.data.control_parameter.chargemode,
115124
self.data.control_parameter.submode)
116125

117-
if self.data.usage.type == ConsumerUsage.SUSPENDABLE_TUNABLE:
118-
min_current = self.data.config.min_current
119-
else:
120-
min_current = self._convert_power_to_current(self.data.config.max_power)
121126
required_current = 0
122127
submode = Chargemode.STOP
123128
mode = self.data.usage.chargemode
@@ -144,10 +149,10 @@ def get_parameter(self) -> Tuple[float, float, Optional[str], Optional[Chargemod
144149
message = f"{message or ''} {tmp_message or ''}".strip()
145150
if self.data.usage.chargemode == Chargemode.STOP:
146151
required_current, message, submode = self.stop()
147-
return min_current, required_current, message, mode, submode
152+
return required_current, message, mode, submode
148153

149154
def _parse_required_current_by_usage(self, required_current: float) -> float:
150-
if self.data.usage.type in [ConsumerUsage.CONTINUOUS, ConsumerUsage.SUSPENDABLE_ONOFF]:
155+
if self.data.usage.type in ON_OFF:
151156
if self.data.get.charge_state:
152157
return get_medium_charging_current(self.data.get.currents)
153158
else:
@@ -306,7 +311,7 @@ def convert_loading_hours_to_string(hour_list: List[datetime.datetime]) -> str:
306311
else:
307312
message = self.SCHEDULED_CHARGING_EXPENSIVE_HOUR.format(get_hours_message())
308313
submode = Chargemode.PV_CHARGING
309-
required_current = self._parse_required_current_by_usage(self.data.config.min_current)
314+
required_current = self._parse_required_current_by_usage(self._get_min_current())
310315
else:
311316
now = datetime.datetime.today()
312317
start_time = now + datetime.timedelta(seconds=remaining_time)
@@ -317,7 +322,7 @@ def convert_loading_hours_to_string(hour_list: List[datetime.datetime]) -> str:
317322
message = self.SCHEDULED_CHARGING_USE_PV.format(
318323
f"am {start_time.strftime('%d.%m')} um {start_time.strftime('%-H:%M')} Uhr")
319324
submode = Chargemode.PV_CHARGING
320-
required_current = self._parse_required_current_by_usage(self.data.config.min_current)
325+
required_current = self._parse_required_current_by_usage(self._get_min_current())
321326
return required_current, message, submode
322327

323328
TIME_CHARGING_MIN_BAT_SOC_REACHED = ("Betrieb mit Zeitladen nach Speicher-SoC nicht möglich, da der SoC des"
@@ -380,18 +385,18 @@ def eco_charging(self) -> Tuple[float, Optional[str], Chargemode]:
380385
message = self.CHARGING_PRICE_LOW
381386
submode = Chargemode.INSTANT_CHARGING
382387
else:
383-
required_current = self._parse_required_current_by_usage(self.data.config.min_current)
388+
required_current = self._parse_required_current_by_usage(self._get_min_current())
384389
message = self.CHARGING_PRICE_EXCEEDED
385390
if self.data.control_parameter.state in CHARGING_STATES:
386391
message += "Lädt mit Überschuss. "
387392
submode = Chargemode.PV_CHARGING
388393
else:
389-
required_current = self._parse_required_current_by_usage(self.data.config.min_current)
394+
required_current = self._parse_required_current_by_usage(self._get_min_current())
390395
submode = Chargemode.PV_CHARGING
391396
return required_current, message, submode
392397

393398
def pv_charging(self) -> Tuple[float, Optional[str], Chargemode]:
394-
required_current = self._parse_required_current_by_usage(self.data.config.min_current)
399+
required_current = self._parse_required_current_by_usage(self._get_min_current())
395400
message = None
396401
submode = Chargemode.PV_CHARGING
397402
return required_current, message, submode
@@ -481,12 +486,11 @@ def reset_chargemode_at_time(self):
481486
self.data.usage.chargemode = self.data.usage.reset_chargemode.chargemode
482487

483488
def set_control_parameter(self,
484-
min_current: float,
485489
required_current: float,
486490
phases: int,
487491
submode: Chargemode,
488492
mode: Optional[Chargemode]):
489-
self.data.control_parameter.min_current = min_current
493+
self.data.control_parameter.min_current = self._get_min_current()
490494
self.data.control_parameter.required_current = required_current
491495
self.data.control_parameter.phases = phases
492496
self.data.control_parameter.submode = submode

‎packages/control/consumer/consumer_test.py‎

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,38 @@ def test_pv_charging(consumer: Consumer):
260260
assert ret == (10, None, Chargemode.PV_CHARGING)
261261

262262

263+
@pytest.mark.parametrize(
264+
"usage_type, charge_state, currents, expected_min_current",
265+
[
266+
pytest.param(ConsumerUsage.CONTINUOUS, True, [13, 13, 13], 13, id="continuous-while-running"),
267+
pytest.param(ConsumerUsage.CONTINUOUS, False, [13, 13, 13], 10, id="continuous-while-stopped"),
268+
pytest.param(ConsumerUsage.SUSPENDABLE_TUNABLE, True, [13, 13, 13], 6, id="tunable-while-running"),
269+
pytest.param(ConsumerUsage.SUSPENDABLE_TUNABLE, False, [13, 13, 13], 6, id="tunable-while-stopped"),
270+
],
271+
)
272+
def test_set_control_parameter_sets_min_current_by_usage_and_charge_state(
273+
consumer: Consumer,
274+
usage_type: ConsumerUsage,
275+
charge_state: bool,
276+
currents: List[float],
277+
expected_min_current: float):
278+
# setup
279+
consumer.data.usage.type = usage_type
280+
consumer.data.get.charge_state = charge_state
281+
consumer.data.get.currents = currents
282+
283+
# execution
284+
consumer.set_control_parameter(
285+
required_current=11,
286+
phases=1,
287+
submode=Chargemode.PV_CHARGING,
288+
mode=Chargemode.PV_CHARGING,
289+
)
290+
291+
# evaluation
292+
assert consumer.data.control_parameter.min_current == expected_min_current
293+
294+
263295
@pytest.mark.parametrize(
264296
"on_time, plan_duration, diff_end_date, expected",
265297
[

‎packages/control/consumer/usage.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ class ConsumerUsage(Enum):
1010

1111

1212
NOT_CONTROLLED = (ConsumerUsage.METER_ONLY, ConsumerUsage.SELF_CONTROLLED)
13+
ON_OFF = (ConsumerUsage.SUSPENDABLE_ONOFF, ConsumerUsage.CONTINUOUS)

0 commit comments

Comments
 (0)