core/homeassistant/components/senseme/switch.py

139 lines
3.9 KiB
Python
Raw Normal View History

"""Support for Big Ass Fans SenseME switch."""
from __future__ import annotations
from collections.abc import Callable
from dataclasses import dataclass
from typing import Any, cast
from aiosenseme import SensemeFan
from aiosenseme.device import SensemeDevice
from homeassistant import config_entries
from homeassistant.components.switch import (
SwitchDeviceClass,
SwitchEntity,
SwitchEntityDescription,
)
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import DOMAIN
from .entity import SensemeEntity
@dataclass
class SenseMESwitchEntityDescriptionMixin:
"""Mixin for required keys."""
value_fn: Callable[[SensemeFan], bool]
set_fn: Callable[[SensemeFan, bool], None]
@dataclass
class SenseMESwitchEntityDescription(
SwitchEntityDescription, SenseMESwitchEntityDescriptionMixin
):
"""Describes SenseME switch entity."""
def _set_sleep_mode(device: SensemeDevice, value: bool) -> None:
device.sleep_mode = value
def _set_motion_fan_auto(device: SensemeDevice, value: bool) -> None:
device.motion_fan_auto = value
def _set_motion_light_auto(device: SensemeDevice, value: bool) -> None:
device.motion_light_auto = value
FAN_SWITCHES = [
# Turning on sleep mode will disable Whoosh
SenseMESwitchEntityDescription(
key="sleep_mode",
name="Sleep Mode",
value_fn=lambda device: cast(bool, device.sleep_mode),
set_fn=_set_sleep_mode,
),
SenseMESwitchEntityDescription(
key="motion_fan_auto",
name="Motion",
value_fn=lambda device: cast(bool, device.motion_fan_auto),
set_fn=_set_motion_fan_auto,
),
]
FAN_LIGHT_SWITCHES = [
SenseMESwitchEntityDescription(
key="motion_light_auto",
name="Light Motion",
value_fn=lambda device: cast(bool, device.motion_light_auto),
set_fn=_set_motion_light_auto,
),
]
LIGHT_SWITCHES = [
SenseMESwitchEntityDescription(
key="sleep_mode",
name="Sleep Mode",
value_fn=lambda device: cast(bool, device.sleep_mode),
set_fn=_set_sleep_mode,
),
SenseMESwitchEntityDescription(
key="motion_light_auto",
name="Motion",
value_fn=lambda device: cast(bool, device.motion_light_auto),
set_fn=_set_motion_light_auto,
),
]
async def async_setup_entry(
hass: HomeAssistant,
entry: config_entries.ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up SenseME fans."""
device = hass.data[DOMAIN][entry.entry_id]
descriptions: list[SenseMESwitchEntityDescription] = []
if device.is_fan:
descriptions.extend(FAN_SWITCHES)
if device.has_light:
descriptions.extend(FAN_LIGHT_SWITCHES)
elif device.is_light:
descriptions.extend(LIGHT_SWITCHES)
async_add_entities(
HASensemeSwitch(device, description) for description in descriptions
)
class HASensemeSwitch(SensemeEntity, SwitchEntity):
"""SenseME switch component."""
entity_description: SenseMESwitchEntityDescription
def __init__(
self, device: SensemeFan, description: SenseMESwitchEntityDescription
) -> None:
"""Initialize the entity."""
self.entity_description = description
self._attr_device_class = SwitchDeviceClass.SWITCH
super().__init__(device, f"{device.name} {description.name}")
self._attr_unique_id = f"{self._device.uuid}-SWITCH-{description.key}"
@callback
def _async_update_attrs(self) -> None:
"""Update attrs from device."""
self._attr_is_on = self.entity_description.value_fn(self._device)
async def async_turn_on(self, **kwargs: Any) -> None:
"""Turn on the switch."""
self.entity_description.set_fn(self._device, True)
async def async_turn_off(self, **kwargs: Any) -> None:
"""Turn off the switch."""
self.entity_description.set_fn(self._device, False)