51 lines
1.5 KiB
Python
51 lines
1.5 KiB
Python
"""Utility method for converting Garmin Connect alarms to python datetime."""
|
|
from datetime import date, datetime, timedelta
|
|
import logging
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
DAY_TO_NUMBER = {
|
|
"Mo": 1,
|
|
"M": 1,
|
|
"Tu": 2,
|
|
"We": 3,
|
|
"W": 3,
|
|
"Th": 4,
|
|
"Fr": 5,
|
|
"F": 5,
|
|
"Sa": 6,
|
|
"Su": 7,
|
|
}
|
|
|
|
|
|
def calculate_next_active_alarms(alarms):
|
|
"""
|
|
Calculate garmin next active alarms from settings.
|
|
|
|
Alarms are sorted by time
|
|
"""
|
|
active_alarms = []
|
|
_LOGGER.debug(alarms)
|
|
|
|
for alarm_setting in alarms:
|
|
if alarm_setting["alarmMode"] != "ON":
|
|
continue
|
|
for day in alarm_setting["alarmDays"]:
|
|
alarm_time = alarm_setting["alarmTime"]
|
|
if day == "ONCE":
|
|
midnight = datetime.combine(date.today(), datetime.min.time())
|
|
alarm = midnight + timedelta(minutes=alarm_time)
|
|
if alarm < datetime.now():
|
|
alarm += timedelta(days=1)
|
|
else:
|
|
start_of_week = datetime.combine(
|
|
date.today() - timedelta(days=datetime.today().isoweekday() % 7),
|
|
datetime.min.time(),
|
|
)
|
|
days_to_add = DAY_TO_NUMBER[day] % 7
|
|
alarm = start_of_week + timedelta(minutes=alarm_time, days=days_to_add)
|
|
if alarm < datetime.now():
|
|
alarm += timedelta(days=7)
|
|
active_alarms.append(alarm.isoformat())
|
|
return sorted(active_alarms) if active_alarms else None
|