Skip to content

Commit 7bd35a9

Browse files
committed
WIP: Work on charging logic when next price minimum is unreachable
1 parent acc29db commit 7bd35a9

File tree

1 file changed

+30
-19
lines changed

1 file changed

+30
-19
lines changed

source/inverter_charge_controller.py

+30-19
Original file line numberDiff line numberDiff line change
@@ -260,19 +260,31 @@ def _coordinate_charging_when_next_price_minimum_is_unreachable(self, average_po
260260
Args:
261261
average_power_consumption: The average rate of power consumption during the charging period.
262262
"""
263-
energy_rate_after_price_drops_after_average, energy_rate_before_price_rises_over_average = (
264-
self._coordinate_charging_when_next_price_minimum_is_unreachable_first_charge()
263+
energy_rate_after_price_drops_over_average, energy_rate_before_price_rises_over_average = (
264+
self._get_energy_rates_before_and_after_price_spike()
265265
)
266266

267+
max_soc = StateOfCharge.from_percentage(100)
268+
self.log.info(f"Charging the inverter to {max_soc}")
269+
with self._protocol_amount_of_energy_bought():
270+
self._charge_inverter(max_soc)
271+
272+
self.log.info(
273+
f"The energy rates before the price spike is at {energy_rate_before_price_rises_over_average.timestamp}"
274+
f"--> Waiting until then..."
275+
)
276+
pause.until(energy_rate_before_price_rises_over_average.timestamp)
277+
267278
self.log.info("Waking up to determine the optimal charging time around the price spike")
268-
if energy_rate_after_price_drops_after_average < energy_rate_before_price_rises_over_average:
279+
if energy_rate_after_price_drops_over_average < energy_rate_before_price_rises_over_average:
269280
self._coordinate_charging_when_next_price_minimum_is_unreachable_second_charge_after_spike_cheaper_than_before(
270281
average_power_consumption,
271-
energy_rate_after_price_drops_after_average,
282+
energy_rate_after_price_drops_over_average,
272283
energy_rate_before_price_rises_over_average,
273284
)
285+
# TODO
274286

275-
def _coordinate_charging_when_next_price_minimum_is_unreachable_first_charge(
287+
def _get_energy_rates_before_and_after_price_spike(
276288
self,
277289
) -> tuple[EnergyRate, EnergyRate]:
278290
upcoming_energy_rates = self._get_upcoming_energy_rates()
@@ -289,10 +301,7 @@ def _coordinate_charging_when_next_price_minimum_is_unreachable_first_charge(
289301
f"--> Will charge now to {self.target_max_soc} and then wait until "
290302
f"{energy_rate_before_price_rises_over_average.timestamp}"
291303
)
292-
with self._protocol_amount_of_energy_bought():
293-
self._charge_inverter(self.target_max_soc)
294-
self.log.info(f"Waiting until {energy_rate_before_price_rises_over_average.timestamp}...")
295-
pause.until(energy_rate_before_price_rises_over_average.timestamp)
304+
296305
return energy_rate_after_price_drops_after_average, energy_rate_before_price_rises_over_average
297306

298307
def _coordinate_charging_when_next_price_minimum_is_unreachable_second_charge_after_spike_cheaper_than_before(
@@ -301,9 +310,11 @@ def _coordinate_charging_when_next_price_minimum_is_unreachable_second_charge_af
301310
energy_rate_after_price_drops_after_average: EnergyRate,
302311
energy_rate_before_price_rises_over_average: EnergyRate,
303312
) -> None:
304-
self.log.debug(
313+
# Current time: Right before the price spike
314+
self.log.info(
305315
"The energy rate after the price drops below the average is lower than the rate before "
306-
"--> Checking whether it is necessary to charge to reach that point in time"
316+
"--> Checking whether it is necessary to charge to reach that point in time "
317+
f"({energy_rate_after_price_drops_after_average.timestamp})"
307318
)
308319
current_state_of_charge = self.inverter.get_state_of_charge()
309320
self.log.debug(f"The current state of charge is {current_state_of_charge}")
@@ -332,7 +343,7 @@ def _coordinate_charging_when_next_price_minimum_is_unreachable_second_charge_af
332343
self.log.debug(f"The current state of charge is {current_state_of_charge}")
333344
minimum_of_soc_until_next_price_minimum, _ = (
334345
self.sun_forecast_handler.calculate_min_and_max_of_soc_in_timeframe(
335-
energy_rate_after_price_drops_after_average.timestamp,
346+
energy_rate_after_price_drops_after_average.timestamp, # = now
336347
self.next_price_minimum.timestamp,
337348
average_power_consumption,
338349
current_state_of_charge,
@@ -381,13 +392,6 @@ def _coordinate_charging_next_price_minimum_is_reachable(
381392

382393
self.log.info(f"The calculated target state of charge is {charging_target_soc}")
383394

384-
if charging_target_soc > self.target_max_soc:
385-
self.log.info(
386-
"The target state of charge is more than the maximum allowed charge set in the environment "
387-
f"--> Setting it to {self.target_max_soc}"
388-
)
389-
charging_target_soc = self.target_max_soc
390-
391395
with self._protocol_amount_of_energy_bought():
392396
self._charge_inverter(charging_target_soc)
393397

@@ -451,6 +455,13 @@ def _charge_inverter(self, target_state_of_charge: StateOfCharge) -> None:
451455
"""
452456
charging_progress_check_interval = timedelta(minutes=5)
453457

458+
if target_state_of_charge > self.target_max_soc:
459+
self.log.info(
460+
"The target state of charge is higher than the maximum allowed charge set in the environment "
461+
f"--> Setting it to {self.target_max_soc}"
462+
)
463+
target_state_of_charge = self.target_max_soc
464+
454465
if self.inverter.get_state_of_charge().in_percentage >= target_state_of_charge.in_percentage:
455466
self.log.info(
456467
"The current state of charge is higher or equal to the target state of charge" "--> Will not charge"

0 commit comments

Comments
 (0)