core/homeassistant/components/tessie/button.py

91 lines
2.7 KiB
Python

"""Button platform for Tessie integration."""
from __future__ import annotations
from collections.abc import Callable
from dataclasses import dataclass
from tessie_api import (
boombox,
enable_keyless_driving,
flash_lights,
honk,
open_close_rear_trunk,
open_front_trunk,
trigger_homelink,
wake,
)
from homeassistant.components.button import ButtonEntity, ButtonEntityDescription
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import DOMAIN
from .coordinator import TessieDataUpdateCoordinator
from .entity import TessieEntity
@dataclass(frozen=True, kw_only=True)
class TessieButtonEntityDescription(ButtonEntityDescription):
"""Describes a Tessie Button entity."""
func: Callable
DESCRIPTIONS: tuple[TessieButtonEntityDescription, ...] = (
TessieButtonEntityDescription(key="wake", func=lambda: wake, icon="mdi:sleep-off"),
TessieButtonEntityDescription(
key="flash_lights", func=lambda: flash_lights, icon="mdi:flashlight"
),
TessieButtonEntityDescription(key="honk", func=honk, icon="mdi:bullhorn"),
TessieButtonEntityDescription(
key="trigger_homelink", func=lambda: trigger_homelink, icon="mdi:garage"
),
TessieButtonEntityDescription(
key="enable_keyless_driving",
func=lambda: enable_keyless_driving,
icon="mdi:car-key",
),
TessieButtonEntityDescription(
key="boombox", func=lambda: boombox, icon="mdi:volume-high"
),
TessieButtonEntityDescription(
key="frunk", func=lambda: open_front_trunk, icon="mdi:car"
),
TessieButtonEntityDescription(
key="trunk", func=lambda: open_close_rear_trunk, icon="mdi:car-back"
),
)
async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
) -> None:
"""Set up the Tessie Button platform from a config entry."""
coordinators = hass.data[DOMAIN][entry.entry_id]
async_add_entities(
TessieButtonEntity(coordinator, description)
for coordinator in coordinators
for description in DESCRIPTIONS
)
class TessieButtonEntity(TessieEntity, ButtonEntity):
"""Base class for Tessie Buttons."""
entity_description: TessieButtonEntityDescription
def __init__(
self,
coordinator: TessieDataUpdateCoordinator,
description: TessieButtonEntityDescription,
) -> None:
"""Initialize the Button."""
super().__init__(coordinator, description.key)
self.entity_description = description
async def async_press(self) -> None:
"""Press the button."""
await self.run(self.entity_description.func())