Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """The Z-Wave-Me WS integration."""
2 
3 from zwave_me_ws import ZWaveMe, ZWaveMeData
4 
5 from homeassistant.config_entries import ConfigEntry
6 from homeassistant.const import CONF_TOKEN, CONF_URL
7 from homeassistant.core import HomeAssistant
8 from homeassistant.exceptions import ConfigEntryNotReady
9 from homeassistant.helpers import device_registry as dr
10 from homeassistant.helpers.dispatcher import dispatcher_send
11 
12 from .const import DOMAIN, PLATFORMS, ZWaveMePlatform
13 
14 ZWAVE_ME_PLATFORMS = [platform.value for platform in ZWaveMePlatform]
15 
16 
17 async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
18  """Set up Z-Wave-Me from a config entry."""
19  hass.data.setdefault(DOMAIN, {})
20  controller = hass.data[DOMAIN][entry.entry_id] = ZWaveMeController(hass, entry)
21  if await controller.async_establish_connection():
22  await async_setup_platforms(hass, entry, controller)
23  registry = dr.async_get(hass)
24  controller.remove_stale_devices(registry)
25  return True
26  raise ConfigEntryNotReady
27 
28 
29 async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
30  """Unload a config entry."""
31 
32  unload_ok = await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
33  if unload_ok:
34  controller = hass.data[DOMAIN].pop(entry.entry_id)
35  await controller.zwave_api.close_ws()
36  return unload_ok
37 
38 
40  """Main ZWave-Me API class."""
41 
42  def __init__(self, hass: HomeAssistant, config: ConfigEntry) -> None:
43  """Create the API instance."""
44  self.device_ids: set = set()
45  self._hass_hass = hass
46  self.configconfig = config
47  self.zwave_apizwave_api = ZWaveMe(
48  on_device_create=self.on_device_createon_device_create,
49  on_device_update=self.on_device_updateon_device_update,
50  on_device_remove=self.on_device_unavailableon_device_unavailable,
51  on_device_destroy=self.on_device_destroyon_device_destroy,
52  on_new_device=self.add_deviceadd_device,
53  token=self.configconfig.data[CONF_TOKEN],
54  url=self.configconfig.data[CONF_URL],
55  platforms=ZWAVE_ME_PLATFORMS,
56  )
57  self.platforms_initedplatforms_inited = False
58 
59  async def async_establish_connection(self):
60  """Get connection status."""
61  return await self.zwave_apizwave_api.get_connection()
62 
63  def add_device(self, device: ZWaveMeData) -> None:
64  """Send signal to create device."""
65  if device.id in self.device_ids:
66  dispatcher_send(self._hass_hass, f"ZWAVE_ME_INFO_{device.id}", device)
67  else:
69  self._hass_hass, f"ZWAVE_ME_NEW_{device.deviceType.upper()}", device
70  )
71  self.device_ids.add(device.id)
72 
73  def on_device_create(self, devices: list[ZWaveMeData]) -> None:
74  """Create multiple devices."""
75  for device in devices:
76  if device.deviceType in ZWAVE_ME_PLATFORMS and self.platforms_initedplatforms_inited:
77  self.add_deviceadd_device(device)
78 
79  def on_device_update(self, new_info: ZWaveMeData) -> None:
80  """Send signal to update device."""
81  dispatcher_send(self._hass_hass, f"ZWAVE_ME_INFO_{new_info.id}", new_info)
82 
83  def on_device_unavailable(self, device_id: str) -> None:
84  """Send signal to set device unavailable."""
85  dispatcher_send(self._hass_hass, f"ZWAVE_ME_UNAVAILABLE_{device_id}")
86 
87  def on_device_destroy(self, device_id: str) -> None:
88  """Send signal to destroy device."""
89  dispatcher_send(self._hass_hass, f"ZWAVE_ME_DESTROY_{device_id}")
90 
91  def remove_stale_devices(self, registry: dr.DeviceRegistry):
92  """Remove old-format devices in the registry."""
93  for device_id in self.device_ids:
94  device = registry.async_get_device(
95  identifiers={(DOMAIN, f"{self.config.unique_id}-{device_id}")}
96  )
97  if device is not None:
98  registry.async_remove_device(device.id)
99 
100 
102  hass: HomeAssistant, entry: ConfigEntry, controller: ZWaveMeController
103 ) -> None:
104  """Set up platforms."""
105  await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
106  controller.platforms_inited = True
107 
108  await hass.async_add_executor_job(controller.zwave_api.get_devices)
None __init__(self, HomeAssistant hass, ConfigEntry config)
Definition: __init__.py:42
None on_device_update(self, ZWaveMeData new_info)
Definition: __init__.py:79
None on_device_create(self, list[ZWaveMeData] devices)
Definition: __init__.py:73
None on_device_unavailable(self, str device_id)
Definition: __init__.py:83
def remove_stale_devices(self, dr.DeviceRegistry registry)
Definition: __init__.py:91
None add_device(self, ZWaveMeData device)
Definition: __init__.py:63
bool add(self, _T matcher)
Definition: match.py:185
CachedConnection get_connection(HomeAssistant hass, str address)
Definition: __init__.py:38
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:29
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:17
None async_setup_platforms(HomeAssistant hass, ConfigEntry entry, ZWaveMeController controller)
Definition: __init__.py:103
None dispatcher_send(HomeAssistant hass, str signal, *Any args)
Definition: dispatcher.py:137