122 lines
4.2 KiB
Python
122 lines
4.2 KiB
Python
"""Config flow for Daily Sensor integration."""
|
|
|
|
from homeassistant.core import callback
|
|
from .const import ( # pylint: disable=unused-import
|
|
DOMAIN,
|
|
CONF_INPUT_SENSOR,
|
|
CONF_OPERATION,
|
|
CONF_NAME,
|
|
CONF_UNIT_OF_MEASUREMENT,
|
|
CONF_INTERVAL,
|
|
CONF_AUTO_RESET,
|
|
NAME,
|
|
VALID_OPERATIONS,
|
|
DEFAULT_INTERVAL,
|
|
DEFAULT_AUTO_RESET,
|
|
)
|
|
from .exceptions import SensorNotFound, OperationNotFound, IntervalNotValid, NotUnique
|
|
from .options_flow import DailySensorOptionsFlowHandler
|
|
import logging
|
|
import voluptuous as vol
|
|
|
|
from homeassistant import config_entries
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
class DailySensorConfigFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
|
|
"""Handle a config flow for Daily Sensor."""
|
|
|
|
VERSION = 1
|
|
CONNECTION_CLASS = config_entries.CONN_CLASS_CLOUD_POLL
|
|
|
|
def __init__(self):
|
|
"""Initialize."""
|
|
self._name = NAME
|
|
self._operation = ""
|
|
self._input_sensor = ""
|
|
self._unit_of_measurement = "unknown"
|
|
self._errors = {}
|
|
self._auto_reset = DEFAULT_AUTO_RESET
|
|
|
|
async def async_step_user(self, user_input=None):
|
|
"""Handle a flow initialized by the user."""
|
|
self._errors = {}
|
|
|
|
if user_input is not None:
|
|
try:
|
|
await self._check_unique(user_input[CONF_NAME])
|
|
|
|
# check input sensor exists
|
|
status = self.hass.states.get(user_input[CONF_INPUT_SENSOR])
|
|
if status is None:
|
|
raise SensorNotFound
|
|
|
|
# check the operation
|
|
if user_input[CONF_OPERATION] not in VALID_OPERATIONS:
|
|
raise OperationNotFound
|
|
# check the interval
|
|
if (
|
|
not (isinstance(user_input[CONF_INTERVAL], int))
|
|
or user_input[CONF_INTERVAL] <= 0
|
|
):
|
|
raise IntervalNotValid
|
|
self._name = user_input[CONF_NAME]
|
|
self._auto_reset = user_input[CONF_AUTO_RESET]
|
|
|
|
return self.async_create_entry(title=self._name, data=user_input)
|
|
|
|
except NotUnique:
|
|
_LOGGER.error("Instance name is not unique.")
|
|
self._errors["base"] = "name"
|
|
except SensorNotFound:
|
|
_LOGGER.error(
|
|
"Input sensor {} not found.".format(user_input[CONF_INPUT_SENSOR])
|
|
)
|
|
self._errors["base"] = "sensornotfound"
|
|
except OperationNotFound:
|
|
_LOGGER.error(
|
|
"Specified operation {} not valid.".format(
|
|
user_input[CONF_OPERATION]
|
|
),
|
|
)
|
|
self._errors["base"] = "operationnotfound"
|
|
except IntervalNotValid:
|
|
_LOGGER.error(
|
|
"Specified interval {} not valid.".format(
|
|
user_input[CONF_INTERVAL]
|
|
),
|
|
)
|
|
self._errors["base"] = "intervalnotvalid"
|
|
|
|
return await self._show_config_form(user_input)
|
|
return await self._show_config_form(user_input)
|
|
|
|
async def _show_config_form(self, user_input):
|
|
"""Show the configuration form to edit info."""
|
|
return self.async_show_form(
|
|
step_id="user",
|
|
data_schema=vol.Schema(
|
|
{
|
|
vol.Required(CONF_NAME, default=NAME): str,
|
|
vol.Required(CONF_INPUT_SENSOR): str,
|
|
vol.Required(CONF_OPERATION): vol.In(VALID_OPERATIONS),
|
|
vol.Required(CONF_UNIT_OF_MEASUREMENT): str,
|
|
vol.Required(CONF_INTERVAL, default=DEFAULT_INTERVAL): int,
|
|
vol.Required(CONF_AUTO_RESET, default=DEFAULT_AUTO_RESET): bool,
|
|
}
|
|
),
|
|
errors=self._errors,
|
|
)
|
|
|
|
@staticmethod
|
|
@callback
|
|
def async_get_options_flow(config_entry):
|
|
"""Get options flow."""
|
|
return DailySensorOptionsFlowHandler(config_entry)
|
|
|
|
async def _check_unique(self, thename):
|
|
"""Test if the specified name is not already claimed."""
|
|
await self.async_set_unique_id(thename)
|
|
self._abort_if_unique_id_configured()
|