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__()
Beispiel #2
0
 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()
Beispiel #3
0
    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)
Beispiel #6
0
 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)
Beispiel #7
0
    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()
Beispiel #10
0
 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()