127 lines
3.8 KiB
Python
127 lines
3.8 KiB
Python
"""Representation of ISY/IoX buttons."""
|
|
from __future__ import annotations
|
|
|
|
from pyisy import ISY
|
|
from pyisy.constants import PROTO_INSTEON
|
|
from pyisy.networking import NetworkCommand
|
|
from pyisy.nodes import Node
|
|
|
|
from homeassistant.components.button import ButtonEntity
|
|
from homeassistant.config_entries import ConfigEntry
|
|
from homeassistant.const import Platform
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers.entity import DeviceInfo, EntityCategory
|
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
|
|
|
from .const import CONF_NETWORK, DOMAIN
|
|
|
|
|
|
async def async_setup_entry(
|
|
hass: HomeAssistant,
|
|
config_entry: ConfigEntry,
|
|
async_add_entities: AddEntitiesCallback,
|
|
) -> None:
|
|
"""Set up ISY/IoX button from config entry."""
|
|
isy_data = hass.data[DOMAIN][config_entry.entry_id]
|
|
isy: ISY = isy_data.root
|
|
device_info = isy_data.devices
|
|
entities: list[
|
|
ISYNodeQueryButtonEntity
|
|
| ISYNodeBeepButtonEntity
|
|
| ISYNetworkResourceButtonEntity
|
|
] = []
|
|
|
|
for node in isy_data.root_nodes[Platform.BUTTON]:
|
|
entities.append(
|
|
ISYNodeQueryButtonEntity(
|
|
node=node,
|
|
name="Query",
|
|
unique_id=f"{isy_data.uid_base(node)}_query",
|
|
entity_category=EntityCategory.DIAGNOSTIC,
|
|
device_info=device_info[node.address],
|
|
)
|
|
)
|
|
if node.protocol == PROTO_INSTEON:
|
|
entities.append(
|
|
ISYNodeBeepButtonEntity(
|
|
node=node,
|
|
name="Beep",
|
|
unique_id=f"{isy_data.uid_base(node)}_beep",
|
|
entity_category=EntityCategory.DIAGNOSTIC,
|
|
device_info=device_info[node.address],
|
|
)
|
|
)
|
|
|
|
for node in isy_data.net_resources:
|
|
entities.append(
|
|
ISYNetworkResourceButtonEntity(
|
|
node=node,
|
|
name=node.name,
|
|
unique_id=isy_data.uid_base(node),
|
|
device_info=device_info[CONF_NETWORK],
|
|
)
|
|
)
|
|
|
|
# Add entity to query full system
|
|
entities.append(
|
|
ISYNodeQueryButtonEntity(
|
|
node=isy,
|
|
name="Query",
|
|
unique_id=isy.uuid,
|
|
device_info=DeviceInfo(identifiers={(DOMAIN, isy.uuid)}),
|
|
entity_category=EntityCategory.DIAGNOSTIC,
|
|
)
|
|
)
|
|
|
|
async_add_entities(entities)
|
|
|
|
|
|
class ISYNodeButtonEntity(ButtonEntity):
|
|
"""Representation of an ISY/IoX device button entity."""
|
|
|
|
_attr_should_poll = False
|
|
_attr_has_entity_name = True
|
|
|
|
def __init__(
|
|
self,
|
|
node: Node | ISY | NetworkCommand,
|
|
name: str,
|
|
unique_id: str,
|
|
device_info: DeviceInfo,
|
|
entity_category: EntityCategory | None = None,
|
|
) -> None:
|
|
"""Initialize a query ISY device button entity."""
|
|
self._node = node
|
|
|
|
# Entity class attributes
|
|
self._attr_name = name
|
|
self._attr_entity_category = entity_category
|
|
self._attr_unique_id = unique_id
|
|
self._attr_device_info = device_info
|
|
|
|
|
|
class ISYNodeQueryButtonEntity(ISYNodeButtonEntity):
|
|
"""Representation of a device query button entity."""
|
|
|
|
async def async_press(self) -> None:
|
|
"""Press the button."""
|
|
await self._node.query()
|
|
|
|
|
|
class ISYNodeBeepButtonEntity(ISYNodeButtonEntity):
|
|
"""Representation of a device beep button entity."""
|
|
|
|
async def async_press(self) -> None:
|
|
"""Press the button."""
|
|
await self._node.beep()
|
|
|
|
|
|
class ISYNetworkResourceButtonEntity(ISYNodeButtonEntity):
|
|
"""Representation of an ISY/IoX Network Resource button entity."""
|
|
|
|
_attr_has_entity_name = False
|
|
|
|
async def async_press(self) -> None:
|
|
"""Press the button."""
|
|
await self._node.run()
|