core/homeassistant/components/livisi/switch.py

106 lines
3.6 KiB
Python

"""Code to handle a Livisi switches."""
from __future__ import annotations
from typing import Any
from homeassistant.components.switch import SwitchEntity
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant, callback
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.dispatcher import async_dispatcher_connect
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import DOMAIN, LIVISI_STATE_CHANGE, LOGGER, SWITCH_DEVICE_TYPES
from .coordinator import LivisiDataUpdateCoordinator
from .entity import LivisiEntity
async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up switch device."""
coordinator: LivisiDataUpdateCoordinator = hass.data[DOMAIN][config_entry.entry_id]
@callback
def handle_coordinator_update() -> None:
"""Add switch."""
shc_devices: list[dict[str, Any]] = coordinator.data
entities: list[SwitchEntity] = []
for device in shc_devices:
if (
device["type"] in SWITCH_DEVICE_TYPES
and device["id"] not in coordinator.devices
):
livisi_switch: SwitchEntity = LivisiSwitch(
config_entry, coordinator, device
)
LOGGER.debug("Include device type: %s", device["type"])
coordinator.devices.add(device["id"])
entities.append(livisi_switch)
async_add_entities(entities)
config_entry.async_on_unload(
coordinator.async_add_listener(handle_coordinator_update)
)
class LivisiSwitch(LivisiEntity, SwitchEntity):
"""Represents the Livisi Switch."""
def __init__(
self,
config_entry: ConfigEntry,
coordinator: LivisiDataUpdateCoordinator,
device: dict[str, Any],
) -> None:
"""Initialize the Livisi switch."""
super().__init__(config_entry, coordinator, device)
self._capability_id = self.capabilities["SwitchActuator"]
async def async_turn_on(self, **kwargs: Any) -> None:
"""Turn the entity on."""
response = await self.aio_livisi.async_pss_set_state(
self._capability_id, is_on=True
)
if response is None:
self._attr_available = False
raise HomeAssistantError(f"Failed to turn on {self._attr_name}")
async def async_turn_off(self, **kwargs: Any) -> None:
"""Turn the entity off."""
response = await self.aio_livisi.async_pss_set_state(
self._capability_id, is_on=False
)
if response is None:
self._attr_available = False
raise HomeAssistantError(f"Failed to turn off {self._attr_name}")
async def async_added_to_hass(self) -> None:
"""Register callbacks."""
await super().async_added_to_hass()
response = await self.coordinator.async_get_device_state(
self._capability_id, "onState"
)
if response is None:
self._attr_is_on = False
self._attr_available = False
else:
self._attr_is_on = response
self.async_on_remove(
async_dispatcher_connect(
self.hass,
f"{LIVISI_STATE_CHANGE}_{self._capability_id}",
self.update_states,
)
)
@callback
def update_states(self, state: bool) -> None:
"""Update the state of the switch device."""
self._attr_is_on = state
self.async_write_ha_state()