1 """Config flow for loqed integration."""
3 from __future__
import annotations
10 from loqedAPI
import cloud_loqed, loqed
11 import voluptuous
as vol
21 from .const
import DOMAIN
23 _LOGGER = logging.getLogger(__name__)
27 """Handle a config flow for Loqed."""
31 _host: str |
None =
None
34 self, hass: HomeAssistant, data: dict[str, Any]
36 """Validate the user input allows us to connect."""
41 cloud_api_client = cloud_loqed.CloudAPIClient(
45 cloud_client = cloud_loqed.LoqedCloudAPI(cloud_api_client)
46 lock_data = await cloud_client.async_get_locks()
47 except aiohttp.ClientError
as err:
48 _LOGGER.error(
"HTTP Connection error to loqed API")
49 raise CannotConnect
from err
54 for lock
in lock_data[
"data"]
55 if lock[
"bridge_ip"] == self.
_host_host
or lock[
"name"] == data.get(
"name")
58 apiclient = loqed.APIClient(session, f
"http://{selected_lock['bridge_ip']}")
59 api = loqed.LoqedAPI(apiclient)
60 lock = await api.async_get_lock(
61 selected_lock[
"backend_key"],
62 selected_lock[
"bridge_key"],
63 selected_lock[
"local_id"],
64 selected_lock[
"bridge_ip"],
68 await lock.getWebhooks()
70 "lock_key_key": selected_lock[
"key_secret"],
71 "bridge_key": selected_lock[
"bridge_key"],
72 "lock_key_local_id": selected_lock[
"local_id"],
73 "bridge_mdns_hostname": selected_lock[
"bridge_hostname"],
74 "bridge_ip": selected_lock[
"bridge_ip"],
75 "name": selected_lock[
"name"],
76 "id": selected_lock[
"id"],
79 raise InvalidAuth
from StopIteration
80 except aiohttp.ClientError:
81 _LOGGER.error(
"HTTP Connection error to loqed lock")
82 raise CannotConnect
from aiohttp.ClientError
85 self, discovery_info: ZeroconfServiceInfo
86 ) -> ConfigFlowResult:
87 """Handle zeroconf discovery."""
88 host = discovery_info.host
92 apiclient = loqed.APIClient(session, f
"http://{host}")
93 api = loqed.LoqedAPI(apiclient)
94 lock_data = await api.async_get_lock_details()
103 self, user_input: dict[str, Any] |
None =
None
104 ) -> ConfigFlowResult:
105 """Show userform to user."""
109 vol.Required(CONF_API_TOKEN): str,
115 vol.Required(CONF_NAME): str,
116 vol.Required(CONF_API_TOKEN): str,
121 if user_input
is None:
124 data_schema=user_data_schema,
125 description_placeholders={
126 "config_url":
"https://integrations.loqed.com/personal-access-tokens",
133 info = await self.
validate_inputvalidate_input(self.hass, user_input)
134 except CannotConnect:
135 errors[
"base"] =
"cannot_connect"
137 errors[
"base"] =
"invalid_auth"
141 r"LOQED-([a-f0-9]+)\.local",
r"\1", info[
"bridge_mdns_hostname"]
143 raise_on_progress=
False,
148 title=
"LOQED Touch Smart Lock",
150 user_input | {CONF_WEBHOOK_ID: webhook.async_generate_id()} | info
156 data_schema=user_data_schema,
158 description_placeholders={
159 "config_url":
"https://integrations.loqed.com/personal-access-tokens",
165 """Error to indicate we cannot connect."""
168 class InvalidAuth(HomeAssistantError):
169 """Error to indicate there is invalid auth."""
dict[str, Any] validate_input(self, HomeAssistant hass, dict[str, Any] data)
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_step_user(self, dict[str, Any]|None user_input=None)
ConfigFlowResult async_step_zeroconf(self, ZeroconfServiceInfo discovery_info)
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)
aiohttp.ClientSession async_get_clientsession(HomeAssistant hass, bool verify_ssl=True, socket.AddressFamily family=socket.AF_UNSPEC, ssl_util.SSLCipherList ssl_cipher=ssl_util.SSLCipherList.PYTHON_DEFAULT)