1 """Adds config flow for Trafikverket Camera integration."""
3 from __future__
import annotations
5 from collections.abc
import Mapping
8 from pytrafikverket
import (
10 InvalidAuthentication,
15 import voluptuous
as vol
32 from .const
import DOMAIN
36 """Handle a config flow for Trafikverket Camera integration."""
40 cameras: list[CameraInfoModel]
44 self, sensor_api: str, location: str
45 ) -> tuple[dict[str, str], list[CameraInfoModel] |
None]:
46 """Validate input from user input."""
47 errors: dict[str, str] = {}
48 cameras: list[CameraInfoModel] |
None =
None
51 camera_api = TrafikverketCamera(web_session, sensor_api)
53 cameras = await camera_api.async_get_cameras(location)
55 errors[
"location"] =
"invalid_location"
56 except InvalidAuthentication:
57 errors[
"base"] =
"invalid_auth"
59 errors[
"base"] =
"cannot_connect"
61 return (errors, cameras)
64 self, entry_data: Mapping[str, Any]
65 ) -> ConfigFlowResult:
66 """Handle re-authentication with Trafikverket."""
71 self, user_input: dict[str, Any] |
None =
None
72 ) -> ConfigFlowResult:
73 """Confirm re-authentication with Trafikverket."""
74 errors: dict[str, str] = {}
77 api_key = user_input[CONF_API_KEY]
80 errors, _ = await self.
validate_inputvalidate_input(api_key, reauth_entry.data[CONF_ID])
84 reauth_entry, data_updates={CONF_API_KEY: api_key}
88 step_id=
"reauth_confirm",
89 data_schema=vol.Schema(
98 self, user_input: dict[str, Any] |
None =
None
99 ) -> ConfigFlowResult:
100 """Handle re-configuration with Trafikverket."""
101 errors: dict[str, str] = {}
105 api_key = user_input[CONF_API_KEY]
106 location = user_input[CONF_LOCATION]
108 errors, cameras = await self.
validate_inputvalidate_input(api_key, location)
110 if not errors
and cameras:
119 unique_id=f
"{DOMAIN}-{cameras[0].camera_id}",
120 title=cameras[0].camera_name
or "Trafikverket Camera",
121 data={CONF_API_KEY: api_key, CONF_ID: cameras[0].camera_id},
131 {**reconfigure_entry.data, **(user_input
or {})},
135 step_id=
"reconfigure",
141 self, user_input: dict[str, str] |
None =
None
142 ) -> ConfigFlowResult:
143 """Handle the initial step."""
144 errors: dict[str, str] = {}
147 api_key = user_input[CONF_API_KEY]
148 location = user_input[CONF_LOCATION]
150 errors, cameras = await self.
validate_inputvalidate_input(api_key, location)
152 if not errors
and cameras:
160 title=cameras[0].camera_name
or "Trafikverket Camera",
161 data={CONF_API_KEY: api_key, CONF_ID: cameras[0].camera_id},
166 data_schema=vol.Schema(
176 self, user_input: dict[str, str] |
None =
None
177 ) -> ConfigFlowResult:
178 """Handle when multiple cameras."""
182 self.
api_keyapi_key, user_input[CONF_ID]
185 if not errors
and cameras:
189 unique_id=f
"{DOMAIN}-{cameras[0].camera_id}",
190 title=cameras[0].camera_name
or "Trafikverket Camera",
192 CONF_API_KEY: self.
api_keyapi_key,
193 CONF_ID: cameras[0].camera_id,
199 title=cameras[0].camera_name
or "Trafikverket Camera",
200 data={CONF_API_KEY: self.
api_keyapi_key, CONF_ID: cameras[0].camera_id},
205 value=f
"{camera_info.camera_id}",
206 label=f
"{camera_info.camera_id} - {camera_info.camera_name} - {camera_info.location}",
208 for camera_info
in self.
camerascameras
212 step_id=
"multiple_cameras",
213 data_schema=vol.Schema(
217 options=camera_choices, mode=SelectSelectorMode.LIST
ConfigFlowResult async_step_reauth(self, Mapping[str, Any] entry_data)
ConfigFlowResult async_step_user(self, dict[str, str]|None user_input=None)
ConfigFlowResult async_step_multiple_cameras(self, dict[str, str]|None user_input=None)
tuple[dict[str, str], list[CameraInfoModel]|None] validate_input(self, str sensor_api, str location)
ConfigFlowResult async_step_reauth_confirm(self, dict[str, Any]|None user_input=None)
ConfigFlowResult async_step_reconfigure(self, dict[str, Any]|None user_input=None)
None _abort_if_unique_id_configured(self, dict[str, Any]|None updates=None, bool reload_on_update=True, *str error="already_configured")
ConfigEntry _get_reauth_entry(self)
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_update_reload_and_abort(self, ConfigEntry entry, *str|None|UndefinedType unique_id=UNDEFINED, str|UndefinedType title=UNDEFINED, Mapping[str, Any]|UndefinedType data=UNDEFINED, Mapping[str, Any]|UndefinedType data_updates=UNDEFINED, Mapping[str, Any]|UndefinedType options=UNDEFINED, str|UndefinedType reason=UNDEFINED, bool reload_even_if_entry_is_unchanged=True)
ConfigEntry _get_reconfigure_entry(self)
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)
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)
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)