Files
Home-Assistant/custom_components/powercalc/flow_helper/schema.py
T
2026-06-11 11:50:50 -04:00

125 lines
4.2 KiB
Python

from homeassistant.components.utility_meter import CONF_METER_TYPE, METER_TYPES
from homeassistant.const import UnitOfPower
from homeassistant.helpers import selector
from homeassistant.helpers.selector import NumberSelector, NumberSelectorConfig, NumberSelectorMode
import voluptuous as vol
from custom_components.powercalc.const import (
CONF_CREATE_ENERGY_SENSOR,
CONF_CREATE_UTILITY_METERS,
CONF_ENERGY_FILTER_OUTLIER_ENABLED,
CONF_ENERGY_FILTER_OUTLIER_MAX,
CONF_ENERGY_INTEGRATION_METHOD,
CONF_ENERGY_SENSOR_UNIT_PREFIX,
CONF_SUB_PROFILE,
CONF_UTILITY_METER_NET_CONSUMPTION,
CONF_UTILITY_METER_OFFSET,
CONF_UTILITY_METER_TARIFFS,
CONF_UTILITY_METER_TYPES,
ENERGY_INTEGRATION_METHOD_LEFT,
ENERGY_INTEGRATION_METHODS,
UnitPrefix,
)
from custom_components.powercalc.power_profile.power_profile import PowerProfile
SCHEMA_UTILITY_METER_TOGGLE = vol.Schema(
{
vol.Optional(CONF_CREATE_UTILITY_METERS, default=False): selector.BooleanSelector(),
},
)
SCHEMA_ENERGY_SENSOR_TOGGLE = vol.Schema(
{
vol.Optional(CONF_CREATE_ENERGY_SENSOR, default=True): selector.BooleanSelector(),
},
)
SCHEMA_ENERGY_OPTIONS = vol.Schema(
{
vol.Optional(
CONF_ENERGY_INTEGRATION_METHOD,
default=ENERGY_INTEGRATION_METHOD_LEFT,
): selector.SelectSelector(
selector.SelectSelectorConfig(
options=ENERGY_INTEGRATION_METHODS,
mode=selector.SelectSelectorMode.DROPDOWN,
),
),
vol.Optional(CONF_ENERGY_SENSOR_UNIT_PREFIX): selector.SelectSelector(
selector.SelectSelectorConfig(
options=[
selector.SelectOptionDict(value=UnitPrefix.KILO, label="k (kilo)"),
selector.SelectOptionDict(value=UnitPrefix.MEGA, label="M (mega)"),
selector.SelectOptionDict(value=UnitPrefix.GIGA, label="G (giga)"),
selector.SelectOptionDict(value=UnitPrefix.TERA, label="T (tera)"),
],
mode=selector.SelectSelectorMode.DROPDOWN,
),
),
},
)
SCHEMA_SENSOR_ENERGY_OPTIONS = SCHEMA_ENERGY_OPTIONS.extend(
vol.Schema(
{
vol.Optional(CONF_ENERGY_FILTER_OUTLIER_ENABLED, default=False): selector.BooleanSelector(),
vol.Optional(CONF_ENERGY_FILTER_OUTLIER_MAX): NumberSelector(
NumberSelectorConfig(mode=NumberSelectorMode.BOX, unit_of_measurement=UnitOfPower.WATT),
),
},
).schema,
)
SCHEMA_UTILITY_METER_OPTIONS = vol.Schema(
{
vol.Required(CONF_UTILITY_METER_TYPES): selector.SelectSelector(
selector.SelectSelectorConfig(
options=METER_TYPES,
translation_key=CONF_METER_TYPE,
multiple=True,
),
),
vol.Optional(CONF_UTILITY_METER_TARIFFS, default=[]): selector.SelectSelector(
selector.SelectSelectorConfig(options=[], custom_value=True, multiple=True),
),
vol.Optional(CONF_UTILITY_METER_NET_CONSUMPTION, default=False): selector.BooleanSelector(),
vol.Required(CONF_UTILITY_METER_OFFSET, default=0): selector.NumberSelector(
selector.NumberSelectorConfig(
min=0,
max=28,
mode=selector.NumberSelectorMode.BOX,
unit_of_measurement="days",
),
),
},
)
async def build_sub_profile_schema(
profile: PowerProfile,
selected_sub_profile: str | None,
) -> vol.Schema:
"""Create sub profile schema."""
sub_profiles = [
selector.SelectOptionDict(
value=sub_profile[0],
label=sub_profile[1]["name"] if "name" in sub_profile[1] else sub_profile[0],
)
for sub_profile in await profile.get_sub_profiles()
]
return vol.Schema(
{
vol.Required(
CONF_SUB_PROFILE,
description={"suggested_value": selected_sub_profile},
default=selected_sub_profile,
): selector.SelectSelector(
selector.SelectSelectorConfig(
options=sub_profiles,
mode=selector.SelectSelectorMode.DROPDOWN,
),
),
},
)