hass-core/homeassistant/components/rova/config_flow.py
Gido 1ed8232b02
Add config flow to Rova (#113596)
* Add Config Flow for Rova component

* Add tests for Rova config flow

* Fix data type

* Add rova to requirements for tests

* Removed seperate function for area check and global variable

* Add unique name and id to rova entities

* Add support for multiple rova entries

* Fix correct error after connection timeout or http error

* Revert SENSOR_TYPES update

* Add existing rova configuration from yaml as new entity

* Add tests for import configuration.yaml flow

* Cleanup code

* Update valid rova area check in config flow

* Changed abort keys and messages

* Updated using self.add_suggested_values_to_schema

* Update to pass tests

* Added missing strings

* Update sensor unique_ids

* Fix service name formatting

* Update tests for Rova entry

* Update tests to recover after error

* Update test name

* Apply suggestions from code review

---------

Co-authored-by: Joost Lekkerkerker <joostlek@outlook.com>
2024-03-18 18:00:54 +01:00

91 lines
3.1 KiB
Python

"""Config flow for the Rova platform."""
from typing import Any
from requests.exceptions import ConnectTimeout, HTTPError
from rova.rova import Rova
import voluptuous as vol
from homeassistant import config_entries
from .const import CONF_HOUSE_NUMBER, CONF_HOUSE_NUMBER_SUFFIX, CONF_ZIP_CODE, DOMAIN
class RovaConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
"""Handle Rova config flow."""
VERSION = 1
async def async_step_user(
self, user_input: dict[str, Any] | None = None
) -> config_entries.ConfigFlowResult:
"""Step when user initializes a integration."""
errors: dict[str, str] = {}
if user_input is not None:
# generate unique name for rova integration
zip_code = user_input[CONF_ZIP_CODE]
number = user_input[CONF_HOUSE_NUMBER]
suffix = user_input[CONF_HOUSE_NUMBER_SUFFIX]
await self.async_set_unique_id(f"{zip_code}{number}{suffix}".strip())
self._abort_if_unique_id_configured()
api = Rova(zip_code, number, suffix)
try:
if not await self.hass.async_add_executor_job(api.is_rova_area):
errors = {"base": "invalid_rova_area"}
except (ConnectTimeout, HTTPError):
errors = {"base": "cannot_connect"}
if not errors:
return self.async_create_entry(
title=f"{zip_code} {number} {suffix}".strip(),
data=user_input,
)
return self.async_show_form(
step_id="user",
data_schema=self.add_suggested_values_to_schema(
vol.Schema(
{
vol.Required(CONF_ZIP_CODE): str,
vol.Required(CONF_HOUSE_NUMBER): str,
vol.Optional(CONF_HOUSE_NUMBER_SUFFIX, default=""): str,
}
),
user_input,
),
errors=errors,
)
async def async_step_import(
self, user_input: dict[str, Any]
) -> config_entries.ConfigFlowResult:
"""Import the yaml config."""
zip_code = user_input[CONF_ZIP_CODE]
number = user_input[CONF_HOUSE_NUMBER]
suffix = user_input[CONF_HOUSE_NUMBER_SUFFIX]
await self.async_set_unique_id(f"{zip_code}{number}{suffix}".strip())
self._abort_if_unique_id_configured()
api = Rova(zip_code, number, suffix)
try:
result = await self.hass.async_add_executor_job(api.is_rova_area)
if result:
return self.async_create_entry(
title=f"{zip_code} {number} {suffix}".strip(),
data={
CONF_ZIP_CODE: zip_code,
CONF_HOUSE_NUMBER: number,
CONF_HOUSE_NUMBER_SUFFIX: suffix,
},
)
return self.async_abort(reason="invalid_rova_area")
except (ConnectTimeout, HTTPError):
return self.async_abort(reason="cannot_connect")