Skip to content

Commit

Permalink
fix(binary-sensor): Fixed offset not being applied to discovered targ…
Browse files Browse the repository at this point in the history
…et rates
  • Loading branch information
BottlecapDave committed Mar 18, 2023
1 parent d9cc6f4 commit 322f4a0
Show file tree
Hide file tree
Showing 5 changed files with 842 additions and 61 deletions.
24 changes: 12 additions & 12 deletions custom_components/carbon_intensity/binary_sensors/__init__.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
from datetime import timedelta
from datetime import datetime, timedelta
import math
from homeassistant.util.dt import (as_utc, parse_datetime)
from ..utils import (apply_offset)
import logging

_LOGGER = logging.getLogger(__name__)

def __get_applicable_rates(current_date, target_start_time, target_end_time, rates, target_start_offset, is_rolling_target):
def __get_applicable_rates(current_date: datetime, target_start_time: str, target_end_time: str, rates, is_rolling_target: bool):
if (target_start_time is not None):
target_start = parse_datetime(current_date.strftime(f"%Y-%m-%dT{target_start_time}:00%z"))
else:
Expand All @@ -32,12 +32,6 @@ def __get_applicable_rates(current_date, target_start_time, target_end_time, rat
_LOGGER.debug(f'Rolling target and {target_start} is in the past. Setting start to {current_date}')
target_start = current_date

# Apply our offset so we make sure our target turns on within the specified timeframe
if (target_start_offset is not None):
_LOGGER.debug(f'Offsetting time period')
target_start = apply_offset(target_start, target_start_offset, True)
target_end = apply_offset(target_end, target_start_offset, True)

# If our start and end are both in the past, then look to the next day
if (target_start < current_date and target_end < current_date):
target_start = target_start + timedelta(days=1)
Expand Down Expand Up @@ -68,8 +62,11 @@ def __get_intensity(rate):
def __get_to(rate):
return rate["to"]

def calculate_continuous_times(current_date, target_start_time, target_end_time, target_hours, rates, target_start_offset = None, is_rolling_target = True):
applicable_rates = __get_applicable_rates(current_date, target_start_time, target_end_time, rates, target_start_offset, is_rolling_target)
def calculate_continuous_times(current_date: datetime, target_start_time: str, target_end_time: str, target_hours: float, rates, is_rolling_target = True):
applicable_rates = __get_applicable_rates(current_date, target_start_time, target_end_time, rates, is_rolling_target)
if (applicable_rates is None):
return []

applicable_rates_count = len(applicable_rates)
total_required_rates = math.ceil(target_hours * 2)

Expand Down Expand Up @@ -101,8 +98,11 @@ def calculate_continuous_times(current_date, target_start_time, target_end_time,

return []

def calculate_intermittent_times(current_date, target_start_time, target_end_time, target_hours, rates, target_start_offset = None, is_rolling_target = True):
applicable_rates = __get_applicable_rates(current_date, target_start_time, target_end_time, rates, target_start_offset, is_rolling_target)
def calculate_intermittent_times(current_date: datetime, target_start_time: str, target_end_time: str, target_hours: float, rates, is_rolling_target = True):
applicable_rates = __get_applicable_rates(current_date, target_start_time, target_end_time, rates, is_rolling_target)
if (applicable_rates is None):
return []

total_required_rates = math.ceil(target_hours * 2)

applicable_rates.sort(key=__get_intensity)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,6 @@ def is_on(self):
end_time,
target_hours,
all_rates,
offset,
is_rolling_target
)
elif (self._config[CONFIG_TARGET_TYPE] == "Intermittent"):
Expand All @@ -122,7 +121,6 @@ def is_on(self):
end_time,
target_hours,
all_rates,
offset,
is_rolling_target
)
else:
Expand Down
23 changes: 22 additions & 1 deletion tests/unit/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import os
from datetime import timedelta
from datetime import datetime, timedelta

def create_rate_data(period_from, period_to, expected_rates: list):
rates = []
Expand All @@ -23,3 +23,24 @@ def create_rate_data(period_from, period_to, expected_rates: list):
rate_index = 0

return rates

def get_from(rate):
return rate["from"]

def to_thirty_minute_increments(initial_rates: list):
rates = []

for rate in initial_rates:
current_from = datetime.strptime(rate["from"], "%Y-%m-%dT%H:%M:%S%z")
target_to = datetime.strptime(rate["to"], "%Y-%m-%dT%H:%M:%S%z")
while current_from < target_to:
current_to = current_from + timedelta(minutes=30)
rates.append({
"intensity_forecast": rate["intensity_forecast"],
"from": current_from,
"to": current_to
})
current_from = current_to

rates.sort(key=get_from)
return rates
Loading

0 comments on commit 322f4a0

Please sign in to comment.