Skip to content

Commit 577eab6

Browse files
committed
Update energy buy function to support past days retrieval
1 parent ce040cd commit 577eab6

File tree

2 files changed

+35
-11
lines changed

2 files changed

+35
-11
lines changed

source/inverter_charge_controller.py

+24-7
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
from datetime import datetime, timedelta
1+
from datetime import date, datetime, timedelta
22

33
import pause
44
from abscence_handler import AbsenceHandler
55
from aiohttp import ClientError
66
from dateutil import tz
7+
from energy_amount import EnergyAmount
78
from environment_variable_getter import EnvironmentVariableGetter
89
from goodwe import OperationMode
910
from inverter import Inverter
@@ -179,8 +180,9 @@ def _charge_inverter(self, target_state_of_charge: int) -> None:
179180
charging_progress_check_interval = timedelta(minutes=5)
180181
dry_run = EnvironmentVariableGetter.get(name_of_variable="DRY_RUN", default_value=True)
181182

182-
energy_buy_of_today_before_charging = self.sems_portal_api_handler.get_energy_buy_of_today()
183-
self.log.debug(f"The amount of energy bought before charging is {energy_buy_of_today_before_charging}")
183+
energy_bought_before_charging = self.sems_portal_api_handler.get_energy_buy()
184+
date_starting_to_charge = date.today()
185+
self.log.debug(f"The amount of energy bought before charging is {energy_bought_before_charging}")
184186

185187
self.log.info("Starting to charge")
186188
self.inverter.set_operation_mode(OperationMode.ECO_CHARGE)
@@ -217,9 +219,24 @@ def _charge_inverter(self, target_state_of_charge: int) -> None:
217219
f"Charging is still ongoing (current: {current_state_of_charge} %, target: >= {target_state_of_charge} %) --> Waiting for another {charging_progress_check_interval}..."
218220
)
219221

220-
energy_buy_of_today_after_charging = self.sems_portal_api_handler.get_energy_buy_of_today()
221-
self.log.debug(f"The amount of energy bought after charging is {energy_buy_of_today_after_charging}")
222+
energy_bought = self._calculate_amount_of_energy_bought(energy_bought_before_charging, date_starting_to_charge)
223+
self.log.info(f"Bought {energy_bought} to charge the battery")
222224

223-
self.log.info(
224-
f"Bought {energy_buy_of_today_after_charging - energy_buy_of_today_before_charging} to charge the battery"
225+
def _calculate_amount_of_energy_bought(
226+
self, energy_bought_before_charging: EnergyAmount, date_starting_to_charge: date
227+
) -> EnergyAmount:
228+
date_ending_to_charge = date.today()
229+
230+
if date_starting_to_charge == date_ending_to_charge:
231+
energy_bought_today_after_charging = self.sems_portal_api_handler.get_energy_buy()
232+
self.log.debug(
233+
f"It is till the same day since starting to charge, the amount of energy bought after charging is {energy_bought_today_after_charging}"
234+
)
235+
return energy_bought_today_after_charging - energy_bought_before_charging
236+
237+
energy_bought_today_after_charging = self.sems_portal_api_handler.get_energy_buy()
238+
energy_bought_yesterday = self.sems_portal_api_handler.get_energy_buy(1) - energy_bought_before_charging
239+
self.log.debug(
240+
f"It is the next day since starting to charge, the amount of energy bought after charging (today) is {energy_bought_today_after_charging}, the amount of energy bought after charging (yesterday) is {energy_bought_yesterday}"
225241
)
242+
return energy_bought_today_after_charging + energy_bought_yesterday

source/sems_portal_api_handler.py

+11-4
Original file line numberDiff line numberDiff line change
@@ -131,12 +131,19 @@ def _extract_energy_usage_data_of_response(self, response_json: dict) -> list[En
131131

132132
return last_weeks_energy_usage
133133

134-
def get_energy_buy_of_today(self) -> EnergyAmount:
134+
def get_energy_buy(self, days_in_past: int = 0) -> EnergyAmount:
135135
"""
136-
Crawls the SEMSPORTAL API for the amount of energy bought today until this point in time.
136+
Determines the amount of energy bought for a specified day in the past.
137+
138+
The argument days_in_past specifies how many days to look for in the past. E.g.,
139+
- days_in_past = 0 --> energy bought today until this point in time
140+
- days_in_past = 1 --> energy bought yesterday
141+
142+
Args:
143+
days_in_past: The number of days in the past to retrieve data for. Default is 0, which means today.
137144
138145
Returns:
139-
EnergyAmount: The amount of energy bought today.
146+
An instance of EnergyAmount representing the energy bought.
140147
"""
141148
self.log.debug("Determining the amount of energy bought today")
142149

@@ -146,7 +153,7 @@ def get_energy_buy_of_today(self) -> EnergyAmount:
146153
lines = api_response["data"]["lines"]
147154
buy_line = [line for line in lines if "buy" in line["label"].lower()][0]
148155

149-
return EnergyAmount.from_kilo_watt_hours(buy_line["xy"][-1]["y"])
156+
return EnergyAmount.from_kilo_watt_hours(buy_line["xy"][-1 - days_in_past]["y"])
150157

151158
def estimate_energy_usage_in_timeframe(self, timestamp_start: datetime, timestamp_end: datetime) -> EnergyAmount:
152159
"""

0 commit comments

Comments
 (0)