Skip to content

Commit

Permalink
fix: fix next timer for recurrence alarms
Browse files Browse the repository at this point in the history
The Alexa API apparently does not change the timer date but instead
relies on the client app to figure out the next alarm based on the
recurrence pattern. This adds that logic.
fixes #566
  • Loading branch information
alandtse committed Mar 16, 2020
1 parent 0d2c72b commit 605e168
Showing 1 changed file with 49 additions and 21 deletions.
70 changes: 49 additions & 21 deletions custom_components/alexa_media/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from homeassistant.exceptions import NoEntitySpecifiedError
from homeassistant.helpers.entity import Entity
from homeassistant.util import dt
import pytz

from . import (
CONF_EMAIL,
Expand Down Expand Up @@ -45,6 +46,20 @@
"XXXX-WXX-7": "Every Sunday",
}

RECURRING_PATTERN_ISO_SET = {
None: (),
"P1D": (1, 2, 3, 4, 5, 6, 7),
"XXXX-WE": (6, 7),
"XXXX-WD": (1, 2, 3, 4, 5),
"XXXX-WXX-1": (1),
"XXXX-WXX-2": (2),
"XXXX-WXX-3": (3),
"XXXX-WXX-4": (4),
"XXXX-WXX-5": (5),
"XXXX-WXX-6": (6),
"XXXX-WXX-7": (7),
}


@retry_async(limit=5, delay=5, catch_exceptions=False)
async def async_setup_platform(hass, config, add_devices_callback, discovery_info=None):
Expand Down Expand Up @@ -170,23 +185,28 @@ def __init__(
self._unit = None
self._device_class = DEVICE_CLASS_TIMESTAMP
self._icon = icon
self._all = []
self._active = []
self._next = None
self._timestamp: datetime.datetime = None
self._process_raw_notifications()

def _process_raw_notifications(self):
self._all = (
sorted(self._n_dict.items(), key=lambda x: x[1][self._sensor_property])
list(map(self._fix_alarm_date_time, self._n_dict.items()))
if self._n_dict
else []
)
self._all = list(map(self._fix_alarm_date_time, self._all))
self._sorted = (
self._all = list(map(self._update_recurring_alarm, self._all))
self._all = sorted(self._all, key=lambda x: x[1][self._sensor_property])
self._active = (
list(filter(lambda x: x[1]["status"] == "ON", self._all))
if self._all
else []
)
self._next = self._sorted[0][1] if self._sorted else None
self._timestamp: datetime.datetime = None
self._next = self._active[0][1] if self._active else None

def _fix_alarm_date_time(self, value):
import pytz

if (
self._sensor_property != "date_time"
or not value
Expand Down Expand Up @@ -222,6 +242,25 @@ def _fix_alarm_date_time(self, value):
)
return value

def _update_recurring_alarm(self, value):
_LOGGER.debug("value %s", value)
alarm = value[1][self._sensor_property]
recurring_pattern = value[1]["recurringPattern"]
while (
recurring_pattern
and alarm < dt.now()
and alarm.isoweekday not in RECURRING_PATTERN_ISO_SET[recurring_pattern]
):
alarm += datetime.timedelta(days=1)
if alarm != value[1][self._sensor_property]:
_LOGGER.debug(
"Alarm with recurrence %s set to %s",
RECURRING_PATTERN[recurring_pattern],
alarm,
)
value[1][self._sensor_property] = alarm
return value

@staticmethod
def _round_time(value: datetime.datetime) -> datetime.datetime:
precision = datetime.timedelta(seconds=1).total_seconds()
Expand Down Expand Up @@ -325,18 +364,7 @@ async def async_update(self):
self._n_dict = account_dict["notifications"][self._dev_id][self._type]
except KeyError:
self._n_dict = None
self._all = (
sorted(self._n_dict.items(), key=lambda x: x[1][self._sensor_property])
if self._n_dict
else []
)
self._all = list(map(self._fix_alarm_date_time, self._all))
self._sorted = (
list(filter(lambda x: x[1]["status"] == "ON", self._all))
if self._all
else []
)
self._next = self._sorted[0][1] if self._sorted else None
self._process_raw_notifications()
try:
self.async_schedule_update_ha_state()
except NoEntitySpecifiedError:
Expand Down Expand Up @@ -367,9 +395,9 @@ def device_state_attributes(self):

attr = {
"recurrence": self.recurrence,
"total_active": len(self._sorted),
"total_active": len(self._active),
"total_all": len(self._all),
"sorted_active": json.dumps(self._sorted, default=str),
"sorted_active": json.dumps(self._active, default=str),
"sorted_all": json.dumps(self._all, default=str),
}
return attr
Expand Down

0 comments on commit 605e168

Please sign in to comment.