diff --git a/homeassistant/components/asuswrt/config_flow.py b/homeassistant/components/asuswrt/config_flow.py index f5db3dfa3d8..d58a216aaee 100644 --- a/homeassistant/components/asuswrt/config_flow.py +++ b/homeassistant/components/asuswrt/config_flow.py @@ -32,6 +32,7 @@ from homeassistant.helpers.schema_config_entry_flow import ( SchemaOptionsFlowHandler, ) from homeassistant.helpers.selector import SelectSelector, SelectSelectorConfig +from homeassistant.helpers.typing import VolDictType from .bridge import AsusWrtBridge from .const import ( @@ -143,6 +144,7 @@ class AsusWrtFlowHandler(ConfigFlow, domain=DOMAIN): user_input = self._config_data + add_schema: VolDictType if self.show_advanced_options: add_schema = { vol.Exclusive(CONF_PASSWORD, PASS_KEY, PASS_KEY_MSG): str, diff --git a/homeassistant/components/axis/config_flow.py b/homeassistant/components/axis/config_flow.py index 1754e37853f..63cac941423 100644 --- a/homeassistant/components/axis/config_flow.py +++ b/homeassistant/components/axis/config_flow.py @@ -30,6 +30,7 @@ from homeassistant.const import ( ) from homeassistant.core import callback from homeassistant.helpers.device_registry import format_mac +from homeassistant.helpers.typing import VolDictType from homeassistant.util.network import is_link_local from . import AxisConfigEntry @@ -63,7 +64,7 @@ class AxisFlowHandler(ConfigFlow, domain=AXIS_DOMAIN): def __init__(self) -> None: """Initialize the Axis config flow.""" 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( self, user_input: dict[str, Any] | None = None diff --git a/homeassistant/components/dlna_dmr/config_flow.py b/homeassistant/components/dlna_dmr/config_flow.py index 6b551f0e999..265c78fd9a9 100644 --- a/homeassistant/components/dlna_dmr/config_flow.py +++ b/homeassistant/components/dlna_dmr/config_flow.py @@ -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.exceptions import IntegrationError from homeassistant.helpers import config_validation as cv, device_registry as dr +from homeassistant.helpers.typing import VolDictType from .const import ( CONF_BROWSE_UNFILTERED, @@ -382,7 +383,7 @@ class DlnaDmrOptionsFlowHandler(OptionsFlow): if not errors: return self.async_create_entry(title="", data=options) - fields = {} + fields: VolDictType = {} def _add_with_suggestion(key: str, validator: Callable | type[bool]) -> None: """Add a field to with a suggested value. diff --git a/homeassistant/components/ecovacs/config_flow.py b/homeassistant/components/ecovacs/config_flow.py index 7e4bfbe5597..a254731a946 100644 --- a/homeassistant/components/ecovacs/config_flow.py +++ b/homeassistant/components/ecovacs/config_flow.py @@ -22,6 +22,7 @@ from homeassistant.core import DOMAIN as HOMEASSISTANT_DOMAIN, HomeAssistant from homeassistant.data_entry_flow import AbortFlow from homeassistant.helpers import aiohttp_client, selector 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.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 ) - schema = { + schema: VolDictType = { vol.Required(CONF_USERNAME): selector.TextSelector( selector.TextSelectorConfig(type=selector.TextSelectorType.TEXT) ), diff --git a/homeassistant/components/enphase_envoy/config_flow.py b/homeassistant/components/enphase_envoy/config_flow.py index 695709627b7..c18401859de 100644 --- a/homeassistant/components/enphase_envoy/config_flow.py +++ b/homeassistant/components/enphase_envoy/config_flow.py @@ -21,6 +21,7 @@ from homeassistant.config_entries import ( from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PASSWORD, CONF_USERNAME from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.httpx_client import get_async_client +from homeassistant.helpers.typing import VolDictType from .const import ( DOMAIN, @@ -69,7 +70,7 @@ class EnphaseConfigFlow(ConfigFlow, domain=DOMAIN): @callback def _async_generate_schema(self) -> vol.Schema: """Generate schema.""" - schema = {} + schema: VolDictType = {} if self.ip_address: schema[vol.Required(CONF_HOST, default=self.ip_address)] = vol.In( diff --git a/homeassistant/components/homekit_controller/config_flow.py b/homeassistant/components/homekit_controller/config_flow.py index 48aa3fc2bc7..2ca32ccb911 100644 --- a/homeassistant/components/homekit_controller/config_flow.py +++ b/homeassistant/components/homekit_controller/config_flow.py @@ -24,6 +24,7 @@ from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.core import callback from homeassistant.data_entry_flow import AbortFlow from homeassistant.helpers import device_registry as dr +from homeassistant.helpers.typing import VolDictType from .const import DOMAIN, KNOWN_DEVICES from .storage import async_get_entity_storage @@ -555,7 +556,7 @@ class HomekitControllerFlowHandler(ConfigFlow, domain=DOMAIN): "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": schema[vol.Optional("allow_insecure_setup_codes")] = bool diff --git a/homeassistant/components/http/data_validator.py b/homeassistant/components/http/data_validator.py index b2f6496a77b..abfeadc7189 100644 --- a/homeassistant/components/http/data_validator.py +++ b/homeassistant/components/http/data_validator.py @@ -11,6 +11,8 @@ from typing import Any, Concatenate from aiohttp import web import voluptuous as vol +from homeassistant.helpers.typing import VolDictType + from .view import HomeAssistantView _LOGGER = logging.getLogger(__name__) @@ -25,7 +27,9 @@ class RequestDataValidator: 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.""" if isinstance(schema, dict): schema = vol.Schema(schema) diff --git a/homeassistant/components/humidifier/device_action.py b/homeassistant/components/humidifier/device_action.py index 74ef73443d6..de1d4c871e3 100644 --- a/homeassistant/components/humidifier/device_action.py +++ b/homeassistant/components/humidifier/device_action.py @@ -22,7 +22,7 @@ from homeassistant.exceptions import HomeAssistantError from homeassistant.helpers import entity_registry as er import homeassistant.helpers.config_validation as cv 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 @@ -114,7 +114,7 @@ async def async_get_action_capabilities( """List action capabilities.""" action_type = config[CONF_TYPE] - fields = {} + fields: VolDictType = {} if action_type == "set_humidity": fields[vol.Required(const.ATTR_HUMIDITY)] = vol.Coerce(int) diff --git a/homeassistant/components/ibeacon/config_flow.py b/homeassistant/components/ibeacon/config_flow.py index ccedaa675b6..424befa81ec 100644 --- a/homeassistant/components/ibeacon/config_flow.py +++ b/homeassistant/components/ibeacon/config_flow.py @@ -16,6 +16,7 @@ from homeassistant.config_entries import ( ) from homeassistant.core import callback import homeassistant.helpers.config_validation as cv +from homeassistant.helpers.typing import VolDictType from .const import CONF_ALLOW_NAMELESS_UUIDS, DOMAIN @@ -81,7 +82,7 @@ class IBeaconOptionsFlow(OptionsFlow): data = {CONF_ALLOW_NAMELESS_UUIDS: list(updated_uuids)} return self.async_create_entry(title="", data=data) - schema = { + schema: VolDictType = { vol.Optional( "new_uuid", description={"suggested_value": new_uuid}, diff --git a/homeassistant/components/knx/config_flow.py b/homeassistant/components/knx/config_flow.py index c526a1e25f6..226abc1b868 100644 --- a/homeassistant/components/knx/config_flow.py +++ b/homeassistant/components/knx/config_flow.py @@ -29,7 +29,7 @@ from homeassistant.config_entries import ( from homeassistant.const import CONF_HOST, CONF_PORT from homeassistant.core import callback from homeassistant.helpers import selector -from homeassistant.helpers.typing import UNDEFINED +from homeassistant.helpers.typing import UNDEFINED, VolDictType from .const import ( CONF_KNX_AUTOMATIC, @@ -368,7 +368,7 @@ class KNXCommonFlow(ABC, ConfigEntryBaseFlow): CONF_KNX_ROUTE_BACK, not bool(self._selected_tunnel) ) - fields = { + fields: VolDictType = { vol.Required(CONF_KNX_TUNNELING_TYPE, default=default_type): vol.In( CONF_KNX_TUNNELING_TYPE_LABELS ), @@ -694,7 +694,7 @@ class KNXCommonFlow(ABC, ConfigEntryBaseFlow): router for router in routers if router.routing_requires_secure ) - fields = { + fields: VolDictType = { vol.Required( CONF_KNX_INDIVIDUAL_ADDRESS, default=_individual_address ): _IA_SELECTOR, diff --git a/homeassistant/components/light/device_action.py b/homeassistant/components/light/device_action.py index dbdf7200a7b..45e9731c5b8 100644 --- a/homeassistant/components/light/device_action.py +++ b/homeassistant/components/light/device_action.py @@ -21,7 +21,7 @@ from homeassistant.core import Context, HomeAssistant from homeassistant.exceptions import HomeAssistantError from homeassistant.helpers import config_validation as cv, entity_registry as er 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 ( ATTR_BRIGHTNESS_PCT, @@ -150,7 +150,7 @@ async def async_get_action_capabilities( supported_color_modes = None supported_features = 0 - extra_fields = {} + extra_fields: VolDictType = {} if brightness_supported(supported_color_modes): extra_fields[vol.Optional(ATTR_BRIGHTNESS_PCT)] = VALID_BRIGHTNESS_PCT diff --git a/homeassistant/components/mysensors/config_flow.py b/homeassistant/components/mysensors/config_flow.py index 9a8d79ca3a7..f3fb03ffac8 100644 --- a/homeassistant/components/mysensors/config_flow.py +++ b/homeassistant/components/mysensors/config_flow.py @@ -22,6 +22,7 @@ from homeassistant.const import CONF_DEVICE from homeassistant.core import callback from homeassistant.helpers import selector import homeassistant.helpers.config_validation as cv +from homeassistant.helpers.typing import VolDictType from .const import ( CONF_BAUD_RATE, @@ -153,7 +154,7 @@ class MySensorsConfigFlowHandler(ConfigFlow, domain=DOMAIN): return self._async_create_entry(user_input) user_input = user_input or {} - schema = { + schema: VolDictType = { vol.Required( CONF_DEVICE, default=user_input.get(CONF_DEVICE, "/dev/ttyACM0") ): str, @@ -164,9 +165,8 @@ class MySensorsConfigFlowHandler(ConfigFlow, domain=DOMAIN): } schema.update(_get_schema_common(user_input)) - schema = vol.Schema(schema) 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( @@ -182,7 +182,7 @@ class MySensorsConfigFlowHandler(ConfigFlow, domain=DOMAIN): return self._async_create_entry(user_input) user_input = user_input or {} - schema = { + schema: VolDictType = { vol.Required( CONF_DEVICE, default=user_input.get(CONF_DEVICE, "127.0.0.1") ): str, @@ -192,8 +192,9 @@ class MySensorsConfigFlowHandler(ConfigFlow, domain=DOMAIN): } schema.update(_get_schema_common(user_input)) - schema = vol.Schema(schema) - return self.async_show_form(step_id="gw_tcp", data_schema=schema, errors=errors) + return self.async_show_form( + step_id="gw_tcp", data_schema=vol.Schema(schema), errors=errors + ) def _check_topic_exists(self, topic: str) -> bool: for other_config in self._async_current_entries(): @@ -243,7 +244,7 @@ class MySensorsConfigFlowHandler(ConfigFlow, domain=DOMAIN): return self._async_create_entry(user_input) user_input = user_input or {} - schema = { + schema: VolDictType = { vol.Required( CONF_TOPIC_IN_PREFIX, default=user_input.get(CONF_TOPIC_IN_PREFIX, "") ): str, @@ -254,9 +255,8 @@ class MySensorsConfigFlowHandler(ConfigFlow, domain=DOMAIN): } schema.update(_get_schema_common(user_input)) - schema = vol.Schema(schema) 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 diff --git a/homeassistant/components/nmap_tracker/config_flow.py b/homeassistant/components/nmap_tracker/config_flow.py index a89c50a2210..b724dca1a81 100644 --- a/homeassistant/components/nmap_tracker/config_flow.py +++ b/homeassistant/components/nmap_tracker/config_flow.py @@ -23,6 +23,7 @@ from homeassistant.config_entries import ( from homeassistant.const import CONF_EXCLUDE, CONF_HOSTS from homeassistant.core import HomeAssistant, callback import homeassistant.helpers.config_validation as cv +from homeassistant.helpers.typing import VolDictType from .const import ( CONF_HOME_INTERVAL, @@ -110,7 +111,7 @@ async def _async_build_schema_with_user_input( exclude = user_input.get( 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_HOME_INTERVAL, default=user_input.get(CONF_HOME_INTERVAL, 0) diff --git a/homeassistant/components/opower/config_flow.py b/homeassistant/components/opower/config_flow.py index bbd9315eaa3..574062aca52 100644 --- a/homeassistant/components/opower/config_flow.py +++ b/homeassistant/components/opower/config_flow.py @@ -20,6 +20,7 @@ from homeassistant.config_entries import ConfigEntry, ConfigFlow, ConfigFlowResu from homeassistant.const import CONF_NAME, CONF_PASSWORD, CONF_USERNAME from homeassistant.core import HomeAssistant, callback from homeassistant.helpers.aiohttp_client import async_create_clientsession +from homeassistant.helpers.typing import VolDictType 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) return self.async_abort(reason="reauth_successful") - schema = { + schema: VolDictType = { vol.Required(CONF_USERNAME): self.reauth_entry.data[CONF_USERNAME], vol.Required(CONF_PASSWORD): str, } diff --git a/homeassistant/components/proximity/config_flow.py b/homeassistant/components/proximity/config_flow.py index 14f26f5d45d..d133b14cb6a 100644 --- a/homeassistant/components/proximity/config_flow.py +++ b/homeassistant/components/proximity/config_flow.py @@ -23,6 +23,7 @@ from homeassistant.helpers.selector import ( NumberSelector, NumberSelectorConfig, ) +from homeassistant.helpers.typing import VolDictType from homeassistant.util import slugify from .const import ( @@ -37,7 +38,7 @@ from .const import ( RESULT_SUCCESS = "success" -def _base_schema(user_input: dict[str, Any]) -> vol.Schema: +def _base_schema(user_input: dict[str, Any]) -> VolDictType: return { vol.Required( CONF_TRACKED_ENTITIES, default=user_input.get(CONF_TRACKED_ENTITIES, []) diff --git a/homeassistant/components/rfxtrx/config_flow.py b/homeassistant/components/rfxtrx/config_flow.py index 1fbb2e8fc29..ceb9bea4661 100644 --- a/homeassistant/components/rfxtrx/config_flow.py +++ b/homeassistant/components/rfxtrx/config_flow.py @@ -38,6 +38,7 @@ from homeassistant.helpers import ( entity_registry as er, ) from homeassistant.helpers.event import async_track_state_change_event +from homeassistant.helpers.typing import VolDictType from . import ( DOMAIN, @@ -245,9 +246,10 @@ class RfxtrxOptionsFlow(OptionsFlow): device_data = self._selected_device - data_schema = {} + data_schema: VolDictType = {} if binary_supported(self._selected_device_object): + off_delay_schema: VolDictType if device_data.get(CONF_OFF_DELAY): off_delay_schema = { vol.Optional( diff --git a/homeassistant/components/synology_dsm/config_flow.py b/homeassistant/components/synology_dsm/config_flow.py index 63ff804951c..6e2b090fc98 100644 --- a/homeassistant/components/synology_dsm/config_flow.py +++ b/homeassistant/components/synology_dsm/config_flow.py @@ -41,7 +41,7 @@ from homeassistant.core import callback from homeassistant.exceptions import HomeAssistantError from homeassistant.helpers.aiohttp_client import async_get_clientsession 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 .const import ( @@ -79,7 +79,7 @@ def _reauth_schema() -> 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, } 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) -def _ordered_shared_schema( - schema_input: dict[str, Any], -) -> dict[vol.Required | vol.Optional, Any]: +def _ordered_shared_schema(schema_input: dict[str, Any]) -> VolDictType: return { vol.Required(CONF_USERNAME, default=schema_input.get(CONF_USERNAME, "")): str, vol.Required(CONF_PASSWORD, default=schema_input.get(CONF_PASSWORD, "")): str, diff --git a/homeassistant/components/tplink/light.py b/homeassistant/components/tplink/light.py index aa50c3f2ed2..977e75215aa 100644 --- a/homeassistant/components/tplink/light.py +++ b/homeassistant/components/tplink/light.py @@ -4,7 +4,7 @@ from __future__ import annotations from collections.abc import Sequence import logging -from typing import Any, Final, cast +from typing import Any, cast from kasa import SmartBulb, SmartLightStrip import voluptuous as vol @@ -25,6 +25,7 @@ from homeassistant.core import HomeAssistant, callback from homeassistant.helpers import entity_platform import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity_platform import AddEntitiesCallback +from homeassistant.helpers.typing import VolDictType from . import legacy_device_id from .const import DOMAIN @@ -43,7 +44,7 @@ VAL = vol.Range(min=0, max=100) TRANSITION = vol.Range(min=0, max=6000) HSV_SEQUENCE = vol.ExactSequence((HUE, SAT, VAL)) -BASE_EFFECT_DICT: Final = { +BASE_EFFECT_DICT: VolDictType = { vol.Optional("brightness", default=100): vol.All( 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, vol.Required("sequence"): vol.All( cv.ensure_list, @@ -76,7 +77,7 @@ SEQUENCE_EFFECT_DICT: Final = { ), } -RANDOM_EFFECT_DICT: Final = { +RANDOM_EFFECT_DICT: VolDictType = { **BASE_EFFECT_DICT, vol.Optional("fadeoff", default=0): vol.All( vol.Coerce(int), vol.Range(min=0, max=3000) diff --git a/homeassistant/components/zwave_js/config_flow.py b/homeassistant/components/zwave_js/config_flow.py index dff582558b1..e73fa9fc3a7 100644 --- a/homeassistant/components/zwave_js/config_flow.py +++ b/homeassistant/components/zwave_js/config_flow.py @@ -38,6 +38,7 @@ from homeassistant.core import HomeAssistant, callback from homeassistant.data_entry_flow import AbortFlow, FlowManager from homeassistant.exceptions import HomeAssistantError from homeassistant.helpers.aiohttp_client import async_get_clientsession +from homeassistant.helpers.typing import VolDictType from . import disconnect_client 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 "" ) - schema = { + schema: VolDictType = { vol.Optional(CONF_S0_LEGACY_KEY, default=s0_legacy_key): str, vol.Optional( CONF_S2_ACCESS_CONTROL_KEY, default=s2_access_control_key