Files
core/homeassistant/components/utility_meter/config_flow.py
T

142 lines
3.7 KiB
Python

"""Config flow for Utility Meter integration."""
from collections.abc import Mapping
from typing import Any, cast, override
import voluptuous as vol
from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN
from homeassistant.const import CONF_NAME
from homeassistant.helpers import selector
from homeassistant.helpers.schema_config_entry_flow import (
SchemaCommonFlowHandler,
SchemaConfigFlowHandler,
SchemaFlowError,
SchemaFlowFormStep,
)
from .const import (
BIMONTHLY,
CONF_METER_DELTA_VALUES,
CONF_METER_NET_CONSUMPTION,
CONF_METER_OFFSET,
CONF_METER_PERIODICALLY_RESETTING,
CONF_METER_TYPE,
CONF_SENSOR_ALWAYS_AVAILABLE,
CONF_SOURCE_SENSOR,
CONF_TARIFFS,
DAILY,
DOMAIN,
HOURLY,
MONTHLY,
QUARTER_HOURLY,
QUARTERLY,
WEEKLY,
YEARLY,
)
METER_TYPES = [
"none",
QUARTER_HOURLY,
HOURLY,
DAILY,
WEEKLY,
MONTHLY,
BIMONTHLY,
QUARTERLY,
YEARLY,
]
async def _validate_config(
handler: SchemaCommonFlowHandler, user_input: dict[str, Any]
) -> dict[str, Any]:
"""Validate config."""
try:
vol.Unique()(user_input[CONF_TARIFFS])
except vol.Invalid as exc:
raise SchemaFlowError("tariffs_not_unique") from exc
return user_input
OPTIONS_SCHEMA = vol.Schema(
{
vol.Required(CONF_SOURCE_SENSOR): selector.EntitySelector(
selector.EntitySelectorConfig(domain=SENSOR_DOMAIN),
),
vol.Required(
CONF_METER_PERIODICALLY_RESETTING,
): selector.BooleanSelector(),
vol.Optional(
CONF_SENSOR_ALWAYS_AVAILABLE,
default=False,
): selector.BooleanSelector(),
}
)
CONFIG_SCHEMA = vol.Schema(
{
vol.Required(CONF_NAME): selector.TextSelector(),
vol.Required(CONF_SOURCE_SENSOR): selector.EntitySelector(
selector.EntitySelectorConfig(domain=SENSOR_DOMAIN),
),
vol.Required(CONF_METER_TYPE): selector.SelectSelector(
selector.SelectSelectorConfig(
options=METER_TYPES, translation_key=CONF_METER_TYPE
),
),
vol.Required(CONF_METER_OFFSET, default=0): selector.NumberSelector(
selector.NumberSelectorConfig(
min=0,
max=28,
mode=selector.NumberSelectorMode.BOX,
unit_of_measurement="days",
translation_key=CONF_METER_OFFSET,
),
),
vol.Required(CONF_TARIFFS, default=[]): selector.SelectSelector(
selector.SelectSelectorConfig(options=[], custom_value=True, multiple=True),
),
vol.Required(
CONF_METER_NET_CONSUMPTION, default=False
): selector.BooleanSelector(),
vol.Required(
CONF_METER_DELTA_VALUES, default=False
): selector.BooleanSelector(),
vol.Required(
CONF_METER_PERIODICALLY_RESETTING,
default=True,
): selector.BooleanSelector(),
vol.Optional(
CONF_SENSOR_ALWAYS_AVAILABLE,
default=False,
): selector.BooleanSelector(),
}
)
CONFIG_FLOW = {
"user": SchemaFlowFormStep(CONFIG_SCHEMA, validate_user_input=_validate_config)
}
OPTIONS_FLOW = {
"init": SchemaFlowFormStep(OPTIONS_SCHEMA),
}
class ConfigFlowHandler(SchemaConfigFlowHandler, domain=DOMAIN):
"""Handle a config or options flow for Utility Meter."""
VERSION = 2
MINOR_VERSION = 2
config_flow = CONFIG_FLOW
options_flow = OPTIONS_FLOW
options_flow_reloads = True
@override
def async_config_entry_title(self, options: Mapping[str, Any]) -> str:
"""Return config entry title."""
return cast(str, options[CONF_NAME])