irm-kmi-ha/custom_components/irm_kmi/repairs.py

93 lines
3.6 KiB
Python

import logging
import async_timeout
import voluptuous as vol
from homeassistant import data_entry_flow
from homeassistant.components.repairs import RepairsFlow
from homeassistant.const import ATTR_LATITUDE, ATTR_LONGITUDE
from homeassistant.core import HomeAssistant
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.selector import SelectSelector, SelectSelectorConfig
from irm_kmi_api.api import IrmKmiApiClient
from . import async_reload_entry
from .const import (OUT_OF_BENELUX, REPAIR_OPT_DELETE, REPAIR_OPT_MOVE,
REPAIR_OPTIONS, REPAIR_SOLUTION, USER_AGENT)
from .utils import modify_from_config
_LOGGER = logging.getLogger(__name__)
class OutOfBeneluxRepairFlow(RepairsFlow):
"""Handler for an issue fixing flow."""
def __init__(self, data: dict):
self._data: dict = data
async def async_step_init(
self, user_input: dict[str, str] | None = None
) -> data_entry_flow.FlowResult:
"""Handle the first step of a fix flow."""
return await (self.async_step_confirm())
async def async_step_confirm(
self, user_input: dict[str, str] | None = None
) -> data_entry_flow.FlowResult:
"""Handle the confirm step of a fix flow."""
errors = {}
config_entry = self.hass.config_entries.async_get_entry(self._data['config_entry_id'])
if user_input is not None:
if user_input[REPAIR_SOLUTION] == REPAIR_OPT_MOVE:
if (zone := self.hass.states.get(self._data['zone'])) is None:
errors[REPAIR_SOLUTION] = "zone_not_exist"
if not errors:
api_data = {}
try:
async with async_timeout.timeout(10):
api_data = await IrmKmiApiClient(
session=async_get_clientsession(self.hass),
user_agent=USER_AGENT
).get_forecasts_coord(
{'lat': zone.attributes[ATTR_LATITUDE],
'long': zone.attributes[ATTR_LONGITUDE]}
)
except Exception:
errors[REPAIR_SOLUTION] = 'api_error'
if api_data.get('cityName', None) in OUT_OF_BENELUX:
errors[REPAIR_SOLUTION] = 'out_of_benelux'
if not errors:
modify_from_config(self.hass, self._data['config_entry_id'], enable=True)
await async_reload_entry(self.hass, config_entry)
elif user_input[REPAIR_SOLUTION] == REPAIR_OPT_DELETE:
await self.hass.config_entries.async_remove(self._data['config_entry_id'])
else:
errors[REPAIR_SOLUTION] = "invalid_choice"
if not errors:
return self.async_create_entry(title="", data={})
return self.async_show_form(
step_id="confirm",
errors=errors,
description_placeholders={'zone': self._data['zone']},
data_schema=vol.Schema({
vol.Required(REPAIR_SOLUTION, default=REPAIR_OPT_MOVE):
SelectSelector(SelectSelectorConfig(options=REPAIR_OPTIONS,
translation_key=REPAIR_SOLUTION)),
}))
async def async_create_fix_flow(
_hass: HomeAssistant,
_issue_id: str,
data: dict[str, str | int | float | None] | None,
) -> OutOfBeneluxRepairFlow:
"""Create flow."""
return OutOfBeneluxRepairFlow(data)