107 lines
3.2 KiB
Python
107 lines
3.2 KiB
Python
|
"""Support for ZHA button."""
|
||
|
from __future__ import annotations
|
||
|
|
||
|
import abc
|
||
|
import functools
|
||
|
import logging
|
||
|
from typing import Any
|
||
|
|
||
|
from homeassistant.components.button import ButtonDeviceClass, ButtonEntity
|
||
|
from homeassistant.config_entries import ConfigEntry
|
||
|
from homeassistant.const import ENTITY_CATEGORY_DIAGNOSTIC, Platform
|
||
|
from homeassistant.core import HomeAssistant
|
||
|
from homeassistant.helpers.dispatcher import async_dispatcher_connect
|
||
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||
|
|
||
|
from .core import discovery
|
||
|
from .core.const import CHANNEL_IDENTIFY, DATA_ZHA, SIGNAL_ADD_ENTITIES
|
||
|
from .core.registries import ZHA_ENTITIES
|
||
|
from .core.typing import ChannelType, ZhaDeviceType
|
||
|
from .entity import ZhaEntity
|
||
|
|
||
|
MULTI_MATCH = functools.partial(ZHA_ENTITIES.multipass_match, Platform.BUTTON)
|
||
|
DEFAULT_DURATION = 5 # seconds
|
||
|
|
||
|
_LOGGER = logging.getLogger(__name__)
|
||
|
|
||
|
|
||
|
async def async_setup_entry(
|
||
|
hass: HomeAssistant,
|
||
|
config_entry: ConfigEntry,
|
||
|
async_add_entities: AddEntitiesCallback,
|
||
|
) -> None:
|
||
|
"""Set up the Zigbee Home Automation button from config entry."""
|
||
|
entities_to_create = hass.data[DATA_ZHA][Platform.BUTTON]
|
||
|
|
||
|
unsub = async_dispatcher_connect(
|
||
|
hass,
|
||
|
SIGNAL_ADD_ENTITIES,
|
||
|
functools.partial(
|
||
|
discovery.async_add_entities,
|
||
|
async_add_entities,
|
||
|
entities_to_create,
|
||
|
update_before_add=False,
|
||
|
),
|
||
|
)
|
||
|
config_entry.async_on_unload(unsub)
|
||
|
|
||
|
|
||
|
class ZHAButton(ZhaEntity, ButtonEntity):
|
||
|
"""Defines a ZHA button."""
|
||
|
|
||
|
_command_name: str = None
|
||
|
|
||
|
def __init__(
|
||
|
self,
|
||
|
unique_id: str,
|
||
|
zha_device: ZhaDeviceType,
|
||
|
channels: list[ChannelType],
|
||
|
**kwargs,
|
||
|
) -> None:
|
||
|
"""Init this button."""
|
||
|
super().__init__(unique_id, zha_device, channels, **kwargs)
|
||
|
self._channel: ChannelType = channels[0]
|
||
|
|
||
|
@abc.abstractmethod
|
||
|
def get_args(self) -> list[Any]:
|
||
|
"""Return the arguments to use in the command."""
|
||
|
|
||
|
async def async_press(self) -> None:
|
||
|
"""Send out a update command."""
|
||
|
command = getattr(self._channel, self._command_name)
|
||
|
arguments = self.get_args()
|
||
|
await command(*arguments)
|
||
|
|
||
|
|
||
|
@MULTI_MATCH(channel_names=CHANNEL_IDENTIFY)
|
||
|
class ZHAIdentifyButton(ZHAButton):
|
||
|
"""Defines a ZHA identify button."""
|
||
|
|
||
|
@classmethod
|
||
|
def create_entity(
|
||
|
cls,
|
||
|
unique_id: str,
|
||
|
zha_device: ZhaDeviceType,
|
||
|
channels: list[ChannelType],
|
||
|
**kwargs,
|
||
|
) -> ZhaEntity | None:
|
||
|
"""Entity Factory.
|
||
|
|
||
|
Return entity if it is a supported configuration, otherwise return None
|
||
|
"""
|
||
|
platform_restrictions = ZHA_ENTITIES.single_device_matches[Platform.BUTTON]
|
||
|
device_restrictions = platform_restrictions[zha_device.ieee]
|
||
|
if CHANNEL_IDENTIFY in device_restrictions:
|
||
|
return None
|
||
|
device_restrictions.append(CHANNEL_IDENTIFY)
|
||
|
return cls(unique_id, zha_device, channels, **kwargs)
|
||
|
|
||
|
_attr_device_class: ButtonDeviceClass = ButtonDeviceClass.UPDATE
|
||
|
_attr_entity_category = ENTITY_CATEGORY_DIAGNOSTIC
|
||
|
_command_name = "identify"
|
||
|
|
||
|
def get_args(self) -> list[Any]:
|
||
|
"""Return the arguments to use in the command."""
|
||
|
|
||
|
return [DEFAULT_DURATION]
|