1
0
mirror of https://github.com/home-assistant/core.git synced 2026-05-20 07:20:14 +01:00
Files
2026-04-20 18:29:46 +02:00

78 lines
3.0 KiB
Python

"""The Z-Wave-Me WS controller."""
from zwave_me_ws import ZWaveMe, ZWaveMeData
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import CONF_TOKEN, CONF_URL
from homeassistant.core import HomeAssistant
from homeassistant.helpers import device_registry as dr
from homeassistant.helpers.dispatcher import dispatcher_send
from .const import DOMAIN, ZWaveMePlatform
type ZWaveMeConfigEntry = ConfigEntry[ZWaveMeController]
ZWAVE_ME_PLATFORMS = [platform.value for platform in ZWaveMePlatform]
class ZWaveMeController:
"""Main ZWave-Me API class."""
def __init__(self, hass: HomeAssistant, config: ZWaveMeConfigEntry) -> None:
"""Create the API instance."""
self.device_ids: set[str] = set()
self._hass = hass
self.config = config
self.zwave_api = ZWaveMe(
on_device_create=self.on_device_create,
on_device_update=self.on_device_update,
on_device_remove=self.on_device_unavailable,
on_device_destroy=self.on_device_destroy,
on_new_device=self.add_device,
token=self.config.data[CONF_TOKEN],
url=self.config.data[CONF_URL],
platforms=ZWAVE_ME_PLATFORMS,
)
self.platforms_inited = False
async def async_establish_connection(self) -> bool:
"""Get connection status."""
return await self.zwave_api.get_connection()
def add_device(self, device: ZWaveMeData) -> None:
"""Send signal to create device."""
if device.id in self.device_ids:
dispatcher_send(self._hass, f"ZWAVE_ME_INFO_{device.id}", device)
else:
dispatcher_send(
self._hass, f"ZWAVE_ME_NEW_{device.deviceType.upper()}", device
)
self.device_ids.add(device.id)
def on_device_create(self, devices: list[ZWaveMeData]) -> None:
"""Create multiple devices."""
for device in devices:
if device.deviceType in ZWAVE_ME_PLATFORMS and self.platforms_inited:
self.add_device(device)
def on_device_update(self, new_info: ZWaveMeData) -> None:
"""Send signal to update device."""
dispatcher_send(self._hass, f"ZWAVE_ME_INFO_{new_info.id}", new_info)
def on_device_unavailable(self, device_id: str) -> None:
"""Send signal to set device unavailable."""
dispatcher_send(self._hass, f"ZWAVE_ME_UNAVAILABLE_{device_id}")
def on_device_destroy(self, device_id: str) -> None:
"""Send signal to destroy device."""
dispatcher_send(self._hass, f"ZWAVE_ME_DESTROY_{device_id}")
def remove_stale_devices(self, registry: dr.DeviceRegistry):
"""Remove old-format devices in the registry."""
for device_id in self.device_ids:
device = registry.async_get_device(
identifiers={(DOMAIN, f"{self.config.unique_id}-{device_id}")}
)
if device is not None:
registry.async_remove_device(device.id)