Home Assistant Unofficial Reference 2024.12.1
config_flow.py
Go to the documentation of this file.
1 """Config flow for drop_connect integration."""
2 
3 from __future__ import annotations
4 
5 import logging
6 from typing import TYPE_CHECKING, Any
7 
8 from dropmqttapi.discovery import DropDiscovery
9 
10 from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
11 from homeassistant.helpers.service_info.mqtt import MqttServiceInfo
12 
13 from .const import (
14  CONF_COMMAND_TOPIC,
15  CONF_DATA_TOPIC,
16  CONF_DEVICE_DESC,
17  CONF_DEVICE_ID,
18  CONF_DEVICE_NAME,
19  CONF_DEVICE_OWNER_ID,
20  CONF_DEVICE_TYPE,
21  CONF_HUB_ID,
22  DISCOVERY_TOPIC,
23  DOMAIN,
24 )
25 
26 _LOGGER = logging.getLogger(__name__)
27 
28 
29 class FlowHandler(ConfigFlow, domain=DOMAIN):
30  """Handle DROP config flow."""
31 
32  VERSION = 1
33 
34  _drop_discovery: DropDiscovery | None = None
35 
36  async def async_step_mqtt(
37  self, discovery_info: MqttServiceInfo
38  ) -> ConfigFlowResult:
39  """Handle a flow initialized by MQTT discovery."""
40 
41  # Abort if the topic does not match our discovery topic or the payload is empty.
42  if (
43  discovery_info.subscribed_topic != DISCOVERY_TOPIC
44  or not discovery_info.payload
45  ):
46  return self.async_abortasync_abortasync_abort(reason="invalid_discovery_info")
47 
48  self._drop_discovery_drop_discovery = DropDiscovery(DOMAIN)
49  if not (
50  await self._drop_discovery_drop_discovery.parse_discovery(
51  discovery_info.topic, discovery_info.payload
52  )
53  ):
54  return self.async_abortasync_abortasync_abort(reason="invalid_discovery_info")
55  existing_entry = await self.async_set_unique_idasync_set_unique_id(
56  f"{self._drop_discovery.hub_id}_{self._drop_discovery.device_id}"
57  )
58  if existing_entry is not None:
59  # Note: returning "invalid_discovery_info" here instead of "already_configured"
60  # allows discovery of additional device types.
61  return self.async_abortasync_abortasync_abort(reason="invalid_discovery_info")
62 
63  self.context.update({"title_placeholders": {"name": self._drop_discovery_drop_discovery.name}})
64 
65  return await self.async_step_confirm()
66 
67  async def async_step_confirm(
68  self, user_input: dict[str, Any] | None = None
69  ) -> ConfigFlowResult:
70  """Confirm the setup."""
71  if TYPE_CHECKING:
72  assert self._drop_discovery_drop_discovery is not None
73  if user_input is not None:
74  device_data = {
75  CONF_COMMAND_TOPIC: self._drop_discovery_drop_discovery.command_topic,
76  CONF_DATA_TOPIC: self._drop_discovery_drop_discovery.data_topic,
77  CONF_DEVICE_DESC: self._drop_discovery_drop_discovery.device_desc,
78  CONF_DEVICE_ID: self._drop_discovery_drop_discovery.device_id,
79  CONF_DEVICE_NAME: self._drop_discovery_drop_discovery.name,
80  CONF_DEVICE_TYPE: self._drop_discovery_drop_discovery.device_type,
81  CONF_HUB_ID: self._drop_discovery_drop_discovery.hub_id,
82  CONF_DEVICE_OWNER_ID: self._drop_discovery_drop_discovery.owner_id,
83  }
84  return self.async_create_entryasync_create_entryasync_create_entry(
85  title=self._drop_discovery_drop_discovery.name, data=device_data
86  )
87 
88  return self.async_show_formasync_show_formasync_show_form(
89  step_id="confirm",
90  description_placeholders={
91  "device_name": self._drop_discovery_drop_discovery.name,
92  "device_type": self._drop_discovery_drop_discovery.device_desc,
93  },
94  )
95 
96  async def async_step_user(
97  self, user_input: dict[str, Any] | None = None
98  ) -> ConfigFlowResult:
99  """Handle a flow initialized by the user."""
100  return self.async_abortasync_abortasync_abort(reason="not_supported")
ConfigFlowResult async_step_mqtt(self, MqttServiceInfo discovery_info)
Definition: config_flow.py:38
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_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
config_entries.ConfigFlowResult async_step_confirm(self, dict[str, Any]|None user_input=None)