core/homeassistant/components/fritzbox/button.py

64 lines
2.1 KiB
Python

"""Support for AVM FRITZ!SmartHome templates."""
from pyfritzhome.devicetypes import FritzhomeTemplate
from homeassistant.components.button import ButtonEntity
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from . import FritzBoxEntity
from .const import DOMAIN
from .coordinator import FritzboxConfigEntry
async def async_setup_entry(
hass: HomeAssistant,
entry: FritzboxConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up the FRITZ!SmartHome template from ConfigEntry."""
coordinator = entry.runtime_data
@callback
def _add_entities(templates: set[str] | None = None) -> None:
"""Add templates."""
if templates is None:
templates = coordinator.new_templates
if not templates:
return
async_add_entities(FritzBoxTemplate(coordinator, ain) for ain in templates)
entry.async_on_unload(coordinator.async_add_listener(_add_entities))
_add_entities(set(coordinator.data.templates))
class FritzBoxTemplate(FritzBoxEntity, ButtonEntity):
"""Interface between FritzhomeTemplate and hass."""
@property
def data(self) -> FritzhomeTemplate:
"""Return the template data entity."""
return self.coordinator.data.templates[self.ain]
@property
def device_info(self) -> DeviceInfo:
"""Return device specific attributes."""
return DeviceInfo(
name=self.data.name,
identifiers={(DOMAIN, self.ain)},
configuration_url=self.coordinator.configuration_url,
manufacturer="AVM",
model="SmartHome Template",
)
async def async_press(self) -> None:
"""Apply template and refresh."""
await self.hass.async_add_executor_job(self.apply_template)
await self.coordinator.async_refresh()
def apply_template(self) -> None:
"""Use Fritzhome to apply the template via ain."""
self.coordinator.fritz.apply_template(self.ain)