Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """Support for AVM FRITZ!SmartHome devices."""
2 
3 from __future__ import annotations
4 
5 from homeassistant.components.binary_sensor import DOMAIN as BINARY_SENSOR_DOMAIN
6 from homeassistant.const import EVENT_HOMEASSISTANT_STOP, UnitOfTemperature
7 from homeassistant.core import Event, HomeAssistant
8 from homeassistant.helpers.device_registry import DeviceEntry
9 from homeassistant.helpers.entity_registry import RegistryEntry, async_migrate_entries
10 
11 from .const import DOMAIN, LOGGER, PLATFORMS
12 from .coordinator import FritzboxConfigEntry, FritzboxDataUpdateCoordinator
13 
14 
15 async def async_setup_entry(hass: HomeAssistant, entry: FritzboxConfigEntry) -> bool:
16  """Set up the AVM FRITZ!SmartHome platforms."""
17 
18  def _update_unique_id(entry: RegistryEntry) -> dict[str, str] | None:
19  """Update unique ID of entity entry."""
20  if (
21  entry.unit_of_measurement == UnitOfTemperature.CELSIUS
22  and "_temperature" not in entry.unique_id
23  ):
24  new_unique_id = f"{entry.unique_id}_temperature"
25  LOGGER.debug(
26  "Migrating unique_id [%s] to [%s]", entry.unique_id, new_unique_id
27  )
28  return {"new_unique_id": new_unique_id}
29 
30  if entry.domain == BINARY_SENSOR_DOMAIN and "_" not in entry.unique_id:
31  new_unique_id = f"{entry.unique_id}_alarm"
32  LOGGER.debug(
33  "Migrating unique_id [%s] to [%s]", entry.unique_id, new_unique_id
34  )
35  return {"new_unique_id": new_unique_id}
36  return None
37 
38  await async_migrate_entries(hass, entry.entry_id, _update_unique_id)
39 
40  coordinator = FritzboxDataUpdateCoordinator(hass, entry.entry_id)
41  await coordinator.async_setup()
42 
43  entry.runtime_data = coordinator
44 
45  await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
46 
47  def logout_fritzbox(event: Event) -> None:
48  """Close connections to this fritzbox."""
49  coordinator.fritz.logout()
50 
51  entry.async_on_unload(
52  hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, logout_fritzbox)
53  )
54 
55  return True
56 
57 
58 async def async_unload_entry(hass: HomeAssistant, entry: FritzboxConfigEntry) -> bool:
59  """Unloading the AVM FRITZ!SmartHome platforms."""
60  await hass.async_add_executor_job(entry.runtime_data.fritz.logout)
61 
62  return await hass.config_entries.async_unload_platforms(entry, PLATFORMS)
63 
64 
66  hass: HomeAssistant, entry: FritzboxConfigEntry, device: DeviceEntry
67 ) -> bool:
68  """Remove Fritzbox config entry from a device."""
69  coordinator = entry.runtime_data
70 
71  for identifier in device.identifiers:
72  if identifier[0] == DOMAIN and (
73  identifier[1] in coordinator.data.devices
74  or identifier[1] in coordinator.data.templates
75  ):
76  return False
77 
78  return True
None async_migrate_entries(HomeAssistant hass, dict[str, AdapterDetails] adapters, str default_adapter)
Definition: __init__.py:249
bool async_remove_config_entry_device(HomeAssistant hass, FritzboxConfigEntry entry, DeviceEntry device)
Definition: __init__.py:67
bool async_setup_entry(HomeAssistant hass, FritzboxConfigEntry entry)
Definition: __init__.py:15
bool async_unload_entry(HomeAssistant hass, FritzboxConfigEntry entry)
Definition: __init__.py:58