mirror of
https://github.com/jdejaegh/irm-kmi-ha.git
synced 2025-06-27 03:35:56 +02:00
93 lines
3.7 KiB
Python
93 lines
3.7 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 custom_components.irm_kmi import async_reload_entry
|
|
from custom_components.irm_kmi.api import IrmKmiApiClient
|
|
from custom_components.irm_kmi.const import (OUT_OF_BENELUX, REPAIR_OPT_DELETE,
|
|
REPAIR_OPT_MOVE, REPAIR_OPTIONS,
|
|
REPAIR_SOLUTION)
|
|
from custom_components.irm_kmi.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'])
|
|
_LOGGER.info(f"State of config entry: {config_entry.state}")
|
|
|
|
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)).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)
|