Home Assistant Unofficial Reference 2024.12.1
__init__.py
Go to the documentation of this file.
1 """The Home Assistant Yellow integration."""
2 
3 from __future__ import annotations
4 
5 import logging
6 
7 from homeassistant.components.hassio import get_os_info
9  check_multi_pan_addon,
10 )
12  ApplicationType,
13  guess_firmware_type,
14 )
15 from homeassistant.config_entries import SOURCE_HARDWARE, ConfigEntry
16 from homeassistant.core import HomeAssistant
17 from homeassistant.exceptions import ConfigEntryNotReady, HomeAssistantError
18 from homeassistant.helpers import discovery_flow
19 from homeassistant.helpers.hassio import is_hassio
20 
21 from .const import FIRMWARE, RADIO_DEVICE, ZHA_HW_DISCOVERY_DATA
22 
23 _LOGGER = logging.getLogger(__name__)
24 
25 
26 async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
27  """Set up a Home Assistant Yellow config entry."""
28  if not is_hassio(hass):
29  # Not running under supervisor, Home Assistant may have been migrated
30  hass.async_create_task(hass.config_entries.async_remove(entry.entry_id))
31  return False
32 
33  if (os_info := get_os_info(hass)) is None:
34  # The hassio integration has not yet fetched data from the supervisor
35  raise ConfigEntryNotReady
36 
37  if os_info.get("board") != "yellow":
38  # Not running on a Home Assistant Yellow, Home Assistant may have been migrated
39  hass.async_create_task(hass.config_entries.async_remove(entry.entry_id))
40  return False
41 
42  firmware = ApplicationType(entry.data[FIRMWARE])
43 
44  if firmware is ApplicationType.CPC:
45  try:
46  await check_multi_pan_addon(hass)
47  except HomeAssistantError as err:
48  raise ConfigEntryNotReady from err
49 
50  if firmware is ApplicationType.EZSP:
51  discovery_flow.async_create_flow(
52  hass,
53  "zha",
54  context={"source": SOURCE_HARDWARE},
55  data=ZHA_HW_DISCOVERY_DATA,
56  )
57 
58  return True
59 
60 
61 async def async_unload_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
62  """Unload a config entry."""
63  return True
64 
65 
66 async def async_migrate_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool:
67  """Migrate old entry."""
68 
69  _LOGGER.debug(
70  "Migrating from version %s.%s", config_entry.version, config_entry.minor_version
71  )
72 
73  if config_entry.version == 1:
74  if config_entry.minor_version == 1:
75  # Add-on startup with type service get started before Core, always (e.g. the
76  # Multi-Protocol add-on). Probing the firmware would interfere with the add-on,
77  # so we can't safely probe here. Instead, we must make an educated guess!
78  firmware_guess = await guess_firmware_type(hass, RADIO_DEVICE)
79 
80  new_data = {**config_entry.data}
81  new_data[FIRMWARE] = firmware_guess.firmware_type.value
82 
83  hass.config_entries.async_update_entry(
84  config_entry,
85  data=new_data,
86  version=1,
87  minor_version=2,
88  )
89 
90  _LOGGER.debug(
91  "Migration to version %s.%s successful",
92  config_entry.version,
93  config_entry.minor_version,
94  )
95 
96  return True
97 
98  # This means the user has downgraded from a future version
99  return False
dict[str, Any]|None get_os_info(HomeAssistant hass)
Definition: coordinator.py:169
bool is_hassio(HomeAssistant hass)
Definition: __init__.py:302
FirmwareGuess guess_firmware_type(HomeAssistant hass, str device_path)
Definition: util.py:73
bool async_migrate_entry(HomeAssistant hass, ConfigEntry config_entry)
Definition: __init__.py:66
bool async_setup_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:26
bool async_unload_entry(HomeAssistant hass, ConfigEntry entry)
Definition: __init__.py:61