Home Assistant Unofficial Reference 2024.12.1
config_flow.py
Go to the documentation of this file.
1 """Config flow for Homeassistant Analytics integration."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
7 from python_homeassistant_analytics import (
8  HomeassistantAnalyticsClient,
9  HomeassistantAnalyticsConnectionError,
10 )
11 from python_homeassistant_analytics.models import IntegrationType
12 import voluptuous as vol
13 
14 from homeassistant.config_entries import (
15  ConfigEntry,
16  ConfigFlow,
17  ConfigFlowResult,
18  OptionsFlow,
19 )
20 from homeassistant.core import callback
21 from homeassistant.helpers.aiohttp_client import async_get_clientsession
23  SelectOptionDict,
24  SelectSelector,
25  SelectSelectorConfig,
26 )
27 
28 from .const import (
29  CONF_TRACKED_ADDONS,
30  CONF_TRACKED_CUSTOM_INTEGRATIONS,
31  CONF_TRACKED_INTEGRATIONS,
32  DOMAIN,
33  LOGGER,
34 )
35 
36 INTEGRATION_TYPES_WITHOUT_ANALYTICS = (
37  IntegrationType.BRAND,
38  IntegrationType.ENTITY,
39  IntegrationType.VIRTUAL,
40 )
41 
42 
44  """Handle a config flow for Homeassistant Analytics."""
45 
46  @staticmethod
47  @callback
49  config_entry: ConfigEntry,
50  ) -> HomeassistantAnalyticsOptionsFlowHandler:
51  """Get the options flow for this handler."""
53 
54  async def async_step_user(
55  self, user_input: dict[str, Any] | None = None
56  ) -> ConfigFlowResult:
57  """Handle the initial step."""
58  errors: dict[str, str] = {}
59  if user_input is not None:
60  if all(
61  [
62  not user_input.get(CONF_TRACKED_ADDONS),
63  not user_input.get(CONF_TRACKED_INTEGRATIONS),
64  not user_input.get(CONF_TRACKED_CUSTOM_INTEGRATIONS),
65  ]
66  ):
67  errors["base"] = "no_integrations_selected"
68  else:
69  return self.async_create_entryasync_create_entryasync_create_entry(
70  title="Home Assistant Analytics Insights",
71  data={},
72  options={
73  CONF_TRACKED_ADDONS: user_input.get(CONF_TRACKED_ADDONS, []),
74  CONF_TRACKED_INTEGRATIONS: user_input.get(
75  CONF_TRACKED_INTEGRATIONS, []
76  ),
77  CONF_TRACKED_CUSTOM_INTEGRATIONS: user_input.get(
78  CONF_TRACKED_CUSTOM_INTEGRATIONS, []
79  ),
80  },
81  )
82 
83  client = HomeassistantAnalyticsClient(
84  session=async_get_clientsession(self.hass)
85  )
86  try:
87  addons = await client.get_addons()
88  integrations = await client.get_integrations()
89  custom_integrations = await client.get_custom_integrations()
90  except HomeassistantAnalyticsConnectionError:
91  LOGGER.exception("Error connecting to Home Assistant analytics")
92  return self.async_abortasync_abortasync_abort(reason="cannot_connect")
93  except Exception: # noqa: BLE001
94  LOGGER.exception("Unexpected error")
95  return self.async_abortasync_abortasync_abort(reason="unknown")
96 
97  options = [
99  value=domain,
100  label=integration.title,
101  )
102  for domain, integration in integrations.items()
103  if integration.integration_type not in INTEGRATION_TYPES_WITHOUT_ANALYTICS
104  ]
105  return self.async_show_formasync_show_formasync_show_form(
106  step_id="user",
107  errors=errors,
108  data_schema=vol.Schema(
109  {
110  vol.Optional(CONF_TRACKED_ADDONS): SelectSelector(
112  options=list(addons),
113  multiple=True,
114  sort=True,
115  )
116  ),
117  vol.Optional(CONF_TRACKED_INTEGRATIONS): SelectSelector(
119  options=options,
120  multiple=True,
121  sort=True,
122  )
123  ),
124  vol.Optional(CONF_TRACKED_CUSTOM_INTEGRATIONS): SelectSelector(
126  options=list(custom_integrations),
127  multiple=True,
128  sort=True,
129  )
130  ),
131  }
132  ),
133  )
134 
135 
137  """Handle Homeassistant Analytics options."""
138 
139  async def async_step_init(
140  self, user_input: dict[str, Any] | None = None
141  ) -> ConfigFlowResult:
142  """Manage the options."""
143  errors: dict[str, str] = {}
144  if user_input is not None:
145  if all(
146  [
147  not user_input.get(CONF_TRACKED_ADDONS),
148  not user_input.get(CONF_TRACKED_INTEGRATIONS),
149  not user_input.get(CONF_TRACKED_CUSTOM_INTEGRATIONS),
150  ]
151  ):
152  errors["base"] = "no_integrations_selected"
153  else:
154  return self.async_create_entryasync_create_entry(
155  title="",
156  data={
157  CONF_TRACKED_ADDONS: user_input.get(CONF_TRACKED_ADDONS, []),
158  CONF_TRACKED_INTEGRATIONS: user_input.get(
159  CONF_TRACKED_INTEGRATIONS, []
160  ),
161  CONF_TRACKED_CUSTOM_INTEGRATIONS: user_input.get(
162  CONF_TRACKED_CUSTOM_INTEGRATIONS, []
163  ),
164  },
165  )
166 
167  client = HomeassistantAnalyticsClient(
168  session=async_get_clientsession(self.hass)
169  )
170  try:
171  addons = await client.get_addons()
172  integrations = await client.get_integrations()
173  custom_integrations = await client.get_custom_integrations()
174  except HomeassistantAnalyticsConnectionError:
175  LOGGER.exception("Error connecting to Home Assistant analytics")
176  return self.async_abortasync_abort(reason="cannot_connect")
177 
178  options = [
180  value=domain,
181  label=integration.title,
182  )
183  for domain, integration in integrations.items()
184  if integration.integration_type not in INTEGRATION_TYPES_WITHOUT_ANALYTICS
185  ]
186  return self.async_show_formasync_show_form(
187  step_id="init",
188  errors=errors,
189  data_schema=self.add_suggested_values_to_schemaadd_suggested_values_to_schema(
190  vol.Schema(
191  {
192  vol.Optional(CONF_TRACKED_ADDONS): SelectSelector(
194  options=list(addons),
195  multiple=True,
196  sort=True,
197  )
198  ),
199  vol.Optional(CONF_TRACKED_INTEGRATIONS): SelectSelector(
201  options=options,
202  multiple=True,
203  sort=True,
204  )
205  ),
206  vol.Optional(CONF_TRACKED_CUSTOM_INTEGRATIONS): SelectSelector(
208  options=list(custom_integrations),
209  multiple=True,
210  sort=True,
211  )
212  ),
213  },
214  ),
215  self.config_entryconfig_entryconfig_entry.options,
216  ),
217  )
ConfigFlowResult async_step_user(self, dict[str, Any]|None user_input=None)
Definition: config_flow.py:56
HomeassistantAnalyticsOptionsFlowHandler async_get_options_flow(ConfigEntry config_entry)
Definition: config_flow.py:50
ConfigFlowResult async_step_init(self, dict[str, Any]|None user_input=None)
Definition: config_flow.py:141
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)
None config_entry(self, ConfigEntry value)
vol.Schema add_suggested_values_to_schema(self, vol.Schema data_schema, Mapping[str, Any]|None suggested_values)
_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)
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)