core/homeassistant/components/trend/config_flow.py

112 lines
3.4 KiB
Python

"""Config flow for Trend integration."""
from __future__ import annotations
from collections.abc import Mapping
from typing import Any, cast
import voluptuous as vol
from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN
from homeassistant.const import CONF_ATTRIBUTE, CONF_ENTITY_ID, CONF_NAME, UnitOfTime
from homeassistant.helpers import selector
from homeassistant.helpers.schema_config_entry_flow import (
SchemaCommonFlowHandler,
SchemaConfigFlowHandler,
SchemaFlowFormStep,
)
from .const import (
CONF_INVERT,
CONF_MAX_SAMPLES,
CONF_MIN_GRADIENT,
CONF_MIN_SAMPLES,
CONF_SAMPLE_DURATION,
DEFAULT_MAX_SAMPLES,
DEFAULT_MIN_GRADIENT,
DEFAULT_MIN_SAMPLES,
DEFAULT_SAMPLE_DURATION,
DOMAIN,
)
async def get_base_options_schema(handler: SchemaCommonFlowHandler) -> vol.Schema:
"""Get base options schema."""
return vol.Schema(
{
vol.Optional(CONF_ATTRIBUTE): selector.AttributeSelector(
selector.AttributeSelectorConfig(
entity_id=handler.options[CONF_ENTITY_ID]
)
),
vol.Optional(CONF_INVERT, default=False): selector.BooleanSelector(),
}
)
async def get_extended_options_schema(handler: SchemaCommonFlowHandler) -> vol.Schema:
"""Get extended options schema."""
return (await get_base_options_schema(handler)).extend(
{
vol.Optional(
CONF_MAX_SAMPLES, default=DEFAULT_MAX_SAMPLES
): selector.NumberSelector(
selector.NumberSelectorConfig(
min=2,
mode=selector.NumberSelectorMode.BOX,
),
),
vol.Optional(
CONF_MIN_SAMPLES, default=DEFAULT_MIN_SAMPLES
): selector.NumberSelector(
selector.NumberSelectorConfig(
min=2,
mode=selector.NumberSelectorMode.BOX,
),
),
vol.Optional(
CONF_MIN_GRADIENT, default=DEFAULT_MIN_GRADIENT
): selector.NumberSelector(
selector.NumberSelectorConfig(
step="any",
mode=selector.NumberSelectorMode.BOX,
),
),
vol.Optional(
CONF_SAMPLE_DURATION, default=DEFAULT_SAMPLE_DURATION
): selector.NumberSelector(
selector.NumberSelectorConfig(
min=0,
mode=selector.NumberSelectorMode.BOX,
unit_of_measurement=UnitOfTime.SECONDS,
),
),
}
)
CONFIG_SCHEMA = vol.Schema(
{
vol.Required(CONF_NAME): selector.TextSelector(),
vol.Required(CONF_ENTITY_ID): selector.EntitySelector(
selector.EntitySelectorConfig(domain=SENSOR_DOMAIN, multiple=False),
),
}
)
class ConfigFlowHandler(SchemaConfigFlowHandler, domain=DOMAIN):
"""Handle a config or options flow for Trend."""
config_flow = {
"user": SchemaFlowFormStep(schema=CONFIG_SCHEMA, next_step="settings"),
"settings": SchemaFlowFormStep(get_base_options_schema),
}
options_flow = {
"init": SchemaFlowFormStep(get_extended_options_schema),
}
def async_config_entry_title(self, options: Mapping[str, Any]) -> str:
"""Return config entry title."""
return cast(str, options[CONF_NAME])