def __init__(self, soco, alarm): """Init Sonos alarms switch.""" self._icon = "mdi:alarm" self._soco = soco self._id = alarm._alarm_id self._is_available = True speaker_info = self._soco.get_speaker_info(True) self._unique_id = "{}-{}".format(soco.uid, self._id) self._name = "Sonos {} Alarm (id: {})".format( speaker_info["zone_name"], self._id) _entity_id = slugify("sonos_alarm_{}".format(self._id)) self.entity_id = ENTITY_ID_FORMAT.format(_entity_id) self._model = speaker_info["model_name"] self.alarm = None for one_alarm in alarms.get_alarms(self._soco): # pylint: disable=protected-access if one_alarm._alarm_id == self._id: self.alarm = one_alarm self._is_on = self.alarm.enabled self._attributes = { ATTR_TIME: str(self.alarm.start_time), ATTR_VOLUME: self.alarm.volume / 100, ATTR_DURATION: str(self.alarm.duration), ATTR_INCLUDE_LINKED_ZONES: self.alarm.include_linked_zones, ATTR_RECURRENCE: str(self.alarm.recurrence), ATTR_PLAY_MODE: str(self.alarm.play_mode), } super().__init__()
def set_alarm( self, alarm_id: int, time: datetime.datetime | None = None, volume: float | None = None, enabled: bool | None = None, include_linked_zones: bool | None = None, ) -> None: """Set the alarm clock on the player.""" alarm = None for one_alarm in alarms.get_alarms(self.coordinator.soco): if one_alarm.alarm_id == str(alarm_id): alarm = one_alarm if alarm is None: _LOGGER.warning("Did not find alarm with id %s", alarm_id) return if time is not None: alarm.start_time = time if volume is not None: alarm.volume = int(volume * 100) if enabled is not None: alarm.enabled = enabled if include_linked_zones is not None: alarm.include_linked_zones = include_linked_zones alarm.save()
def _get_current_alarm_instance(self): """Function that retrieves the current alarms and returns if the alarm is available or not.""" current_alarms = alarms.get_alarms(self.alarm.zone) if self.alarm in current_alarms: return True else: return False
def update(self, now=None): """Retrieve latest state.""" _LOGGER.debug("updating alarms") try: alarms.get_alarms(self._soco) self._is_on = self.alarm.enabled self._attributes[ATTR_TIME] = str(self.alarm.start_time) self._attributes[ATTR_DURATION] = str(self.alarm.duration) self._attributes[ATTR_RECURRENCE] = str(self.alarm.recurrence) self._attributes[ATTR_VOLUME] = self.alarm.volume / 100 self._attributes[ATTR_PLAY_MODE] = str(self.alarm.play_mode) self._attributes[ ATTR_INCLUDE_LINKED_ZONES] = self.alarm.include_linked_zones self._is_available = True _LOGGER.debug("successfully updated alarms") except SoCoException as exc: _LOGGER.error( "Home Assistant couldnt update the state of the alarm %s", exc, exc_info=True, ) self._is_available = False
def _discovered_alarm(soco): """Handle a (re)discovered player.""" try: _LOGGER.debug("Reached _discovered_player, soco=%s", soco) for one_alarm in alarms.get_alarms(soco): if one_alarm.zone == soco and one_alarm not in alarm_list: _LOGGER.debug("Adding new alarm") alarm_list.append(one_alarm) hass.add_job( async_add_entities, [SonosAlarmSwitch(soco, one_alarm)], ) except SoCoException as ex: _LOGGER.debug("SoCoException, ex=%s", ex)
def _discovered_alarm(soco): """Handle a (re)discovered player.""" try: _LOGGER.debug("Reached _discovered_player, soco=%s", soco) for one_alarm in alarms.get_alarms(soco): if one_alarm.zone == soco and one_alarm._alarm_id not in hass.data[DATA_SONOS].discovered: _LOGGER.debug("Adding new alarm") hass.data[DATA_SONOS].discovered.append(one_alarm._alarm_id) hass.add_job( async_add_entities, [SonosAlarmSwitch(one_alarm)], ) else: entity = _get_entity_from_alarm_id(hass, one_alarm._alarm_id) if entity and (entity.soco == soco or not entity.available): _LOGGER.debug("Seen %s", entity) hass.add_job(entity.async_seen(soco)) # type: ignore except SoCoUPnPException as ex: _LOGGER.debug("SoCoException, ex=%s", ex)
def update_cache(self, soco: SoCo) -> set[Alarm]: """Populate cache of known alarms. Prune deleted alarms and return new alarms. """ soco_alarms = get_alarms(soco) new_alarms = set() for alarm in soco_alarms: if alarm.alarm_id not in self._alarms: new_alarms.add(alarm) self._alarms[alarm.alarm_id] = alarm for alarm_id, alarm in list(self._alarms.items()): if alarm not in soco_alarms: self._alarms.pop(alarm_id) return new_alarms
def set_alarm(self, data): """Set the alarm clock on the player.""" alarm = None for one_alarm in alarms.get_alarms(self.soco): # pylint: disable=protected-access if one_alarm._alarm_id == str(data[ATTR_ALARM_ID]): alarm = one_alarm if alarm is None: _LOGGER.warning("did not find alarm with id %s", data[ATTR_ALARM_ID]) return if ATTR_TIME in data: alarm.start_time = data[ATTR_TIME] if ATTR_VOLUME in data: alarm.volume = int(data[ATTR_VOLUME] * 100) if ATTR_ENABLED in data: alarm.enabled = data[ATTR_ENABLED] if ATTR_INCLUDE_LINKED_ZONES in data: alarm.include_linked_zones = data[ATTR_INCLUDE_LINKED_ZONES] alarm.save()
def set_alarm(self, **data): """Set the alarm clock on the player.""" from pysonos import alarms alarm = None for one_alarm in alarms.get_alarms(self.soco): # pylint: disable=protected-access if one_alarm._alarm_id == str(data[ATTR_ALARM_ID]): alarm = one_alarm if alarm is None: _LOGGER.warning("did not find alarm with id %s", data[ATTR_ALARM_ID]) return if ATTR_TIME in data: alarm.start_time = data[ATTR_TIME] if ATTR_VOLUME in data: alarm.volume = int(data[ATTR_VOLUME] * 100) if ATTR_ENABLED in data: alarm.enabled = data[ATTR_ENABLED] if ATTR_INCLUDE_LINKED_ZONES in data: alarm.include_linked_zones = data[ATTR_INCLUDE_LINKED_ZONES] alarm.save()
def set_alarm( self, alarm_id, time=None, volume=None, enabled=None, include_linked_zones=None ): """Set the alarm clock on the player.""" alarm = None for one_alarm in alarms.get_alarms(self.soco): # pylint: disable=protected-access if one_alarm._alarm_id == str(alarm_id): alarm = one_alarm if alarm is None: _LOGGER.warning("did not find alarm with id %s", alarm_id) return if time is not None: alarm.start_time = time if volume is not None: alarm.volume = int(volume * 100) if enabled is not None: alarm.enabled = enabled if include_linked_zones is not None: alarm.include_linked_zones = include_linked_zones alarm.save()