125 lines
4.2 KiB
Python
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,
|
|
),
|
|
),
|
|
},
|
|
)
|