diff --git a/custom_components/nordpool/__init__.py b/custom_components/nordpool/__init__.py
index b2aca72..f9a7dca 100644
--- a/custom_components/nordpool/__init__.py
+++ b/custom_components/nordpool/__init__.py
@@ -191,7 +191,7 @@ async def _dry_setup(hass: HomeAssistant, config: ConfigType) -> bool:
hass, new_day_cb, hour=0, minute=0, second=0
)
- cb_new_hr = async_track_time_change(hass, new_hr, minute=0, second=0)
+ cb_new_hr = async_track_time_change(hass, new_hr, minute=[0, 15, 30, 45], second=0)
api.listeners.append(cb_update_tomorrow)
api.listeners.append(cb_new_hr)
diff --git a/custom_components/nordpool/misc.py b/custom_components/nordpool/misc.py
index 864ffe9..ec4e108 100644
--- a/custom_components/nordpool/misc.py
+++ b/custom_components/nordpool/misc.py
@@ -8,6 +8,8 @@ import pytz
from homeassistant.util import dt as dt_util
from pytz import timezone
+from datetime import timedelta, datetime
+
UTC = pytz.utc
__all__ = [
@@ -55,8 +57,12 @@ def stock(d):
return d.astimezone(stockholm_tz)
-def start_of(d, typ_="hour"):
- if typ_ == "hour":
+def start_of(d: datetime, typ_="hour") -> datetime:
+ if typ_ == "quarter":
+ remainder = d.minute % 15
+ floored_d = d - timedelta(minutes=remainder)
+ return floored_d.replace(second=0, microsecond=0)
+ elif typ_ == "hour":
return d.replace(minute=0, second=0, microsecond=0)
elif typ_ == "day":
return d.replace(hour=0, minute=0, microsecond=0)
@@ -70,9 +76,12 @@ def time_in_range(start, end, x):
return start <= x or x <= end
-def end_of(d, typ_="hour"):
+def end_of(d: datetime, typ_="hour") -> datetime:
"""Return end our hour"""
- if typ_ == "hour":
+ if typ_ == "quarter":
+ start = start_of(d, "quarter")
+ return start + timedelta(minutes=15, microseconds=-1)
+ elif typ_ == "hour":
return d.replace(minute=59, second=59, microsecond=999999)
elif typ_ == "day":
return d.replace(hour=23, minute=59, second=59, microsecond=999999)
@@ -123,10 +132,11 @@ def extract_attrs(data) -> dict:
items = [i.get("value") for i in data]
if len(data):
+ SLOTS_PER_HOUR = len(data) / 24
data = sorted(data, key=itemgetter("start"))
- offpeak1 = [i.get("value") for i in data[0:8]]
- peak = [i.get("value") for i in data[8:20]]
- offpeak2 = [i.get("value") for i in data[20:]]
+ offpeak1 = [i.get("value") for i in data[0:int(8*SLOTS_PER_HOUR)]]
+ peak = [i.get("value") for i in data[int(8*SLOTS_PER_HOUR):int(20*SLOTS_PER_HOUR)]]
+ offpeak2 = [i.get("value") for i in data[int(20*SLOTS_PER_HOUR):]]
d["Peak"] = mean(peak)
d["Off-peak 1"] = mean(offpeak1)
diff --git a/custom_components/nordpool/sensor.py b/custom_components/nordpool/sensor.py
index aad5f03..1964eac 100644
--- a/custom_components/nordpool/sensor.py
+++ b/custom_components/nordpool/sensor.py
@@ -307,14 +307,17 @@ class NordpoolSensor(SensorEntity):
_LOGGER.debug("No data for today, unable to set attrs")
return
+ SLOTS_PER_HOUR = len(today) / 24
+
self._average = mean(today)
self._min = min(today)
self._max = max(today)
- self._off_peak_1 = mean(today[0:8])
- self._off_peak_2 = mean(today[20:])
- self._peak = mean(today[8:20])
self._mean = median(today)
+ self._off_peak_1 = mean(today[0:int(8*SLOTS_PER_HOUR)])
+ self._off_peak_2 = mean(today[int(20*SLOTS_PER_HOUR):])
+ self._peak = mean(today[int(8*SLOTS_PER_HOUR):int(20*SLOTS_PER_HOUR)])
+
@property
def current_price(self) -> float:
"""This the current price for the hour we are in at any given time."""
@@ -429,7 +432,7 @@ class NordpoolSensor(SensorEntity):
data = await self._api.today(self._area, self._currency)
if data:
for item in self._someday(data):
- if item["start"] == start_of(local_now, "hour"):
+ if item["start"] <= local_now < item["end"]:
self._current_price = item["value"]
_LOGGER.debug(
"Updated %s _current_price %s", self.name, item["value"]