Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """The Airzone integration."""
2 
3 from __future__ import annotations
4 
5 import logging
6 from typing import Any
7 
8 from aioairzone.const import AZD_MAC, AZD_WEBSERVER, DEFAULT_SYSTEM_ID
9 from aioairzone.localapi import AirzoneLocalApi, ConnectionOptions
10 
11 from homeassistant.config_entries import ConfigEntry
12 from homeassistant.const import CONF_HOST, CONF_ID, CONF_PORT, Platform
13 from homeassistant.core import HomeAssistant, callback
14 from homeassistant.helpers import (
15  aiohttp_client,
16  device_registry as dr,
17  entity_registry as er,
18 )
19 
20 from .coordinator import AirzoneUpdateCoordinator
21 
22 PLATFORMS: list[Platform] = [
23  Platform.BINARY_SENSOR,
24  Platform.CLIMATE,
25  Platform.SELECT,
26  Platform.SENSOR,
27  Platform.SWITCH,
28  Platform.WATER_HEATER,
29 ]
30 
31 _LOGGER = logging.getLogger(__name__)
32 
33 type AirzoneConfigEntry = ConfigEntry[AirzoneUpdateCoordinator]
34 
35 
37  hass: HomeAssistant,
38  entry: AirzoneConfigEntry,
39  coordinator: AirzoneUpdateCoordinator,
40 ) -> None:
41  """Migrate entities when the mac address gets discovered."""
42 
43  @callback
44  def _async_migrator(entity_entry: er.RegistryEntry) -> dict[str, Any] | None:
45  updates = None
46 
47  unique_id = entry.unique_id
48  entry_id = entry.entry_id
49  entity_unique_id = entity_entry.unique_id
50 
51  if entity_unique_id.startswith(entry_id):
52  new_unique_id = f"{unique_id}{entity_unique_id.removeprefix(entry_id)}"
53  _LOGGER.debug(
54  "Migrating unique_id from [%s] to [%s]",
55  entity_unique_id,
56  new_unique_id,
57  )
58  updates = {"new_unique_id": new_unique_id}
59 
60  return updates
61 
62  if (
63  entry.unique_id is None
64  and AZD_WEBSERVER in coordinator.data
65  and AZD_MAC in coordinator.data[AZD_WEBSERVER]
66  and (mac := coordinator.data[AZD_WEBSERVER][AZD_MAC]) is not None
67  ):
68  updates: dict[str, Any] = {
69  "unique_id": dr.format_mac(mac),
70  }
71  hass.config_entries.async_update_entry(entry, **updates)
72 
73  await er.async_migrate_entries(hass, entry.entry_id, _async_migrator)
74 
75 
76 async def async_setup_entry(hass: HomeAssistant, entry: AirzoneConfigEntry) -> bool:
77  """Set up Airzone from a config entry."""
78  options = ConnectionOptions(
79  entry.data[CONF_HOST],
80  entry.data[CONF_PORT],
81  entry.data.get(CONF_ID, DEFAULT_SYSTEM_ID),
82  )
83 
84  airzone = AirzoneLocalApi(aiohttp_client.async_get_clientsession(hass), options)
85  coordinator = AirzoneUpdateCoordinator(hass, airzone)
86  await coordinator.async_config_entry_first_refresh()
87  await _async_migrate_unique_ids(hass, entry, coordinator)
88 
89  entry.runtime_data = coordinator
90 
91  await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
92 
93  return True
94 
95 
96 async def async_unload_entry(hass: HomeAssistant, entry: AirzoneConfigEntry) -> bool:
97  """Unload a config entry."""
98  return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
bool async_setup_entry(HomeAssistant hass, AirzoneConfigEntry entry)
Definition: __init__.py:76
bool async_unload_entry(HomeAssistant hass, AirzoneConfigEntry entry)
Definition: __init__.py:96
None _async_migrate_unique_ids(HomeAssistant hass, AirzoneConfigEntry entry, AirzoneUpdateCoordinator coordinator)
Definition: __init__.py:40