/simplify pass on the bubble soak/pre-wash/intensive switches: - Move validate_fn dispatch from switch.py into coordinator.async_send_command, next to the existing write_fn getattr -- every platform gets validation for free instead of switch.py hand-rolling it alone, and it avoids building the full resources snapshot twice per write (switch.py was calling coordinator.last_resources twice; the coordinator now snapshots once, and only when a validate_fn is actually present). - Collapse the four per-switch factories (write/value/exists/validate) plus the _AVAILABILITY_FIELD side-table into one _bool_option_switch() that builds the SwitchDesc directly, so the three call sites read as one line each instead of six, and a typo'd prefix can no longer silently KeyError against a separate lookup table. - Rename _dosing_alarm_exists to _option_exists and reuse it for the new switches too -- it was already the exact same "is this token present" check the toggles need. No behavior change; re-verified write_fn/rep_fn/exists_fn/validate_fn against the same fixtures and golden state-key sets as before.
45 lines
1.5 KiB
Python
45 lines
1.5 KiB
Python
"""Switch platform for Local Things."""
|
|
from __future__ import annotations
|
|
|
|
from homeassistant.components.switch import SwitchEntity
|
|
from homeassistant.config_entries import ConfigEntry
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
|
|
|
from .registry.entities import SwitchDesc
|
|
|
|
from .const import DOMAIN
|
|
from .coordinator import LocalThingsCoordinator
|
|
from .entity import LocalThingsEntity, _is_included
|
|
|
|
|
|
async def async_setup_entry(
|
|
hass: HomeAssistant,
|
|
entry: ConfigEntry,
|
|
async_add_entities: AddEntitiesCallback,
|
|
) -> None:
|
|
coordinator: LocalThingsCoordinator = hass.data[DOMAIN][entry.entry_id]
|
|
async_add_entities(
|
|
LocalThingsSwitch(coordinator, b)
|
|
for b in coordinator.bound
|
|
if isinstance(b.desc, SwitchDesc) and _is_included(b, coordinator)
|
|
)
|
|
|
|
|
|
class LocalThingsSwitch(LocalThingsEntity, SwitchEntity):
|
|
|
|
def __init__(self, coordinator: LocalThingsCoordinator, bound) -> None:
|
|
super().__init__(coordinator, bound)
|
|
desc: SwitchDesc = bound.desc
|
|
self._attr_device_class = desc.device_class
|
|
|
|
@property
|
|
def is_on(self):
|
|
return (self.coordinator.data or {}).get(self._state_key)
|
|
|
|
async def async_turn_on(self, **kwargs) -> None:
|
|
await self.coordinator.async_send_command(self._bound, 'On')
|
|
|
|
async def async_turn_off(self, **kwargs) -> None:
|
|
await self.coordinator.async_send_command(self._bound, 'Off')
|