Home Assistant Unofficial Reference 2024.12.1
config_flow.py
Go to the documentation of this file.
1 """Config flow for Kaleidescape."""
2 
3 from __future__ import annotations
4 
5 from typing import Any, cast
6 from urllib.parse import urlparse
7 
8 import voluptuous as vol
9 
10 from homeassistant.components import ssdp
11 from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
12 from homeassistant.const import CONF_HOST
13 
14 from . import KaleidescapeDeviceInfo, UnsupportedError, validate_host
15 from .const import DEFAULT_HOST, DOMAIN, NAME as KALEIDESCAPE_NAME
16 
17 ERROR_CANNOT_CONNECT = "cannot_connect"
18 ERROR_UNSUPPORTED = "unsupported"
19 
20 
21 class KaleidescapeConfigFlow(ConfigFlow, domain=DOMAIN):
22  """Config flow for Kaleidescape integration."""
23 
24  VERSION = 1
25 
26  discovered_device: KaleidescapeDeviceInfo
27 
28  async def async_step_user(
29  self, user_input: dict[str, Any] | None = None
30  ) -> ConfigFlowResult:
31  """Handle user initiated device additions."""
32  errors = {}
33  host = DEFAULT_HOST
34 
35  if user_input is not None:
36  host = user_input[CONF_HOST].strip()
37 
38  try:
39  info = await validate_host(host)
40  if info.server_only:
41  raise UnsupportedError # noqa: TRY301
42  except ConnectionError:
43  errors["base"] = ERROR_CANNOT_CONNECT
44  except UnsupportedError:
45  errors["base"] = ERROR_UNSUPPORTED
46  else:
47  host = info.host
48 
49  await self.async_set_unique_idasync_set_unique_id(info.serial, raise_on_progress=False)
50  self._abort_if_unique_id_configured_abort_if_unique_id_configured(updates={CONF_HOST: host})
51 
52  return self.async_create_entryasync_create_entryasync_create_entry(
53  title=f"{KALEIDESCAPE_NAME} ({info.name})",
54  data={CONF_HOST: host},
55  )
56 
57  return self.async_show_formasync_show_formasync_show_form(
58  step_id="user",
59  data_schema=vol.Schema({vol.Required(CONF_HOST, default=host): str}),
60  errors=errors,
61  )
62 
63  async def async_step_ssdp(
64  self, discovery_info: ssdp.SsdpServiceInfo
65  ) -> ConfigFlowResult:
66  """Handle discovered device."""
67  host = cast(str, urlparse(discovery_info.ssdp_location).hostname)
68  serial_number = discovery_info.upnp[ssdp.ATTR_UPNP_SERIAL]
69 
70  await self.async_set_unique_idasync_set_unique_id(serial_number)
71  self._abort_if_unique_id_configured_abort_if_unique_id_configured(updates={CONF_HOST: host})
72 
73  try:
74  self.discovered_devicediscovered_device = await validate_host(host)
75  if self.discovered_devicediscovered_device.server_only:
76  raise UnsupportedError # noqa: TRY301
77  except ConnectionError:
78  return self.async_abortasync_abortasync_abort(reason=ERROR_CANNOT_CONNECT)
79  except UnsupportedError:
80  return self.async_abortasync_abortasync_abort(reason=ERROR_UNSUPPORTED)
81 
82  self.context.update(
83  {
84  "title_placeholders": {
85  "name": self.discovered_devicediscovered_device.name,
86  "model": self.discovered_devicediscovered_device.model,
87  }
88  }
89  )
90 
91  return await self.async_step_discovery_confirmasync_step_discovery_confirm()
92 
94  self, user_input: dict | None = None
95  ) -> ConfigFlowResult:
96  """Handle addition of discovered device."""
97  if user_input is None:
98  return self.async_show_formasync_show_formasync_show_form(
99  step_id="discovery_confirm",
100  description_placeholders={
101  "name": self.discovered_devicediscovered_device.name,
102  "model": self.discovered_devicediscovered_device.model,
103  },
104  errors={},
105  )
106 
107  return self.async_create_entryasync_create_entryasync_create_entry(
108  title=f"{KALEIDESCAPE_NAME} ({self.discovered_device.name})",
109  data={CONF_HOST: self.discovered_devicediscovered_device.host},
110  )
ConfigFlowResult async_step_user(self, dict[str, Any]|None user_input=None)
Definition: config_flow.py:30
ConfigFlowResult async_step_ssdp(self, ssdp.SsdpServiceInfo discovery_info)
Definition: config_flow.py:65
ConfigFlowResult async_step_discovery_confirm(self, dict|None user_input=None)
Definition: config_flow.py:95
None _abort_if_unique_id_configured(self, dict[str, Any]|None updates=None, bool reload_on_update=True, *str error="already_configured")
ConfigEntry|None async_set_unique_id(self, str|None unique_id=None, *bool raise_on_progress=True)
ConfigFlowResult async_create_entry(self, *str title, Mapping[str, Any] data, str|None description=None, Mapping[str, str]|None description_placeholders=None, Mapping[str, Any]|None options=None)
ConfigFlowResult async_abort(self, *str reason, Mapping[str, str]|None description_placeholders=None)
ConfigFlowResult async_show_form(self, *str|None step_id=None, vol.Schema|None data_schema=None, dict[str, str]|None errors=None, Mapping[str, str]|None description_placeholders=None, bool|None last_step=None, str|None preview=None)
_FlowResultT async_show_form(self, *str|None step_id=None, vol.Schema|None data_schema=None, dict[str, str]|None errors=None, Mapping[str, str]|None description_placeholders=None, bool|None last_step=None, str|None preview=None)
_FlowResultT async_create_entry(self, *str|None title=None, Mapping[str, Any] data, str|None description=None, Mapping[str, str]|None description_placeholders=None)
_FlowResultT async_abort(self, *str reason, Mapping[str, str]|None description_placeholders=None)
IssData update(pyiss.ISS iss)
Definition: __init__.py:33
KaleidescapeDeviceInfo validate_host(str host)
Definition: __init__.py:76