1 """Utility functions for Home Assistant SkyConnect integration."""
3 from __future__
import annotations
5 from collections
import defaultdict
6 from dataclasses
import dataclass
8 from typing
import cast
10 from universal_silabs_flasher.const
import ApplicationType
19 OTBR_ADDON_MANAGER_DATA,
23 ZIGBEE_FLASHER_ADDON_MANAGER_DATA,
24 ZIGBEE_FLASHER_ADDON_NAME,
25 ZIGBEE_FLASHER_ADDON_SLUG,
27 from .silabs_multiprotocol_addon
import (
29 get_multiprotocol_addon_manager,
32 _LOGGER = logging.getLogger(__name__)
36 """Get the device path from a ZHA config entry."""
37 return cast(str |
None, config_entry.data.get(
"device", {}).
get(
"path",
None))
40 @singleton(OTBR_ADDON_MANAGER_DATA)
43 """Get the OTBR add-on manager."""
52 @singleton(ZIGBEE_FLASHER_ADDON_MANAGER_DATA)
55 """Get the flasher add-on manager."""
59 ZIGBEE_FLASHER_ADDON_NAME,
60 ZIGBEE_FLASHER_ADDON_SLUG,
64 @dataclass(slots=True, kw_only=True)
69 firmware_type: ApplicationType
74 """Guess the firmware type based on installed addons and other integrations."""
75 device_guesses: defaultdict[str |
None, list[FirmwareGuess]] = defaultdict(list)
77 for zha_config_entry
in hass.config_entries.async_entries(ZHA_DOMAIN):
80 if zha_path
is not None:
81 device_guesses[zha_path].append(
83 is_running=(zha_config_entry.state == ConfigEntryState.LOADED),
84 firmware_type=ApplicationType.EZSP,
93 otbr_addon_info = await otbr_addon_manager.async_get_addon_info()
97 if otbr_addon_info.state != AddonState.NOT_INSTALLED:
98 otbr_path = otbr_addon_info.options.get(
"device")
99 device_guesses[otbr_path].append(
101 is_running=(otbr_addon_info.state == AddonState.RUNNING),
102 firmware_type=ApplicationType.SPINEL,
110 multipan_addon_info = await multipan_addon_manager.async_get_addon_info()
114 if multipan_addon_info.state != AddonState.NOT_INSTALLED:
115 multipan_path = multipan_addon_info.options.get(
"device")
116 device_guesses[multipan_path].append(
118 is_running=(multipan_addon_info.state == AddonState.RUNNING),
119 firmware_type=ApplicationType.CPC,
120 source=
"multiprotocol",
125 if device_path
not in device_guesses:
127 is_running=
False, firmware_type=ApplicationType.EZSP, source=
"unknown"
133 device_guesses[device_path],
134 key=
lambda guess: guess.is_running,
web.Response get(self, web.Request request, str config_key)
bool is_hassio(HomeAssistant hass)
MultiprotocolAddonManager get_multiprotocol_addon_manager(HomeAssistant hass)
WaitingAddonManager get_zigbee_flasher_addon_manager(HomeAssistant hass)
FirmwareGuess guess_firmware_type(HomeAssistant hass, str device_path)
WaitingAddonManager get_otbr_addon_manager(HomeAssistant hass)
str|None get_zha_device_path(ConfigEntry config_entry)