diff --git a/.coveragerc b/.coveragerc index 6fe6914cd07..aa32ac422fa 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1447,6 +1447,7 @@ omit = homeassistant/components/yale_smart_alarm/__init__.py homeassistant/components/yale_smart_alarm/alarm_control_panel.py homeassistant/components/yale_smart_alarm/binary_sensor.py + homeassistant/components/yale_smart_alarm/button.py homeassistant/components/yale_smart_alarm/const.py homeassistant/components/yale_smart_alarm/coordinator.py homeassistant/components/yale_smart_alarm/diagnostics.py diff --git a/homeassistant/components/yale_smart_alarm/button.py b/homeassistant/components/yale_smart_alarm/button.py new file mode 100644 index 00000000000..081c25c4342 --- /dev/null +++ b/homeassistant/components/yale_smart_alarm/button.py @@ -0,0 +1,60 @@ +"""Support for Yale Smart Alarm button.""" +from __future__ import annotations + +from typing import TYPE_CHECKING, Any + +from homeassistant.components.button import ButtonEntity, ButtonEntityDescription +from homeassistant.config_entries import ConfigEntry +from homeassistant.const import CONF_NAME +from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity_platform import AddEntitiesCallback + +from .const import COORDINATOR, DOMAIN +from .coordinator import YaleDataUpdateCoordinator +from .entity import YaleAlarmEntity + +BUTTON_TYPES = ( + ButtonEntityDescription(key="panic", name="Panic Button", icon="mdi:alarm-light"), +) + + +async def async_setup_entry( + hass: HomeAssistant, + entry: ConfigEntry, + async_add_entities: AddEntitiesCallback, +) -> None: + """Set up the button from a config entry.""" + + coordinator: YaleDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id][ + COORDINATOR + ] + + async_add_entities( + [YalePanicButton(coordinator, description) for description in BUTTON_TYPES] + ) + + +class YalePanicButton(YaleAlarmEntity, ButtonEntity): + """A Panic button for Yale Smart Alarm.""" + + entity_description: ButtonEntityDescription + + def __init__( + self, + coordinator: YaleDataUpdateCoordinator, + description: ButtonEntityDescription, + ) -> None: + """Initialize the plug switch.""" + super().__init__(coordinator) + self.entity_description = description + self._attr_name = f"{coordinator.entry.data[CONF_NAME]} {description.name}" + self._attr_unique_id = f"yale_smart_alarm-{description.key}" + + async def async_press(self, **kwargs: Any) -> None: + """Press the button.""" + if TYPE_CHECKING: + assert self.coordinator.yale, "Connection to API is missing" + + await self.hass.async_add_executor_job( + self.coordinator.yale.trigger_panic_button + ) diff --git a/homeassistant/components/yale_smart_alarm/const.py b/homeassistant/components/yale_smart_alarm/const.py index e506a2c70d6..71b34a3011a 100644 --- a/homeassistant/components/yale_smart_alarm/const.py +++ b/homeassistant/components/yale_smart_alarm/const.py @@ -34,7 +34,12 @@ LOGGER = logging.getLogger(__package__) ATTR_ONLINE = "online" ATTR_STATUS = "status" -PLATFORMS = [Platform.ALARM_CONTROL_PANEL, Platform.BINARY_SENSOR, Platform.LOCK] +PLATFORMS = [ + Platform.ALARM_CONTROL_PANEL, + Platform.BINARY_SENSOR, + Platform.BUTTON, + Platform.LOCK, +] STATE_MAP = { YALE_STATE_DISARM: STATE_ALARM_DISARMED,