Skip to content

Commit c3752ec

Browse files
committed
Implement code to write the amount of energy bought and timestamps to file
1 parent 577eab6 commit c3752ec

3 files changed

+37
-33
lines changed

solar_forecast_and_power_buy_logger.sh

+1-18
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,6 @@ source "${env_temp}"
1414
log_directory=${DIRECTORY_OF_LOGS:-logs/}
1515
logfile=${log_directory}/app${environment}.log
1616

17-
###### Find values of energy buy ######
18-
start_string="Starting to work..."
19-
temp_file_output_energy_buy=$(mktemp)
20-
21-
tac "$logfile" | while read -r line; do
22-
echo "$line" >>"${temp_file_output_energy_buy}"
23-
[[ "$line" == *"$start_string"* ]] && break
24-
done
25-
26-
timestamp_start=$(grep "Starting to charge" "${temp_file_output_energy_buy}" | awk '{print $1}' | tr -d '[]')
27-
if [[ -n ${timestamp_start} ]]; then
28-
# happens if there was no need to charge and thus no charging occurred
29-
timestamp_end=$(grep "Charging finished" "${temp_file_output_energy_buy}" | awk '{print $1}' | tr -d '[]')
30-
amount_of_energy_bought=$(grep "Bought" "${temp_file_output_energy_buy}" | sed -n 's/.*Bought \([0-9]*\) Wh.*/\1/p')
31-
32-
echo -e "${timestamp_start}\t${timestamp_end}\t${amount_of_energy_bought}" >>"${log_directory}/energy_buy${environment}.log"
33-
fi
3417

3518
###### Find values of solar forecast ######
3619
start_string="The expected solar output for today"
@@ -50,4 +33,4 @@ echo -e "${date}\t${solar_forecast_expected}\t${solar_forecast_real}" >>"${log_d
5033

5134
###### Cleanup ######
5235

53-
rm "${temp_file_output_energy_buy}" "${temp_output_solar_forecast}" "${env_temp}"
36+
rm "${temp_output_solar_forecast}" "${env_temp}"

source/inverter_charge_controller.py

+29-12
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from datetime import date, datetime, timedelta
1+
from datetime import datetime, timedelta
22

33
import pause
44
from abscence_handler import AbsenceHandler
@@ -164,9 +164,23 @@ def _do_iteration(self) -> datetime: # FIXME: Find better name
164164
f"Need to charge to {required_state_of_charge} % in order to reach the next minimum with {target_min_state_of_charge} % left"
165165
)
166166

167+
energy_bought_before_charging = self.sems_portal_api_handler.get_energy_buy()
168+
timestamp_starting_to_charge = datetime.now(tz=self.timezone)
169+
self.log.debug(f"The amount of energy bought before charging is {energy_bought_before_charging}")
170+
167171
# TODO: Implement error handling
168172
self._charge_inverter(required_state_of_charge)
169173

174+
timestamp_ending_to_charge = datetime.now(tz=self.timezone)
175+
energy_bought = self._calculate_amount_of_energy_bought(
176+
energy_bought_before_charging, timestamp_starting_to_charge, timestamp_ending_to_charge
177+
)
178+
self.log.info(f"Bought {energy_bought} to charge the battery")
179+
180+
self._write_energy_buy_statistics_to_file(
181+
timestamp_starting_to_charge, timestamp_ending_to_charge, energy_bought
182+
)
183+
170184
return next_price_minimum
171185

172186
def _charge_inverter(self, target_state_of_charge: int) -> None:
@@ -180,10 +194,6 @@ def _charge_inverter(self, target_state_of_charge: int) -> None:
180194
charging_progress_check_interval = timedelta(minutes=5)
181195
dry_run = EnvironmentVariableGetter.get(name_of_variable="DRY_RUN", default_value=True)
182196

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}")
186-
187197
self.log.info("Starting to charge")
188198
self.inverter.set_operation_mode(OperationMode.ECO_CHARGE)
189199

@@ -219,15 +229,13 @@ def _charge_inverter(self, target_state_of_charge: int) -> None:
219229
f"Charging is still ongoing (current: {current_state_of_charge} %, target: >= {target_state_of_charge} %) --> Waiting for another {charging_progress_check_interval}..."
220230
)
221231

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")
224-
225232
def _calculate_amount_of_energy_bought(
226-
self, energy_bought_before_charging: EnergyAmount, date_starting_to_charge: date
233+
self,
234+
energy_bought_before_charging: EnergyAmount,
235+
timestamp_starting_to_charge: datetime,
236+
timestamp_ending_to_charge: datetime,
227237
) -> EnergyAmount:
228-
date_ending_to_charge = date.today()
229-
230-
if date_starting_to_charge == date_ending_to_charge:
238+
if timestamp_starting_to_charge.date() == timestamp_ending_to_charge.date():
231239
energy_bought_today_after_charging = self.sems_portal_api_handler.get_energy_buy()
232240
self.log.debug(
233241
f"It is till the same day since starting to charge, the amount of energy bought after charging is {energy_bought_today_after_charging}"
@@ -240,3 +248,12 @@ def _calculate_amount_of_energy_bought(
240248
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}"
241249
)
242250
return energy_bought_today_after_charging + energy_bought_yesterday
251+
252+
def _write_energy_buy_statistics_to_file(
253+
self, timestamp_starting_to_charge: datetime, timestamp_ending_to_charge: datetime, energy_bought: EnergyAmount
254+
) -> None:
255+
filename = super().directory_of_logs + "/energy_buy_prod.log"
256+
with open(filename, "a") as f:
257+
f.write(
258+
f"{timestamp_starting_to_charge.isoformat()}\t{timestamp_ending_to_charge.isoformat()}\t{energy_bought.watt_hours}\n"
259+
)

source/logger.py

+7-3
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,11 @@ def _set_logger(self, root_logger: logging.Logger) -> None:
3636
directory_of_repository = pathlib.Path(__file__).parent.parent.resolve()
3737
directory_of_logs_default_value = os.path.join(directory_of_repository, "logs")
3838

39-
directory_of_logs = EnvironmentVariableGetter.get(
39+
self._directory_of_logs = EnvironmentVariableGetter.get(
4040
name_of_variable="DIRECTORY_OF_LOGS",
4141
default_value=directory_of_logs_default_value,
4242
)
43-
self._create_logging_directory_if_necessary(directory_of_logs)
43+
self._create_logging_directory_if_necessary(self._directory_of_logs)
4444

4545
log_level = EnvironmentVariableGetter.get(name_of_variable="LOGLEVEL", default_value="INFO").upper()
4646
environment = EnvironmentVariableGetter.get("ENVIRONMENT", "")
@@ -52,7 +52,7 @@ def _set_logger(self, root_logger: logging.Logger) -> None:
5252
)
5353

5454
file_handler = RotatingFileHandler(
55-
os.path.join(directory_of_logs, f"app{environment}.log"),
55+
os.path.join(self._directory_of_logs, f"app{environment}.log"),
5656
maxBytes=1024 * 1024,
5757
backupCount=7,
5858
)
@@ -116,3 +116,7 @@ def _write_newlines_to_log_file(self, amount_of_newlines: int = 2) -> None:
116116
amount_of_newlines: Number of newline characters to write. Default is 2.
117117
"""
118118
self.log.parent.handlers[0].stream.write("".join("\n" for _ in range(amount_of_newlines)))
119+
120+
@property
121+
def directory_of_logs(self) -> str:
122+
return self._directory_of_logs

0 commit comments

Comments
 (0)