fix: dynamically list notify targets in setup flow
This commit is contained in:
@@ -3,7 +3,7 @@ from __future__ import annotations
|
|||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from homeassistant.config_entries import ConfigEntry, ConfigFlow, ConfigFlowResult, OptionsFlow
|
from homeassistant.config_entries import ConfigEntry, ConfigFlow, ConfigFlowResult, OptionsFlow
|
||||||
from homeassistant.core import callback
|
from homeassistant.core import HomeAssistant, callback
|
||||||
from homeassistant.helpers import device_registry as dr, selector
|
from homeassistant.helpers import device_registry as dr, selector
|
||||||
|
|
||||||
from .const import (
|
from .const import (
|
||||||
@@ -18,12 +18,13 @@ from .const import (
|
|||||||
EASEE_DOMAIN,
|
EASEE_DOMAIN,
|
||||||
)
|
)
|
||||||
|
|
||||||
_NOTIFY_TARGET_SELECTOR = selector.TextSelector(
|
_STOP_GRACE_SELECTOR = selector.NumberSelector(
|
||||||
selector.TextSelectorConfig(type=selector.TextSelectorType.TEXT)
|
selector.NumberSelectorConfig(
|
||||||
|
min=1, max=60, step=1, unit_of_measurement="min", mode=selector.NumberSelectorMode.BOX
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
STEP_USER_DATA_SCHEMA = vol.Schema(
|
_STATIC_USER_FIELDS = {
|
||||||
{
|
|
||||||
vol.Required(CONF_SITE_ID): str,
|
vol.Required(CONF_SITE_ID): str,
|
||||||
vol.Required(CONF_SOLAR_EXCESS_SENSOR): selector.EntitySelector(
|
vol.Required(CONF_SOLAR_EXCESS_SENSOR): selector.EntitySelector(
|
||||||
selector.EntitySelectorConfig(domain="sensor")
|
selector.EntitySelectorConfig(domain="sensor")
|
||||||
@@ -31,21 +32,46 @@ STEP_USER_DATA_SCHEMA = vol.Schema(
|
|||||||
vol.Required(CONF_DEVICE_ID): selector.DeviceSelector(
|
vol.Required(CONF_DEVICE_ID): selector.DeviceSelector(
|
||||||
selector.DeviceSelectorConfig(integration="easee")
|
selector.DeviceSelectorConfig(integration="easee")
|
||||||
),
|
),
|
||||||
vol.Optional(CONF_NOTIFY_TARGET): _NOTIFY_TARGET_SELECTOR,
|
}
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
OPTIONS_SCHEMA = vol.Schema(
|
|
||||||
{
|
|
||||||
vol.Required(CONF_STOP_GRACE_MINUTES, default=DEFAULT_STOP_GRACE_MINUTES): selector.NumberSelector(
|
|
||||||
selector.NumberSelectorConfig(min=1, max=60, step=1, unit_of_measurement="min", mode=selector.NumberSelectorMode.BOX)
|
|
||||||
),
|
|
||||||
vol.Optional(CONF_NOTIFY_TARGET): _NOTIFY_TARGET_SELECTOR,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def _charger_serial_from_device(hass, device_id: str) -> str | None:
|
def _notify_services(hass: HomeAssistant) -> list[str]:
|
||||||
|
"""Return sorted list of notify service names, excluding internal ones."""
|
||||||
|
return sorted(
|
||||||
|
svc
|
||||||
|
for svc in hass.services.async_services().get("notify", {})
|
||||||
|
if svc not in ("notify", "send_message", "reload")
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def _notify_selector(options: list[str]) -> selector.SelectSelector:
|
||||||
|
return selector.SelectSelector(
|
||||||
|
selector.SelectSelectorConfig(
|
||||||
|
options=options,
|
||||||
|
mode=selector.SelectSelectorMode.DROPDOWN,
|
||||||
|
custom_value=True, # allow typing a target not yet loaded
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def _user_schema(hass: HomeAssistant) -> vol.Schema:
|
||||||
|
return vol.Schema({
|
||||||
|
**_STATIC_USER_FIELDS,
|
||||||
|
vol.Optional(CONF_NOTIFY_TARGET): _notify_selector(_notify_services(hass)),
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
def _options_schema(hass: HomeAssistant, current: dict) -> vol.Schema:
|
||||||
|
return vol.Schema({
|
||||||
|
vol.Required(
|
||||||
|
CONF_STOP_GRACE_MINUTES,
|
||||||
|
default=current.get(CONF_STOP_GRACE_MINUTES, DEFAULT_STOP_GRACE_MINUTES),
|
||||||
|
): _STOP_GRACE_SELECTOR,
|
||||||
|
vol.Optional(CONF_NOTIFY_TARGET): _notify_selector(_notify_services(hass)),
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
def _charger_serial_from_device(hass: HomeAssistant, device_id: str) -> str | None:
|
||||||
"""Extract the Easee charger serial number from the device registry entry."""
|
"""Extract the Easee charger serial number from the device registry entry."""
|
||||||
registry = dr.async_get(hass)
|
registry = dr.async_get(hass)
|
||||||
device = registry.async_get(device_id)
|
device = registry.async_get(device_id)
|
||||||
@@ -89,7 +115,7 @@ class EaseeSolarChargingConfigFlow(ConfigFlow, domain=DOMAIN):
|
|||||||
|
|
||||||
return self.async_show_form(
|
return self.async_show_form(
|
||||||
step_id="user",
|
step_id="user",
|
||||||
data_schema=STEP_USER_DATA_SCHEMA,
|
data_schema=_user_schema(self.hass),
|
||||||
errors=errors,
|
errors=errors,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -102,7 +128,7 @@ class EaseeSolarChargingOptionsFlow(OptionsFlow):
|
|||||||
return self.async_show_form(
|
return self.async_show_form(
|
||||||
step_id="init",
|
step_id="init",
|
||||||
data_schema=self.add_suggested_values_to_schema(
|
data_schema=self.add_suggested_values_to_schema(
|
||||||
OPTIONS_SCHEMA,
|
_options_schema(self.hass, self.config_entry.options),
|
||||||
self.config_entry.options,
|
self.config_entry.options,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user