core/homeassistant/components/ezviz/select.py

89 lines
2.7 KiB
Python

"""Support for EZVIZ select controls."""
from __future__ import annotations
from dataclasses import dataclass
from pyezviz.constants import DeviceSwitchType, SoundMode
from pyezviz.exceptions import HTTPError, PyEzvizError
from homeassistant.components.select import SelectEntity, SelectEntityDescription
from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .coordinator import EzvizConfigEntry, EzvizDataUpdateCoordinator
from .entity import EzvizEntity
PARALLEL_UPDATES = 1
@dataclass(frozen=True, kw_only=True)
class EzvizSelectEntityDescription(SelectEntityDescription):
"""Describe a EZVIZ Select entity."""
supported_switch: int
SELECT_TYPE = EzvizSelectEntityDescription(
key="alarm_sound_mod",
translation_key="alarm_sound_mode",
entity_category=EntityCategory.CONFIG,
options=["soft", "intensive", "silent"],
supported_switch=DeviceSwitchType.ALARM_TONE.value,
)
async def async_setup_entry(
hass: HomeAssistant,
entry: EzvizConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up EZVIZ select entities based on a config entry."""
coordinator = entry.runtime_data
async_add_entities(
EzvizSelect(coordinator, camera)
for camera in coordinator.data
for switch in coordinator.data[camera]["switches"]
if switch == SELECT_TYPE.supported_switch
)
class EzvizSelect(EzvizEntity, SelectEntity):
"""Representation of a EZVIZ select entity."""
def __init__(
self,
coordinator: EzvizDataUpdateCoordinator,
serial: str,
) -> None:
"""Initialize the sensor."""
super().__init__(coordinator, serial)
self._attr_unique_id = f"{serial}_{SELECT_TYPE.key}"
self.entity_description = SELECT_TYPE
@property
def current_option(self) -> str | None:
"""Return the selected entity option to represent the entity state."""
sound_mode_value = getattr(
SoundMode, self.data[self.entity_description.key]
).value
if sound_mode_value in [0, 1, 2]:
return self.options[sound_mode_value]
return None
def select_option(self, option: str) -> None:
"""Change the selected option."""
sound_mode_value = self.options.index(option)
try:
self.coordinator.ezviz_client.alarm_sound(self._serial, sound_mode_value, 1)
except (HTTPError, PyEzvizError) as err:
raise HomeAssistantError(
f"Cannot set Warning sound level for {self.entity_id}"
) from err