Use VolDictType to improve schema typing (#120417)

This commit is contained in:
Marc Mueller 2024-06-25 15:15:59 +02:00 committed by GitHub
parent aa05f73210
commit bcd1243686
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
19 changed files with 54 additions and 37 deletions

View file

@ -32,6 +32,7 @@ from homeassistant.helpers.schema_config_entry_flow import (
SchemaOptionsFlowHandler, SchemaOptionsFlowHandler,
) )
from homeassistant.helpers.selector import SelectSelector, SelectSelectorConfig from homeassistant.helpers.selector import SelectSelector, SelectSelectorConfig
from homeassistant.helpers.typing import VolDictType
from .bridge import AsusWrtBridge from .bridge import AsusWrtBridge
from .const import ( from .const import (
@ -143,6 +144,7 @@ class AsusWrtFlowHandler(ConfigFlow, domain=DOMAIN):
user_input = self._config_data user_input = self._config_data
add_schema: VolDictType
if self.show_advanced_options: if self.show_advanced_options:
add_schema = { add_schema = {
vol.Exclusive(CONF_PASSWORD, PASS_KEY, PASS_KEY_MSG): str, vol.Exclusive(CONF_PASSWORD, PASS_KEY, PASS_KEY_MSG): str,

View file

@ -30,6 +30,7 @@ from homeassistant.const import (
) )
from homeassistant.core import callback from homeassistant.core import callback
from homeassistant.helpers.device_registry import format_mac from homeassistant.helpers.device_registry import format_mac
from homeassistant.helpers.typing import VolDictType
from homeassistant.util.network import is_link_local from homeassistant.util.network import is_link_local
from . import AxisConfigEntry from . import AxisConfigEntry
@ -63,7 +64,7 @@ class AxisFlowHandler(ConfigFlow, domain=AXIS_DOMAIN):
def __init__(self) -> None: def __init__(self) -> None:
"""Initialize the Axis config flow.""" """Initialize the Axis config flow."""
self.config: dict[str, Any] = {} self.config: dict[str, Any] = {}
self.discovery_schema: dict[vol.Required, type[str | int]] | None = None self.discovery_schema: VolDictType | None = None
async def async_step_user( async def async_step_user(
self, user_input: dict[str, Any] | None = None self, user_input: dict[str, Any] | None = None

View file

@ -27,6 +27,7 @@ from homeassistant.const import CONF_DEVICE_ID, CONF_HOST, CONF_MAC, CONF_TYPE,
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.exceptions import IntegrationError from homeassistant.exceptions import IntegrationError
from homeassistant.helpers import config_validation as cv, device_registry as dr from homeassistant.helpers import config_validation as cv, device_registry as dr
from homeassistant.helpers.typing import VolDictType
from .const import ( from .const import (
CONF_BROWSE_UNFILTERED, CONF_BROWSE_UNFILTERED,
@ -382,7 +383,7 @@ class DlnaDmrOptionsFlowHandler(OptionsFlow):
if not errors: if not errors:
return self.async_create_entry(title="", data=options) return self.async_create_entry(title="", data=options)
fields = {} fields: VolDictType = {}
def _add_with_suggestion(key: str, validator: Callable | type[bool]) -> None: def _add_with_suggestion(key: str, validator: Callable | type[bool]) -> None:
"""Add a field to with a suggested value. """Add a field to with a suggested value.

View file

@ -22,6 +22,7 @@ from homeassistant.core import DOMAIN as HOMEASSISTANT_DOMAIN, HomeAssistant
from homeassistant.data_entry_flow import AbortFlow from homeassistant.data_entry_flow import AbortFlow
from homeassistant.helpers import aiohttp_client, selector from homeassistant.helpers import aiohttp_client, selector
from homeassistant.helpers.issue_registry import IssueSeverity, async_create_issue from homeassistant.helpers.issue_registry import IssueSeverity, async_create_issue
from homeassistant.helpers.typing import VolDictType
from homeassistant.loader import async_get_issue_tracker from homeassistant.loader import async_get_issue_tracker
from homeassistant.util.ssl import get_default_no_verify_context from homeassistant.util.ssl import get_default_no_verify_context
@ -181,7 +182,7 @@ class EcovacsConfigFlow(ConfigFlow, domain=DOMAIN):
title=user_input[CONF_USERNAME], data=user_input title=user_input[CONF_USERNAME], data=user_input
) )
schema = { schema: VolDictType = {
vol.Required(CONF_USERNAME): selector.TextSelector( vol.Required(CONF_USERNAME): selector.TextSelector(
selector.TextSelectorConfig(type=selector.TextSelectorType.TEXT) selector.TextSelectorConfig(type=selector.TextSelectorType.TEXT)
), ),

View file

@ -21,6 +21,7 @@ from homeassistant.config_entries import (
from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PASSWORD, CONF_USERNAME from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PASSWORD, CONF_USERNAME
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.httpx_client import get_async_client from homeassistant.helpers.httpx_client import get_async_client
from homeassistant.helpers.typing import VolDictType
from .const import ( from .const import (
DOMAIN, DOMAIN,
@ -69,7 +70,7 @@ class EnphaseConfigFlow(ConfigFlow, domain=DOMAIN):
@callback @callback
def _async_generate_schema(self) -> vol.Schema: def _async_generate_schema(self) -> vol.Schema:
"""Generate schema.""" """Generate schema."""
schema = {} schema: VolDictType = {}
if self.ip_address: if self.ip_address:
schema[vol.Required(CONF_HOST, default=self.ip_address)] = vol.In( schema[vol.Required(CONF_HOST, default=self.ip_address)] = vol.In(

View file

@ -24,6 +24,7 @@ from homeassistant.config_entries import ConfigFlow, ConfigFlowResult
from homeassistant.core import callback from homeassistant.core import callback
from homeassistant.data_entry_flow import AbortFlow from homeassistant.data_entry_flow import AbortFlow
from homeassistant.helpers import device_registry as dr from homeassistant.helpers import device_registry as dr
from homeassistant.helpers.typing import VolDictType
from .const import DOMAIN, KNOWN_DEVICES from .const import DOMAIN, KNOWN_DEVICES
from .storage import async_get_entity_storage from .storage import async_get_entity_storage
@ -555,7 +556,7 @@ class HomekitControllerFlowHandler(ConfigFlow, domain=DOMAIN):
"category": formatted_category(self.category), "category": formatted_category(self.category),
} }
schema = {vol.Required("pairing_code"): vol.All(str, vol.Strip)} schema: VolDictType = {vol.Required("pairing_code"): vol.All(str, vol.Strip)}
if errors and errors.get("pairing_code") == "insecure_setup_code": if errors and errors.get("pairing_code") == "insecure_setup_code":
schema[vol.Optional("allow_insecure_setup_codes")] = bool schema[vol.Optional("allow_insecure_setup_codes")] = bool

View file

@ -11,6 +11,8 @@ from typing import Any, Concatenate
from aiohttp import web from aiohttp import web
import voluptuous as vol import voluptuous as vol
from homeassistant.helpers.typing import VolDictType
from .view import HomeAssistantView from .view import HomeAssistantView
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -25,7 +27,9 @@ class RequestDataValidator:
Will return a 400 if no JSON provided or doesn't match schema. Will return a 400 if no JSON provided or doesn't match schema.
""" """
def __init__(self, schema: vol.Schema, allow_empty: bool = False) -> None: def __init__(
self, schema: VolDictType | vol.Schema, allow_empty: bool = False
) -> None:
"""Initialize the decorator.""" """Initialize the decorator."""
if isinstance(schema, dict): if isinstance(schema, dict):
schema = vol.Schema(schema) schema = vol.Schema(schema)

View file

@ -22,7 +22,7 @@ from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers import entity_registry as er from homeassistant.helpers import entity_registry as er
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entity import get_capability, get_supported_features from homeassistant.helpers.entity import get_capability, get_supported_features
from homeassistant.helpers.typing import ConfigType, TemplateVarsType from homeassistant.helpers.typing import ConfigType, TemplateVarsType, VolDictType
from . import DOMAIN, const from . import DOMAIN, const
@ -114,7 +114,7 @@ async def async_get_action_capabilities(
"""List action capabilities.""" """List action capabilities."""
action_type = config[CONF_TYPE] action_type = config[CONF_TYPE]
fields = {} fields: VolDictType = {}
if action_type == "set_humidity": if action_type == "set_humidity":
fields[vol.Required(const.ATTR_HUMIDITY)] = vol.Coerce(int) fields[vol.Required(const.ATTR_HUMIDITY)] = vol.Coerce(int)

View file

@ -16,6 +16,7 @@ from homeassistant.config_entries import (
) )
from homeassistant.core import callback from homeassistant.core import callback
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.typing import VolDictType
from .const import CONF_ALLOW_NAMELESS_UUIDS, DOMAIN from .const import CONF_ALLOW_NAMELESS_UUIDS, DOMAIN
@ -81,7 +82,7 @@ class IBeaconOptionsFlow(OptionsFlow):
data = {CONF_ALLOW_NAMELESS_UUIDS: list(updated_uuids)} data = {CONF_ALLOW_NAMELESS_UUIDS: list(updated_uuids)}
return self.async_create_entry(title="", data=data) return self.async_create_entry(title="", data=data)
schema = { schema: VolDictType = {
vol.Optional( vol.Optional(
"new_uuid", "new_uuid",
description={"suggested_value": new_uuid}, description={"suggested_value": new_uuid},

View file

@ -29,7 +29,7 @@ from homeassistant.config_entries import (
from homeassistant.const import CONF_HOST, CONF_PORT from homeassistant.const import CONF_HOST, CONF_PORT
from homeassistant.core import callback from homeassistant.core import callback
from homeassistant.helpers import selector from homeassistant.helpers import selector
from homeassistant.helpers.typing import UNDEFINED from homeassistant.helpers.typing import UNDEFINED, VolDictType
from .const import ( from .const import (
CONF_KNX_AUTOMATIC, CONF_KNX_AUTOMATIC,
@ -368,7 +368,7 @@ class KNXCommonFlow(ABC, ConfigEntryBaseFlow):
CONF_KNX_ROUTE_BACK, not bool(self._selected_tunnel) CONF_KNX_ROUTE_BACK, not bool(self._selected_tunnel)
) )
fields = { fields: VolDictType = {
vol.Required(CONF_KNX_TUNNELING_TYPE, default=default_type): vol.In( vol.Required(CONF_KNX_TUNNELING_TYPE, default=default_type): vol.In(
CONF_KNX_TUNNELING_TYPE_LABELS CONF_KNX_TUNNELING_TYPE_LABELS
), ),
@ -694,7 +694,7 @@ class KNXCommonFlow(ABC, ConfigEntryBaseFlow):
router for router in routers if router.routing_requires_secure router for router in routers if router.routing_requires_secure
) )
fields = { fields: VolDictType = {
vol.Required( vol.Required(
CONF_KNX_INDIVIDUAL_ADDRESS, default=_individual_address CONF_KNX_INDIVIDUAL_ADDRESS, default=_individual_address
): _IA_SELECTOR, ): _IA_SELECTOR,

View file

@ -21,7 +21,7 @@ from homeassistant.core import Context, HomeAssistant
from homeassistant.exceptions import HomeAssistantError from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers import config_validation as cv, entity_registry as er from homeassistant.helpers import config_validation as cv, entity_registry as er
from homeassistant.helpers.entity import get_supported_features from homeassistant.helpers.entity import get_supported_features
from homeassistant.helpers.typing import ConfigType, TemplateVarsType from homeassistant.helpers.typing import ConfigType, TemplateVarsType, VolDictType
from . import ( from . import (
ATTR_BRIGHTNESS_PCT, ATTR_BRIGHTNESS_PCT,
@ -150,7 +150,7 @@ async def async_get_action_capabilities(
supported_color_modes = None supported_color_modes = None
supported_features = 0 supported_features = 0
extra_fields = {} extra_fields: VolDictType = {}
if brightness_supported(supported_color_modes): if brightness_supported(supported_color_modes):
extra_fields[vol.Optional(ATTR_BRIGHTNESS_PCT)] = VALID_BRIGHTNESS_PCT extra_fields[vol.Optional(ATTR_BRIGHTNESS_PCT)] = VALID_BRIGHTNESS_PCT

View file

@ -22,6 +22,7 @@ from homeassistant.const import CONF_DEVICE
from homeassistant.core import callback from homeassistant.core import callback
from homeassistant.helpers import selector from homeassistant.helpers import selector
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.typing import VolDictType
from .const import ( from .const import (
CONF_BAUD_RATE, CONF_BAUD_RATE,
@ -153,7 +154,7 @@ class MySensorsConfigFlowHandler(ConfigFlow, domain=DOMAIN):
return self._async_create_entry(user_input) return self._async_create_entry(user_input)
user_input = user_input or {} user_input = user_input or {}
schema = { schema: VolDictType = {
vol.Required( vol.Required(
CONF_DEVICE, default=user_input.get(CONF_DEVICE, "/dev/ttyACM0") CONF_DEVICE, default=user_input.get(CONF_DEVICE, "/dev/ttyACM0")
): str, ): str,
@ -164,9 +165,8 @@ class MySensorsConfigFlowHandler(ConfigFlow, domain=DOMAIN):
} }
schema.update(_get_schema_common(user_input)) schema.update(_get_schema_common(user_input))
schema = vol.Schema(schema)
return self.async_show_form( return self.async_show_form(
step_id="gw_serial", data_schema=schema, errors=errors step_id="gw_serial", data_schema=vol.Schema(schema), errors=errors
) )
async def async_step_gw_tcp( async def async_step_gw_tcp(
@ -182,7 +182,7 @@ class MySensorsConfigFlowHandler(ConfigFlow, domain=DOMAIN):
return self._async_create_entry(user_input) return self._async_create_entry(user_input)
user_input = user_input or {} user_input = user_input or {}
schema = { schema: VolDictType = {
vol.Required( vol.Required(
CONF_DEVICE, default=user_input.get(CONF_DEVICE, "127.0.0.1") CONF_DEVICE, default=user_input.get(CONF_DEVICE, "127.0.0.1")
): str, ): str,
@ -192,8 +192,9 @@ class MySensorsConfigFlowHandler(ConfigFlow, domain=DOMAIN):
} }
schema.update(_get_schema_common(user_input)) schema.update(_get_schema_common(user_input))
schema = vol.Schema(schema) return self.async_show_form(
return self.async_show_form(step_id="gw_tcp", data_schema=schema, errors=errors) step_id="gw_tcp", data_schema=vol.Schema(schema), errors=errors
)
def _check_topic_exists(self, topic: str) -> bool: def _check_topic_exists(self, topic: str) -> bool:
for other_config in self._async_current_entries(): for other_config in self._async_current_entries():
@ -243,7 +244,7 @@ class MySensorsConfigFlowHandler(ConfigFlow, domain=DOMAIN):
return self._async_create_entry(user_input) return self._async_create_entry(user_input)
user_input = user_input or {} user_input = user_input or {}
schema = { schema: VolDictType = {
vol.Required( vol.Required(
CONF_TOPIC_IN_PREFIX, default=user_input.get(CONF_TOPIC_IN_PREFIX, "") CONF_TOPIC_IN_PREFIX, default=user_input.get(CONF_TOPIC_IN_PREFIX, "")
): str, ): str,
@ -254,9 +255,8 @@ class MySensorsConfigFlowHandler(ConfigFlow, domain=DOMAIN):
} }
schema.update(_get_schema_common(user_input)) schema.update(_get_schema_common(user_input))
schema = vol.Schema(schema)
return self.async_show_form( return self.async_show_form(
step_id="gw_mqtt", data_schema=schema, errors=errors step_id="gw_mqtt", data_schema=vol.Schema(schema), errors=errors
) )
@callback @callback

View file

@ -23,6 +23,7 @@ from homeassistant.config_entries import (
from homeassistant.const import CONF_EXCLUDE, CONF_HOSTS from homeassistant.const import CONF_EXCLUDE, CONF_HOSTS
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.typing import VolDictType
from .const import ( from .const import (
CONF_HOME_INTERVAL, CONF_HOME_INTERVAL,
@ -110,7 +111,7 @@ async def _async_build_schema_with_user_input(
exclude = user_input.get( exclude = user_input.get(
CONF_EXCLUDE, await network.async_get_source_ip(hass, MDNS_TARGET_IP) CONF_EXCLUDE, await network.async_get_source_ip(hass, MDNS_TARGET_IP)
) )
schema = { schema: VolDictType = {
vol.Required(CONF_HOSTS, default=hosts): str, vol.Required(CONF_HOSTS, default=hosts): str,
vol.Required( vol.Required(
CONF_HOME_INTERVAL, default=user_input.get(CONF_HOME_INTERVAL, 0) CONF_HOME_INTERVAL, default=user_input.get(CONF_HOME_INTERVAL, 0)

View file

@ -20,6 +20,7 @@ from homeassistant.config_entries import ConfigEntry, ConfigFlow, ConfigFlowResu
from homeassistant.const import CONF_NAME, CONF_PASSWORD, CONF_USERNAME from homeassistant.const import CONF_NAME, CONF_PASSWORD, CONF_USERNAME
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.aiohttp_client import async_create_clientsession from homeassistant.helpers.aiohttp_client import async_create_clientsession
from homeassistant.helpers.typing import VolDictType
from .const import CONF_TOTP_SECRET, CONF_UTILITY, DOMAIN from .const import CONF_TOTP_SECRET, CONF_UTILITY, DOMAIN
@ -151,7 +152,7 @@ class OpowerConfigFlow(ConfigFlow, domain=DOMAIN):
) )
await self.hass.config_entries.async_reload(self.reauth_entry.entry_id) await self.hass.config_entries.async_reload(self.reauth_entry.entry_id)
return self.async_abort(reason="reauth_successful") return self.async_abort(reason="reauth_successful")
schema = { schema: VolDictType = {
vol.Required(CONF_USERNAME): self.reauth_entry.data[CONF_USERNAME], vol.Required(CONF_USERNAME): self.reauth_entry.data[CONF_USERNAME],
vol.Required(CONF_PASSWORD): str, vol.Required(CONF_PASSWORD): str,
} }

View file

@ -23,6 +23,7 @@ from homeassistant.helpers.selector import (
NumberSelector, NumberSelector,
NumberSelectorConfig, NumberSelectorConfig,
) )
from homeassistant.helpers.typing import VolDictType
from homeassistant.util import slugify from homeassistant.util import slugify
from .const import ( from .const import (
@ -37,7 +38,7 @@ from .const import (
RESULT_SUCCESS = "success" RESULT_SUCCESS = "success"
def _base_schema(user_input: dict[str, Any]) -> vol.Schema: def _base_schema(user_input: dict[str, Any]) -> VolDictType:
return { return {
vol.Required( vol.Required(
CONF_TRACKED_ENTITIES, default=user_input.get(CONF_TRACKED_ENTITIES, []) CONF_TRACKED_ENTITIES, default=user_input.get(CONF_TRACKED_ENTITIES, [])

View file

@ -38,6 +38,7 @@ from homeassistant.helpers import (
entity_registry as er, entity_registry as er,
) )
from homeassistant.helpers.event import async_track_state_change_event from homeassistant.helpers.event import async_track_state_change_event
from homeassistant.helpers.typing import VolDictType
from . import ( from . import (
DOMAIN, DOMAIN,
@ -245,9 +246,10 @@ class RfxtrxOptionsFlow(OptionsFlow):
device_data = self._selected_device device_data = self._selected_device
data_schema = {} data_schema: VolDictType = {}
if binary_supported(self._selected_device_object): if binary_supported(self._selected_device_object):
off_delay_schema: VolDictType
if device_data.get(CONF_OFF_DELAY): if device_data.get(CONF_OFF_DELAY):
off_delay_schema = { off_delay_schema = {
vol.Optional( vol.Optional(

View file

@ -41,7 +41,7 @@ from homeassistant.core import callback
from homeassistant.exceptions import HomeAssistantError from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers.aiohttp_client import async_get_clientsession
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.typing import DiscoveryInfoType from homeassistant.helpers.typing import DiscoveryInfoType, VolDictType
from homeassistant.util.network import is_ip_address as is_ip from homeassistant.util.network import is_ip_address as is_ip
from .const import ( from .const import (
@ -79,7 +79,7 @@ def _reauth_schema() -> vol.Schema:
def _user_schema_with_defaults(user_input: dict[str, Any]) -> vol.Schema: def _user_schema_with_defaults(user_input: dict[str, Any]) -> vol.Schema:
user_schema = { user_schema: VolDictType = {
vol.Required(CONF_HOST, default=user_input.get(CONF_HOST, "")): str, vol.Required(CONF_HOST, default=user_input.get(CONF_HOST, "")): str,
} }
user_schema.update(_ordered_shared_schema(user_input)) user_schema.update(_ordered_shared_schema(user_input))
@ -87,9 +87,7 @@ def _user_schema_with_defaults(user_input: dict[str, Any]) -> vol.Schema:
return vol.Schema(user_schema) return vol.Schema(user_schema)
def _ordered_shared_schema( def _ordered_shared_schema(schema_input: dict[str, Any]) -> VolDictType:
schema_input: dict[str, Any],
) -> dict[vol.Required | vol.Optional, Any]:
return { return {
vol.Required(CONF_USERNAME, default=schema_input.get(CONF_USERNAME, "")): str, vol.Required(CONF_USERNAME, default=schema_input.get(CONF_USERNAME, "")): str,
vol.Required(CONF_PASSWORD, default=schema_input.get(CONF_PASSWORD, "")): str, vol.Required(CONF_PASSWORD, default=schema_input.get(CONF_PASSWORD, "")): str,

View file

@ -4,7 +4,7 @@ from __future__ import annotations
from collections.abc import Sequence from collections.abc import Sequence
import logging import logging
from typing import Any, Final, cast from typing import Any, cast
from kasa import SmartBulb, SmartLightStrip from kasa import SmartBulb, SmartLightStrip
import voluptuous as vol import voluptuous as vol
@ -25,6 +25,7 @@ from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers import entity_platform from homeassistant.helpers import entity_platform
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import VolDictType
from . import legacy_device_id from . import legacy_device_id
from .const import DOMAIN from .const import DOMAIN
@ -43,7 +44,7 @@ VAL = vol.Range(min=0, max=100)
TRANSITION = vol.Range(min=0, max=6000) TRANSITION = vol.Range(min=0, max=6000)
HSV_SEQUENCE = vol.ExactSequence((HUE, SAT, VAL)) HSV_SEQUENCE = vol.ExactSequence((HUE, SAT, VAL))
BASE_EFFECT_DICT: Final = { BASE_EFFECT_DICT: VolDictType = {
vol.Optional("brightness", default=100): vol.All( vol.Optional("brightness", default=100): vol.All(
vol.Coerce(int), vol.Range(min=0, max=100) vol.Coerce(int), vol.Range(min=0, max=100)
), ),
@ -58,7 +59,7 @@ BASE_EFFECT_DICT: Final = {
), ),
} }
SEQUENCE_EFFECT_DICT: Final = { SEQUENCE_EFFECT_DICT: VolDictType = {
**BASE_EFFECT_DICT, **BASE_EFFECT_DICT,
vol.Required("sequence"): vol.All( vol.Required("sequence"): vol.All(
cv.ensure_list, cv.ensure_list,
@ -76,7 +77,7 @@ SEQUENCE_EFFECT_DICT: Final = {
), ),
} }
RANDOM_EFFECT_DICT: Final = { RANDOM_EFFECT_DICT: VolDictType = {
**BASE_EFFECT_DICT, **BASE_EFFECT_DICT,
vol.Optional("fadeoff", default=0): vol.All( vol.Optional("fadeoff", default=0): vol.All(
vol.Coerce(int), vol.Range(min=0, max=3000) vol.Coerce(int), vol.Range(min=0, max=3000)

View file

@ -38,6 +38,7 @@ from homeassistant.core import HomeAssistant, callback
from homeassistant.data_entry_flow import AbortFlow, FlowManager from homeassistant.data_entry_flow import AbortFlow, FlowManager
from homeassistant.exceptions import HomeAssistantError from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.helpers.typing import VolDictType
from . import disconnect_client from . import disconnect_client
from .addon import get_addon_manager from .addon import get_addon_manager
@ -639,7 +640,7 @@ class ZWaveJSConfigFlow(BaseZwaveJSFlow, ConfigFlow, domain=DOMAIN):
CONF_ADDON_LR_S2_AUTHENTICATED_KEY, self.lr_s2_authenticated_key or "" CONF_ADDON_LR_S2_AUTHENTICATED_KEY, self.lr_s2_authenticated_key or ""
) )
schema = { schema: VolDictType = {
vol.Optional(CONF_S0_LEGACY_KEY, default=s0_legacy_key): str, vol.Optional(CONF_S0_LEGACY_KEY, default=s0_legacy_key): str,
vol.Optional( vol.Optional(
CONF_S2_ACCESS_CONTROL_KEY, default=s2_access_control_key CONF_S2_ACCESS_CONTROL_KEY, default=s2_access_control_key