1 """Config flow for the Home Assistant SkyConnect integration."""
3 from __future__
import annotations
6 from typing
import TYPE_CHECKING, Any, Protocol
8 from universal_silabs_flasher.const
import ApplicationType
13 silabs_multiprotocol_addon,
24 from .const
import DOCS_WEB_FLASHER_URL, DOMAIN, HardwareVariant
25 from .util
import get_hardware_variant, get_usb_service_info
27 _LOGGER = logging.getLogger(__name__)
33 """Protocol describing `BaseFirmwareInstallFlow`'s translation placeholders."""
39 TranslationPlaceholderProtocol = object
43 """Translation placeholder mixin for Home Assistant SkyConnect."""
45 context: ConfigFlowContext
48 """Shared translation placeholders."""
51 "docs_web_flasher_url": DOCS_WEB_FLASHER_URL,
54 self.context[
"title_placeholders"] = placeholders
60 SkyConnectTranslationMixin,
61 firmware_config_flow.BaseFirmwareConfigFlow,
64 """Handle a config flow for Home Assistant SkyConnect."""
69 def __init__(self, *args: Any, **kwargs: Any) ->
None:
70 """Initialize the config flow."""
74 self.
_hw_variant_hw_variant: HardwareVariant |
None =
None
79 config_entry: ConfigEntry,
81 """Return the options flow."""
82 firmware_type = ApplicationType(config_entry.data[
"firmware"])
84 if firmware_type
is ApplicationType.CPC:
90 self, discovery_info: usb.UsbServiceInfo
91 ) -> ConfigFlowResult:
92 """Handle usb discovery."""
93 device = discovery_info.device
94 vid = discovery_info.vid
95 pid = discovery_info.pid
96 serial_number = discovery_info.serial_number
97 manufacturer = discovery_info.manufacturer
98 description = discovery_info.description
99 unique_id = f
"{vid}:{pid}_{serial_number}_{manufacturer}_{description}"
101 if await self.async_set_unique_id(unique_id):
102 self._abort_if_unique_id_configured(updates={
"device": device})
104 discovery_info.device = await self.hass.async_add_executor_job(
105 usb.get_serial_by_id, discovery_info.device
110 assert description
is not None
111 self.
_hw_variant_hw_variant = HardwareVariant.from_usb_product_name(description)
117 return await self.async_step_confirm()
120 """Create the config entry."""
121 assert self.
_usb_info_usb_info
is not None
123 assert self._probed_firmware_type
is not None
130 "serial_number": self.
_usb_info_usb_info.serial_number,
131 "manufacturer": self.
_usb_info_usb_info.manufacturer,
132 "description": self.
_usb_info_usb_info.description,
133 "product": self.
_usb_info_usb_info.description,
134 "device": self.
_usb_info_usb_info.device,
135 "firmware": self._probed_firmware_type.value,
141 silabs_multiprotocol_addon.OptionsFlowHandler
143 """Multi-PAN options flow for Home Assistant SkyConnect."""
147 ) -> silabs_multiprotocol_addon.SerialPortSettings:
148 """Return the radio serial port settings."""
149 usb_dev = self.config_entry.data[
"device"]
151 dev_path = await self.hass.async_add_executor_job(usb.get_serial_by_id, usb_dev)
152 return silabs_multiprotocol_addon.SerialPortSettings(
159 """Return ZHA discovery data when multiprotocol FW is not used.
161 Passed to ZHA do determine if the ZHA config entry is connected to the radio
168 """Return the hardware variant."""
172 """Return the ZHA name."""
173 return f
"{self._hw_variant.short_name} Multiprotocol"
176 """Return the name of the hardware."""
180 self, user_input: dict[str, Any] |
None =
None
181 ) -> ConfigFlowResult:
182 """Finish flashing and update the config entry."""
183 self.hass.config_entries.async_update_entry(
184 entry=self.config_entry,
186 **self.config_entry.data,
187 "firmware": ApplicationType.EZSP.value,
189 options=self.config_entry.options,
196 SkyConnectTranslationMixin, firmware_config_flow.BaseFirmwareOptionsFlow
198 """Zigbee and Thread options flow handlers."""
200 def __init__(self, *args: Any, **kwargs: Any) ->
None:
201 """Instantiate options flow."""
205 self.
_hw_variant_hw_variant = HardwareVariant.from_usb_product_name(
206 self.config_entry.data[
"product"]
215 """Create the config entry."""
216 assert self._probed_firmware_type
is not None
218 self.hass.config_entries.async_update_entry(
219 entry=self.config_entry,
221 **self.config_entry.data,
222 "firmware": self._probed_firmware_type.value,
224 options=self.config_entry.options,
ConfigFlowResult async_step_flashing_complete(self, dict[str, Any]|None user_input=None)
dict[str, Any] _async_zha_physical_discovery(self)
silabs_multiprotocol_addon.SerialPortSettings _async_serial_port_settings(self)
HardwareVariant _hw_variant(self)
ConfigFlowResult _async_flow_finished(self)
None __init__(self, *Any args, **Any kwargs)
OptionsFlow async_get_options_flow(ConfigEntry config_entry)
ConfigFlowResult async_step_usb(self, usb.UsbServiceInfo discovery_info)
None __init__(self, *Any args, **Any kwargs)
ConfigFlowResult _async_flow_finished(self)
dict[str, str] _get_translation_placeholders(self)
dict[str, str] _get_translation_placeholders(self)
_FlowResultT async_create_entry(self, *str|None title=None, Mapping[str, Any] data, str|None description=None, Mapping[str, str]|None description_placeholders=None)
HardwareVariant get_hardware_variant(ConfigEntry config_entry)
usb.UsbServiceInfo get_usb_service_info(ConfigEntry config_entry)