From f3f1b7ae63370a4e2dc8638c4ae0295d383717d0 Mon Sep 17 00:00:00 2001 From: Necroneco Date: Sun, 13 Sep 2026 23:27:08 +0800 Subject: [PATCH 01/10] Remove myself from Midea codeowners (#182114) --- CODEOWNERS | 4 ++-- homeassistant/components/midea/manifest.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index 43e14c41d8bfe..46e9d80844b24 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1161,8 +1161,8 @@ CLAUDE.md @home-assistant/core /tests/components/metoffice/ @MrHarcombe @avee87 /homeassistant/components/microbees/ @microBeesTech /tests/components/microbees/ @microBeesTech -/homeassistant/components/midea/ @chemelli74 @rokam @caibinqing -/tests/components/midea/ @chemelli74 @rokam @caibinqing +/homeassistant/components/midea/ @chemelli74 @rokam +/tests/components/midea/ @chemelli74 @rokam /homeassistant/components/miele/ @astrandb /tests/components/miele/ @astrandb /homeassistant/components/mikrotik/ @engrbm87 @chemelli74 diff --git a/homeassistant/components/midea/manifest.json b/homeassistant/components/midea/manifest.json index e91c9d4e386bf..943d3453e69c3 100644 --- a/homeassistant/components/midea/manifest.json +++ b/homeassistant/components/midea/manifest.json @@ -1,7 +1,7 @@ { "domain": "midea", "name": "Midea", - "codeowners": ["@chemelli74", "@rokam", "@caibinqing"], + "codeowners": ["@chemelli74", "@rokam"], "config_flow": true, "dhcp": [ { From 06ac207c22a8359c3d10f90eac593e60bf9ab78d Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 13 Sep 2026 18:08:49 +0200 Subject: [PATCH 02/10] Use probatio directly in core, auth, helpers and util (#182107) --- homeassistant/auth/mfa_modules/__init__.py | 22 +- .../auth/mfa_modules/insecure_example.py | 18 +- homeassistant/auth/mfa_modules/notify.py | 26 +- homeassistant/auth/mfa_modules/totp.py | 12 +- homeassistant/auth/permissions/__init__.py | 4 +- homeassistant/auth/permissions/entities.py | 28 +- homeassistant/auth/providers/__init__.py | 20 +- homeassistant/auth/providers/command_line.py | 18 +- homeassistant/auth/providers/homeassistant.py | 12 +- .../auth/providers/insecure_example.py | 18 +- .../auth/providers/trusted_networks.py | 22 +- homeassistant/bootstrap.py | 6 +- homeassistant/config.py | 57 +- homeassistant/config_entries.py | 4 +- homeassistant/core.py | 6 +- homeassistant/core_config.py | 102 +-- homeassistant/data_entry_flow.py | 36 +- homeassistant/helpers/automation.py | 8 +- homeassistant/helpers/check_config.py | 16 +- homeassistant/helpers/collection.py | 22 +- homeassistant/helpers/condition.py | 60 +- .../helpers/config_entry_oauth2_flow.py | 10 +- homeassistant/helpers/config_validation.py | 715 +++++++++--------- homeassistant/helpers/data_entry_flow.py | 13 +- homeassistant/helpers/entity.py | 4 +- homeassistant/helpers/entity_registry.py | 8 +- homeassistant/helpers/entityfilter.py | 36 +- homeassistant/helpers/http.py | 4 +- homeassistant/helpers/intent.py | 40 +- homeassistant/helpers/llm.py | 39 +- .../helpers/schema_config_entry_flow.py | 20 +- homeassistant/helpers/script.py | 32 +- homeassistant/helpers/selector.py | 561 +++++++------- homeassistant/helpers/service.py | 64 +- .../helpers/template/extensions/areas.py | 4 +- .../helpers/template/extensions/devices.py | 4 +- .../helpers/template/extensions/labels.py | 4 +- homeassistant/helpers/template/helpers.py | 6 +- homeassistant/helpers/trigger.py | 76 +- .../helpers/trigger_template_entity.py | 32 +- homeassistant/helpers/typing.py | 6 +- homeassistant/loader.py | 4 +- homeassistant/util/unit_system.py | 8 +- 43 files changed, 1140 insertions(+), 1067 deletions(-) diff --git a/homeassistant/auth/mfa_modules/__init__.py b/homeassistant/auth/mfa_modules/__init__.py index da1e52bf98ab1..786527563ba39 100644 --- a/homeassistant/auth/mfa_modules/__init__.py +++ b/homeassistant/auth/mfa_modules/__init__.py @@ -4,8 +4,8 @@ import types from typing import Any -import voluptuous as vol -from voluptuous.humanize import humanize_error +import probatio +from probatio.humanize import humanize_error from homeassistant import data_entry_flow, requirements from homeassistant.const import CONF_ID, CONF_NAME, CONF_TYPE @@ -18,14 +18,14 @@ MULTI_FACTOR_AUTH_MODULES: Registry[str, type[MultiFactorAuthModule]] = Registry() -MULTI_FACTOR_AUTH_MODULE_SCHEMA = vol.Schema( +MULTI_FACTOR_AUTH_MODULE_SCHEMA = probatio.Schema( { - vol.Required(CONF_TYPE): str, - vol.Optional(CONF_NAME): str, + probatio.Required(CONF_TYPE): str, + probatio.Optional(CONF_NAME): str, # Specify ID if you have two mfa auth module for same type. - vol.Optional(CONF_ID): str, + probatio.Optional(CONF_ID): str, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) DATA_REQS: HassKey[set[str]] = HassKey("mfa_auth_module_reqs_processed") @@ -65,8 +65,8 @@ def name(self) -> str: # Implement by extending class @property - def input_schema(self) -> vol.Schema: - """Return a voluptuous schema to define mfa auth module's input.""" + def input_schema(self) -> probatio.Schema: + """Return a schema to define mfa auth module's input.""" raise NotImplementedError async def async_setup_flow(self, user_id: str) -> SetupFlow[Any]: @@ -101,7 +101,7 @@ class SetupFlow[_MultiFactorAuthModuleT: MultiFactorAuthModule = MultiFactorAuth def __init__( self, auth_module: _MultiFactorAuthModuleT, - setup_schema: vol.Schema, + setup_schema: probatio.Schema, user_id: str, ) -> None: """Initialize the setup flow.""" @@ -137,7 +137,7 @@ async def auth_mfa_module_from_config( try: config = module.CONFIG_SCHEMA(config) - except vol.Invalid as err: + except probatio.Invalid as err: _LOGGER.error( "Invalid configuration for multi-factor module %s: %s", module_name, diff --git a/homeassistant/auth/mfa_modules/insecure_example.py b/homeassistant/auth/mfa_modules/insecure_example.py index be635685a2ccc..15b6c55d3c463 100644 --- a/homeassistant/auth/mfa_modules/insecure_example.py +++ b/homeassistant/auth/mfa_modules/insecure_example.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.core import HomeAssistant @@ -15,11 +15,13 @@ CONFIG_SCHEMA = MULTI_FACTOR_AUTH_MODULE_SCHEMA.extend( { - vol.Required("data"): [ - vol.Schema({vol.Required("user_id"): str, vol.Required("pin"): str}) + probatio.Required("data"): [ + probatio.Schema( + {probatio.Required("user_id"): str, probatio.Required("pin"): str} + ) ] }, - extra=vol.PREVENT_EXTRA, + extra=probatio.PREVENT_EXTRA, ) @@ -36,14 +38,14 @@ def __init__(self, hass: HomeAssistant, config: dict[str, Any]) -> None: @property @override - def input_schema(self) -> vol.Schema: + def input_schema(self) -> probatio.Schema: """Validate login flow input data.""" - return vol.Schema({vol.Required("pin"): str}) + return probatio.Schema({probatio.Required("pin"): str}) @property - def setup_schema(self) -> vol.Schema: + def setup_schema(self) -> probatio.Schema: """Validate async_setup_user input data.""" - return vol.Schema({vol.Required("pin"): str}) + return probatio.Schema({probatio.Required("pin"): str}) @override async def async_setup_flow(self, user_id: str) -> SetupFlow: diff --git a/homeassistant/auth/mfa_modules/notify.py b/homeassistant/auth/mfa_modules/notify.py index 30aa0a31e3f3b..1475040097c35 100644 --- a/homeassistant/auth/mfa_modules/notify.py +++ b/homeassistant/auth/mfa_modules/notify.py @@ -8,7 +8,7 @@ from typing import Any, cast, override import attr -import voluptuous as vol +import probatio from homeassistant.const import CONF_EXCLUDE, CONF_INCLUDE from homeassistant.core import HomeAssistant, callback @@ -30,11 +30,13 @@ CONFIG_SCHEMA = MULTI_FACTOR_AUTH_MODULE_SCHEMA.extend( { - vol.Optional(CONF_INCLUDE): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(CONF_EXCLUDE): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(CONF_MESSAGE, default="{} is your Home Assistant login code"): str, + probatio.Optional(CONF_INCLUDE): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(CONF_EXCLUDE): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional( + CONF_MESSAGE, default="{} is your Home Assistant login code" + ): str, }, - extra=vol.PREVENT_EXTRA, + extra=probatio.PREVENT_EXTRA, ) STORAGE_VERSION = 1 @@ -108,9 +110,9 @@ def __init__(self, hass: HomeAssistant, config: dict[str, Any]) -> None: @property @override - def input_schema(self) -> vol.Schema: + def input_schema(self) -> probatio.Schema: """Validate login flow input data.""" - return vol.Schema({vol.Required(INPUT_FIELD_CODE): str}) + return probatio.Schema({probatio.Required(INPUT_FIELD_CODE): str}) async def _async_load(self) -> None: """Load stored data.""" @@ -277,7 +279,7 @@ class NotifySetupFlow(SetupFlow[NotifyAuthModule]): def __init__( self, auth_module: NotifyAuthModule, - setup_schema: vol.Schema, + setup_schema: probatio.Schema, user_id: str, available_notify_services: list[str], ) -> None: @@ -308,10 +310,12 @@ async def async_step_init( if not self._available_notify_services: return self.async_abort(reason="no_available_service") - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required("notify_service"): vol.In(self._available_notify_services), - vol.Optional("target"): str, + probatio.Required("notify_service"): probatio.In( + self._available_notify_services + ), + probatio.Optional("target"): str, } ) diff --git a/homeassistant/auth/mfa_modules/totp.py b/homeassistant/auth/mfa_modules/totp.py index e5963b911f8cb..0ddfe11d261ae 100644 --- a/homeassistant/auth/mfa_modules/totp.py +++ b/homeassistant/auth/mfa_modules/totp.py @@ -4,7 +4,7 @@ from io import BytesIO from typing import Any, cast, override -import voluptuous as vol +import probatio from homeassistant.auth.models import User from homeassistant.core import HomeAssistant @@ -20,7 +20,7 @@ REQUIREMENTS = ["pyotp==2.9.0", "PyQRCode==1.2.1"] -CONFIG_SCHEMA = MULTI_FACTOR_AUTH_MODULE_SCHEMA.extend({}, extra=vol.PREVENT_EXTRA) +CONFIG_SCHEMA = MULTI_FACTOR_AUTH_MODULE_SCHEMA.extend({}, extra=probatio.PREVENT_EXTRA) STORAGE_VERSION = 1 STORAGE_KEY = "auth_module.totp" @@ -88,9 +88,9 @@ def __init__(self, hass: HomeAssistant, config: dict[str, Any]) -> None: @property @override - def input_schema(self) -> vol.Schema: + def input_schema(self) -> probatio.Schema: """Validate login flow input data.""" - return vol.Schema({vol.Required(INPUT_FIELD_CODE): str}) + return probatio.Schema({probatio.Required(INPUT_FIELD_CODE): str}) async def _async_load(self) -> None: """Load stored data.""" @@ -163,7 +163,7 @@ async def async_validate(self, user_id: str, user_input: dict[str, Any]) -> bool await self._async_load() # user_input has been validate in caller - # set INPUT_FIELD_CODE as vol.Required is not user friendly + # set INPUT_FIELD_CODE as probatio.Required is not user friendly return await self.hass.async_add_executor_job( self._validate_2fa, user_id, user_input.get(INPUT_FIELD_CODE, "") ) @@ -189,7 +189,7 @@ class TotpSetupFlow(SetupFlow[TotpAuthModule]): _image: str def __init__( - self, auth_module: TotpAuthModule, setup_schema: vol.Schema, user: User + self, auth_module: TotpAuthModule, setup_schema: probatio.Schema, user: User ) -> None: """Initialize the setup flow.""" super().__init__(auth_module, setup_schema, user.id) diff --git a/homeassistant/auth/permissions/__init__.py b/homeassistant/auth/permissions/__init__.py index b525423691fc4..aeab7ff8193d4 100644 --- a/homeassistant/auth/permissions/__init__.py +++ b/homeassistant/auth/permissions/__init__.py @@ -3,7 +3,7 @@ from collections.abc import Callable, Iterable from typing import TYPE_CHECKING, override -import voluptuous as vol +import probatio from .const import CAT_ENTITIES from .entities import ENTITY_POLICY_SCHEMA, compile_entities @@ -15,7 +15,7 @@ if TYPE_CHECKING: from ..models import User -POLICY_SCHEMA = vol.Schema({vol.Optional(CAT_ENTITIES): ENTITY_POLICY_SCHEMA}) +POLICY_SCHEMA = probatio.Schema({probatio.Optional(CAT_ENTITIES): ENTITY_POLICY_SCHEMA}) __all__ = [ "POLICY_SCHEMA", diff --git a/homeassistant/auth/permissions/entities.py b/homeassistant/auth/permissions/entities.py index 0c9f3eac5b980..6c081d272ae79 100644 --- a/homeassistant/auth/permissions/entities.py +++ b/homeassistant/auth/permissions/entities.py @@ -3,7 +3,7 @@ from collections import OrderedDict from collections.abc import Callable -import voluptuous as vol +import probatio from homeassistant.helpers import device_registry as dr @@ -12,13 +12,13 @@ from .types import CategoryType, SubCategoryDict, ValueType from .util import SubCatLookupType, compile_policy, lookup_all -SINGLE_ENTITY_SCHEMA = vol.Any( +SINGLE_ENTITY_SCHEMA = probatio.Any( True, - vol.Schema( + probatio.Schema( { - vol.Optional(POLICY_READ): True, - vol.Optional(POLICY_CONTROL): True, - vol.Optional(POLICY_EDIT): True, + probatio.Optional(POLICY_READ): True, + probatio.Optional(POLICY_CONTROL): True, + probatio.Optional(POLICY_EDIT): True, } ), ) @@ -28,17 +28,17 @@ ENTITY_DEVICE_IDS = "device_ids" ENTITY_ENTITY_IDS = "entity_ids" -ENTITY_VALUES_SCHEMA = vol.Any(True, vol.Schema({str: SINGLE_ENTITY_SCHEMA})) +ENTITY_VALUES_SCHEMA = probatio.Any(True, probatio.Schema({str: SINGLE_ENTITY_SCHEMA})) -ENTITY_POLICY_SCHEMA = vol.Any( +ENTITY_POLICY_SCHEMA = probatio.Any( True, - vol.Schema( + probatio.Schema( { - vol.Optional(SUBCAT_ALL): SINGLE_ENTITY_SCHEMA, - vol.Optional(ENTITY_AREAS): ENTITY_VALUES_SCHEMA, - vol.Optional(ENTITY_DEVICE_IDS): ENTITY_VALUES_SCHEMA, - vol.Optional(ENTITY_DOMAINS): ENTITY_VALUES_SCHEMA, - vol.Optional(ENTITY_ENTITY_IDS): ENTITY_VALUES_SCHEMA, + probatio.Optional(SUBCAT_ALL): SINGLE_ENTITY_SCHEMA, + probatio.Optional(ENTITY_AREAS): ENTITY_VALUES_SCHEMA, + probatio.Optional(ENTITY_DEVICE_IDS): ENTITY_VALUES_SCHEMA, + probatio.Optional(ENTITY_DOMAINS): ENTITY_VALUES_SCHEMA, + probatio.Optional(ENTITY_ENTITY_IDS): ENTITY_VALUES_SCHEMA, } ), ) diff --git a/homeassistant/auth/providers/__init__.py b/homeassistant/auth/providers/__init__.py index d1e9512f34f01..85dceec452be3 100644 --- a/homeassistant/auth/providers/__init__.py +++ b/homeassistant/auth/providers/__init__.py @@ -5,8 +5,8 @@ import types from typing import Any -import voluptuous as vol -from voluptuous.humanize import humanize_error +import probatio +from probatio.humanize import humanize_error from homeassistant import requirements from homeassistant.const import CONF_ID, CONF_NAME, CONF_TYPE @@ -34,14 +34,14 @@ AUTH_PROVIDERS: Registry[str, type[AuthProvider]] = Registry() -AUTH_PROVIDER_SCHEMA = vol.Schema( +AUTH_PROVIDER_SCHEMA = probatio.Schema( { - vol.Required(CONF_TYPE): str, - vol.Optional(CONF_NAME): str, + probatio.Required(CONF_TYPE): str, + probatio.Optional(CONF_NAME): str, # Specify ID if you have two auth providers for same type. - vol.Optional(CONF_ID): str, + probatio.Optional(CONF_ID): str, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) @@ -148,7 +148,7 @@ async def auth_provider_from_config( try: config = module.CONFIG_SCHEMA(config) - except vol.Invalid as err: + except probatio.Invalid as err: _LOGGER.error( "Invalid configuration for auth provider %s: %s", provider_name, @@ -237,8 +237,8 @@ async def async_step_select_mfa_module( return self.async_show_form( step_id="select_mfa_module", - data_schema=vol.Schema( - {"multi_factor_auth_module": vol.In(self.available_mfa_modules)} + data_schema=probatio.Schema( + {"multi_factor_auth_module": probatio.In(self.available_mfa_modules)} ), errors=errors, ) diff --git a/homeassistant/auth/providers/command_line.py b/homeassistant/auth/providers/command_line.py index f20e34547cf59..484b2a8367c2a 100644 --- a/homeassistant/auth/providers/command_line.py +++ b/homeassistant/auth/providers/command_line.py @@ -6,7 +6,7 @@ import os from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.const import CONF_COMMAND from homeassistant.exceptions import HomeAssistantError @@ -19,13 +19,15 @@ CONFIG_SCHEMA = AUTH_PROVIDER_SCHEMA.extend( { - vol.Required(CONF_COMMAND): vol.All( + probatio.Required(CONF_COMMAND): probatio.All( str, os.path.normpath, msg="must be an absolute path" ), - vol.Optional(CONF_ARGS, default=None): vol.Any(vol.DefaultTo(list), [str]), - vol.Optional(CONF_META, default=False): bool, + probatio.Optional(CONF_ARGS, default=None): probatio.Any( + probatio.DefaultTo(list), [str] + ), + probatio.Optional(CONF_META, default=False): bool, }, - extra=vol.PREVENT_EXTRA, + extra=probatio.PREVENT_EXTRA, ) _LOGGER = logging.getLogger(__name__) @@ -161,10 +163,10 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required("username"): str, - vol.Required("password"): str, + probatio.Required("username"): str, + probatio.Required("password"): str, } ), errors=errors, diff --git a/homeassistant/auth/providers/homeassistant.py b/homeassistant/auth/providers/homeassistant.py index 43134737e061d..c1a7653ab9e3f 100644 --- a/homeassistant/auth/providers/homeassistant.py +++ b/homeassistant/auth/providers/homeassistant.py @@ -6,7 +6,7 @@ from typing import Any, cast, override import bcrypt -import voluptuous as vol +import probatio from homeassistant.const import CONF_ID from homeassistant.core import HomeAssistant, callback @@ -23,12 +23,12 @@ def _disallow_id(conf: dict[str, Any]) -> dict[str, Any]: """Disallow ID in config.""" if CONF_ID in conf: - raise vol.Invalid("ID is not allowed for the homeassistant auth provider.") + raise probatio.Invalid("ID is not allowed for the homeassistant auth provider.") return conf -CONFIG_SCHEMA = vol.All(AUTH_PROVIDER_SCHEMA, _disallow_id) +CONFIG_SCHEMA = probatio.All(AUTH_PROVIDER_SCHEMA, _disallow_id) @callback @@ -376,10 +376,10 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required("username"): str, - vol.Required("password"): str, + probatio.Required("username"): str, + probatio.Required("password"): str, } ), errors=errors, diff --git a/homeassistant/auth/providers/insecure_example.py b/homeassistant/auth/providers/insecure_example.py index 5c35fd7e0e4ab..ba2397314f38d 100644 --- a/homeassistant/auth/providers/insecure_example.py +++ b/homeassistant/auth/providers/insecure_example.py @@ -4,7 +4,7 @@ import hmac from typing import override -import voluptuous as vol +import probatio from homeassistant.core import callback from homeassistant.exceptions import HomeAssistantError @@ -12,17 +12,17 @@ from ..models import AuthFlowContext, AuthFlowResult, Credentials, UserMeta from . import AUTH_PROVIDER_SCHEMA, AUTH_PROVIDERS, AuthProvider, LoginFlow -USER_SCHEMA = vol.Schema( +USER_SCHEMA = probatio.Schema( { - vol.Required("username"): str, - vol.Required("password"): str, - vol.Optional("name"): str, + probatio.Required("username"): str, + probatio.Required("password"): str, + probatio.Optional("name"): str, } ) CONFIG_SCHEMA = AUTH_PROVIDER_SCHEMA.extend( - {vol.Required("users"): [USER_SCHEMA]}, extra=vol.PREVENT_EXTRA + {probatio.Required("users"): [USER_SCHEMA]}, extra=probatio.PREVENT_EXTRA ) @@ -120,10 +120,10 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required("username"): str, - vol.Required("password"): str, + probatio.Required("username"): str, + probatio.Required("password"): str, } ), errors=errors, diff --git a/homeassistant/auth/providers/trusted_networks.py b/homeassistant/auth/providers/trusted_networks.py index c63935a130794..2940e95ce78f3 100644 --- a/homeassistant/auth/providers/trusted_networks.py +++ b/homeassistant/auth/providers/trusted_networks.py @@ -15,7 +15,7 @@ ) from typing import Any, cast, override -import voluptuous as vol +import probatio from homeassistant.core import callback from homeassistant.exceptions import HomeAssistantError @@ -42,24 +42,26 @@ CONFIG_SCHEMA = AUTH_PROVIDER_SCHEMA.extend( { - vol.Required(CONF_TRUSTED_NETWORKS): vol.All(cv.ensure_list, [ip_network]), - vol.Optional(CONF_TRUSTED_USERS, default={}): vol.Schema( + probatio.Required(CONF_TRUSTED_NETWORKS): probatio.All( + cv.ensure_list, [ip_network] + ), + probatio.Optional(CONF_TRUSTED_USERS, default={}): probatio.Schema( # we only validate the format of user_id or group_id { - ip_network: vol.All( + ip_network: probatio.All( cv.ensure_list, [ - vol.Or( + probatio.Or( cv.uuid4_hex, - vol.Schema({vol.Required(CONF_GROUP): str}), + probatio.Schema({probatio.Required(CONF_GROUP): str}), ) ], ) } ), - vol.Optional(CONF_ALLOW_BYPASS_LOGIN, default=False): cv.boolean, + probatio.Optional(CONF_ALLOW_BYPASS_LOGIN, default=False): cv.boolean, }, - extra=vol.PREVENT_EXTRA, + extra=probatio.PREVENT_EXTRA, ) @@ -256,7 +258,7 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( - {vol.Required("user"): vol.In(self._available_users)} + data_schema=probatio.Schema( + {probatio.Required("user"): probatio.In(self._available_users)} ), ) diff --git a/homeassistant/bootstrap.py b/homeassistant/bootstrap.py index 0c606c38d0802..bb07500f82ef0 100644 --- a/homeassistant/bootstrap.py +++ b/homeassistant/bootstrap.py @@ -20,7 +20,7 @@ # _frozen_importlib._DeadlockError: deadlock detected by # _ModuleLock('cryptography.hazmat.backends.openssl.backend') import cryptography.hazmat.backends.openssl.backend # noqa: F401 -import voluptuous as vol +import probatio import yarl from . import ( @@ -555,7 +555,7 @@ async def async_from_config_dict( try: await async_process_ha_core_config(hass, core_config) - except vol.Invalid as config_err: + except probatio.Invalid as config_err: conf_util.async_log_schema_error(config_err, core.DOMAIN, core_config, hass) async_notify_setup_error(hass, core.DOMAIN) return None @@ -692,7 +692,7 @@ def _log_file_disabled_reason() -> str | None: try: if cv.boolean(disable_log_file): return LOG_FILE_DISABLED_REASON_ENVIRONMENT - except vol.Invalid: + except probatio.Invalid: _LOGGER.warning( "Ignoring invalid %s value: %s. Expected a boolean value: " "1/0, true/false, yes/no, on/off, or enable/disable", diff --git a/homeassistant/config.py b/homeassistant/config.py index edcd6ec85fac1..96e3a4f7c117b 100644 --- a/homeassistant/config.py +++ b/homeassistant/config.py @@ -16,9 +16,8 @@ from typing import TYPE_CHECKING, Any, Literal, overload from awesomeversion import AwesomeVersion -from probatio import Undefined -import voluptuous as vol -from voluptuous.humanize import MAX_VALIDATION_ERROR_ITEM_LENGTH +import probatio +from probatio.humanize import MAX_VALIDATION_ERROR_ITEM_LENGTH from yaml.error import MarkedYAMLError from .const import CONF_PACKAGES, CONF_PLATFORM, __version__ @@ -233,7 +232,7 @@ async def async_hass_config_yaml(hass: HomeAssistant) -> dict: for key in config: try: cv.domain_key(key) - except vol.Invalid as exc: + except probatio.Invalid as exc: suffix = "" if annotation := find_annotation(config, exc.path): suffix = f" at {_relpath(hass, annotation[0])}, line {annotation[1]}" @@ -245,7 +244,7 @@ async def async_hass_config_yaml(hass: HomeAssistant) -> dict: core_config = config.get(HOMEASSISTANT_DOMAIN, {}) try: await merge_packages_config(hass, config, core_config.get(CONF_PACKAGES, {})) - except vol.Invalid as exc: + except probatio.Invalid as exc: suffix = "" if annotation := find_annotation( config, [HOMEASSISTANT_DOMAIN, CONF_PACKAGES, *exc.path] @@ -342,7 +341,7 @@ def process_ha_config_upgrade(hass: HomeAssistant) -> None: @callback def async_log_schema_error( - exc: vol.Invalid, + exc: probatio.Invalid, domain: str, config: dict, hass: HomeAssistant, @@ -355,14 +354,14 @@ def async_log_schema_error( @callback def async_log_config_validator_error( - exc: vol.Invalid | HomeAssistantError, + exc: probatio.Invalid | HomeAssistantError, domain: str, config: dict, hass: HomeAssistant, link: str | None = None, ) -> None: """Log an error from a custom config validator.""" - if isinstance(exc, vol.Invalid): + if isinstance(exc, probatio.Invalid): async_log_schema_error(exc, domain, config, hass, link) return @@ -448,16 +447,16 @@ def _relpath(hass: HomeAssistant, path: str) -> str: def stringify_invalid( hass: HomeAssistant, - exc: vol.Invalid, + exc: probatio.Invalid, domain: str, config: dict, link: str | None, max_sub_error_length: int, ) -> str: - """Stringify voluptuous.Invalid. + """Stringify probatio.Invalid. This is an alternative to the custom __str__ implemented in - voluptuous.error.Invalid. The modifications are: + probatio.error.Invalid. The modifications are: - Format the path delimited by -> instead of @data[] - Prefix with domain, file and line of the error - Suffix with a link to the documentation @@ -490,7 +489,7 @@ def stringify_invalid( f"{message_suffix}" ) # This function is an alternative to the stringification done by - # vol.Invalid.__str__, so we need to call Exception.__str__ here + # probatio.Invalid.__str__, so we need to call Exception.__str__ here # instead of str(exc) output = Exception.__str__(exc) if error_type := exc.error_type: @@ -508,7 +507,7 @@ def stringify_invalid( def humanize_error( hass: HomeAssistant, - validation_error: vol.Invalid, + validation_error: probatio.Invalid, domain: str, config: dict, link: str | None, @@ -516,10 +515,10 @@ def humanize_error( ) -> str: """Provide a more helpful + complete validation error message. - This is a modified version of voluptuous.error.Invalid.__str__, + This is a modified version of probatio.error.Invalid.__str__, the modifications make some minor changes to the formatting. """ - if isinstance(validation_error, vol.MultipleInvalid): + if isinstance(validation_error, probatio.MultipleInvalid): return "\n".join( sorted( humanize_error( @@ -564,7 +563,7 @@ def format_homeassistant_error( @callback def format_schema_error( hass: HomeAssistant, - exc: vol.Invalid, + exc: probatio.Invalid, domain: str, config: dict, link: str | None = None, @@ -588,12 +587,12 @@ def _log_pkg_error( def _identify_config_schema(module: ComponentProtocol) -> str | None: """Extract the schema and identify list or dict based.""" - if not isinstance(module.CONFIG_SCHEMA, vol.Schema): + if not isinstance(module.CONFIG_SCHEMA, probatio.Schema): return None # type: ignore[unreachable] schema = module.CONFIG_SCHEMA.schema - if isinstance(schema, vol.All): + if isinstance(schema, probatio.All): for subschema in schema.validators: if isinstance(subschema, dict): schema = subschema @@ -609,7 +608,7 @@ def _identify_config_schema(module: ComponentProtocol) -> str | None: _LOGGER.exception("Unexpected error identifying config schema") return None - if hasattr(key, "default") and not isinstance(key.default, Undefined): + if hasattr(key, "default") and not isinstance(key.default, probatio.Undefined): default_value = module.CONFIG_SCHEMA({module.DOMAIN: key.default()})[ module.DOMAIN ] @@ -671,7 +670,7 @@ async def merge_packages_config( """Merge packages into the top-level configuration. Ignores packages that cannot be setup. Mutates config. Raises - vol.Invalid if whole package config is invalid. + probatio.Invalid if whole package config is invalid. """ _PACKAGES_CONFIG_SCHEMA(packages) @@ -680,7 +679,7 @@ async def merge_packages_config( for pack_name, pack_conf in packages.items(): try: _validate_package_definition(pack_name, pack_conf) - except vol.Invalid as exc: + except probatio.Invalid as exc: _log_pkg_error( hass, pack_name, @@ -697,7 +696,7 @@ async def merge_packages_config( continue try: domain = cv.domain_key(comp_name) - except vol.Invalid: + except probatio.Invalid: _log_pkg_error( hass, pack_name, comp_name, config, f"Invalid domain '{comp_name}'" ) @@ -819,7 +818,7 @@ def _get_log_message_and_stack_print_pref( # If no pre defined log_message is set, we generate an enriched error # message, so we can notify about it during setup show_stack_trace = False - if isinstance(exception, vol.Invalid): + if isinstance(exception, probatio.Invalid): log_message = format_schema_error( hass, exception, platform_path, platform_config, link ) @@ -1025,7 +1024,7 @@ def extract_platform_integrations( for key, domain_config in config.items(): try: domain = cv.domain_key(key) - except vol.Invalid: + except probatio.Invalid: continue if domain not in domains: continue @@ -1050,7 +1049,7 @@ def extract_domain_configs(config: ConfigType, domain: str) -> Sequence[str]: """ domain_configs = [] for key in config: - with suppress(vol.Invalid): + with suppress(probatio.Invalid): if cv.domain_key(key) != domain: continue domain_configs.append(key) @@ -1096,7 +1095,7 @@ async def _async_load_and_validate_platform_integration( # Validate platform specific schema try: return platform.PLATFORM_SCHEMA(p_integration.config) # type: ignore[no-any-return] - except vol.Invalid as exc: + except probatio.Invalid as exc: exc_info = ConfigExceptionInfo( exc, ConfigErrorTranslationKey.PLATFORM_CONFIG_VALIDATION_ERR, @@ -1179,7 +1178,7 @@ async def async_process_component_config( return IntegrationConfigInfo( await config_validator.async_validate_config(hass, config), [] ) - except (vol.Invalid, HomeAssistantError) as exc: + except (probatio.Invalid, HomeAssistantError) as exc: exc_info = ConfigExceptionInfo( exc, ConfigErrorTranslationKey.CONFIG_VALIDATION_ERR, @@ -1206,7 +1205,7 @@ async def async_process_component_config( return IntegrationConfigInfo( await cv.async_validate(hass, component.CONFIG_SCHEMA, config), [] ) - except vol.Invalid as exc: + except probatio.Invalid as exc: exc_info = ConfigExceptionInfo( exc, ConfigErrorTranslationKey.CONFIG_VALIDATION_ERR, @@ -1243,7 +1242,7 @@ async def async_process_component_config( p_validated = await cv.async_validate( hass, component_platform_schema, p_config ) - except vol.Invalid as exc: + except probatio.Invalid as exc: exc_info = ConfigExceptionInfo( exc, ConfigErrorTranslationKey.PLATFORM_CONFIG_VALIDATION_ERR, diff --git a/homeassistant/config_entries.py b/homeassistant/config_entries.py index 89077df7488d5..e39a6e505c557 100644 --- a/homeassistant/config_entries.py +++ b/homeassistant/config_entries.py @@ -24,8 +24,8 @@ from typing import TYPE_CHECKING, Any, Self, TypedDict, cast, override from async_interrupt import interrupt +import probatio from propcache.api import cached_property -import voluptuous as vol from . import data_entry_flow, loader from .const import ( @@ -3618,7 +3618,7 @@ def async_show_form( self, *, step_id: str | None = None, - data_schema: vol.Schema | None = None, + data_schema: probatio.Schema | None = None, errors: dict[str, str] | None = None, description_placeholders: Mapping[str, str] | None = None, last_step: bool | None = None, diff --git a/homeassistant/core.py b/homeassistant/core.py index 5bc5f94c85e30..34fd164c47dcb 100644 --- a/homeassistant/core.py +++ b/homeassistant/core.py @@ -41,8 +41,8 @@ override, ) +import probatio from propcache.api import cached_property, under_cached_property -import voluptuous as vol from . import util from .const import ( @@ -2692,7 +2692,7 @@ def register( [ServiceCall], Coroutine[Any, Any, ServiceResponse] | ServiceResponse | None, ], - schema: vol.Schema | None = None, + schema: probatio.Schema | None = None, supports_response: SupportsResponse = SupportsResponse.NONE, ) -> None: """Register a service. @@ -2924,7 +2924,7 @@ async def async_call( if handler.schema: try: processed_data: dict[str, Any] = handler.schema(service_data) - except vol.Invalid: + except probatio.Invalid: _LOGGER.debug( "Invalid data for service call %s.%s: %s", domain, diff --git a/homeassistant/core_config.py b/homeassistant/core_config.py index 82413efcc7216..93609b2cbc328 100644 --- a/homeassistant/core_config.py +++ b/homeassistant/core_config.py @@ -10,7 +10,7 @@ from typing import TYPE_CHECKING, Any, Final, override from urllib.parse import urlparse -import voluptuous as vol +import probatio from webrtc_models import RTCConfiguration, RTCIceServer import yarl @@ -112,7 +112,7 @@ def _no_duplicate_auth_provider( for config in configs: key = (config[CONF_TYPE], config.get(CONF_ID)) if key in config_keys: - raise vol.Invalid( + raise probatio.Invalid( f"Duplicate auth provider {config[CONF_TYPE]} found. " "Please add unique IDs " "if you want to have the same auth provider twice" @@ -135,7 +135,7 @@ def _no_duplicate_auth_mfa_module( for config in configs: key = config.get(CONF_ID, config[CONF_TYPE]) if key in config_keys: - raise vol.Invalid( + raise probatio.Invalid( f"Duplicate mfa module {config[CONF_TYPE]} found. " "Please add unique IDs " "if you want to have the same mfa module twice" @@ -158,29 +158,31 @@ def _filter_bad_internal_external_urls(conf: dict) -> dict: # Schema for all packages element -_PACKAGES_CONFIG_SCHEMA = vol.Schema({cv.string: vol.Any(dict, list)}) +_PACKAGES_CONFIG_SCHEMA = probatio.Schema({cv.string: probatio.Any(dict, list)}) # Schema for individual package definition -_PACKAGE_DEFINITION_SCHEMA = vol.Schema({cv.string: vol.Any(dict, list, None)}) +_PACKAGE_DEFINITION_SCHEMA = probatio.Schema( + {cv.string: probatio.Any(dict, list, None)} +) -_CUSTOMIZE_DICT_SCHEMA = vol.Schema( +_CUSTOMIZE_DICT_SCHEMA = probatio.Schema( { - vol.Optional(ATTR_FRIENDLY_NAME): cv.string, - vol.Optional(ATTR_HIDDEN): cv.boolean, - vol.Optional(ATTR_ASSUMED_STATE): cv.boolean, + probatio.Optional(ATTR_FRIENDLY_NAME): cv.string, + probatio.Optional(ATTR_HIDDEN): cv.boolean, + probatio.Optional(ATTR_ASSUMED_STATE): cv.boolean, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -_CUSTOMIZE_CONFIG_SCHEMA = vol.Schema( +_CUSTOMIZE_CONFIG_SCHEMA = probatio.Schema( { - vol.Optional(CONF_CUSTOMIZE, default={}): vol.Schema( + probatio.Optional(CONF_CUSTOMIZE, default={}): probatio.Schema( {cv.entity_id: _CUSTOMIZE_DICT_SCHEMA} ), - vol.Optional(CONF_CUSTOMIZE_DOMAIN, default={}): vol.Schema( + probatio.Optional(CONF_CUSTOMIZE_DOMAIN, default={}): probatio.Schema( {cv.string: _CUSTOMIZE_DICT_SCHEMA} ), - vol.Optional(CONF_CUSTOMIZE_GLOB, default={}): vol.Schema( + probatio.Optional(CONF_CUSTOMIZE_GLOB, default={}): probatio.Schema( {cv.string: _CUSTOMIZE_DICT_SCHEMA} ), } @@ -243,8 +245,8 @@ def _raise_issue_if_no_country(hass: HomeAssistant, country: str | None) -> None def _validate_currency(data: Any) -> Any: try: return cv.currency(data) - except vol.InInvalid: - with suppress(vol.InInvalid): + except probatio.InInvalid: + with suppress(probatio.InInvalid): return cv.historic_currency(data) raise @@ -255,43 +257,43 @@ def validate_stun_or_turn_url(value: Any) -> str: url = urlparse(url_in) if url.scheme not in ("stun", "stuns", "turn", "turns"): - raise vol.Invalid("invalid url") + raise probatio.Invalid("invalid url") return url_in -CORE_CONFIG_SCHEMA = vol.All( +CORE_CONFIG_SCHEMA = probatio.All( _CUSTOMIZE_CONFIG_SCHEMA.extend( { - CONF_NAME: vol.Coerce(str), + CONF_NAME: probatio.Coerce(str), CONF_LATITUDE: cv.latitude, CONF_LONGITUDE: cv.longitude, - CONF_ELEVATION: vol.Coerce(int), + CONF_ELEVATION: probatio.Coerce(int), CONF_RADIUS: cv.positive_int, - vol.Remove(CONF_TEMPERATURE_UNIT): cv.temperature_unit, - CONF_UNIT_SYSTEM: vol.Any( + probatio.Remove(CONF_TEMPERATURE_UNIT): cv.temperature_unit, + CONF_UNIT_SYSTEM: probatio.Any( _CONF_UNIT_SYSTEM_METRIC, _CONF_UNIT_SYSTEM_US_CUSTOMARY, _CONF_UNIT_SYSTEM_IMPERIAL, ), CONF_TIME_ZONE: cv.time_zone, - vol.Optional(CONF_INTERNAL_URL): cv.url, - vol.Optional(CONF_EXTERNAL_URL): cv.url, - vol.Optional(CONF_ALLOWLIST_EXTERNAL_DIRS): vol.All( - cv.ensure_list, [vol.IsDir()] + probatio.Optional(CONF_INTERNAL_URL): cv.url, + probatio.Optional(CONF_EXTERNAL_URL): cv.url, + probatio.Optional(CONF_ALLOWLIST_EXTERNAL_DIRS): probatio.All( + cv.ensure_list, [probatio.IsDir()] ), - vol.Optional(LEGACY_CONF_WHITELIST_EXTERNAL_DIRS): vol.All( - cv.ensure_list, [vol.IsDir()] + probatio.Optional(LEGACY_CONF_WHITELIST_EXTERNAL_DIRS): probatio.All( + cv.ensure_list, [probatio.IsDir()] ), - vol.Optional(CONF_ALLOWLIST_EXTERNAL_URLS): vol.All( + probatio.Optional(CONF_ALLOWLIST_EXTERNAL_URLS): probatio.All( cv.ensure_list, [cv.url] ), - vol.Optional(CONF_PACKAGES, default={}): _PACKAGES_CONFIG_SCHEMA, - vol.Optional(CONF_AUTH_PROVIDERS): vol.All( + probatio.Optional(CONF_PACKAGES, default={}): _PACKAGES_CONFIG_SCHEMA, + probatio.Optional(CONF_AUTH_PROVIDERS): probatio.All( cv.ensure_list, [ auth_providers.AUTH_PROVIDER_SCHEMA.extend( { - CONF_TYPE: vol.NotIn( + CONF_TYPE: probatio.NotIn( ["insecure_example"], ( "The insecure_example auth provider" @@ -303,12 +305,12 @@ def validate_stun_or_turn_url(value: Any) -> str: ], _no_duplicate_auth_provider, ), - vol.Optional(CONF_AUTH_MFA_MODULES): vol.All( + probatio.Optional(CONF_AUTH_MFA_MODULES): probatio.All( cv.ensure_list, [ auth_mfa_modules.MULTI_FACTOR_AUTH_MODULE_SCHEMA.extend( { - CONF_TYPE: vol.NotIn( + CONF_TYPE: probatio.NotIn( ["insecure_example"], "The insecure_example mfa module is for testing only.", ) @@ -317,24 +319,26 @@ def validate_stun_or_turn_url(value: Any) -> str: ], _no_duplicate_auth_mfa_module, ), - vol.Optional(CONF_MEDIA_DIRS): cv.schema_with_slug_keys(vol.IsDir()), - vol.Remove(CONF_LEGACY_TEMPLATES): cv.boolean, - vol.Optional(CONF_CURRENCY): _validate_currency, - vol.Optional(CONF_COUNTRY): cv.country, - vol.Optional(CONF_LANGUAGE): cv.language, - vol.Optional(CONF_DEBUG): cv.boolean, - vol.Optional(CONF_WEBRTC): vol.Schema( + probatio.Optional(CONF_MEDIA_DIRS): cv.schema_with_slug_keys( + probatio.IsDir() + ), + probatio.Remove(CONF_LEGACY_TEMPLATES): cv.boolean, + probatio.Optional(CONF_CURRENCY): _validate_currency, + probatio.Optional(CONF_COUNTRY): cv.country, + probatio.Optional(CONF_LANGUAGE): cv.language, + probatio.Optional(CONF_DEBUG): cv.boolean, + probatio.Optional(CONF_WEBRTC): probatio.Schema( { - vol.Required(CONF_ICE_SERVERS): vol.All( + probatio.Required(CONF_ICE_SERVERS): probatio.All( cv.ensure_list, [ - vol.Schema( + probatio.Schema( { - vol.Required(CONF_URL): vol.All( + probatio.Required(CONF_URL): probatio.All( cv.ensure_list, [validate_stun_or_turn_url] ), - vol.Optional(CONF_USERNAME): cv.string, - vol.Optional(CONF_CREDENTIAL): cv.string, + probatio.Optional(CONF_USERNAME): cv.string, + probatio.Optional(CONF_CREDENTIAL): cv.string, } ) ], @@ -352,7 +356,7 @@ async def async_process_ha_core_config(hass: HomeAssistant, config: dict) -> Non This method is a coroutine. """ - # CORE_CONFIG_SCHEMA is not async safe since it uses vol.IsDir + # CORE_CONFIG_SCHEMA is not async safe since it uses probatio.IsDir # so we need to run it in an executor job. config = await hass.async_add_executor_job(CORE_CONFIG_SCHEMA, config) @@ -469,7 +473,7 @@ async def async_process_ha_core_config(hass: HomeAssistant, config: dict) -> Non try: pkg_cust = _CUSTOMIZE_CONFIG_SCHEMA(pkg_cust) - except vol.Invalid: + except probatio.Invalid: _LOGGER.warning("Package %s contains invalid customize", name) continue @@ -884,7 +888,7 @@ async def _async_migrate_func( "language" in owner_store.data and "language" in owner_store.data["language"] ): - with suppress(vol.InInvalid): + with suppress(probatio.InInvalid): data["language"] = cv.language( owner_store.data["language"]["language"] ) diff --git a/homeassistant/data_entry_flow.py b/homeassistant/data_entry_flow.py index deb8d5ae2226c..adcc791fb0714 100644 --- a/homeassistant/data_entry_flow.py +++ b/homeassistant/data_entry_flow.py @@ -12,7 +12,7 @@ from types import MappingProxyType from typing import Any, Generic, Required, TypedDict, TypeVar, cast -import voluptuous as vol +import probatio from .core import HomeAssistant, callback from .exceptions import HomeAssistantError @@ -87,7 +87,7 @@ class UnknownStep(FlowError): """Unknown step specified.""" -class InvalidData(vol.Invalid): +class InvalidData(probatio.Invalid): """Invalid data provided.""" def __init__( @@ -130,7 +130,7 @@ class FlowResult(TypedDict, Generic[_FlowContextT, _HandlerT], total=False): """Typed result dict.""" context: _FlowContextT - data_schema: vol.Schema | None + data_schema: probatio.Schema | None data: Mapping[str, Any] description_placeholders: Mapping[str, str] | None description: str | None @@ -155,8 +155,8 @@ class FlowResult(TypedDict, Generic[_FlowContextT, _HandlerT], total=False): def _map_error_to_schema_errors( schema_errors: dict[str, Any], - error: vol.Invalid, - data_schema: vol.Schema, + error: probatio.Invalid, + data_schema: probatio.Schema, ) -> None: """Map an error to the correct position in the schema_errors. @@ -171,7 +171,7 @@ def _map_error_to_schema_errors( if len(error_path) > 1: raise ValueError("Nested schemas are not supported") - # path_part can also be vol.Marker, but we need a string key + # path_part can also be probatio.Marker, but we need a string key path_part_str = str(path_part) schema_errors[path_part_str] = error.error_message @@ -355,12 +355,12 @@ async def _async_configure( if ( data_schema := cur_step.get("data_schema") ) is not None and user_input is not None: - data_schema = cast(vol.Schema, data_schema) + data_schema = cast(probatio.Schema, data_schema) try: user_input = data_schema(user_input) - except vol.Invalid as ex: + except probatio.Invalid as ex: raised_errors = [ex] - if isinstance(ex, vol.MultipleInvalid): + if isinstance(ex, probatio.MultipleInvalid): raised_errors = ex.errors schema_errors: dict[str, Any] = {} @@ -666,8 +666,8 @@ def show_advanced_options(self) -> bool: return True def add_suggested_values_to_schema( - self, data_schema: vol.Schema, suggested_values: Mapping[str, Any] | None - ) -> vol.Schema: + self, data_schema: probatio.Schema, suggested_values: Mapping[str, Any] | None + ) -> probatio.Schema: """Make a copy of the schema, populated with suggested values. For each schema marker matching items in `suggested_values`, @@ -694,20 +694,20 @@ def add_suggested_values_to_schema( if ( suggested_values and key in suggested_values - and isinstance(key, vol.Marker) + and isinstance(key, probatio.Marker) ): # Copy the marker to not modify the flow schema new_key = copy.copy(key) new_key.description = {"suggested_value": suggested_values[key.schema]} schema[new_key] = val - return vol.Schema(schema) + return probatio.Schema(schema) @callback def async_show_form( self, *, step_id: str | None = None, - data_schema: vol.Schema | None = None, + data_schema: probatio.Schema | None = None, errors: dict[str, str] | None = None, description_placeholders: Mapping[str, str] | None = None, last_step: bool | None = None, @@ -891,7 +891,7 @@ def async_show_menu( type=FlowResultType.MENU, flow_id=self.flow_id, handler=self.handler, - data_schema=vol.Schema({"next_step_id": vol.In(menu_options)}), + data_schema=probatio.Schema({"next_step_id": probatio.In(menu_options)}), menu_options=menu_options, description_placeholders=description_placeholders, ) @@ -939,14 +939,14 @@ class SectionConfig(TypedDict, total=False): class section: """Data entry flow section.""" - CONFIG_SCHEMA = vol.Schema( + CONFIG_SCHEMA = probatio.Schema( { - vol.Optional("collapsed", default=False): bool, + probatio.Optional("collapsed", default=False): bool, }, ) def __init__( - self, schema: vol.Schema, options: SectionConfig | None = None + self, schema: probatio.Schema, options: SectionConfig | None = None ) -> None: """Initialize.""" self.schema = schema diff --git a/homeassistant/helpers/automation.py b/homeassistant/helpers/automation.py index 4b1199e48a9ce..98e4c8b59e40e 100644 --- a/homeassistant/helpers/automation.py +++ b/homeassistant/helpers/automation.py @@ -5,7 +5,7 @@ from enum import Enum from typing import Any, Final, Self -import voluptuous as vol +import probatio from homeassistant.const import CONF_OPTIONS from homeassistant.core import HomeAssistant, split_entity_id @@ -78,7 +78,7 @@ def get_relative_description_key(domain: str, key: str) -> str: def move_top_level_schema_fields_to_options( - config: ConfigType, options_schema_dict: dict[vol.Marker, Any] + config: ConfigType, options_schema_dict: dict[probatio.Marker, Any] ) -> ConfigType: """Move top-level fields to options. @@ -102,7 +102,7 @@ def move_top_level_schema_fields_to_options( def move_options_fields_to_top_level( - config: ConfigType, base_schema: vol.Schema + config: ConfigType, base_schema: probatio.Schema ) -> ConfigType: """Move options fields to top-level. @@ -128,7 +128,7 @@ def move_options_fields_to_top_level( try: new_config = base_schema(new_config) - except vol.Invalid: + except probatio.Invalid: return config new_config.update(options) diff --git a/homeassistant/helpers/check_config.py b/homeassistant/helpers/check_config.py index c7f302a41f690..fecbf8424d785 100644 --- a/homeassistant/helpers/check_config.py +++ b/homeassistant/helpers/check_config.py @@ -7,7 +7,7 @@ from typing import NamedTuple, Self from annotatedyaml import loader as yaml_loader -import voluptuous as vol +import probatio from homeassistant import loader from homeassistant.config import ( # type: ignore[attr-defined] @@ -114,13 +114,13 @@ def _pack_error( result.add_warning(message, domain, pack_config) def _comp_error( - ex: vol.Invalid | HomeAssistantError, + ex: probatio.Invalid | HomeAssistantError, domain: str, component_config: ConfigType, config_to_attach: ConfigType, ) -> None: """Handle errors from components.""" - if isinstance(ex, vol.Invalid): + if isinstance(ex, probatio.Invalid): message = format_schema_error(hass, ex, domain, component_config) else: message = format_homeassistant_error(hass, ex, domain, component_config) @@ -173,7 +173,7 @@ async def _get_integration( await merge_packages_config( hass, config, core_config.get(CONF_PACKAGES, {}), _pack_error ) - except vol.Invalid as err: + except probatio.Invalid as err: result.add_error( format_schema_error(hass, err, HOMEASSISTANT_DOMAIN, core_config), HOMEASSISTANT_DOMAIN, @@ -224,7 +224,7 @@ async def _get_integration( await config_validator.async_validate_config(hass, config) )[domain] continue - except (vol.Invalid, HomeAssistantError) as ex: + except (probatio.Invalid, HomeAssistantError) as ex: _comp_error(ex, domain, config, config[domain]) continue except Exception as err: @@ -245,7 +245,7 @@ async def _get_integration( # Don't fail if the validator removed the domain from the config if domain in validated_config: result[domain] = validated_config[domain] - except vol.Invalid as ex: + except probatio.Invalid as ex: _comp_error(ex, domain, config, config[domain]) continue @@ -265,7 +265,7 @@ async def _get_integration( p_validated = await cv.async_validate( hass, component_platform_schema, p_config ) - except vol.Invalid as ex: + except probatio.Invalid as ex: _comp_error(ex, domain, p_config, p_config) continue @@ -305,7 +305,7 @@ async def _get_integration( if platform_schema is not None: try: p_validated = platform_schema(p_validated) - except vol.Invalid as ex: + except probatio.Invalid as ex: _comp_error(ex, f"{domain}.{p_name}", p_config, p_config) continue diff --git a/homeassistant/helpers/collection.py b/homeassistant/helpers/collection.py index 3a8c8186f78cd..07d089b115929 100644 --- a/homeassistant/helpers/collection.py +++ b/homeassistant/helpers/collection.py @@ -11,8 +11,8 @@ from operator import attrgetter from typing import Any, TypedDict, override -import voluptuous as vol -from voluptuous.humanize import humanize_error +import probatio +from probatio.humanize import humanize_error from homeassistant.components import websocket_api from homeassistant.const import CONF_ID @@ -590,7 +590,7 @@ def async_setup(self, hass: HomeAssistant) -> None: f"{self.api_prefix}/list", list_handler, websocket_api.BASE_COMMAND_MESSAGE_SCHEMA.extend( - {vol.Required("type"): f"{self.api_prefix}/list"} + {probatio.Required("type"): f"{self.api_prefix}/list"} ), ) @@ -603,7 +603,7 @@ def async_setup(self, hass: HomeAssistant) -> None: websocket_api.BASE_COMMAND_MESSAGE_SCHEMA.extend( { **self.create_schema, - vol.Required("type"): f"{self.api_prefix}/create", + probatio.Required("type"): f"{self.api_prefix}/create", } ), ) @@ -613,7 +613,7 @@ def async_setup(self, hass: HomeAssistant) -> None: f"{self.api_prefix}/subscribe", subscribe_handler, websocket_api.BASE_COMMAND_MESSAGE_SCHEMA.extend( - {vol.Required("type"): f"{self.api_prefix}/subscribe"} + {probatio.Required("type"): f"{self.api_prefix}/subscribe"} ), ) @@ -626,8 +626,8 @@ def async_setup(self, hass: HomeAssistant) -> None: websocket_api.BASE_COMMAND_MESSAGE_SCHEMA.extend( { **self.update_schema, - vol.Required("type"): f"{self.api_prefix}/update", - vol.Required(self.item_id_key): str, + probatio.Required("type"): f"{self.api_prefix}/update", + probatio.Required(self.item_id_key): str, } ), ) @@ -640,8 +640,8 @@ def async_setup(self, hass: HomeAssistant) -> None: ), websocket_api.BASE_COMMAND_MESSAGE_SCHEMA.extend( { - vol.Required("type"): f"{self.api_prefix}/delete", - vol.Required(self.item_id_key): str, + probatio.Required("type"): f"{self.api_prefix}/delete", + probatio.Required(self.item_id_key): str, } ), ) @@ -663,7 +663,7 @@ async def ws_create_item( data.pop("type") item = await self.storage_collection.async_create_item(data) connection.send_result(msg["id"], item) - except vol.Invalid as err: + except probatio.Invalid as err: connection.send_error( msg["id"], websocket_api.ERR_INVALID_FORMAT, @@ -740,7 +740,7 @@ async def ws_update_item( websocket_api.ERR_NOT_FOUND, f"Unable to find {self.item_id_key} {item_id}", ) - except vol.Invalid as err: + except probatio.Invalid as err: connection.send_error( msg["id"], websocket_api.ERR_INVALID_FORMAT, diff --git a/homeassistant/helpers/condition.py b/homeassistant/helpers/condition.py index b373d5dd4a6f8..dae7d54c82fd6 100644 --- a/homeassistant/helpers/condition.py +++ b/homeassistant/helpers/condition.py @@ -26,7 +26,7 @@ override, ) -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_ABOVE, @@ -162,33 +162,33 @@ # Basic schemas to sanity check the condition descriptions, # full validation is done by hassfest.conditions -_FIELD_DESCRIPTION_SCHEMA = vol.Schema( +_FIELD_DESCRIPTION_SCHEMA = probatio.Schema( { - vol.Optional(CONF_SELECTOR): selector.validate_selector, + probatio.Optional(CONF_SELECTOR): selector.validate_selector, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -_CONDITION_DESCRIPTION_SCHEMA = vol.Schema( +_CONDITION_DESCRIPTION_SCHEMA = probatio.Schema( { - vol.Optional("target"): TargetSelector.CONFIG_SCHEMA, - vol.Optional("fields"): vol.Schema({str: _FIELD_DESCRIPTION_SCHEMA}), + probatio.Optional("target"): TargetSelector.CONFIG_SCHEMA, + probatio.Optional("fields"): probatio.Schema({str: _FIELD_DESCRIPTION_SCHEMA}), }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) def starts_with_dot(key: str) -> str: """Check if key starts with dot.""" if not key.startswith("."): - raise vol.Invalid("Key does not start with .") + raise probatio.Invalid("Key does not start with .") return key -_CONDITIONS_DESCRIPTION_SCHEMA = vol.Schema( +_CONDITIONS_DESCRIPTION_SCHEMA = probatio.Schema( { - vol.Remove(vol.All(str, starts_with_dot)): object, - cv.underscore_slug: vol.Any(None, _CONDITION_DESCRIPTION_SCHEMA), + probatio.Remove(probatio.All(str, starts_with_dot)): object, + cv.underscore_slug: probatio.Any(None, _CONDITION_DESCRIPTION_SCHEMA), } ) @@ -265,16 +265,16 @@ async def _register_condition_platform( _LOGGER.exception("Error while notifying condition platform listener") -_CONDITION_BASE_SCHEMA = vol.Schema( +_CONDITION_BASE_SCHEMA = probatio.Schema( { **cv.CONDITION_BASE_SCHEMA, - vol.Required(CONF_CONDITION): str, + probatio.Required(CONF_CONDITION): str, } ) _CONDITION_SCHEMA = _CONDITION_BASE_SCHEMA.extend( { - vol.Optional(CONF_OPTIONS): object, - vol.Optional(CONF_TARGET): cv.TARGET_FIELDS, + probatio.Optional(CONF_OPTIONS): object, + probatio.Optional(CONF_TARGET): cv.TARGET_FIELDS, } ) @@ -436,14 +436,14 @@ def __init__(self, hass: HomeAssistant, config: ConditionConfig) -> None: BEHAVIOR_ANY: Final = "any" BEHAVIOR_ALL: Final = "all" -ENTITY_STATE_CONDITION_SCHEMA_ANY_ALL = vol.Schema( +ENTITY_STATE_CONDITION_SCHEMA_ANY_ALL = probatio.Schema( { - vol.Required(CONF_TARGET): cv.TARGET_FIELDS, - vol.Required(CONF_OPTIONS, default={}): { - vol.Required(ATTR_BEHAVIOR, default=BEHAVIOR_ANY): vol.In( + probatio.Required(CONF_TARGET): cv.TARGET_FIELDS, + probatio.Required(CONF_OPTIONS, default={}): { + probatio.Required(ATTR_BEHAVIOR, default=BEHAVIOR_ANY): probatio.In( [BEHAVIOR_ANY, BEHAVIOR_ALL] ), - vol.Optional(CONF_FOR): cv.positive_time_period, + probatio.Optional(CONF_FOR): cv.positive_time_period, }, } ) @@ -537,7 +537,7 @@ class EntityConditionBase(Condition): _excluded_states: Final[frozenset[str]] = frozenset( {STATE_UNAVAILABLE, STATE_UNKNOWN} ) - _schema: vol.Schema = ENTITY_STATE_CONDITION_SCHEMA_ANY_ALL + _schema: probatio.Schema = ENTITY_STATE_CONDITION_SCHEMA_ANY_ALL # When True, indirect target expansion (via device/area/floor) skips # entities with an entity_category. _primary_entities_only: ClassVar[bool] = True @@ -942,8 +942,8 @@ class CustomCondition(EntityStateConditionBase): NUMERICAL_CONDITION_SCHEMA = ENTITY_STATE_CONDITION_SCHEMA_ANY_ALL.extend( { - vol.Required(CONF_OPTIONS): { - vol.Required("threshold"): NumericThresholdSelector( + probatio.Required(CONF_OPTIONS): { + probatio.Required("threshold"): NumericThresholdSelector( NumericThresholdSelectorConfig(mode=NumericThresholdMode.IS) ), }, @@ -1065,12 +1065,12 @@ class CustomCondition(EntityNumericalConditionBase): def _make_numerical_condition_with_unit_schema( unit_converter: type[BaseUnitConverter], -) -> vol.Schema: +) -> probatio.Schema: """Factory for numerical condition schema with unit option.""" return ENTITY_STATE_CONDITION_SCHEMA_ANY_ALL.extend( { - vol.Required(CONF_OPTIONS): { - vol.Required("threshold"): NumericThresholdSelector( + probatio.Required(CONF_OPTIONS): { + probatio.Required("threshold"): NumericThresholdSelector( NumericThresholdSelectorConfig( mode=NumericThresholdMode.IS, unit_of_measurement=list(unit_converter.VALID_UNITS), @@ -1746,7 +1746,7 @@ def state( for_period = cv.positive_time_period(render_complex(for_period, variables)) except TemplateError as ex: raise ConditionErrorMessage("state", f"template error: {ex}") from ex - except vol.Invalid as ex: + except probatio.Invalid as ex: raise ConditionErrorMessage("state", f"schema error: {ex}") from ex duration = dt_util.utcnow() - cast(timedelta, for_period) @@ -2014,7 +2014,7 @@ async def async_validate_condition_config( platform_domain, condition_key ) if not (condition_class := condition_descriptors.get(relative_condition_key)): - raise vol.Invalid(f"Invalid condition '{condition_key}' specified") + raise probatio.Invalid(f"Invalid condition '{condition_key}' specified") return await condition_class.async_validate_complete_config(hass, config) config = move_options_fields_to_top_level(config, _CONDITION_BASE_SCHEMA) @@ -2257,7 +2257,7 @@ def _load_conditions_file(integration: Integration) -> dict[str, Any]: "Unable to find conditions.yaml for the %s integration", integration.domain ) return {} - except (HomeAssistantError, vol.Invalid) as ex: + except (HomeAssistantError, probatio.Invalid) as ex: _LOGGER.warning( "Unable to parse conditions.yaml for the %s integration: %s", integration.domain, diff --git a/homeassistant/helpers/config_entry_oauth2_flow.py b/homeassistant/helpers/config_entry_oauth2_flow.py index 95926ea7b7643..04d5c6313bb03 100644 --- a/homeassistant/helpers/config_entry_oauth2_flow.py +++ b/homeassistant/helpers/config_entry_oauth2_flow.py @@ -23,7 +23,7 @@ from habluetooth import BluetoothServiceInfoBleak import jwt from multidict import CIMultiDict -import voluptuous as vol +import probatio from yarl import URL from homeassistant import config_entries @@ -548,11 +548,13 @@ async def async_step_pick_implementation( return self.async_show_form( step_id="pick_implementation", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( "implementation", default=list(implementations)[0] - ): vol.In({key: impl.name for key, impl in implementations.items()}) + ): probatio.In( + {key: impl.name for key, impl in implementations.items()} + ) } ), ) diff --git a/homeassistant/helpers/config_validation.py b/homeassistant/helpers/config_validation.py index b68ffa82f1ac5..ae5763a27e7c6 100644 --- a/homeassistant/helpers/config_validation.py +++ b/homeassistant/helpers/config_validation.py @@ -1,4 +1,4 @@ -"""Helpers for config validation using voluptuous.""" +"""Helpers for config validation using probatio.""" from collections.abc import Callable, Hashable, Mapping import contextlib @@ -23,8 +23,7 @@ from urllib.parse import urlparse from uuid import UUID -from probatio import UNSUPPORTED, to_field_list -import voluptuous as vol +import probatio from homeassistant.const import ( ATTR_AREA_ID, @@ -181,30 +180,32 @@ class UrlProtocolSchema(StrEnum): ) # Home Assistant types -byte = vol.All(vol.Coerce(int), vol.Range(min=0, max=255)) -small_float = vol.All(vol.Coerce(float), vol.Range(min=0, max=1)) -positive_int = vol.All(vol.Coerce(int), vol.Range(min=0)) -positive_float = vol.All(vol.Coerce(float), vol.Range(min=0)) -latitude = vol.All( - vol.Coerce(float), vol.Range(min=-90, max=90), msg="invalid latitude" +byte = probatio.All(probatio.Coerce(int), probatio.Range(min=0, max=255)) +small_float = probatio.All(probatio.Coerce(float), probatio.Range(min=0, max=1)) +positive_int = probatio.All(probatio.Coerce(int), probatio.Range(min=0)) +positive_float = probatio.All(probatio.Coerce(float), probatio.Range(min=0)) +latitude = probatio.All( + probatio.Coerce(float), probatio.Range(min=-90, max=90), msg="invalid latitude" ) -longitude = vol.All( - vol.Coerce(float), vol.Range(min=-180, max=180), msg="invalid longitude" +longitude = probatio.All( + probatio.Coerce(float), probatio.Range(min=-180, max=180), msg="invalid longitude" ) -gps = vol.ExactSequence([latitude, longitude]) -sun_event = vol.All(vol.Lower, vol.Any(SUN_EVENT_SUNSET, SUN_EVENT_SUNRISE)) -port = vol.All(vol.Coerce(int), vol.Range(min=1, max=65535)) +gps = probatio.ExactSequence([latitude, longitude]) +sun_event = probatio.All( + probatio.Lower, probatio.Any(SUN_EVENT_SUNSET, SUN_EVENT_SUNRISE) +) +port = probatio.All(probatio.Coerce(int), probatio.Range(min=1, max=65535)) def path(value: Any) -> str: """Validate it's a safe path.""" if not isinstance(value, str): - raise vol.Invalid("Expected a string") + raise probatio.Invalid("Expected a string") try: raise_if_invalid_path(value) except ValueError as err: - raise vol.Invalid("Invalid path") from err + raise probatio.Invalid("Invalid path") from err return value @@ -218,12 +219,12 @@ def has_at_least_one_key(*keys: Any) -> Callable[[dict], dict]: def validate(obj: dict) -> dict: """Test keys exist in dict.""" if not isinstance(obj, dict): - raise vol.Invalid("expected dictionary") + raise probatio.Invalid("expected dictionary") if not key_set.isdisjoint(obj): return obj expected = ", ".join(str(k) for k in keys) - raise vol.Invalid(f"must contain at least one of {expected}.") + raise probatio.Invalid(f"must contain at least one of {expected}.") return validate @@ -234,11 +235,11 @@ def has_at_most_one_key(*keys: Any) -> Callable[[dict], dict]: def validate(obj: dict) -> dict: """Test zero keys exist or one key exists in dict.""" if not isinstance(obj, dict): - raise vol.Invalid("expected dictionary") + raise probatio.Invalid("expected dictionary") if len(set(keys) & set(obj)) > 1: expected = ", ".join(str(k) for k in keys) - raise vol.Invalid(f"must contain at most one of {expected}.") + raise probatio.Invalid(f"must contain at most one of {expected}.") return obj return validate @@ -257,7 +258,7 @@ def boolean(value: Any) -> bool: elif isinstance(value, Number): # type ignore: https://github.com/python/mypy/issues/3186 return value != 0 # type: ignore[comparison-overlap] - raise vol.Invalid(f"invalid boolean value {value}") + raise probatio.Invalid(f"invalid boolean value {value}") def whitespace(value: Any) -> str: @@ -265,7 +266,7 @@ def whitespace(value: Any) -> str: if isinstance(value, str) and (value == "" or value.isspace()): return value - raise vol.Invalid(f"contains non-whitespace: {value}") + raise probatio.Invalid(f"contains non-whitespace: {value}") @not_async_friendly @@ -275,7 +276,7 @@ def isdevice(value: Any) -> str: os.stat(value) return str(value) except OSError as err: - raise vol.Invalid(f"No device at {value} found") from err + raise probatio.Invalid(f"No device at {value} found") from err def matches_regex(regex: str) -> Callable[[Any], str]: @@ -285,10 +286,10 @@ def matches_regex(regex: str) -> Callable[[Any], str]: def validator(value: Any) -> str: """Validate that value matches the given regex.""" if not isinstance(value, str): - raise vol.Invalid(f"not a string value: {value}") + raise probatio.Invalid(f"not a string value: {value}") if not compiled.match(value): - raise vol.Invalid( + raise probatio.Invalid( f"value {value} does not match regular expression {compiled.pattern}" ) @@ -302,11 +303,13 @@ def is_regex(value: Any) -> re.Pattern[Any]: try: r = re.compile(value) except TypeError as err: - raise vol.Invalid( + raise probatio.Invalid( f"value {value} is of the wrong type for a regular expression" ) from err except re.error as err: - raise vol.Invalid(f"value {value} is not a valid regular expression") from err + raise probatio.Invalid( + f"value {value} is not a valid regular expression" + ) from err return r @@ -314,13 +317,13 @@ def is_regex(value: Any) -> re.Pattern[Any]: def isfile(value: Any) -> str: """Validate that the value is an existing file.""" if value is None: - raise vol.Invalid("None is not file") + raise probatio.Invalid("None is not file") file_in = os.path.expanduser(str(value)) if not os.path.isfile(file_in): - raise vol.Invalid("not a file") + raise probatio.Invalid("not a file") if not os.access(file_in, os.R_OK): - raise vol.Invalid("file not readable") + raise probatio.Invalid("file not readable") return file_in @@ -328,13 +331,13 @@ def isfile(value: Any) -> str: def isdir(value: Any) -> str: """Validate that the value is an existing dir.""" if value is None: - raise vol.Invalid("not a directory") + raise probatio.Invalid("not a directory") dir_in = os.path.expanduser(str(value)) if not os.path.isdir(dir_in): - raise vol.Invalid("not a directory") + raise probatio.Invalid("not a directory") if not os.access(dir_in, os.R_OK): - raise vol.Invalid("directory not readable") + raise probatio.Invalid("directory not readable") return dir_in @@ -369,33 +372,35 @@ def entity_id(value: Any) -> str: if valid_entity_id(str_value): return str_value - raise vol.Invalid(f"Entity ID {value} is an invalid entity ID") + raise probatio.Invalid(f"Entity ID {value} is an invalid entity ID") def strict_entity_id(value: Any) -> str: """Validate Entity ID, strictly.""" if not isinstance(value, str): - raise vol.Invalid(f"Entity ID {value} is not a string") + raise probatio.Invalid(f"Entity ID {value} is not a string") if valid_entity_id(value): return value - raise vol.Invalid(f"Entity ID {value} is not a valid entity ID") + raise probatio.Invalid(f"Entity ID {value} is not a valid entity ID") def entity_id_or_uuid(value: Any) -> str: """Validate Entity specified by entity_id or uuid.""" - with contextlib.suppress(vol.Invalid): + with contextlib.suppress(probatio.Invalid): return entity_id(value) - with contextlib.suppress(vol.Invalid): + with contextlib.suppress(probatio.Invalid): return fake_uuid4_hex(value) - raise vol.Invalid(f"Entity {value} is neither a valid entity ID nor a valid UUID") + raise probatio.Invalid( + f"Entity {value} is neither a valid entity ID nor a valid UUID" + ) def _entity_ids(value: str | list, allow_uuid: bool) -> list[str]: """Help validate entity IDs or UUIDs.""" if value is None: - raise vol.Invalid("Entity IDs cannot be None") + raise probatio.Invalid("Entity IDs cannot be None") if isinstance(value, str): value = [ent_id.strip() for ent_id in value.split(",")] @@ -413,13 +418,14 @@ def entity_ids_or_uuids(value: str | list) -> list[str]: return _entity_ids(value, True) -comp_entity_ids = vol.Any( - vol.All(vol.Lower, vol.Any(ENTITY_MATCH_ALL, ENTITY_MATCH_NONE)), entity_ids +comp_entity_ids = probatio.Any( + probatio.All(probatio.Lower, probatio.Any(ENTITY_MATCH_ALL, ENTITY_MATCH_NONE)), + entity_ids, ) -comp_entity_ids_or_uuids = vol.Any( - vol.All(vol.Lower, vol.Any(ENTITY_MATCH_ALL, ENTITY_MATCH_NONE)), +comp_entity_ids_or_uuids = probatio.Any( + probatio.All(probatio.Lower, probatio.Any(ENTITY_MATCH_ALL, ENTITY_MATCH_NONE)), entity_ids_or_uuids, ) @@ -439,12 +445,12 @@ def domain_key(config_key: Any) -> str: """ if not isinstance(config_key, str): - raise vol.Invalid("invalid domain", path=[config_key]) + raise probatio.Invalid("invalid domain", path=[config_key]) parts = config_key.partition(" ") _domain = parts[0] if parts[2].strip(" ") else config_key if not _domain or _domain.strip(" ") != _domain: - raise vol.Invalid("invalid domain", path=[config_key]) + raise probatio.Invalid("invalid domain", path=[config_key]) return _domain @@ -457,7 +463,7 @@ def validate(value: str) -> str: """Test if entity domain is domain.""" validated = ent_domain(value) if len(validated) != 1: - raise vol.Invalid(f"Expected exactly 1 entity, got {len(validated)}") + raise probatio.Invalid(f"Expected exactly 1 entity, got {len(validated)}") return validated[0] return validate @@ -480,7 +486,7 @@ def validate(values: str | list) -> list[str]: values = entity_ids(values) for ent_id in values: if check_invalid(split_entity_id(ent_id)[0]): - raise vol.Invalid( + raise probatio.Invalid( f"Entity ID '{ent_id}' does not belong to domain '{domain}'" ) return values @@ -488,9 +494,9 @@ def validate(values: str | list) -> list[str]: return validate -def enum(enumClass: type[Enum]) -> vol.All: +def enum(enumClass: type[Enum]) -> probatio.All: """Create validator for specified enum.""" - return vol.All(vol.In(enumClass.__members__), enumClass.__getitem__) + return probatio.All(probatio.In(enumClass.__members__), enumClass.__getitem__) def icon(value: Any) -> str: @@ -500,7 +506,7 @@ def icon(value: Any) -> str: if ":" in str_value: return str_value - raise vol.Invalid('Icons should be specified in the form "prefix:name"') + raise probatio.Invalid('Icons should be specified in the form "prefix:name"') _COLOR_HEX = re.compile(r"^#[0-9A-F]{6}$", re.IGNORECASE) @@ -511,22 +517,22 @@ def color_hex(value: Any) -> str: str_value = str(value) if not _COLOR_HEX.match(str_value): - raise vol.Invalid("Color should be in the format #RRGGBB") + raise probatio.Invalid("Color should be in the format #RRGGBB") return str_value _TIME_PERIOD_DICT_KEYS = ("days", "hours", "minutes", "seconds", "milliseconds") -time_period_dict = vol.All( +time_period_dict = probatio.All( dict, - vol.Schema( + probatio.Schema( { - "days": vol.Coerce(float), - "hours": vol.Coerce(float), - "minutes": vol.Coerce(float), - "seconds": vol.Coerce(float), - "milliseconds": vol.Coerce(float), + "days": probatio.Coerce(float), + "hours": probatio.Coerce(float), + "minutes": probatio.Coerce(float), + "seconds": probatio.Coerce(float), + "milliseconds": probatio.Coerce(float), } ), has_at_least_one_key(*_TIME_PERIOD_DICT_KEYS), @@ -542,10 +548,10 @@ def time(value: Any) -> time_sys: try: time_val = dt_util.parse_time(value) except TypeError as err: - raise vol.Invalid("Not a parseable type") from err + raise probatio.Invalid("Not a parseable type") from err if time_val is None: - raise vol.Invalid(f"Invalid time specified: {value}") + raise probatio.Invalid(f"Invalid time specified: {value}") return time_val @@ -558,10 +564,10 @@ def date(value: Any) -> date_sys: try: date_val = dt_util.parse_date(value) except TypeError as err: - raise vol.Invalid("Not a parseable type") from err + raise probatio.Invalid("Not a parseable type") from err if date_val is None: - raise vol.Invalid("Could not parse date") + raise probatio.Invalid("Could not parse date") return date_val @@ -569,9 +575,9 @@ def date(value: Any) -> date_sys: def time_period_str(value: str) -> timedelta: """Validate and transform time offset.""" if isinstance(value, int): # type: ignore[unreachable] - raise vol.Invalid("Make sure you wrap time values in quotes") + raise probatio.Invalid("Make sure you wrap time values in quotes") if not isinstance(value, str): - raise vol.Invalid(TIME_PERIOD_ERROR.format(value)) + raise probatio.Invalid(TIME_PERIOD_ERROR.format(value)) negative_offset = False if value.startswith("-"): @@ -582,7 +588,7 @@ def time_period_str(value: str) -> timedelta: parsed = value.split(":") if len(parsed) not in (2, 3): - raise vol.Invalid(TIME_PERIOD_ERROR.format(value)) + raise probatio.Invalid(TIME_PERIOD_ERROR.format(value)) try: hour = int(parsed[0]) minute = int(parsed[1]) @@ -591,7 +597,7 @@ def time_period_str(value: str) -> timedelta: except IndexError: second = 0 except ValueError as err: - raise vol.Invalid(TIME_PERIOD_ERROR.format(value)) from err + raise probatio.Invalid(TIME_PERIOD_ERROR.format(value)) from err offset = timedelta(hours=hour, minutes=minute, seconds=second) @@ -606,10 +612,12 @@ def time_period_seconds(value: float | str) -> timedelta: try: return timedelta(seconds=float(value)) except (ValueError, TypeError) as err: - raise vol.Invalid(f"Expected seconds, got {value}") from err + raise probatio.Invalid(f"Expected seconds, got {value}") from err -time_period = vol.Any(time_period_str, time_period_seconds, timedelta, time_period_dict) +time_period = probatio.Any( + time_period_str, time_period_seconds, timedelta, time_period_dict +) def match_all[_T](value: _T) -> _T: @@ -620,12 +628,12 @@ def match_all[_T](value: _T) -> _T: def positive_timedelta(value: timedelta) -> timedelta: """Validate timedelta is positive.""" if value < timedelta(0): - raise vol.Invalid("Time period should be positive") + raise probatio.Invalid("Time period should be positive") return value -positive_time_period_dict = vol.All(time_period_dict, positive_timedelta) -positive_time_period = vol.All(time_period, positive_timedelta) +positive_time_period_dict = probatio.All(time_period_dict, positive_timedelta) +positive_time_period = probatio.All(time_period, positive_timedelta) def remove_falsy[_T](value: list[_T]) -> list[_T]: @@ -640,18 +648,18 @@ def service(value: Any) -> str: if valid_entity_id(str_value): return str_value - raise vol.Invalid(f"Service {value} does not match format .") + raise probatio.Invalid(f"Service {value} does not match format .") def slug(value: Any) -> str: """Validate value is a valid slug.""" if value is None: - raise vol.Invalid("Slug should not be None") + raise probatio.Invalid("Slug should not be None") str_value = str(value) slg = util_slugify(str_value) if str_value == slg: return str_value - raise vol.Invalid(f"invalid slug {value} (try {slg})") + raise probatio.Invalid(f"invalid slug {value} (try {slg})") def underscore_slug(value: Any) -> str: @@ -666,15 +674,15 @@ def schema_with_slug_keys( ) -> Callable: """Ensure dicts have slugs as keys. - Replacement of vol.Schema({cv.slug: value_schema}) to prevent misleading - "Extra keys" errors from voluptuous. + Replacement of probatio.Schema({cv.slug: value_schema}) to prevent misleading + "Extra keys" errors from probatio. """ - schema = vol.Schema({str: value_schema}) + schema = probatio.Schema({str: value_schema}) def verify(value: dict) -> dict: """Validate all keys are slugs and then the value_schema.""" if not isinstance(value, dict): - raise vol.Invalid("expected dictionary") + raise probatio.Invalid("expected dictionary") for key in value: slug_validator(key) @@ -687,17 +695,17 @@ def verify(value: dict) -> dict: def slugify(value: Any) -> str: """Coerce a value to a slug.""" if value is None: - raise vol.Invalid("Slug should not be None") + raise probatio.Invalid("Slug should not be None") slg = util_slugify(str(value)) if slg: return slg - raise vol.Invalid(f"Unable to slugify {value}") + raise probatio.Invalid(f"Unable to slugify {value}") def string(value: Any) -> str: """Coerce value to string, except for None, list or dict.""" if value is None: - raise vol.Invalid("string value is None") + raise probatio.Invalid("string value is None") # This is expected to be the most common case, so check it first. if type(value) is str or type(value) is NodeStrClass or isinstance(value, str): @@ -707,7 +715,7 @@ def string(value: Any) -> str: value = value.render_result elif isinstance(value, (list, dict)): - raise vol.Invalid("value should be a string") + raise probatio.Invalid("value should be a string") return str(value) @@ -717,7 +725,7 @@ def string_with_no_html(value: Any) -> str: value = string(value) regex = re.compile(r"<[a-z].*?>", re.IGNORECASE) if regex.search(value): - raise vol.Invalid("the string should not contain HTML") + raise probatio.Invalid("the string should not contain HTML") return str(value) @@ -728,44 +736,44 @@ def temperature_unit(value: Any) -> UnitOfTemperature: return UnitOfTemperature.CELSIUS if value == "F": return UnitOfTemperature.FAHRENHEIT - raise vol.Invalid("invalid temperature unit (expected C or F)") + raise probatio.Invalid("invalid temperature unit (expected C or F)") def template(value: Any) -> template_helper.Template: """Validate a jinja2 template.""" if value is None: - raise vol.Invalid("template value is None") + raise probatio.Invalid("template value is None") if isinstance(value, (list, dict, template_helper.Template)): - raise vol.Invalid("template value should be a string") + raise probatio.Invalid("template value should be a string") if not (hass := _async_get_hass_or_none()): - raise vol.Invalid("Validates schema outside the event loop") + raise probatio.Invalid("Validates schema outside the event loop") template_value = template_helper.Template(str(value), hass) try: template_value.ensure_valid() except TemplateError as ex: - raise vol.Invalid(f"invalid template ({ex})") from ex + raise probatio.Invalid(f"invalid template ({ex})") from ex return template_value def dynamic_template(value: Any) -> template_helper.Template: """Validate a dynamic (non static) jinja2 template.""" if value is None: - raise vol.Invalid("template value is None") + raise probatio.Invalid("template value is None") if isinstance(value, (list, dict, template_helper.Template)): - raise vol.Invalid("template value should be a string") + raise probatio.Invalid("template value should be a string") if not template_helper.is_template_string(str(value)): - raise vol.Invalid("template value does not contain a dynamic template") + raise probatio.Invalid("template value does not contain a dynamic template") if not (hass := _async_get_hass_or_none()): - raise vol.Invalid("Validates schema outside the event loop") + raise probatio.Invalid("Validates schema outside the event loop") template_value = template_helper.Template(str(value), hass) try: template_value.ensure_valid() except TemplateError as ex: - raise vol.Invalid(f"invalid template ({ex})") from ex + raise probatio.Invalid(f"invalid template ({ex})") from ex return template_value @@ -790,20 +798,20 @@ def template_complex(value: Any) -> Any: def _positive_time_period_template_complex(value: Any) -> Any: """Do basic validation of a positive time period expressed as a templated dict.""" if not isinstance(value, dict) or not value: - raise vol.Invalid("template should be a dict") + raise probatio.Invalid("template should be a dict") for key, element in value.items(): if not isinstance(key, str): - raise vol.Invalid("key should be a string") + raise probatio.Invalid("key should be a string") if not template_helper.is_template_string(key): - vol.In(_TIME_PERIOD_DICT_KEYS)(key) + probatio.In(_TIME_PERIOD_DICT_KEYS)(key) if not isinstance(element, str) or ( isinstance(element, str) and not template_helper.is_template_string(element) ): - vol.All(vol.Coerce(float), vol.Range(min=0))(element) + probatio.All(probatio.Coerce(float), probatio.Range(min=0))(element) return template_complex(value) -positive_time_period_template = vol.Any( +positive_time_period_template = probatio.Any( positive_time_period, dynamic_template, _positive_time_period_template_complex ) @@ -819,7 +827,7 @@ def datetime(value: Any) -> datetime_sys: date_val = None if date_val is None: - raise vol.Invalid(f"Invalid datetime specified: {value}") + raise probatio.Invalid(f"Invalid datetime specified: {value}") return date_val @@ -828,13 +836,13 @@ def time_zone(value: str) -> str: """Validate timezone.""" if dt_util.get_time_zone(value) is not None: return value - raise vol.Invalid( + raise probatio.Invalid( "Invalid time zone passed in. Valid options can be found here: " "http://en.wikipedia.org/wiki/List_of_tz_database_time_zones" ) -weekdays = vol.All(ensure_list, [vol.In(WEEKDAYS)]) +weekdays = probatio.All(ensure_list, [probatio.In(WEEKDAYS)]) def socket_timeout(value: Any | None) -> object: @@ -849,8 +857,8 @@ def socket_timeout(value: Any | None) -> object: if float_value > 0.0: return float_value except Exception as err: - raise vol.Invalid(f"Invalid socket timeout: {err}") from err - raise vol.Invalid("Invalid socket timeout value. float > 0.0 required.") + raise probatio.Invalid(f"Invalid socket timeout: {err}") from err + raise probatio.Invalid("Invalid socket timeout value. float > 0.0 required.") def url( @@ -862,13 +870,13 @@ def url( parsed = urlparse(url_in) if parsed.scheme not in _schema_list: - raise vol.Invalid("invalid url") + raise probatio.Invalid("invalid url") try: _port = parsed.port except ValueError as err: - raise vol.Invalid("invalid url") from err - return cast(str, vol.Schema(vol.Url())(url_in)) + raise probatio.Invalid("invalid url") from err + return cast(str, probatio.Schema(probatio.Url())(url_in)) def configuration_url(value: Any) -> str: @@ -881,7 +889,7 @@ def url_no_path(value: Any) -> str: url_in = url(value) if urlparse(url_in).path not in ("", "/"): - raise vol.Invalid("url is not allowed to have a path component") + raise probatio.Invalid("url is not allowed to have a path component") return url_in @@ -890,7 +898,7 @@ def x10_address(value: str) -> str: """Validate an x10 address.""" regex = re.compile(r"([A-Pa-p]{1})(?:[2-9]|1[0-6]?)$") if not regex.match(value): - raise vol.Invalid("Invalid X10 Address") + raise probatio.Invalid("Invalid X10 Address") return str(value).lower() @@ -899,11 +907,13 @@ def uuid4_hex(value: Any) -> str: try: result = UUID(value, version=4) except (ValueError, AttributeError, TypeError) as error: - raise vol.Invalid("Invalid Version4 UUID", error_message=str(error)) from error + raise probatio.Invalid( + "Invalid Version4 UUID", error_message=str(error) + ) from error if result.hex != value.lower(): # UUID() will create a uuid4 if input is invalid - raise vol.Invalid("Invalid Version4 UUID") + raise probatio.Invalid("Invalid Version4 UUID") return result.hex @@ -915,9 +925,9 @@ def fake_uuid4_hex(value: Any) -> str: """Validate a fake v4 UUID generated by random_uuid_hex.""" try: if not _FAKE_UUID_4_HEX.match(value): - raise vol.Invalid("Invalid UUID") + raise probatio.Invalid("Invalid UUID") except TypeError as exc: - raise vol.Invalid("Invalid UUID") from exc + raise probatio.Invalid("Invalid UUID") from exc return cast(str, value) # Pattern.match throws if input is not a string @@ -938,11 +948,11 @@ def __init__(self, options: dict | list) -> None: def __call__(self, selected: list) -> list: """Validate input.""" if not isinstance(selected, list): - raise vol.Invalid("Not a list") + raise probatio.Invalid("Not a list") for value in selected: if value not in self.options: - raise vol.Invalid(f"{value} is not a valid option") + raise probatio.Invalid(f"{value} is not a valid option") return selected @@ -995,7 +1005,7 @@ def validator(config: dict) -> dict: arguments = (key, near, option_status) if raise_if_present: - raise vol.Invalid(warning % arguments) + raise probatio.Invalid(warning % arguments) get_integration_logger(__name__).log(level, warning, *arguments) value = config[key] @@ -1078,7 +1088,7 @@ def validator(value: Any) -> Any: if old_key in value: if new_key in value: - raise vol.Invalid( + raise probatio.Invalid( f"Cannot specify both '{old_key}' and" f" '{new_key}'. Please use '{new_key}' only." ) @@ -1115,7 +1125,7 @@ def key_value_schemas( def key_value_validator(value: Any) -> dict[Hashable, Any]: if not isinstance(value, dict): - raise vol.Invalid("Expected a dictionary") + raise probatio.Invalid("Expected a dictionary") key_value = value.get(key) @@ -1123,7 +1133,7 @@ def key_value_validator(value: Any) -> dict[Hashable, Any]: return cast(dict[Hashable, Any], value_schemas[key_value](value)) if default_schema: - with contextlib.suppress(vol.Invalid): + with contextlib.suppress(probatio.Invalid): return cast(dict[Hashable, Any], default_schema(value)) if list_alternatives: @@ -1133,7 +1143,7 @@ def key_value_validator(value: Any) -> dict[Hashable, Any]: else: # mypy does not understand that default_description is not None here alternatives = default_description # type: ignore[assignment] - raise vol.Invalid( + raise probatio.Invalid( f"Unexpected value for {key}: '{key_value}'. Expected {alternatives}" ) @@ -1151,9 +1161,9 @@ def key_dependency[_KT: Hashable, _VT]( def validator(value: dict[_KT, _VT]) -> dict[_KT, _VT]: """Test dependencies.""" if not isinstance(value, dict): - raise vol.Invalid("key dependencies require a dict") + raise probatio.Invalid("key dependencies require a dict") if key in value and dependency not in value: - raise vol.Invalid( + raise probatio.Invalid( f'dependency violation - key "{key}" requires ' f'key "{dependency}" to exist' ) @@ -1164,12 +1174,12 @@ def validator(value: dict[_KT, _VT]) -> dict[_KT, _VT]: def custom_serializer(schema: Any) -> Any: - """Serialize additional types for voluptuous_serialize.""" + """Serialize additional types for to_field_list.""" return _custom_serializer(schema, allow_section=True) def _custom_serializer(schema: Any, *, allow_section: bool) -> Any: - """Serialize additional types for voluptuous_serialize.""" + """Serialize additional types for to_field_list.""" from homeassistant import data_entry_flow # noqa: PLC0415 from . import selector # noqa: PLC0415 @@ -1188,7 +1198,7 @@ def _custom_serializer(schema: Any, *, allow_section: bool) -> Any: raise ValueError("Nesting expandable sections is not supported") return { "type": "expandable", - "schema": to_field_list( + "schema": probatio.to_field_list( schema.schema, custom_serializer=functools.partial( _custom_serializer, allow_section=False @@ -1203,7 +1213,7 @@ def _custom_serializer(schema: Any, *, allow_section: bool) -> Any: if isinstance(schema, selector.Selector): return schema.serialize() - return UNSUPPORTED + return probatio.UNSUPPORTED # Schemas @@ -1296,42 +1306,42 @@ def platform_only_config_schema(domain: str) -> Callable[[dict], dict]: ) -PLATFORM_SCHEMA = vol.Schema( +PLATFORM_SCHEMA = probatio.Schema( { - vol.Required(CONF_PLATFORM): string, - vol.Optional(CONF_ENTITY_NAMESPACE): string, - vol.Optional(CONF_SCAN_INTERVAL): time_period, + probatio.Required(CONF_PLATFORM): string, + probatio.Optional(CONF_ENTITY_NAMESPACE): string, + probatio.Optional(CONF_SCAN_INTERVAL): time_period, } ) -PLATFORM_SCHEMA_BASE = PLATFORM_SCHEMA.extend({}, extra=vol.ALLOW_EXTRA) +PLATFORM_SCHEMA_BASE = PLATFORM_SCHEMA.extend({}, extra=probatio.ALLOW_EXTRA) TARGET_FIELDS: VolDictType = { - vol.Optional(ATTR_ENTITY_ID): vol.All(ensure_list, [strict_entity_id]), - vol.Optional(ATTR_DEVICE_ID): vol.All(ensure_list, [str]), - vol.Optional(ATTR_AREA_ID): vol.All(ensure_list, [str]), - vol.Optional(ATTR_FLOOR_ID): vol.All(ensure_list, [str]), - vol.Optional(ATTR_LABEL_ID): vol.All(ensure_list, [str]), + probatio.Optional(ATTR_ENTITY_ID): probatio.All(ensure_list, [strict_entity_id]), + probatio.Optional(ATTR_DEVICE_ID): probatio.All(ensure_list, [str]), + probatio.Optional(ATTR_AREA_ID): probatio.All(ensure_list, [str]), + probatio.Optional(ATTR_FLOOR_ID): probatio.All(ensure_list, [str]), + probatio.Optional(ATTR_LABEL_ID): probatio.All(ensure_list, [str]), } ENTITY_SERVICE_FIELDS: VolDictType = { - vol.Optional(ATTR_ENTITY_ID): comp_entity_ids, - vol.Optional(ATTR_DEVICE_ID): vol.Any( + probatio.Optional(ATTR_ENTITY_ID): comp_entity_ids, + probatio.Optional(ATTR_DEVICE_ID): probatio.Any( ENTITY_MATCH_NONE, - vol.All(ensure_list, [str]), + probatio.All(ensure_list, [str]), ), - vol.Optional(ATTR_AREA_ID): vol.Any( + probatio.Optional(ATTR_AREA_ID): probatio.Any( ENTITY_MATCH_NONE, - vol.All(ensure_list, [str]), + probatio.All(ensure_list, [str]), ), - vol.Optional(ATTR_FLOOR_ID): vol.Any( + probatio.Optional(ATTR_FLOOR_ID): probatio.Any( ENTITY_MATCH_NONE, - vol.All(ensure_list, [str]), + probatio.All(ensure_list, [str]), ), - vol.Optional(ATTR_LABEL_ID): vol.Any( + probatio.Optional(ATTR_LABEL_ID): probatio.Any( ENTITY_MATCH_NONE, - vol.All(ensure_list, [str]), + probatio.All(ensure_list, [str]), ), } @@ -1339,7 +1349,7 @@ def platform_only_config_schema(domain: str) -> Callable[[dict], dict]: # Same as ENTITY_SERVICE_FIELDS but supports specifying entity # by entity registry ID. **ENTITY_SERVICE_FIELDS, - vol.Optional(ATTR_ENTITY_ID): comp_entity_ids_or_uuids, + probatio.Optional(ATTR_ENTITY_ID): comp_entity_ids_or_uuids, } _TARGET_SERVICE_FIELDS_TEMPLATED: VolDictType = { @@ -1350,30 +1360,30 @@ def platform_only_config_schema(domain: str) -> Callable[[dict], dict]: # # The schema supports templates as it is meant to be used in the initial validation # before templates are automatically rendered by the core logic. - vol.Optional(ATTR_ENTITY_ID): vol.Any( + probatio.Optional(ATTR_ENTITY_ID): probatio.Any( comp_entity_ids_or_uuids, dynamic_template, - vol.All(list, template_complex), + probatio.All(list, template_complex), ), - vol.Optional(ATTR_DEVICE_ID): vol.Any( + probatio.Optional(ATTR_DEVICE_ID): probatio.Any( ENTITY_MATCH_NONE, dynamic_template, - vol.All(ensure_list, [vol.Any(dynamic_template, str)]), + probatio.All(ensure_list, [probatio.Any(dynamic_template, str)]), ), - vol.Optional(ATTR_AREA_ID): vol.Any( + probatio.Optional(ATTR_AREA_ID): probatio.Any( ENTITY_MATCH_NONE, dynamic_template, - vol.All(ensure_list, [vol.Any(dynamic_template, str)]), + probatio.All(ensure_list, [probatio.Any(dynamic_template, str)]), ), - vol.Optional(ATTR_FLOOR_ID): vol.Any( + probatio.Optional(ATTR_FLOOR_ID): probatio.Any( ENTITY_MATCH_NONE, dynamic_template, - vol.All(ensure_list, [vol.Any(dynamic_template, str)]), + probatio.All(ensure_list, [probatio.Any(dynamic_template, str)]), ), - vol.Optional(ATTR_LABEL_ID): vol.Any( + probatio.Optional(ATTR_LABEL_ID): probatio.Any( ENTITY_MATCH_NONE, dynamic_template, - vol.All(ensure_list, [vol.Any(dynamic_template, str)]), + probatio.All(ensure_list, [probatio.Any(dynamic_template, str)]), ), } @@ -1385,15 +1395,15 @@ def is_entity_service_schema(validator: VolSchemaType) -> bool: The validator must be either of: - A validator returned by cv._make_entity_service_schema - - A validator returned by cv._make_entity_service_schema, wrapped in a vol.Schema - - A validator returned by cv._make_entity_service_schema, wrapped in a vol.All + - A validator returned by cv._make_entity_service_schema, wrapped in a probatio.Schema + - A validator returned by cv._make_entity_service_schema, wrapped in a probatio.All Nesting is allowed. """ if hasattr(validator, "_entity_service_schema"): return True - if isinstance(validator, (vol.All)): + if isinstance(validator, (probatio.All)): return any(is_entity_service_schema(val) for val in validator.validators) - if isinstance(validator, (vol.Schema)): + if isinstance(validator, (probatio.Schema)): return is_entity_service_schema(validator.schema) return False @@ -1401,11 +1411,11 @@ def is_entity_service_schema(validator: VolSchemaType) -> bool: def _make_entity_service_schema(schema: dict, extra: int) -> VolSchemaType: """Create an entity service schema.""" - validator = vol.All( - vol.Schema( + validator = probatio.All( + probatio.Schema( { # The frontend stores data here. Don't use in core. - vol.Remove("metadata"): dict, + probatio.Remove("metadata"): dict, **schema, **ENTITY_SERVICE_FIELDS, }, @@ -1414,20 +1424,20 @@ def _make_entity_service_schema(schema: dict, extra: int) -> VolSchemaType: _HAS_ENTITY_SERVICE_FIELD, ) setattr(validator, "_entity_service_schema", True) # noqa: B010 - # Wrap in a vol.Schema so the vol.All compiles its sub-validators once, - # instead of re-wrapping them in a new vol.Schema on every validation as a - # top-level vol.All does. - return vol.Schema(validator) + # Wrap in a probatio.Schema so the probatio.All compiles its sub-validators once, + # instead of re-wrapping them in a new probatio.Schema on every validation as a + # top-level probatio.All does. + return probatio.Schema(validator) -BASE_ENTITY_SCHEMA = _make_entity_service_schema({}, vol.PREVENT_EXTRA) +BASE_ENTITY_SCHEMA = _make_entity_service_schema({}, probatio.PREVENT_EXTRA) def make_entity_service_schema( - schema: dict | None, *, extra: int = vol.PREVENT_EXTRA + schema: dict | None, *, extra: int = probatio.PREVENT_EXTRA ) -> VolSchemaType: """Create an entity service schema.""" - if not schema and extra == vol.PREVENT_EXTRA: + if not schema and extra == probatio.PREVENT_EXTRA: # If the schema is empty and we don't allow extra keys, we can return # the base schema and avoid compiling a new schema which is the case # for ~50% of services. @@ -1435,11 +1445,11 @@ def make_entity_service_schema( return _make_entity_service_schema(schema or {}, extra) -SCRIPT_CONVERSATION_RESPONSE_SCHEMA = vol.Any(template, None) +SCRIPT_CONVERSATION_RESPONSE_SCHEMA = probatio.Any(template, None) -SCRIPT_VARIABLES_SCHEMA = vol.All( - vol.Schema({str: template_complex}), +SCRIPT_VARIABLES_SCHEMA = probatio.All( + probatio.Schema({str: template_complex}), # pylint: disable-next=unnecessary-lambda lambda val: script_variables_helper.ScriptVariables(val), ) @@ -1448,31 +1458,33 @@ def make_entity_service_schema( def script_action(value: Any) -> dict: """Validate a script action.""" if not isinstance(value, dict): - raise vol.Invalid("expected dictionary") + raise probatio.Invalid("expected dictionary") try: action = determine_script_action(value) except ValueError as err: - raise vol.Invalid(str(err)) from err + raise probatio.Invalid(str(err)) from err return ACTION_TYPE_SCHEMAS[action](value) -SCRIPT_SCHEMA = vol.All(ensure_list, [script_action]) +SCRIPT_SCHEMA = probatio.All(ensure_list, [script_action]) SCRIPT_ACTION_BASE_SCHEMA: VolDictType = { - vol.Optional(CONF_ALIAS): string, - vol.Remove(CONF_NOTE): str, # Is only used in frontend - vol.Optional(CONF_CONTINUE_ON_ERROR): boolean, - vol.Optional(CONF_ENABLED): vol.Any(boolean, template), + probatio.Optional(CONF_ALIAS): string, + probatio.Remove(CONF_NOTE): str, # Is only used in frontend + probatio.Optional(CONF_CONTINUE_ON_ERROR): boolean, + probatio.Optional(CONF_ENABLED): probatio.Any(boolean, template), } -EVENT_SCHEMA = vol.Schema( +EVENT_SCHEMA = probatio.Schema( { **SCRIPT_ACTION_BASE_SCHEMA, - vol.Required(CONF_EVENT): string, - vol.Optional(CONF_EVENT_DATA): vol.All(dict, template_complex), - vol.Optional(CONF_EVENT_DATA_TEMPLATE): vol.All(dict, template_complex), + probatio.Required(CONF_EVENT): string, + probatio.Optional(CONF_EVENT_DATA): probatio.All(dict, template_complex), + probatio.Optional(CONF_EVENT_DATA_TEMPLATE): probatio.All( + dict, template_complex + ), } ) @@ -1486,7 +1498,7 @@ def _backward_compat_service_schema(value: Any | None) -> Any: # `service` has been renamed to `action` if CONF_SERVICE in value: if CONF_ACTION in value: - raise vol.Invalid( + raise probatio.Invalid( "Cannot specify both 'service' and 'action'. Please use 'action' only." ) value[CONF_ACTION] = value.pop(CONF_SERVICE) @@ -1494,56 +1506,56 @@ def _backward_compat_service_schema(value: Any | None) -> Any: return value -SERVICE_SCHEMA = vol.All( +SERVICE_SCHEMA = probatio.All( _backward_compat_service_schema, - vol.Schema( + probatio.Schema( { **SCRIPT_ACTION_BASE_SCHEMA, - vol.Exclusive(CONF_ACTION, "service name"): vol.Any( + probatio.Exclusive(CONF_ACTION, "service name"): probatio.Any( service, dynamic_template ), - vol.Exclusive(CONF_SERVICE_TEMPLATE, "service name"): vol.Any( + probatio.Exclusive(CONF_SERVICE_TEMPLATE, "service name"): probatio.Any( service, dynamic_template ), - vol.Optional(CONF_SERVICE_DATA): vol.Any( - template, vol.All(dict, template_complex) + probatio.Optional(CONF_SERVICE_DATA): probatio.Any( + template, probatio.All(dict, template_complex) ), - vol.Optional(CONF_SERVICE_DATA_TEMPLATE): vol.Any( - template, vol.All(dict, template_complex) + probatio.Optional(CONF_SERVICE_DATA_TEMPLATE): probatio.Any( + template, probatio.All(dict, template_complex) ), - vol.Optional(CONF_ENTITY_ID): comp_entity_ids, - vol.Optional(CONF_TARGET): vol.Any( + probatio.Optional(CONF_ENTITY_ID): comp_entity_ids, + probatio.Optional(CONF_TARGET): probatio.Any( _TARGET_SERVICE_FIELDS_TEMPLATED, dynamic_template ), - vol.Optional(CONF_RESPONSE_VARIABLE): str, + probatio.Optional(CONF_RESPONSE_VARIABLE): str, # The frontend stores data here. Don't use in core. - vol.Remove("metadata"): dict, + probatio.Remove("metadata"): dict, } ), has_at_least_one_key(CONF_ACTION, CONF_SERVICE_TEMPLATE), ) -NUMERIC_STATE_THRESHOLD_SCHEMA = vol.Any( - vol.Coerce(float), - vol.All(str, entity_domain(["input_number", "number", "sensor", "zone"])), +NUMERIC_STATE_THRESHOLD_SCHEMA = probatio.Any( + probatio.Coerce(float), + probatio.All(str, entity_domain(["input_number", "number", "sensor", "zone"])), ) CONDITION_BASE_SCHEMA: VolDictType = { - vol.Optional(CONF_ALIAS): string, - vol.Remove(CONF_NOTE): str, # Is only used in frontend - vol.Optional(CONF_ENABLED): vol.Any(boolean, template), + probatio.Optional(CONF_ALIAS): string, + probatio.Remove(CONF_NOTE): str, # Is only used in frontend + probatio.Optional(CONF_ENABLED): probatio.Any(boolean, template), } -NUMERIC_STATE_CONDITION_SCHEMA = vol.All( - vol.Schema( +NUMERIC_STATE_CONDITION_SCHEMA = probatio.All( + probatio.Schema( { **CONDITION_BASE_SCHEMA, - vol.Required(CONF_CONDITION): "numeric_state", - vol.Required(CONF_ENTITY_ID): entity_ids_or_uuids, - vol.Optional(CONF_ATTRIBUTE): str, + probatio.Required(CONF_CONDITION): "numeric_state", + probatio.Required(CONF_ENTITY_ID): entity_ids_or_uuids, + probatio.Optional(CONF_ATTRIBUTE): str, CONF_BELOW: NUMERIC_STATE_THRESHOLD_SCHEMA, CONF_ABOVE: NUMERIC_STATE_THRESHOLD_SCHEMA, - vol.Optional(CONF_VALUE_TEMPLATE): template, + probatio.Optional(CONF_VALUE_TEMPLATE): template, } ), has_at_least_one_key(CONF_BELOW, CONF_ABOVE), @@ -1555,26 +1567,26 @@ def _backward_compat_service_schema(value: Any | None) -> Any: STATE_CONDITION_BASE_SCHEMA = { **CONDITION_BASE_SCHEMA, - vol.Required(CONF_CONDITION): "state", - vol.Required(CONF_ENTITY_ID): entity_ids_or_uuids, - vol.Optional(CONF_MATCH, default=ENTITY_MATCH_ALL): vol.All( - vol.Lower, vol.Any(ENTITY_MATCH_ALL, ENTITY_MATCH_ANY) + probatio.Required(CONF_CONDITION): "state", + probatio.Required(CONF_ENTITY_ID): entity_ids_or_uuids, + probatio.Optional(CONF_MATCH, default=ENTITY_MATCH_ALL): probatio.All( + probatio.Lower, probatio.Any(ENTITY_MATCH_ALL, ENTITY_MATCH_ANY) ), - vol.Optional(CONF_ATTRIBUTE): str, - vol.Optional(CONF_FOR): positive_time_period_template, + probatio.Optional(CONF_ATTRIBUTE): str, + probatio.Optional(CONF_FOR): positive_time_period_template, } -STATE_CONDITION_STATE_SCHEMA = vol.Schema( +STATE_CONDITION_STATE_SCHEMA = probatio.Schema( { **STATE_CONDITION_BASE_SCHEMA, - vol.Required(CONF_STATE): vol.Any(str, [str]), + probatio.Required(CONF_STATE): probatio.Any(str, [str]), } ) -STATE_CONDITION_ATTRIBUTE_SCHEMA = vol.Schema( +STATE_CONDITION_ATTRIBUTE_SCHEMA = probatio.Schema( { **STATE_CONDITION_BASE_SCHEMA, - vol.Required(CONF_STATE): match_all, + probatio.Required(CONF_STATE): match_all, } ) @@ -1582,7 +1594,7 @@ def _backward_compat_service_schema(value: Any | None) -> Any: def STATE_CONDITION_SCHEMA(value: Any) -> dict[str, Any]: """Validate a state condition.""" if not isinstance(value, dict): - raise vol.Invalid("Expected a dictionary") + raise probatio.Invalid("Expected a dictionary") if CONF_ATTRIBUTE in value: validated: dict[str, Any] = STATE_CONDITION_ATTRIBUTE_SCHEMA(value) @@ -1596,58 +1608,62 @@ def STATE_CONDITION_SCHEMA(value: Any) -> dict[str, Any]: # single current state. It therefore can't track an attribute, multiple # states, or a state resolved from another entity. if CONF_ATTRIBUTE in validated: - raise vol.Invalid("Cannot use 'for' with an attribute") + raise probatio.Invalid("Cannot use 'for' with an attribute") state = validated[CONF_STATE] # A single-element list is just that one state; unwrap it so the # input-entity check below also rejects `state: [input_select.x]`. if isinstance(state, list): if len(state) != 1: - raise vol.Invalid("Cannot use 'for' with a list of states") + raise probatio.Invalid("Cannot use 'for' with a list of states") state = state[0] if INPUT_ENTITY_ID.match(state): - raise vol.Invalid("Cannot use 'for' with a state referencing an entity") + raise probatio.Invalid( + "Cannot use 'for' with a state referencing an entity" + ) return validated -TEMPLATE_CONDITION_SCHEMA = vol.Schema( +TEMPLATE_CONDITION_SCHEMA = probatio.Schema( { **CONDITION_BASE_SCHEMA, - vol.Required(CONF_CONDITION): "template", - vol.Required(CONF_VALUE_TEMPLATE): template, + probatio.Required(CONF_CONDITION): "template", + probatio.Required(CONF_VALUE_TEMPLATE): template, } ) -TIME_CONDITION_SCHEMA = vol.All( - vol.Schema( +TIME_CONDITION_SCHEMA = probatio.All( + probatio.Schema( { **CONDITION_BASE_SCHEMA, - vol.Required(CONF_CONDITION): "time", - vol.Optional("before"): vol.Any( - time, vol.All(str, entity_domain(["input_datetime", "time", "sensor"])) + probatio.Required(CONF_CONDITION): "time", + probatio.Optional("before"): probatio.Any( + time, + probatio.All(str, entity_domain(["input_datetime", "time", "sensor"])), ), - vol.Optional("after"): vol.Any( - time, vol.All(str, entity_domain(["input_datetime", "time", "sensor"])) + probatio.Optional("after"): probatio.Any( + time, + probatio.All(str, entity_domain(["input_datetime", "time", "sensor"])), ), - vol.Optional("weekday"): weekdays, + probatio.Optional("weekday"): weekdays, } ), has_at_least_one_key("before", "after", "weekday"), ) -TRIGGER_CONDITION_SCHEMA = vol.Schema( +TRIGGER_CONDITION_SCHEMA = probatio.Schema( { **CONDITION_BASE_SCHEMA, - vol.Required(CONF_CONDITION): "trigger", - vol.Required(CONF_ID): vol.All(ensure_list, [string]), + probatio.Required(CONF_CONDITION): "trigger", + probatio.Required(CONF_ID): probatio.All(ensure_list, [string]), } ) -AND_CONDITION_SCHEMA = vol.Schema( +AND_CONDITION_SCHEMA = probatio.Schema( { **CONDITION_BASE_SCHEMA, - vol.Required(CONF_CONDITION): "and", - vol.Required(CONF_CONDITIONS): vol.All( + probatio.Required(CONF_CONDITION): "and", + probatio.Required(CONF_CONDITIONS): probatio.All( ensure_list, # pylint: disable-next=unnecessary-lambda [lambda value: CONDITION_SCHEMA(value)], @@ -1655,10 +1671,10 @@ def STATE_CONDITION_SCHEMA(value: Any) -> dict[str, Any]: } ) -AND_CONDITION_SHORTHAND_SCHEMA = vol.Schema( +AND_CONDITION_SHORTHAND_SCHEMA = probatio.Schema( { **CONDITION_BASE_SCHEMA, - vol.Required("and"): vol.All( + probatio.Required("and"): probatio.All( ensure_list, # pylint: disable-next=unnecessary-lambda [lambda value: CONDITION_SCHEMA(value)], @@ -1666,11 +1682,11 @@ def STATE_CONDITION_SCHEMA(value: Any) -> dict[str, Any]: } ) -OR_CONDITION_SCHEMA = vol.Schema( +OR_CONDITION_SCHEMA = probatio.Schema( { **CONDITION_BASE_SCHEMA, - vol.Required(CONF_CONDITION): "or", - vol.Required(CONF_CONDITIONS): vol.All( + probatio.Required(CONF_CONDITION): "or", + probatio.Required(CONF_CONDITIONS): probatio.All( ensure_list, # pylint: disable-next=unnecessary-lambda [lambda value: CONDITION_SCHEMA(value)], @@ -1678,10 +1694,10 @@ def STATE_CONDITION_SCHEMA(value: Any) -> dict[str, Any]: } ) -OR_CONDITION_SHORTHAND_SCHEMA = vol.Schema( +OR_CONDITION_SHORTHAND_SCHEMA = probatio.Schema( { **CONDITION_BASE_SCHEMA, - vol.Required("or"): vol.All( + probatio.Required("or"): probatio.All( ensure_list, # pylint: disable-next=unnecessary-lambda [lambda value: CONDITION_SCHEMA(value)], @@ -1689,11 +1705,11 @@ def STATE_CONDITION_SCHEMA(value: Any) -> dict[str, Any]: } ) -NOT_CONDITION_SCHEMA = vol.Schema( +NOT_CONDITION_SCHEMA = probatio.Schema( { **CONDITION_BASE_SCHEMA, - vol.Required(CONF_CONDITION): "not", - vol.Required(CONF_CONDITIONS): vol.All( + probatio.Required(CONF_CONDITION): "not", + probatio.Required(CONF_CONDITIONS): probatio.All( ensure_list, # pylint: disable-next=unnecessary-lambda [lambda value: CONDITION_SCHEMA(value)], @@ -1701,10 +1717,10 @@ def STATE_CONDITION_SCHEMA(value: Any) -> dict[str, Any]: } ) -NOT_CONDITION_SHORTHAND_SCHEMA = vol.Schema( +NOT_CONDITION_SHORTHAND_SCHEMA = probatio.Schema( { **CONDITION_BASE_SCHEMA, - vol.Required("not"): vol.All( + probatio.Required("not"): probatio.All( ensure_list, # pylint: disable-next=unnecessary-lambda [lambda value: CONDITION_SCHEMA(value)], @@ -1712,17 +1728,19 @@ def STATE_CONDITION_SCHEMA(value: Any) -> dict[str, Any]: } ) -DEVICE_CONDITION_BASE_SCHEMA = vol.Schema( +DEVICE_CONDITION_BASE_SCHEMA = probatio.Schema( { **CONDITION_BASE_SCHEMA, - vol.Required(CONF_CONDITION): "device", - vol.Required(CONF_DEVICE_ID): str, - vol.Required(CONF_DOMAIN): str, - vol.Remove("metadata"): dict, + probatio.Required(CONF_CONDITION): "device", + probatio.Required(CONF_DEVICE_ID): str, + probatio.Required(CONF_DOMAIN): str, + probatio.Remove("metadata"): dict, } ) -DEVICE_CONDITION_SCHEMA = DEVICE_CONDITION_BASE_SCHEMA.extend({}, extra=vol.ALLOW_EXTRA) +DEVICE_CONDITION_SCHEMA = DEVICE_CONDITION_BASE_SCHEMA.extend( + {}, extra=probatio.ALLOW_EXTRA +) def expand_condition_shorthand(value: Any | None) -> Any: @@ -1743,7 +1761,7 @@ def expand_condition_shorthand(value: Any | None) -> Any: CONF_CONDITIONS: value[key], **{k: value[k] for k in value if k != key}, } - except vol.MultipleInvalid: + except probatio.MultipleInvalid: pass if isinstance(value.get(CONF_CONDITION), list): @@ -1754,13 +1772,13 @@ def expand_condition_shorthand(value: Any | None) -> Any: CONF_CONDITIONS: value[CONF_CONDITION], **{k: value[k] for k in value if k != CONF_CONDITION}, } - except vol.MultipleInvalid: + except probatio.MultipleInvalid: pass return value -dynamic_template_condition = vol.All( +dynamic_template_condition = probatio.All( # Wrap a shorthand template condition in a template condition dynamic_template, lambda config: { @@ -1769,10 +1787,10 @@ def expand_condition_shorthand(value: Any | None) -> Any: }, ) -CONDITION_SHORTHAND_SCHEMA = vol.Schema( +CONDITION_SHORTHAND_SCHEMA = probatio.Schema( { **CONDITION_BASE_SCHEMA, - vol.Required(CONF_CONDITION): vol.All( + probatio.Required(CONF_CONDITION): probatio.All( ensure_list, # pylint: disable-next=unnecessary-lambda [lambda value: CONDITION_SCHEMA(value)], @@ -1796,19 +1814,21 @@ def expand_condition_shorthand(value: Any | None) -> Any: # This is first round of validation, we don't want to mutate the config here already, # just ensure basics as condition type and alias are there. def _base_condition_validator(value: Any) -> Any: - vol.Schema( + probatio.Schema( { **CONDITION_BASE_SCHEMA, - vol.Required(CONF_CONDITION): vol.All(str, vol.NotIn(BUILT_IN_CONDITIONS)), + probatio.Required(CONF_CONDITION): probatio.All( + str, probatio.NotIn(BUILT_IN_CONDITIONS) + ), }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, )(value) return value -CONDITION_SCHEMA: vol.Schema = vol.Schema( - vol.Any( - vol.All( +CONDITION_SCHEMA: probatio.Schema = probatio.Schema( + probatio.Any( + probatio.All( expand_condition_shorthand, key_value_schemas( CONF_CONDITION, @@ -1822,12 +1842,12 @@ def _base_condition_validator(value: Any) -> Any: ) ) -CONDITIONS_SCHEMA = vol.All(ensure_list, [CONDITION_SCHEMA]) +CONDITIONS_SCHEMA = probatio.All(ensure_list, [CONDITION_SCHEMA]) -dynamic_template_condition_action = vol.All( +dynamic_template_condition_action = probatio.All( # Wrap a shorthand template condition action in a template condition - vol.Schema( - {**CONDITION_BASE_SCHEMA, vol.Required(CONF_CONDITION): dynamic_template} + probatio.Schema( + {**CONDITION_BASE_SCHEMA, probatio.Required(CONF_CONDITION): dynamic_template} ), lambda config: { **config, @@ -1837,13 +1857,13 @@ def _base_condition_validator(value: Any) -> Any: ) -CONDITION_ACTION_SCHEMA: vol.Schema = vol.Schema( - vol.All( +CONDITION_ACTION_SCHEMA: probatio.Schema = probatio.Schema( + probatio.All( expand_condition_shorthand, key_value_schemas( CONF_CONDITION, BUILT_IN_CONDITIONS, - vol.Any( + probatio.Any( dynamic_template_condition_action, _base_condition_validator, ), @@ -1868,31 +1888,33 @@ def _trigger_pre_validator(value: Any | None) -> Any: if CONF_TRIGGER in value: if CONF_PLATFORM in value: - raise vol.Invalid( + raise probatio.Invalid( "Cannot specify both 'platform' and 'trigger'." " Please use 'trigger' only." ) value = dict(value) value[CONF_PLATFORM] = value.pop(CONF_TRIGGER) elif CONF_PLATFORM not in value: - raise vol.Invalid("required key not provided", [CONF_TRIGGER]) + raise probatio.Invalid("required key not provided", [CONF_TRIGGER]) return value -TRIGGER_BASE_SCHEMA = vol.Schema( +TRIGGER_BASE_SCHEMA = probatio.Schema( { - vol.Optional(CONF_ALIAS): str, - vol.Required(CONF_PLATFORM): str, - vol.Optional(CONF_ID): str, - vol.Optional(CONF_VARIABLES): SCRIPT_VARIABLES_SCHEMA, - vol.Optional(CONF_ENABLED): vol.Any(boolean, template), - vol.Remove(CONF_NOTE): str, # Is only used in frontend + probatio.Optional(CONF_ALIAS): str, + probatio.Required(CONF_PLATFORM): str, + probatio.Optional(CONF_ID): str, + probatio.Optional(CONF_VARIABLES): SCRIPT_VARIABLES_SCHEMA, + probatio.Optional(CONF_ENABLED): probatio.Any(boolean, template), + probatio.Remove(CONF_NOTE): str, # Is only used in frontend } ) -_base_trigger_validator_schema = TRIGGER_BASE_SCHEMA.extend({}, extra=vol.ALLOW_EXTRA) +_base_trigger_validator_schema = TRIGGER_BASE_SCHEMA.extend( + {}, extra=probatio.ALLOW_EXTRA +) def _base_trigger_list_flatten(triggers: list[Any]) -> list[Any]: @@ -1915,108 +1937,110 @@ def _base_trigger_validator(value: Any) -> Any: return value -TRIGGER_SCHEMA = vol.All( +TRIGGER_SCHEMA = probatio.All( ensure_list, _base_trigger_list_flatten, - [vol.All(_trigger_pre_validator, _base_trigger_validator)], + [probatio.All(_trigger_pre_validator, _base_trigger_validator)], ) -_SCRIPT_DELAY_SCHEMA = vol.Schema( +_SCRIPT_DELAY_SCHEMA = probatio.Schema( { **SCRIPT_ACTION_BASE_SCHEMA, - vol.Required(CONF_DELAY): positive_time_period_template, + probatio.Required(CONF_DELAY): positive_time_period_template, } ) -_SCRIPT_WAIT_TEMPLATE_SCHEMA = vol.Schema( +_SCRIPT_WAIT_TEMPLATE_SCHEMA = probatio.Schema( { **SCRIPT_ACTION_BASE_SCHEMA, - vol.Required(CONF_WAIT_TEMPLATE): template, - vol.Optional(CONF_TIMEOUT): positive_time_period_template, - vol.Optional(CONF_CONTINUE_ON_TIMEOUT): boolean, + probatio.Required(CONF_WAIT_TEMPLATE): template, + probatio.Optional(CONF_TIMEOUT): positive_time_period_template, + probatio.Optional(CONF_CONTINUE_ON_TIMEOUT): boolean, } ) -DEVICE_ACTION_BASE_SCHEMA = vol.Schema( +DEVICE_ACTION_BASE_SCHEMA = probatio.Schema( { **SCRIPT_ACTION_BASE_SCHEMA, - vol.Required(CONF_DEVICE_ID): string, - vol.Required(CONF_DOMAIN): str, - vol.Remove("metadata"): dict, + probatio.Required(CONF_DEVICE_ID): string, + probatio.Required(CONF_DOMAIN): str, + probatio.Remove("metadata"): dict, } ) -DEVICE_ACTION_SCHEMA = DEVICE_ACTION_BASE_SCHEMA.extend({}, extra=vol.ALLOW_EXTRA) +DEVICE_ACTION_SCHEMA = DEVICE_ACTION_BASE_SCHEMA.extend({}, extra=probatio.ALLOW_EXTRA) -_SCRIPT_SCENE_SCHEMA = vol.Schema( - {**SCRIPT_ACTION_BASE_SCHEMA, vol.Required(CONF_SCENE): entity_domain("scene")} +_SCRIPT_SCENE_SCHEMA = probatio.Schema( + {**SCRIPT_ACTION_BASE_SCHEMA, probatio.Required(CONF_SCENE): entity_domain("scene")} ) -_SCRIPT_REPEAT_SCHEMA = vol.Schema( +_SCRIPT_REPEAT_SCHEMA = probatio.Schema( { **SCRIPT_ACTION_BASE_SCHEMA, - vol.Required(CONF_REPEAT): vol.All( + probatio.Required(CONF_REPEAT): probatio.All( { - vol.Exclusive(CONF_COUNT, "repeat"): vol.Any(vol.Coerce(int), template), - vol.Exclusive(CONF_FOR_EACH, "repeat"): vol.Any( - dynamic_template, vol.All(list, template_complex) + probatio.Exclusive(CONF_COUNT, "repeat"): probatio.Any( + probatio.Coerce(int), template ), - vol.Exclusive(CONF_WHILE, "repeat"): CONDITIONS_SCHEMA, - vol.Exclusive(CONF_UNTIL, "repeat"): CONDITIONS_SCHEMA, - vol.Required(CONF_SEQUENCE): SCRIPT_SCHEMA, + probatio.Exclusive(CONF_FOR_EACH, "repeat"): probatio.Any( + dynamic_template, probatio.All(list, template_complex) + ), + probatio.Exclusive(CONF_WHILE, "repeat"): CONDITIONS_SCHEMA, + probatio.Exclusive(CONF_UNTIL, "repeat"): CONDITIONS_SCHEMA, + probatio.Required(CONF_SEQUENCE): SCRIPT_SCHEMA, }, has_at_least_one_key(CONF_COUNT, CONF_FOR_EACH, CONF_WHILE, CONF_UNTIL), ), } ) -_SCRIPT_CHOOSE_SCHEMA = vol.Schema( +_SCRIPT_CHOOSE_SCHEMA = probatio.Schema( { **SCRIPT_ACTION_BASE_SCHEMA, - vol.Required(CONF_CHOOSE): vol.All( + probatio.Required(CONF_CHOOSE): probatio.All( ensure_list, [ { - vol.Optional(CONF_ALIAS): string, - vol.Remove(CONF_NOTE): str, # Is only used in frontend - vol.Required(CONF_CONDITIONS): CONDITIONS_SCHEMA, - vol.Required(CONF_SEQUENCE): SCRIPT_SCHEMA, + probatio.Optional(CONF_ALIAS): string, + probatio.Remove(CONF_NOTE): str, # Is only used in frontend + probatio.Required(CONF_CONDITIONS): CONDITIONS_SCHEMA, + probatio.Required(CONF_SEQUENCE): SCRIPT_SCHEMA, } ], ), - vol.Optional(CONF_DEFAULT): SCRIPT_SCHEMA, + probatio.Optional(CONF_DEFAULT): SCRIPT_SCHEMA, } ) -_SCRIPT_WAIT_FOR_TRIGGER_SCHEMA = vol.Schema( +_SCRIPT_WAIT_FOR_TRIGGER_SCHEMA = probatio.Schema( { **SCRIPT_ACTION_BASE_SCHEMA, - vol.Required(CONF_WAIT_FOR_TRIGGER): TRIGGER_SCHEMA, - vol.Optional(CONF_TIMEOUT): positive_time_period_template, - vol.Optional(CONF_CONTINUE_ON_TIMEOUT): boolean, + probatio.Required(CONF_WAIT_FOR_TRIGGER): TRIGGER_SCHEMA, + probatio.Optional(CONF_TIMEOUT): positive_time_period_template, + probatio.Optional(CONF_CONTINUE_ON_TIMEOUT): boolean, } ) -_SCRIPT_IF_SCHEMA = vol.Schema( +_SCRIPT_IF_SCHEMA = probatio.Schema( { **SCRIPT_ACTION_BASE_SCHEMA, - vol.Required(CONF_IF): CONDITIONS_SCHEMA, - vol.Required(CONF_THEN): SCRIPT_SCHEMA, - vol.Optional(CONF_ELSE): SCRIPT_SCHEMA, + probatio.Required(CONF_IF): CONDITIONS_SCHEMA, + probatio.Required(CONF_THEN): SCRIPT_SCHEMA, + probatio.Optional(CONF_ELSE): SCRIPT_SCHEMA, } ) -_SCRIPT_SET_SCHEMA = vol.Schema( +_SCRIPT_SET_SCHEMA = probatio.Schema( { **SCRIPT_ACTION_BASE_SCHEMA, - vol.Required(CONF_VARIABLES): SCRIPT_VARIABLES_SCHEMA, + probatio.Required(CONF_VARIABLES): SCRIPT_VARIABLES_SCHEMA, } ) -_SCRIPT_SET_CONVERSATION_RESPONSE_SCHEMA = vol.Schema( +_SCRIPT_SET_CONVERSATION_RESPONSE_SCHEMA = probatio.Schema( { **SCRIPT_ACTION_BASE_SCHEMA, - vol.Required( + probatio.Required( CONF_SET_CONVERSATION_RESPONSE ): SCRIPT_CONVERSATION_RESPONSE_SCHEMA, } @@ -2026,32 +2050,32 @@ def _base_trigger_validator(value: Any) -> Any: def _stop_action_check_error_response(config: dict) -> dict: """Validate that error stop actions don't have a response variable.""" if config.get(CONF_ERROR) and CONF_RESPONSE_VARIABLE in config: - raise vol.Invalid("not allowed to add a response to an error stop action") + raise probatio.Invalid("not allowed to add a response to an error stop action") return config -_SCRIPT_STOP_SCHEMA = vol.All( - vol.Schema( +_SCRIPT_STOP_SCHEMA = probatio.All( + probatio.Schema( { **SCRIPT_ACTION_BASE_SCHEMA, - vol.Required(CONF_STOP): vol.Any(None, string), - vol.Optional(CONF_ERROR): boolean, - vol.Optional(CONF_RESPONSE_VARIABLE): str, + probatio.Required(CONF_STOP): probatio.Any(None, string), + probatio.Optional(CONF_ERROR): boolean, + probatio.Optional(CONF_RESPONSE_VARIABLE): str, } ), _stop_action_check_error_response, ) -_SCRIPT_SEQUENCE_SCHEMA = vol.Schema( +_SCRIPT_SEQUENCE_SCHEMA = probatio.Schema( { **SCRIPT_ACTION_BASE_SCHEMA, # The frontend stores data here. Don't use in core. - vol.Remove("metadata"): dict, - vol.Required(CONF_SEQUENCE): SCRIPT_SCHEMA, + probatio.Remove("metadata"): dict, + probatio.Required(CONF_SEQUENCE): SCRIPT_SCHEMA, } ) -_parallel_sequence_action = vol.All( +_parallel_sequence_action = probatio.All( # Wrap a shorthand sequences in a parallel action SCRIPT_SCHEMA, lambda config: { @@ -2059,11 +2083,12 @@ def _stop_action_check_error_response(config: dict) -> dict: }, ) -_SCRIPT_PARALLEL_SCHEMA = vol.Schema( +_SCRIPT_PARALLEL_SCHEMA = probatio.Schema( { **SCRIPT_ACTION_BASE_SCHEMA, - vol.Required(CONF_PARALLEL): vol.All( - ensure_list, [vol.Any(_SCRIPT_SEQUENCE_SCHEMA, _parallel_sequence_action)] + probatio.Required(CONF_PARALLEL): probatio.All( + ensure_list, + [probatio.Any(_SCRIPT_SEQUENCE_SCHEMA, _parallel_sequence_action)], ), } ) @@ -2147,17 +2172,17 @@ def determine_script_action(action: dict[str, Any]) -> str: } -currency = vol.In( +currency = probatio.In( currencies.ACTIVE_CURRENCIES, msg="invalid ISO 4217 formatted currency" ) -historic_currency = vol.In( +historic_currency = probatio.In( currencies.HISTORIC_CURRENCIES, msg="invalid ISO 4217 formatted historic currency" ) -country = vol.In(COUNTRIES, msg="invalid ISO 3166 formatted country") +country = probatio.In(COUNTRIES, msg="invalid ISO 3166 formatted country") -language = vol.In(LANGUAGES, msg="invalid RFC 5646 formatted language") +language = probatio.In(LANGUAGES, msg="invalid RFC 5646 formatted language") async def async_validate( diff --git a/homeassistant/helpers/data_entry_flow.py b/homeassistant/helpers/data_entry_flow.py index 62b16a00175bd..c4a9f7cd6b1cd 100644 --- a/homeassistant/helpers/data_entry_flow.py +++ b/homeassistant/helpers/data_entry_flow.py @@ -4,8 +4,7 @@ from typing import Any, Generic, TypeVar from aiohttp import web -from probatio import to_field_list -import voluptuous as vol +import probatio from homeassistant import data_entry_flow from homeassistant.components.http import HomeAssistantView @@ -51,7 +50,7 @@ def _prepare_result_json(self, result: _FlowResultT) -> dict[str, Any]: if (schema := result["data_schema"]) is None: data["data_schema"] = [] else: - data["data_schema"] = to_field_list( + data["data_schema"] = probatio.to_field_list( schema, custom_serializer=cv.custom_serializer ) return data @@ -61,11 +60,11 @@ class FlowManagerIndexView(_BaseFlowManagerView[_FlowManagerT, _FlowResultT]): """View to create config flows.""" @RequestDataValidator( - vol.Schema( + probatio.Schema( { - vol.Required("handler"): str, + probatio.Required("handler"): str, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) ) async def post(self, request: web.Request, data: dict[str, Any]) -> web.Response: @@ -113,7 +112,7 @@ async def get(self, request: web.Request, /, flow_id: str) -> web.Response: return self.json(result) - @RequestDataValidator(vol.Schema(dict), allow_empty=True) + @RequestDataValidator(probatio.Schema(dict), allow_empty=True) async def post( self, request: web.Request, data: dict[str, Any], flow_id: str ) -> web.Response: diff --git a/homeassistant/helpers/entity.py b/homeassistant/helpers/entity.py index 673862c85814c..e2ca36c91aed8 100644 --- a/homeassistant/helpers/entity.py +++ b/homeassistant/helpers/entity.py @@ -26,8 +26,8 @@ override, ) +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.const import ( DEVICE_DEFAULT_NAME, @@ -209,7 +209,7 @@ def get_unit_of_measurement(hass: HomeAssistant, entity_id: str) -> str | None: return entry.unit_of_measurement -ENTITY_CATEGORIES_SCHEMA: Final = vol.Coerce(EntityCategory) +ENTITY_CATEGORIES_SCHEMA: Final = probatio.Coerce(EntityCategory) class EntityInfo(TypedDict): diff --git a/homeassistant/helpers/entity_registry.py b/homeassistant/helpers/entity_registry.py index 111fb3c4a75f7..3192962dcbbe7 100644 --- a/homeassistant/helpers/entity_registry.py +++ b/homeassistant/helpers/entity_registry.py @@ -19,7 +19,7 @@ from typing import TYPE_CHECKING, Any, Literal, NotRequired, TypedDict, override import attr -import voluptuous as vol +import probatio from homeassistant.const import ( EVENT_HOMEASSISTANT_START, @@ -2768,13 +2768,13 @@ async def async_migrate_entries( def async_validate_entity_id(registry: EntityRegistry, entity_id_or_uuid: str) -> str: """Validate and resolve an entity id or UUID to an entity id. - Raises vol.Invalid if the entity or UUID is invalid, or if the UUID is not + Raises probatio.Invalid if the entity or UUID is invalid, or if the UUID is not associated with an entity registry item. """ if valid_entity_id(entity_id_or_uuid): return entity_id_or_uuid if (entry := registry.entities.get_entry(entity_id_or_uuid)) is None: - raise vol.Invalid(f"Unknown entity registry entry {entity_id_or_uuid}") + raise probatio.Invalid(f"Unknown entity registry entry {entity_id_or_uuid}") return entry.entity_id @@ -2801,7 +2801,7 @@ def async_validate_entity_ids( """Validate and resolve a list of entity ids or UUIDs to a list of entity ids. Returns a list with UUID resolved to entity_ids. - Raises vol.Invalid if any item is invalid, or if any a UUID is not associated with + Raises probatio.Invalid if any item is invalid, or if any a UUID is not associated with an entity registry item. """ diff --git a/homeassistant/helpers/entityfilter.py b/homeassistant/helpers/entityfilter.py index eb09ce526d914..a0d343a78e654 100644 --- a/homeassistant/helpers/entityfilter.py +++ b/homeassistant/helpers/entityfilter.py @@ -6,7 +6,7 @@ import operator import re -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_DOMAINS, @@ -77,26 +77,26 @@ def convert_filter(config: dict[str, list[str]]) -> EntityFilter: return EntityFilter(config) -BASE_FILTER_SCHEMA = vol.Schema( +BASE_FILTER_SCHEMA = probatio.Schema( { - vol.Optional(CONF_EXCLUDE_DOMAINS, default=[]): vol.All( + probatio.Optional(CONF_EXCLUDE_DOMAINS, default=[]): probatio.All( cv.ensure_list, [cv.string] ), - vol.Optional(CONF_EXCLUDE_ENTITY_GLOBS, default=[]): vol.All( + probatio.Optional(CONF_EXCLUDE_ENTITY_GLOBS, default=[]): probatio.All( cv.ensure_list, [cv.string] ), - vol.Optional(CONF_EXCLUDE_ENTITIES, default=[]): cv.entity_ids, - vol.Optional(CONF_INCLUDE_DOMAINS, default=[]): vol.All( + probatio.Optional(CONF_EXCLUDE_ENTITIES, default=[]): cv.entity_ids, + probatio.Optional(CONF_INCLUDE_DOMAINS, default=[]): probatio.All( cv.ensure_list, [cv.string] ), - vol.Optional(CONF_INCLUDE_ENTITY_GLOBS, default=[]): vol.All( + probatio.Optional(CONF_INCLUDE_ENTITY_GLOBS, default=[]): probatio.All( cv.ensure_list, [cv.string] ), - vol.Optional(CONF_INCLUDE_ENTITIES, default=[]): cv.entity_ids, + probatio.Optional(CONF_INCLUDE_ENTITIES, default=[]): cv.entity_ids, } ) -FILTER_SCHEMA = vol.All(BASE_FILTER_SCHEMA, convert_filter) +FILTER_SCHEMA = probatio.All(BASE_FILTER_SCHEMA, convert_filter) def convert_include_exclude_filter( @@ -117,28 +117,30 @@ def convert_include_exclude_filter( ) -INCLUDE_EXCLUDE_FILTER_SCHEMA_INNER = vol.Schema( +INCLUDE_EXCLUDE_FILTER_SCHEMA_INNER = probatio.Schema( { - vol.Optional(CONF_DOMAINS, default=[]): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(CONF_ENTITY_GLOBS, default=[]): vol.All( + probatio.Optional(CONF_DOMAINS, default=[]): probatio.All( cv.ensure_list, [cv.string] ), - vol.Optional(CONF_ENTITIES, default=[]): cv.entity_ids, + probatio.Optional(CONF_ENTITY_GLOBS, default=[]): probatio.All( + cv.ensure_list, [cv.string] + ), + probatio.Optional(CONF_ENTITIES, default=[]): cv.entity_ids, } ) -INCLUDE_EXCLUDE_BASE_FILTER_SCHEMA = vol.Schema( +INCLUDE_EXCLUDE_BASE_FILTER_SCHEMA = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_INCLUDE, default=INCLUDE_EXCLUDE_FILTER_SCHEMA_INNER({}) ): INCLUDE_EXCLUDE_FILTER_SCHEMA_INNER, - vol.Optional( + probatio.Optional( CONF_EXCLUDE, default=INCLUDE_EXCLUDE_FILTER_SCHEMA_INNER({}) ): INCLUDE_EXCLUDE_FILTER_SCHEMA_INNER, } ) -INCLUDE_EXCLUDE_FILTER_SCHEMA = vol.All( +INCLUDE_EXCLUDE_FILTER_SCHEMA = probatio.All( INCLUDE_EXCLUDE_BASE_FILTER_SCHEMA, convert_include_exclude_filter ) diff --git a/homeassistant/helpers/http.py b/homeassistant/helpers/http.py index a380cec1ae312..b5592ede48989 100644 --- a/homeassistant/helpers/http.py +++ b/homeassistant/helpers/http.py @@ -16,7 +16,7 @@ HTTPUnauthorized, ) from aiohttp.web_urldispatcher import AbstractResource, AbstractRoute -import voluptuous as vol +import probatio from homeassistant import exceptions from homeassistant.const import CONTENT_TYPE_JSON @@ -92,7 +92,7 @@ async def handle(request: web.Request) -> web.StreamResponse: result = await handler(request, **request.match_info) else: result = handler(request, **request.match_info) - except vol.Invalid as err: + except probatio.Invalid as err: raise HTTPBadRequest from err except exceptions.ServiceNotFound as err: raise HTTPInternalServerError from err diff --git a/homeassistant/helpers/intent.py b/homeassistant/helpers/intent.py index 31d2bf26a69c3..2f11201747907 100644 --- a/homeassistant/helpers/intent.py +++ b/homeassistant/helpers/intent.py @@ -10,8 +10,8 @@ import logging from typing import Any, override +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.components.homeassistant.exposed_entities import async_should_expose from homeassistant.const import ATTR_ENTITY_ID, EntityStateAttribute @@ -56,7 +56,7 @@ INTENT_BROADCAST = "HassBroadcast" INTENT_GET_TEMPERATURE = "HassClimateGetTemperature" -SLOT_SCHEMA = vol.Schema({}, extra=vol.ALLOW_EXTRA) +SLOT_SCHEMA = probatio.Schema({}, extra=probatio.ALLOW_EXTRA) DATA_KEY: HassKey[dict[str, IntentHandler]] = HassKey("intent") @@ -138,7 +138,7 @@ async def async_handle( try: _LOGGER.info("Triggering intent handler %s", handler) result = await handler.async_handle(intent) - except vol.Invalid as err: + except probatio.Invalid as err: _LOGGER.warning("Received invalid slot info for %s: %s", intent_type, err) raise InvalidSlotInfo(f"Received invalid slot info for {intent_type}") from err except IntentError: @@ -843,15 +843,15 @@ def async_validate_slots(self, slots: _SlotsType) -> _SlotsType: return self._slot_schema(slots) # type: ignore[no-any-return] @cached_property - def _slot_schema(self) -> vol.Schema: + def _slot_schema(self) -> probatio.Schema: """Create validation schema for slots.""" assert self.slot_schema is not None - return vol.Schema( + return probatio.Schema( { key: SLOT_SCHEMA.extend({"value": validator}) for key, validator in self.slot_schema.items() }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) async def async_handle(self, intent_obj: Intent) -> IntentResponse: @@ -868,7 +868,7 @@ def non_empty_string(value: Any) -> str: """Coerce value to string and fail if string is empty or whitespace.""" value_str = cv.string(value) if not value_str.strip(): - raise vol.Invalid("string value is empty") + raise probatio.Invalid("string value is empty") return value_str @@ -883,7 +883,7 @@ class IntentSlotInfo: description: str | None = None """Human readable description of the slot.""" - value_schema: VolSchemaType | Callable[[Any], Any] = vol.Any + value_schema: VolSchemaType | Callable[[Any], Any] = probatio.Any """Validator for the slot.""" @@ -947,16 +947,20 @@ def __init__( def slot_schema(self) -> dict: """Return a slot schema.""" domain_validator = ( - vol.In(list(self.required_domains)) if self.required_domains else cv.string + probatio.In(list(self.required_domains)) + if self.required_domains + else cv.string ) slot_schema = { - vol.Any("name", "area", "floor"): non_empty_string, - vol.Optional("domain"): vol.All(cv.ensure_list, [domain_validator]), + probatio.Any("name", "area", "floor"): non_empty_string, + probatio.Optional("domain"): probatio.All( + cv.ensure_list, [domain_validator] + ), } if self.device_classes: - # The typical way to match enums is with vol.Coerce, but we build a + # The typical way to match enums is with probatio.Coerce, but we build a # flat list to make the API simpler to describe programmatically - flattened_device_classes = vol.In( + flattened_device_classes = probatio.In( [ device_class.value for device_class_enum in self.device_classes @@ -965,7 +969,7 @@ def slot_schema(self) -> dict: ) slot_schema.update( { - vol.Optional("device_class"): vol.All( + probatio.Optional("device_class"): probatio.All( cv.ensure_list, [flattened_device_classes], ) @@ -974,15 +978,15 @@ def slot_schema(self) -> dict: slot_schema.update( { - vol.Optional("preferred_area_id"): cv.string, - vol.Optional("preferred_floor_id"): cv.string, + probatio.Optional("preferred_area_id"): cv.string, + probatio.Optional("preferred_floor_id"): cv.string, } ) if self.required_slots: slot_schema.update( { - vol.Required( + probatio.Required( key, description=slot_info.description ): slot_info.value_schema for key, slot_info in self.required_slots.items() @@ -992,7 +996,7 @@ def slot_schema(self) -> dict: if self.optional_slots: slot_schema.update( { - vol.Optional( + probatio.Optional( key, description=slot_info.description ): slot_info.value_schema for key, slot_info in self.optional_slots.items() diff --git a/homeassistant/helpers/llm.py b/homeassistant/helpers/llm.py index 1fe67f966a7c3..07b69a8f57a61 100644 --- a/homeassistant/helpers/llm.py +++ b/homeassistant/helpers/llm.py @@ -5,9 +5,8 @@ from dataclasses import dataclass, field as dc_field from typing import Any, override -from probatio import UNSUPPORTED, to_openapi +import probatio import slugify as unicode_slug -import voluptuous as vol from homeassistant.const import ( ATTR_DOMAIN, @@ -34,7 +33,7 @@ from .singleton import singleton ACTION_PARAMETERS_CACHE: HassKey[ - dict[str, dict[str, tuple[str | None, vol.Schema]]] + dict[str, dict[str, tuple[str | None, probatio.Schema]]] ] = HassKey("llm_action_parameters_cache") APIS_CACHE: HassKey[dict[str, API]] = HassKey("llm_apis") @@ -160,7 +159,7 @@ class Tool: name: str description: str | None = None - parameters: vol.Schema = vol.Schema({}) + parameters: probatio.Schema = probatio.Schema({}) @abstractmethod async def async_call( @@ -247,7 +246,7 @@ def __init__( extra_slots.add(field) del slot_schema[field] - self.parameters = vol.Schema(slot_schema) + self.parameters = probatio.Schema(slot_schema) if extra_slots: self.extra_slots = extra_slots @@ -416,7 +415,7 @@ def selector_serializer(schema: Any) -> Any: # noqa: C901 return {"type": "boolean"} if not isinstance(schema, selector.Selector): - return UNSUPPORTED + return probatio.UNSUPPORTED if isinstance(schema, selector.BackupLocationSelector): return {"type": "string", "pattern": "^(?:\\/backup|\\w+)$"} @@ -434,10 +433,10 @@ def selector_serializer(schema: Any) -> Any: # noqa: C901 } if isinstance(schema, selector.ConditionSelector): - return to_openapi(cv.CONDITIONS_SCHEMA) + return probatio.to_openapi(cv.CONDITIONS_SCHEMA) if isinstance(schema, selector.ConstantSelector): - return to_openapi(vol.Schema(schema.config["value"])) + return probatio.to_openapi(probatio.Schema(schema.config["value"])) result: dict[str, Any] if isinstance(schema, selector.ColorTempSelector): @@ -464,7 +463,7 @@ def selector_serializer(schema: Any) -> Any: # noqa: C901 return {"type": "string", "format": "date-time"} if isinstance(schema, selector.DurationSelector): - return to_openapi(cv.time_period_dict) + return probatio.to_openapi(cv.time_period_dict) if isinstance(schema, selector.EntitySelector): if schema.config.get("multiple"): @@ -478,10 +477,10 @@ def selector_serializer(schema: Any) -> Any: # noqa: C901 return {"type": "string", "format": "RFC 5646"} if isinstance(schema, selector.LocationSelector): - return to_openapi(schema.DATA_SCHEMA) + return probatio.to_openapi(schema.DATA_SCHEMA) if isinstance(schema, selector.MediaSelector): - item_schema = to_openapi(schema.DATA_SCHEMA) + item_schema = probatio.to_openapi(schema.DATA_SCHEMA) # Media selector allows multiple when configured if schema.config.get("multiple"): return { @@ -504,7 +503,7 @@ def selector_serializer(schema: Any) -> Any: # noqa: C901 properties = {} required = [] for field, field_schema in fields.items(): - properties[field] = to_openapi( + properties[field] = probatio.to_openapi( selector.selector(field_schema["selector"]), custom_serializer=selector_serializer, ) @@ -536,7 +535,7 @@ def selector_serializer(schema: Any) -> Any: # noqa: C901 return {"type": "string", "enum": options} if isinstance(schema, selector.TargetSelector): - return to_openapi(cv.TARGET_FIELDS) + return probatio.to_openapi(cv.TARGET_FIELDS) if isinstance(schema, selector.TemplateSelector): return {"type": "string", "format": "jinja2"} @@ -555,10 +554,10 @@ def selector_serializer(schema: Any) -> Any: # noqa: C901 def _get_cached_action_parameters( hass: HomeAssistant, domain: str, action: str -) -> tuple[str | None, vol.Schema]: +) -> tuple[str | None, probatio.Schema]: """Get action description and schema.""" description = None - parameters = vol.Schema({}) + parameters = probatio.Schema({}) parameters_cache = hass.data.get(ACTION_PARAMETERS_CACHE) @@ -591,24 +590,24 @@ def on_homeassistant_close(event: Event) -> None: hass, domain, action ): description = action_desc.get("description") - schema: dict[vol.Marker, Any] = {} + schema: dict[probatio.Marker, Any] = {} fields = action_desc.get("fields", {}) for field, config in fields.items(): field_description = config.get("description") if not field_description: field_description = config.get("name") - key: vol.Marker + key: probatio.Marker if config.get("required"): - key = vol.Required(field, description=field_description) + key = probatio.Required(field, description=field_description) else: - key = vol.Optional(field, description=field_description) + key = probatio.Optional(field, description=field_description) if "selector" in config: schema[key] = selector.selector(config["selector"]) else: schema[key] = cv.string - parameters = vol.Schema(schema) + parameters = probatio.Schema(schema) parameters_cache.setdefault(domain, {})[action] = (description, parameters) diff --git a/homeassistant/helpers/schema_config_entry_flow.py b/homeassistant/helpers/schema_config_entry_flow.py index 0d424b4d8cead..c4de641e873e0 100644 --- a/homeassistant/helpers/schema_config_entry_flow.py +++ b/homeassistant/helpers/schema_config_entry_flow.py @@ -7,7 +7,7 @@ import types from typing import Any, cast, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -37,11 +37,13 @@ class SchemaFlowFormStep(SchemaFlowStep): """Define a config or options flow form step.""" schema: ( - vol.Schema - | Callable[[SchemaCommonFlowHandler], Coroutine[Any, Any, vol.Schema | None]] + probatio.Schema + | Callable[ + [SchemaCommonFlowHandler], Coroutine[Any, Any, probatio.Schema | None] + ] | None ) = None - """Optional voluptuous schema, or function which returns a schema or None, for + """Optional schema, or function which returns a schema or None, for requesting and validating user input. - If a function is specified, the function will be passed the current @@ -168,10 +170,12 @@ async def _get_options(self, form_step: SchemaFlowMenuStep) -> Container[str]: return form_step.options return await form_step.options(self) - async def _get_schema(self, form_step: SchemaFlowFormStep) -> vol.Schema | None: + async def _get_schema( + self, form_step: SchemaFlowFormStep + ) -> probatio.Schema | None: if form_step.schema is None: return None - if isinstance(form_step.schema, vol.Schema): + if isinstance(form_step.schema, probatio.Schema): return form_step.schema return await form_step.schema(self) @@ -203,13 +207,13 @@ def _update_and_remove_omitted_optional_keys( self, values: dict[str, Any], user_input: dict[str, Any], - data_schema: vol.Schema | None, + data_schema: probatio.Schema | None, ) -> None: values.update(user_input) if data_schema and data_schema.schema: for key in data_schema.schema: if ( - isinstance(key, vol.Optional) + isinstance(key, probatio.Optional) and key not in user_input and not ( # don't remove read_only keys diff --git a/homeassistant/helpers/script.py b/homeassistant/helpers/script.py index 1da929f2291fc..a70d8d594305b 100644 --- a/homeassistant/helpers/script.py +++ b/homeassistant/helpers/script.py @@ -12,8 +12,8 @@ from typing import Any, Literal, TypedDict, cast, overload, override import async_interrupt +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant import exceptions from homeassistant.components import scene @@ -285,21 +285,23 @@ async def __aexit__( def make_script_schema( - schema: Mapping[Any, Any], default_script_mode: str, extra: int = vol.PREVENT_EXTRA -) -> vol.Schema: + schema: Mapping[Any, Any], + default_script_mode: str, + extra: int = probatio.PREVENT_EXTRA, +) -> probatio.Schema: """Make a schema for a component that uses the script helper.""" - return vol.Schema( + return probatio.Schema( { **schema, - vol.Optional(CONF_MODE, default=default_script_mode): vol.In( + probatio.Optional(CONF_MODE, default=default_script_mode): probatio.In( SCRIPT_MODE_CHOICES ), - vol.Optional(CONF_MAX, default=DEFAULT_MAX): vol.All( - vol.Coerce(int), vol.Range(min=2) - ), - vol.Optional(CONF_MAX_EXCEEDED, default=DEFAULT_MAX_EXCEEDED): vol.All( - vol.Upper, vol.In(_MAX_EXCEEDED_CHOICES) + probatio.Optional(CONF_MAX, default=DEFAULT_MAX): probatio.All( + probatio.Coerce(int), probatio.Range(min=2) ), + probatio.Optional( + CONF_MAX_EXCEEDED, default=DEFAULT_MAX_EXCEEDED + ): probatio.All(probatio.Upper, probatio.In(_MAX_EXCEEDED_CHOICES)), }, extra=extra, ) @@ -620,7 +622,7 @@ def _handle_exception( if isinstance( exception, ( - vol.Invalid, + probatio.Invalid, exceptions.TemplateError, exceptions.ServiceNotFound, exceptions.InvalidEntityFormatError, @@ -643,7 +645,7 @@ def _log_exception(self, exception: Exception) -> None: error = str(exception) level = logging.ERROR - if isinstance(exception, vol.Invalid): + if isinstance(exception, probatio.Invalid): error_desc = "Invalid data" elif isinstance(exception, exceptions.TemplateError): @@ -1063,12 +1065,12 @@ async def _async_step_call_service(self) -> None: params[CONF_DOMAIN], params[CONF_SERVICE] ) if supports_response == SupportsResponse.ONLY and not return_response: - raise vol.Invalid( + raise probatio.Invalid( f"Script requires '{CONF_RESPONSE_VARIABLE}' for response data " f"for service call {params[CONF_DOMAIN]}.{params[CONF_SERVICE]}" ) if supports_response == SupportsResponse.NONE and return_response: - raise vol.Invalid( + raise probatio.Invalid( f"Script does not support '{CONF_RESPONSE_VARIABLE}' for service " f"'{params[CONF_DOMAIN]}.{params[CONF_SERVICE]}'" " which does not support response data." @@ -1186,7 +1188,7 @@ def _get_pos_time_period_template(self, key: str) -> timedelta: return cv.positive_time_period( # type: ignore[no-any-return] template.render_complex(self._action[key], self._variables) ) - except (exceptions.TemplateError, vol.Invalid) as ex: + except (exceptions.TemplateError, probatio.Invalid) as ex: self._log( "Error rendering %s %s template: %s", self._script.name, diff --git a/homeassistant/helpers/selector.py b/homeassistant/helpers/selector.py index 88b690cb5bf18..f9af2eb1d7181 100644 --- a/homeassistant/helpers/selector.py +++ b/homeassistant/helpers/selector.py @@ -8,7 +8,7 @@ from typing import TYPE_CHECKING, Any, Literal, Required, TypedDict, cast, override from uuid import UUID -import voluptuous as vol +import probatio from homeassistant.const import CONF_MODE, CONF_UNIT_OF_MEASUREMENT, Platform from homeassistant.core import split_entity_id, valid_entity_id @@ -27,15 +27,17 @@ def _get_selector_type_and_class(config: Any) -> tuple[str, type[Selector]]: """Get selector type and class.""" if not isinstance(config, dict): - raise vol.Invalid("Expected a dictionary") + raise probatio.Invalid("Expected a dictionary") if len(config) != 1: - raise vol.Invalid(f"Only one type can be specified. Found {', '.join(config)}") + raise probatio.Invalid( + f"Only one type can be specified. Found {', '.join(config)}" + ) selector_type: str = list(config)[0] if (selector_class := SELECTORS.get(selector_type)) is None: - raise vol.Invalid(f"Unknown selector type {selector_type} found") + raise probatio.Invalid(f"Unknown selector type {selector_type} found") return selector_type, selector_class @@ -80,7 +82,7 @@ def __eq__(self, other: object) -> bool: return self.selector_type == other.selector_type and self.config == other.config def serialize(self) -> dict[str, dict[str, _T]]: - """Serialize Selector for voluptuous_serialize.""" + """Serialize Selector for to_field_list.""" return {"selector": {self.selector_type: self.config}} @@ -103,7 +105,7 @@ def _validate_supported_feature(supported_feature: str) -> int: try: domain, enum, feature = supported_feature.split(".", 2) except ValueError as exc: - raise vol.Invalid( + raise probatio.Invalid( f"Invalid supported feature '{supported_feature}', expected " ".." ) from exc @@ -111,7 +113,9 @@ def _validate_supported_feature(supported_feature: str) -> int: try: return _entity_feature_flag(domain, enum, feature) except (ModuleNotFoundError, AttributeError) as exc: - raise vol.Invalid(f"Unknown supported feature '{supported_feature}'") from exc + raise probatio.Invalid( + f"Unknown supported feature '{supported_feature}'" + ) from exc def _validate_supported_features(supported_features: list[str]) -> int: @@ -128,11 +132,11 @@ def _validate_supported_features(supported_features: list[str]) -> int: def _validate_selector_reorder_config(config: Any) -> Any: """Validate selectors with reorder option.""" if config.get("reorder") and not config.get("multiple"): - raise vol.Invalid("reorder can only be used when multiple is true") + raise probatio.Invalid("reorder can only be used when multiple is true") return config -def make_selector_config_schema(schema_dict: dict | None = None) -> vol.Schema: +def make_selector_config_schema(schema_dict: dict | None = None) -> probatio.Schema: """Make selector config schema.""" if schema_dict is None: schema_dict = {} @@ -142,11 +146,11 @@ def none_to_empty_dict(value: Any) -> Any: return {} return value - return vol.Schema( - vol.All( + return probatio.Schema( + probatio.All( none_to_empty_dict, { - vol.Optional("read_only"): bool, + probatio.Optional("read_only"): bool, **schema_dict, }, ) @@ -159,20 +163,22 @@ class BaseSelectorConfig(TypedDict, total=False): read_only: bool -ENTITY_FILTER_SELECTOR_CONFIG_SCHEMA = vol.Schema( +ENTITY_FILTER_SELECTOR_CONFIG_SCHEMA = probatio.Schema( { # Integration that provided the entity - vol.Optional("integration"): str, + probatio.Optional("integration"): str, # Domain the entity belongs to - vol.Optional("domain"): vol.All(cv.ensure_list, [str]), + probatio.Optional("domain"): probatio.All(cv.ensure_list, [str]), # Device class of the entity - vol.Optional("device_class"): vol.All(cv.ensure_list, [str]), + probatio.Optional("device_class"): probatio.All(cv.ensure_list, [str]), # Features supported by the entity - vol.Optional("supported_features"): [ - vol.All(cv.ensure_list, [str], _validate_supported_features) + probatio.Optional("supported_features"): [ + probatio.All(cv.ensure_list, [str], _validate_supported_features) ], # Unit of measurement of the entity - vol.Optional(CONF_UNIT_OF_MEASUREMENT): vol.All(cv.ensure_list, [str]), + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): probatio.All( + cv.ensure_list, [str] + ), } ) @@ -194,11 +200,11 @@ class _LegacyEntityFilterSelectorConfig(TypedDict, total=False): # https://github.com/home-assistant/frontend/pull/15302 _LEGACY_ENTITY_SELECTOR_CONFIG_SCHEMA_DICT = { # Integration that provided the entity - vol.Optional("integration"): str, + probatio.Optional("integration"): str, # Domain the entity belongs to - vol.Optional("domain"): vol.All(cv.ensure_list, [str]), + probatio.Optional("domain"): probatio.All(cv.ensure_list, [str]), # Device class of the entity - vol.Optional("device_class"): vol.All(cv.ensure_list, [str]), + probatio.Optional("device_class"): probatio.All(cv.ensure_list, [str]), } @@ -212,16 +218,16 @@ class EntityFilterSelectorConfig(TypedDict, total=False): unit_of_measurement: str | list[str] -DEVICE_FILTER_SELECTOR_CONFIG_SCHEMA = vol.Schema( +DEVICE_FILTER_SELECTOR_CONFIG_SCHEMA = probatio.Schema( { # Integration linked to it with a config entry - vol.Optional("integration"): str, + probatio.Optional("integration"): str, # Manufacturer of device - vol.Optional("manufacturer"): str, + probatio.Optional("manufacturer"): str, # Model of device - vol.Optional("model"): str, + probatio.Optional("model"): str, # Model ID of device - vol.Optional("model_id"): str, + probatio.Optional("model_id"): str, } ) @@ -232,11 +238,11 @@ class EntityFilterSelectorConfig(TypedDict, total=False): # https://github.com/home-assistant/frontend/pull/15302 _LEGACY_DEVICE_SELECTOR_CONFIG_SCHEMA_DICT = { # Integration linked to it with a config entry - vol.Optional("integration"): str, + probatio.Optional("integration"): str, # Manufacturer of device - vol.Optional("manufacturer"): str, + probatio.Optional("manufacturer"): str, # Model of device - vol.Optional("model"): str, + probatio.Optional("model"): str, } @@ -253,7 +259,7 @@ class DeviceFilterSelectorConfig(TypedDict, total=False): ENTITY_FILTER_SELECTOR_CONFIG_SCHEMA.extend( { # Filter on properties of the device the entity belongs to - vol.Optional("device"): DEVICE_FILTER_SELECTOR_CONFIG_SCHEMA, + probatio.Optional("device"): DEVICE_FILTER_SELECTOR_CONFIG_SCHEMA, } ) ) @@ -305,8 +311,8 @@ class AppSelector(Selector[AppSelectorConfig]): CONFIG_SCHEMA = make_selector_config_schema( { - vol.Optional("name"): str, - vol.Optional("slug"): str, + probatio.Optional("name"): str, + probatio.Optional("slug"): str, } ) @@ -316,7 +322,7 @@ def __init__(self, config: AppSelectorConfig | None = None) -> None: def __call__(self, data: Any) -> str: """Validate the passed selection.""" - app: str = vol.Schema(str)(data) + app: str = probatio.Schema(str)(data) return app @@ -342,7 +348,7 @@ def __init__(self, config: AddonSelectorConfig | None = None) -> None: def __call__(self, data: Any) -> str: """Validate the passed selection.""" - addon: str = vol.Schema(str)(data) + addon: str = probatio.Schema(str)(data) return addon @@ -361,19 +367,19 @@ class AreaSelector(Selector[AreaSelectorConfig]): selector_type = "area" - CONFIG_SCHEMA = vol.All( + CONFIG_SCHEMA = probatio.All( make_selector_config_schema( { - vol.Optional("entity"): vol.All( + probatio.Optional("entity"): probatio.All( cv.ensure_list, [ENTITY_FILTER_SELECTOR_CONFIG_SCHEMA], ), - vol.Optional("device"): vol.All( + probatio.Optional("device"): probatio.All( cv.ensure_list, [DEVICE_FILTER_SELECTOR_CONFIG_SCHEMA], ), - vol.Optional("multiple", default=False): cv.boolean, - vol.Optional("reorder", default=False): cv.boolean, + probatio.Optional("multiple", default=False): cv.boolean, + probatio.Optional("reorder", default=False): cv.boolean, } ), _validate_selector_reorder_config, @@ -386,11 +392,11 @@ def __init__(self, config: AreaSelectorConfig | None = None) -> None: def __call__(self, data: Any) -> str | list[str]: """Validate the passed selection.""" if not self.config["multiple"]: - area_id: str = vol.Schema(str)(data) + area_id: str = probatio.Schema(str)(data) return area_id if not isinstance(data, list): - raise vol.Invalid("Value should be a list") - return [vol.Schema(str)(val) for val in data] + raise probatio.Invalid("Value should be a list") + return [probatio.Schema(str)(val) for val in data] class AssistPipelineSelectorConfig(BaseSelectorConfig, total=False): @@ -411,7 +417,7 @@ def __init__(self, config: AssistPipelineSelectorConfig | None = None) -> None: def __call__(self, data: Any) -> str: """Validate the passed selection.""" - pipeline: str = vol.Schema(str)(data) + pipeline: str = probatio.Schema(str)(data) return pipeline @@ -430,10 +436,10 @@ class AttributeSelector(Selector[AttributeSelectorConfig]): CONFIG_SCHEMA = make_selector_config_schema( { - vol.Required("entity_id"): cv.entity_id, + probatio.Required("entity_id"): cv.entity_id, # hide_attributes is used to hide attributes in the frontend. # A hidden attribute can still be provided manually. - vol.Optional("hide_attributes"): [str], + probatio.Optional("hide_attributes"): [str], } ) @@ -447,7 +453,7 @@ def __init__(self, config: AttributeSelectorConfig) -> None: def __call__(self, data: Any) -> str: """Validate the passed selection.""" - attribute: str = vol.Schema(str)(data) + attribute: str = probatio.Schema(str)(data) return attribute @@ -495,10 +501,10 @@ class AutomationBehaviorSelector(Selector[AutomationBehaviorConfig]): CONFIG_SCHEMA = make_selector_config_schema( { - vol.Required("mode"): vol.All( - vol.Coerce(AutomationBehaviorSelectorMode), lambda val: val.value + probatio.Required("mode"): probatio.All( + probatio.Coerce(AutomationBehaviorSelectorMode), lambda val: val.value ), - vol.Optional("translation_key"): cv.string, + probatio.Optional("translation_key"): cv.string, }, ) @@ -509,9 +515,9 @@ def __init__(self, config: AutomationBehaviorConfig | None = None) -> None: def __call__(self, data: Any) -> Any: """Validate the passed selection.""" if not isinstance(data, str): - raise vol.Invalid("Value should be a string") + raise probatio.Invalid("Value should be a string") mode = AutomationBehaviorSelectorMode(self.config["mode"]) - return vol.In(_AUTOMATION_BEHAVIOR_MODES[mode])(data) + return probatio.In(_AUTOMATION_BEHAVIOR_MODES[mode])(data) class BackupLocationSelectorConfig(BaseSelectorConfig, total=False): @@ -532,7 +538,7 @@ def __init__(self, config: BackupLocationSelectorConfig | None = None) -> None: def __call__(self, data: Any) -> str: """Validate the passed selection.""" - name: str = vol.Match(r"^(?:\/backup|\w+)$")(data) + name: str = probatio.Match(r"^(?:\/backup|\w+)$")(data) return name @@ -554,7 +560,7 @@ def __init__(self, config: BooleanSelectorConfig | None = None) -> None: def __call__(self, data: Any) -> bool: """Validate the passed selection.""" - value: bool = vol.Coerce(bool)(data) + value: bool = probatio.Coerce(bool)(data) return value @@ -564,7 +570,7 @@ def reject_nested_choose_selector(config: dict[str, Any]) -> dict[str, Any]: if isinstance(choice["selector"], dict): selector_type, _ = _get_selector_type_and_class(choice["selector"]) if selector_type == "choose": - raise vol.Invalid("Nested choose selectors are not allowed") + raise probatio.Invalid("Nested choose selectors are not allowed") return config @@ -587,15 +593,17 @@ class ChooseSelector(Selector[ChooseSelectorConfig]): selector_type = "choose" - CONFIG_SCHEMA = vol.All( + CONFIG_SCHEMA = probatio.All( make_selector_config_schema( { - vol.Required("choices"): { + probatio.Required("choices"): { str: { - vol.Required("selector"): vol.Any(Selector, validate_selector), + probatio.Required("selector"): probatio.Any( + Selector, validate_selector + ), } }, - vol.Optional("translation_key"): cv.string, + probatio.Optional("translation_key"): cv.string, }, ), reject_nested_choose_selector, @@ -607,7 +615,7 @@ def __init__(self, config: ChooseSelectorConfig | None = None) -> None: @override def serialize(self) -> dict[str, dict[str, ChooseSelectorConfig]]: - """Serialize ChooseSelectorConfig for voluptuous_serialize.""" + """Serialize ChooseSelectorConfig for to_field_list.""" _config = deepcopy(self.config) if "choices" in _config: for choice in _config["choices"].values(): @@ -621,21 +629,21 @@ def __call__(self, data: Any) -> Any: for choice in self.config["choices"].values(): try: validated = selector(choice["selector"])(data) # type: ignore[operator] - except vol.Invalid, vol.MultipleInvalid: + except probatio.Invalid, probatio.MultipleInvalid: continue else: return validated - raise vol.Invalid("Value does not match any choice selector") + raise probatio.Invalid("Value does not match any choice selector") if "active_choice" not in data: - raise vol.Invalid("Missing active_choice key") + raise probatio.Invalid("Missing active_choice key") if data["active_choice"] not in data: - raise vol.Invalid("Missing value for active choice") + raise probatio.Invalid("Missing value for active choice") choices = self.config.get("choices", {}) if data["active_choice"] not in choices: - raise vol.Invalid("Invalid active_choice key") + raise probatio.Invalid("Invalid active_choice key") return selector(choices[data["active_choice"]]["selector"])( # type: ignore[operator] data[data["active_choice"]] ) @@ -659,7 +667,9 @@ def __init__(self, config: ColorRGBSelectorConfig | None = None) -> None: def __call__(self, data: Any) -> list[int]: """Validate the passed selection.""" - value: list[int] = vol.All(list, vol.ExactSequence((cv.byte,) * 3))(data) + value: list[int] = probatio.All(list, probatio.ExactSequence((cv.byte,) * 3))( + data + ) return value @@ -688,13 +698,15 @@ class ColorTempSelector(Selector[ColorTempSelectorConfig]): CONFIG_SCHEMA = make_selector_config_schema( { - vol.Optional("unit", default=ColorTempSelectorUnit.MIRED): vol.All( - vol.Coerce(ColorTempSelectorUnit), lambda val: val.value + probatio.Optional( + "unit", default=ColorTempSelectorUnit.MIRED + ): probatio.All( + probatio.Coerce(ColorTempSelectorUnit), lambda val: val.value ), - vol.Optional("min"): vol.Coerce(int), - vol.Optional("max"): vol.Coerce(int), - vol.Optional("max_mireds"): vol.Coerce(int), - vol.Optional("min_mireds"): vol.Coerce(int), + probatio.Optional("min"): probatio.Coerce(int), + probatio.Optional("max"): probatio.Coerce(int), + probatio.Optional("max_mireds"): probatio.Coerce(int), + probatio.Optional("min_mireds"): probatio.Coerce(int), } ) @@ -713,9 +725,9 @@ def __call__(self, data: Any) -> int: if range_max is None: range_max = self.config.get("max_mireds") - value: int = vol.All( - vol.Coerce(float), - vol.Range( + value: int = probatio.All( + probatio.Coerce(float), + probatio.Range( min=range_min, max=range_max, ), @@ -741,7 +753,7 @@ def __init__(self, config: ConditionSelectorConfig | None = None) -> None: def __call__(self, data: Any) -> Any: """Validate the passed selection.""" - return vol.Schema(cv.CONDITIONS_SCHEMA)(data) + return probatio.Schema(cv.CONDITIONS_SCHEMA)(data) class ConfigEntrySelectorConfig(BaseSelectorConfig, total=False): @@ -758,7 +770,7 @@ class ConfigEntrySelector(Selector[ConfigEntrySelectorConfig]): CONFIG_SCHEMA = make_selector_config_schema( { - vol.Optional("integration"): str, + probatio.Optional("integration"): str, } ) @@ -768,7 +780,7 @@ def __init__(self, config: ConfigEntrySelectorConfig | None = None) -> None: def __call__(self, data: Any) -> str: """Validate the passed selection.""" - config: str = vol.Schema(str)(data) + config: str = probatio.Schema(str)(data) return config @@ -788,9 +800,9 @@ class ConstantSelector(Selector[ConstantSelectorConfig]): CONFIG_SCHEMA = make_selector_config_schema( { - vol.Optional("label"): str, - vol.Optional("translation_key"): cv.string, - vol.Required("value"): vol.Any(str, int, bool), + probatio.Optional("label"): str, + probatio.Optional("translation_key"): cv.string, + probatio.Required("value"): probatio.Any(str, int, bool), } ) @@ -800,7 +812,7 @@ def __init__(self, config: ConstantSelectorConfig) -> None: def __call__(self, data: Any) -> Any: """Validate the passed selection.""" - vol.Schema(self.config["value"])(data) + probatio.Schema(self.config["value"])(data) return self.config["value"] @@ -818,7 +830,7 @@ class ConversationAgentSelector(Selector[ConversationAgentSelectorConfig]): CONFIG_SCHEMA = make_selector_config_schema( { - vol.Optional("language"): str, + probatio.Optional("language"): str, } ) @@ -828,7 +840,7 @@ def __init__(self, config: ConversationAgentSelectorConfig | None = None) -> Non def __call__(self, data: Any) -> str: """Validate the passed selection.""" - agent: str = vol.Schema(str)(data) + agent: str = probatio.Schema(str)(data) return agent @@ -847,8 +859,8 @@ class CountrySelector(Selector[CountrySelectorConfig]): CONFIG_SCHEMA = make_selector_config_schema( { - vol.Optional("countries"): [str], - vol.Optional("no_sort", default=False): cv.boolean, + probatio.Optional("countries"): [str], + probatio.Optional("no_sort", default=False): cv.boolean, } ) @@ -858,11 +870,11 @@ def __init__(self, config: CountrySelectorConfig | None = None) -> None: def __call__(self, data: Any) -> Any: """Validate the passed selection.""" - country: str = vol.Schema(str)(data) + country: str = probatio.Schema(str)(data) if "countries" in self.config and ( country not in self.config["countries"] or country not in COUNTRIES ): - raise vol.Invalid(f"Value {country} is not a valid option") + raise probatio.Invalid(f"Value {country} is not a valid option") return country @@ -953,10 +965,10 @@ class DeviceClassSelector(Selector[DeviceClassSelectorConfig]): CONFIG_SCHEMA = make_selector_config_schema( { - vol.Required("domain"): vol.All( - vol.In(SUPPORTED_PLATFORMS), lambda val: Platform(val).value + probatio.Required("domain"): probatio.All( + probatio.In(SUPPORTED_PLATFORMS), lambda val: Platform(val).value ), - vol.Optional("multiple", default=False): cv.boolean, + probatio.Optional("multiple", default=False): cv.boolean, } ) @@ -969,13 +981,13 @@ def __call__(self, data: Any) -> Any: valid_options = _enum_options( self.config["domain"], self.SUPPORTED_PLATFORMS[self.config["domain"]] ) - options_schema = vol.In(valid_options) + options_schema = probatio.In(valid_options) if not self.config["multiple"]: - return options_schema(vol.Schema(str)(data)) + return options_schema(probatio.Schema(str)(data)) if not isinstance(data, list): - raise vol.Invalid("Value should be a list") - return [options_schema(vol.Schema(str)(val)) for val in data] + raise probatio.Invalid("Value should be a list") + return [options_schema(probatio.Schema(str)(val)) for val in data] class DeviceSelectorConfig(BaseSelectorConfig, DeviceFilterSelectorConfig, total=False): @@ -996,11 +1008,11 @@ class DeviceSelector(Selector[DeviceSelectorConfig]): { **_LEGACY_DEVICE_SELECTOR_CONFIG_SCHEMA_DICT, # Device has to contain entities matching this selector - vol.Optional("entity"): vol.All( + probatio.Optional("entity"): probatio.All( cv.ensure_list, [ENTITY_FILTER_SELECTOR_CONFIG_SCHEMA] ), - vol.Optional("multiple", default=False): cv.boolean, - vol.Optional("filter"): vol.All( + probatio.Optional("multiple", default=False): cv.boolean, + probatio.Optional("filter"): probatio.All( cv.ensure_list, [DEVICE_FILTER_SELECTOR_CONFIG_SCHEMA], ), @@ -1014,11 +1026,11 @@ def __init__(self, config: DeviceSelectorConfig | None = None) -> None: def __call__(self, data: Any) -> str | list[str]: """Validate the passed selection.""" if not self.config["multiple"]: - device_id: str = vol.Schema(str)(data) + device_id: str = probatio.Schema(str)(data) return device_id if not isinstance(data, list): - raise vol.Invalid("Value should be a list") - return [vol.Schema(str)(val) for val in data] + raise probatio.Invalid("Value should be a list") + return [probatio.Schema(str)(val) for val in data] class DurationSelectorConfig(BaseSelectorConfig, total=False): @@ -1040,13 +1052,13 @@ class DurationSelector(Selector[DurationSelectorConfig]): { # Enable day field in frontend. A selection with `days` set is allowed # even if `enable_day` is not set - vol.Optional("enable_day"): cv.boolean, + probatio.Optional("enable_day"): cv.boolean, # Enable seconds field in frontend. - vol.Optional("enable_second", default=True): cv.boolean, + probatio.Optional("enable_second", default=True): cv.boolean, # Enable millisecond field in frontend. - vol.Optional("enable_millisecond"): cv.boolean, + probatio.Optional("enable_millisecond"): cv.boolean, # Allow negative durations. - vol.Optional("allow_negative"): cv.boolean, + probatio.Optional("allow_negative"): cv.boolean, } ) @@ -1088,15 +1100,15 @@ class EntitySelector(Selector[EntitySelectorConfig]): selector_type = "entity" - CONFIG_SCHEMA = vol.All( + CONFIG_SCHEMA = probatio.All( make_selector_config_schema( { **_LEGACY_ENTITY_SELECTOR_CONFIG_SCHEMA_DICT, - vol.Optional("exclude_entities"): [str], - vol.Optional("include_entities"): [str], - vol.Optional("multiple", default=False): cv.boolean, - vol.Optional("reorder", default=False): cv.boolean, - vol.Optional("filter"): vol.All( + probatio.Optional("exclude_entities"): [str], + probatio.Optional("include_entities"): [str], + probatio.Optional("multiple", default=False): cv.boolean, + probatio.Optional("reorder", default=False): cv.boolean, + probatio.Optional("filter"): probatio.All( cv.ensure_list, [ENTITY_WITH_DEVICE_FILTER_SELECTOR_CONFIG_SCHEMA], ), @@ -1122,21 +1134,21 @@ def validate(e_or_u: str) -> str: if allowed_domains := cv.ensure_list(self.config.get("domain")): domain = split_entity_id(e_or_u)[0] if domain not in allowed_domains: - raise vol.Invalid( + raise probatio.Invalid( f"Entity {e_or_u} belongs to domain {domain}, " f"expected {allowed_domains}" ) if include_entities: - vol.In(include_entities)(e_or_u) + probatio.In(include_entities)(e_or_u) if exclude_entities: - vol.NotIn(exclude_entities)(e_or_u) + probatio.NotIn(exclude_entities)(e_or_u) return e_or_u if not self.config["multiple"]: return validate(data) if not isinstance(data, list): - raise vol.Invalid("Value should be a list") - return cast(list, vol.Schema([validate])(data)) # Output is a list + raise probatio.Invalid("Value should be a list") + return cast(list, probatio.Schema([validate])(data)) # Output is a list class FileSelectorConfig(BaseSelectorConfig): @@ -1154,7 +1166,7 @@ class FileSelector(Selector[FileSelectorConfig]): CONFIG_SCHEMA = make_selector_config_schema( { # https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#accept - vol.Required("accept"): str, + probatio.Required("accept"): str, } ) @@ -1165,7 +1177,7 @@ def __init__(self, config: FileSelectorConfig) -> None: def __call__(self, data: Any) -> str: """Validate the passed selection.""" if not isinstance(data, str): - raise vol.Invalid("Value should be a string") + raise probatio.Invalid("Value should be a string") UUID(data) @@ -1188,15 +1200,15 @@ class FloorSelector(Selector[FloorSelectorConfig]): CONFIG_SCHEMA = make_selector_config_schema( { - vol.Optional("entity"): vol.All( + probatio.Optional("entity"): probatio.All( cv.ensure_list, [ENTITY_FILTER_SELECTOR_CONFIG_SCHEMA], ), - vol.Optional("device"): vol.All( + probatio.Optional("device"): probatio.All( cv.ensure_list, [DEVICE_FILTER_SELECTOR_CONFIG_SCHEMA], ), - vol.Optional("multiple", default=False): cv.boolean, + probatio.Optional("multiple", default=False): cv.boolean, } ) @@ -1207,11 +1219,11 @@ def __init__(self, config: FloorSelectorConfig | None = None) -> None: def __call__(self, data: Any) -> str | list[str]: """Validate the passed selection.""" if not self.config["multiple"]: - floor_id: str = vol.Schema(str)(data) + floor_id: str = probatio.Schema(str)(data) return floor_id if not isinstance(data, list): - raise vol.Invalid("Value should be a list") - return [vol.Schema(str)(val) for val in data] + raise probatio.Invalid("Value should be a list") + return [probatio.Schema(str)(val) for val in data] class IconSelectorConfig(BaseSelectorConfig, total=False): @@ -1227,7 +1239,7 @@ class IconSelector(Selector[IconSelectorConfig]): selector_type = "icon" CONFIG_SCHEMA = make_selector_config_schema( - {vol.Optional("placeholder"): str} + {probatio.Optional("placeholder"): str} # Frontend also has a fallbackPath option, this is not used by core ) @@ -1237,7 +1249,7 @@ def __init__(self, config: IconSelectorConfig | None = None) -> None: def __call__(self, data: Any) -> str: """Validate the passed selection.""" - icon: str = vol.Schema(str)(data) + icon: str = probatio.Schema(str)(data) return icon @@ -1255,7 +1267,7 @@ class LabelSelector(Selector[LabelSelectorConfig]): CONFIG_SCHEMA = make_selector_config_schema( { - vol.Optional("multiple", default=False): cv.boolean, + probatio.Optional("multiple", default=False): cv.boolean, } ) @@ -1266,11 +1278,11 @@ def __init__(self, config: LabelSelectorConfig | None = None) -> None: def __call__(self, data: Any) -> str | list[str]: """Validate the passed selection.""" if not self.config["multiple"]: - label_id: str = vol.Schema(str)(data) + label_id: str = probatio.Schema(str)(data) return label_id if not isinstance(data, list): - raise vol.Invalid("Value should be a list") - return [vol.Schema(str)(val) for val in data] + raise probatio.Invalid("Value should be a list") + return [probatio.Schema(str)(val) for val in data] class LanguageSelectorConfig(BaseSelectorConfig, total=False): @@ -1289,9 +1301,9 @@ class LanguageSelector(Selector[LanguageSelectorConfig]): CONFIG_SCHEMA = make_selector_config_schema( { - vol.Optional("languages"): [str], - vol.Optional("native_name", default=False): cv.boolean, - vol.Optional("no_sort", default=False): cv.boolean, + probatio.Optional("languages"): [str], + probatio.Optional("native_name", default=False): cv.boolean, + probatio.Optional("no_sort", default=False): cv.boolean, } ) @@ -1301,9 +1313,9 @@ def __init__(self, config: LanguageSelectorConfig | None = None) -> None: def __call__(self, data: Any) -> str: """Validate the passed selection.""" - language: str = vol.Schema(str)(data) + language: str = probatio.Schema(str)(data) if "languages" in self.config and language not in self.config["languages"]: - raise vol.Invalid(f"Value {language} is not a valid option") + raise probatio.Invalid(f"Value {language} is not a valid option") return language @@ -1321,13 +1333,13 @@ class LocationSelector(Selector[LocationSelectorConfig]): selector_type = "location" CONFIG_SCHEMA = make_selector_config_schema( - {vol.Optional("radius"): bool, vol.Optional("icon"): str} + {probatio.Optional("radius"): bool, probatio.Optional("icon"): str} ) - DATA_SCHEMA = vol.Schema( + DATA_SCHEMA = probatio.Schema( { - vol.Required("latitude"): vol.Coerce(float), - vol.Required("longitude"): vol.Coerce(float), - vol.Optional("radius"): vol.Coerce(float), + probatio.Required("latitude"): probatio.Coerce(float), + probatio.Required("longitude"): probatio.Coerce(float), + probatio.Optional("radius"): probatio.Coerce(float), } ) @@ -1356,20 +1368,20 @@ class MediaSelector(Selector[MediaSelectorConfig]): CONFIG_SCHEMA = make_selector_config_schema( { - vol.Optional("accept"): [str], - vol.Optional("multiple", default=False): cv.boolean, + probatio.Optional("accept"): [str], + probatio.Optional("multiple", default=False): cv.boolean, } ) - DATA_SCHEMA = vol.Schema( + DATA_SCHEMA = probatio.Schema( { # If accept is set, the entity_id field will not be present - vol.Optional("entity_id"): cv.entity_id_or_uuid, + probatio.Optional("entity_id"): cv.entity_id_or_uuid, # Although marked as optional in frontend, this field is required - vol.Required("media_content_id"): str, + probatio.Required("media_content_id"): str, # Although marked as optional in frontend, this field is required - vol.Required("media_content_type"): str, + probatio.Required("media_content_type"): str, # Data used by frontend for decoration. - vol.Optional("metadata"): dict, + probatio.Optional("metadata"): dict, } ) @@ -1391,9 +1403,9 @@ def __call__(self, data: Any) -> dict[str, Any] | list[dict[str, Any]]: if "accept" not in self.config: # If accept is not set, the entity_id field is required - item_schema_dict[vol.Required("entity_id")] = cv.entity_id_or_uuid + item_schema_dict[probatio.Required("entity_id")] = cv.entity_id_or_uuid - item_schema = vol.Schema(item_schema_dict) + item_schema = probatio.Schema(item_schema_dict) if not self.config["multiple"]: media: dict[str, Any] = item_schema(data) @@ -1432,7 +1444,7 @@ def validate_slider(data: Any) -> Any: data["mode"] = "slider" if has_min_max else "box" if data["mode"] == "slider" and not has_min_max: - raise vol.Invalid("min and max are required in slider mode") + raise probatio.Invalid("min and max are required in slider mode") return data @@ -1443,21 +1455,22 @@ class NumberSelector(Selector[NumberSelectorConfig]): selector_type = "number" - CONFIG_SCHEMA = vol.All( + CONFIG_SCHEMA = probatio.All( make_selector_config_schema( { - vol.Optional("min"): vol.Coerce(float), - vol.Optional("max"): vol.Coerce(float), + probatio.Optional("min"): probatio.Coerce(float), + probatio.Optional("max"): probatio.Coerce(float), # Controls slider steps, and up/down keyboard binding for the box # user input is not rounded - vol.Optional("step", default=1): vol.Any( - "any", vol.All(vol.Coerce(float), vol.Range(min=1e-3)) + probatio.Optional("step", default=1): probatio.Any( + "any", + probatio.All(probatio.Coerce(float), probatio.Range(min=1e-3)), ), - vol.Optional(CONF_UNIT_OF_MEASUREMENT): str, - vol.Optional(CONF_MODE): vol.All( - vol.Coerce(NumberSelectorMode), lambda val: val.value + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): str, + probatio.Optional(CONF_MODE): probatio.All( + probatio.Coerce(NumberSelectorMode), lambda val: val.value ), - vol.Optional("translation_key"): str, + probatio.Optional("translation_key"): str, } ), validate_slider, @@ -1469,13 +1482,13 @@ def __init__(self, config: NumberSelectorConfig | None = None) -> None: def __call__(self, data: Any) -> float: """Validate the passed selection.""" - value: float = vol.Coerce(float)(data) + value: float = probatio.Coerce(float)(data) if "min" in self.config and value < self.config["min"]: - raise vol.Invalid(f"Value {value} is too small") + raise probatio.Invalid(f"Value {value} is too small") if "max" in self.config and value > self.config["max"]: - raise vol.Invalid(f"Value {value} is too large") + raise probatio.Invalid(f"Value {value} is too large") return value @@ -1536,7 +1549,7 @@ def _validate_numeric_threshold_active_choice( ) -> dict[str, Any]: """Validate that active_choice matches an existing key in the entry.""" if "active_choice" not in data and "number" in data and "entity" in data: - raise vol.Invalid( + raise probatio.Invalid( "Value entry contains both 'number' and 'entity';" " set 'active_choice' to disambiguate" ) @@ -1544,26 +1557,30 @@ def _validate_numeric_threshold_active_choice( return data active_choice = data["active_choice"] if active_choice not in data: - raise vol.Invalid( + raise probatio.Invalid( f"active_choice is '{active_choice}' but '{active_choice}' key is missing" ) return data -_NUMERIC_THRESHOLD_VALUE_ENTRY_SCHEMA = vol.All( - vol.Schema( +_NUMERIC_THRESHOLD_VALUE_ENTRY_SCHEMA = probatio.All( + probatio.Schema( { - vol.Optional("active_choice"): vol.All( - vol.Coerce(NumericThresholdActiveChoice), lambda val: val.value + probatio.Optional("active_choice"): probatio.All( + probatio.Coerce(NumericThresholdActiveChoice), lambda val: val.value ), - vol.Optional("number"): vol.Coerce(float), - vol.Optional("entity"): cv.entity_id, - vol.Optional("unit_of_measurement"): vol.Any(str, None), + probatio.Optional("number"): probatio.Coerce(float), + probatio.Optional("entity"): cv.entity_id, + probatio.Optional("unit_of_measurement"): probatio.Any(str, None), } ), - vol.Any( - vol.Schema({vol.Required("number"): object}, extra=vol.ALLOW_EXTRA), - vol.Schema({vol.Required("entity"): object}, extra=vol.ALLOW_EXTRA), + probatio.Any( + probatio.Schema( + {probatio.Required("number"): object}, extra=probatio.ALLOW_EXTRA + ), + probatio.Schema( + {probatio.Required("entity"): object}, extra=probatio.ALLOW_EXTRA + ), msg="Value entry must contain at least one of 'number' or 'entity'", ), _validate_numeric_threshold_active_choice, @@ -1584,35 +1601,35 @@ def _validate_numeric_threshold_range[_T: dict[str, Any]](value: _T) -> _T: min_number = min_entry.get("number") max_number = max_entry.get("number") if min_number is not None and max_number is not None and min_number > max_number: - raise vol.Invalid( + raise probatio.Invalid( f"value_min ({min_number}) must not be greater than" f" value_max ({max_number})" ) return value -_NUMERIC_THRESHOLD_VALUE_SCHEMA = vol.All( - vol.Any( - vol.Schema( +_NUMERIC_THRESHOLD_VALUE_SCHEMA = probatio.All( + probatio.Any( + probatio.Schema( { - vol.Required("type"): vol.In( + probatio.Required("type"): probatio.In( [NumericThresholdType.ABOVE, NumericThresholdType.BELOW] ), - vol.Required("value"): _NUMERIC_THRESHOLD_VALUE_ENTRY_SCHEMA, + probatio.Required("value"): _NUMERIC_THRESHOLD_VALUE_ENTRY_SCHEMA, } ), - vol.Schema( + probatio.Schema( { - vol.Required("type"): vol.In( + probatio.Required("type"): probatio.In( [NumericThresholdType.BETWEEN, NumericThresholdType.OUTSIDE] ), - vol.Required("value_min"): _NUMERIC_THRESHOLD_VALUE_ENTRY_SCHEMA, - vol.Required("value_max"): _NUMERIC_THRESHOLD_VALUE_ENTRY_SCHEMA, + probatio.Required("value_min"): _NUMERIC_THRESHOLD_VALUE_ENTRY_SCHEMA, + probatio.Required("value_max"): _NUMERIC_THRESHOLD_VALUE_ENTRY_SCHEMA, } ), - vol.Schema( + probatio.Schema( { - vol.Required("type"): vol.In([NumericThresholdType.ANY]), + probatio.Required("type"): probatio.In([NumericThresholdType.ANY]), } ), ), @@ -1638,12 +1655,12 @@ def _validate(value: _T) -> _T: if "number" not in entry: continue if "unit_of_measurement" not in entry: - raise vol.Invalid( + raise probatio.Invalid( f"Missing unit_of_measurement, expected one of {allowed_units}" ) unit = entry["unit_of_measurement"] if unit not in allowed_units: - raise vol.Invalid( + raise probatio.Invalid( f"Invalid unit_of_measurement '{unit}'," f" expected one of {allowed_units}" ) @@ -1655,7 +1672,9 @@ def _validate(value: _T) -> _T: def _validate_numeric_threshold_not_any[_T: dict[str, Any]](value: _T) -> _T: """Validate that the threshold type is not 'any'.""" if value.get("type") == NumericThresholdType.ANY: - raise vol.Invalid("Threshold type 'any' is only allowed when mode is 'changed'") + raise probatio.Invalid( + "Threshold type 'any' is only allowed when mode is 'changed'" + ) return value @@ -1680,11 +1699,11 @@ def _validate(value: _T) -> _T: continue number = entry["number"] if min_value is not None and number < min_value: - raise vol.Invalid( + raise probatio.Invalid( f"Value {number} is less than the minimum {min_value}" ) if max_value is not None and number > max_value: - raise vol.Invalid( + raise probatio.Invalid( f"Value {number} is greater than the maximum {max_value}" ) return value @@ -1700,12 +1719,12 @@ class NumericThresholdSelector(Selector[NumericThresholdSelectorConfig]): CONFIG_SCHEMA = make_selector_config_schema( { - vol.Required("mode"): vol.All( - vol.Coerce(NumericThresholdMode), lambda val: val.value + probatio.Required("mode"): probatio.All( + probatio.Coerce(NumericThresholdMode), lambda val: val.value ), - vol.Optional("unit_of_measurement"): [vol.Any(str, None)], - vol.Optional("number"): NumberSelector.CONFIG_SCHEMA, - vol.Optional("entity"): vol.All( + probatio.Optional("unit_of_measurement"): [probatio.Any(str, None)], + probatio.Optional("number"): NumberSelector.CONFIG_SCHEMA, + probatio.Optional("entity"): probatio.All( cv.ensure_list, [ENTITY_FILTER_SELECTOR_CONFIG_SCHEMA] ), } @@ -1725,7 +1744,7 @@ def __call__(self, data: Any) -> Any: validators.append(_validate_numeric_threshold_unit(allowed_units)) if number_config := cast(dict[str, Any] | None, self.config.get("number")): validators.append(_validate_numeric_threshold_number_range(number_config)) - return vol.All(*validators)(data) + return probatio.All(*validators)(data) class ObjectSelectorField(TypedDict, total=False): @@ -1754,17 +1773,19 @@ class ObjectSelector(Selector[ObjectSelectorConfig]): CONFIG_SCHEMA = make_selector_config_schema( { - vol.Optional("fields"): { + probatio.Optional("fields"): { str: { - vol.Required("selector"): vol.Any(Selector, validate_selector), - vol.Optional("required"): bool, - vol.Optional("label"): str, + probatio.Required("selector"): probatio.Any( + Selector, validate_selector + ), + probatio.Optional("required"): bool, + probatio.Optional("label"): str, } }, - vol.Optional("multiple", default=False): bool, - vol.Optional("label_field"): str, - vol.Optional("description_field"): str, - vol.Optional("translation_key"): str, + probatio.Optional("multiple", default=False): bool, + probatio.Optional("label_field"): str, + probatio.Optional("description_field"): str, + probatio.Optional("translation_key"): str, } ) @@ -1774,7 +1795,7 @@ def __init__(self, config: ObjectSelectorConfig | None = None) -> None: @override def serialize(self) -> dict[str, dict[str, ObjectSelectorConfig]]: - """Serialize ObjectSelector for voluptuous_serialize.""" + """Serialize ObjectSelector for to_field_list.""" _config = deepcopy(self.config) if "fields" in _config: for field_items in _config["fields"].values(): @@ -1791,16 +1812,16 @@ def __call__(self, data: Any) -> Any: return data if not isinstance(data, (list, dict)): - raise vol.Invalid("Value should be a dict or a list of dicts") + raise probatio.Invalid("Value should be a dict or a list of dicts") if isinstance(data, list) and not self.config["multiple"]: - raise vol.Invalid("Value should not be a list") + raise probatio.Invalid("Value should not be a list") test_data = data if isinstance(data, list) else [data] for _config in test_data: for field, field_data in self.config["fields"].items(): if field_data.get("required") and field not in _config: - raise vol.Invalid(f"Field {field} is required") + raise probatio.Invalid(f"Field {field} is required") if field in _config: field_selector = field_data["selector"] if isinstance(field_selector, Selector): @@ -1810,7 +1831,7 @@ def __call__(self, data: Any) -> Any: for key in _config: if key not in self.config["fields"]: - raise vol.Invalid(f"Field {key} is not allowed") + raise probatio.Invalid(f"Field {key} is not allowed") return data @@ -1840,10 +1861,10 @@ class QrCodeSelector(Selector[QrCodeSelectorConfig]): CONFIG_SCHEMA = make_selector_config_schema( { - vol.Required("data"): str, - vol.Optional("scale"): int, - vol.Optional("error_correction_level"): vol.All( - vol.Coerce(QrErrorCorrectionLevel), lambda val: val.value + probatio.Required("data"): str, + probatio.Optional("scale"): int, + probatio.Optional("error_correction_level"): probatio.All( + probatio.Coerce(QrErrorCorrectionLevel), lambda val: val.value ), } ) @@ -1854,16 +1875,16 @@ def __init__(self, config: QrCodeSelectorConfig) -> None: def __call__(self, data: Any) -> Any: """Validate the passed selection.""" - vol.Schema(vol.Any(str, None))(data) + probatio.Schema(probatio.Any(str, None))(data) return self.config["data"] -select_option = vol.All( +select_option = probatio.All( dict, - vol.Schema( + probatio.Schema( { - vol.Required("value"): str, - vol.Required("label"): str, + probatio.Required("value"): str, + probatio.Required("label"): str, } ), ) @@ -1902,14 +1923,16 @@ class SelectSelector(Selector[SelectSelectorConfig]): CONFIG_SCHEMA = make_selector_config_schema( { - vol.Required("options"): vol.All(vol.Any([str], [select_option])), - vol.Optional("multiple", default=False): cv.boolean, - vol.Optional("custom_value", default=False): cv.boolean, - vol.Optional("mode"): vol.All( - vol.Coerce(SelectSelectorMode), lambda val: val.value + probatio.Required("options"): probatio.All( + probatio.Any([str], [select_option]) + ), + probatio.Optional("multiple", default=False): cv.boolean, + probatio.Optional("custom_value", default=False): cv.boolean, + probatio.Optional("mode"): probatio.All( + probatio.Coerce(SelectSelectorMode), lambda val: val.value ), - vol.Optional("translation_key"): cv.string, - vol.Optional("sort", default=False): cv.boolean, + probatio.Optional("translation_key"): cv.string, + probatio.Optional("sort", default=False): cv.boolean, } ) @@ -1929,15 +1952,15 @@ def __call__(self, data: Any) -> Any: for option in cast(Sequence[SelectOptionDict], config_options) ] - parent_schema: vol.In | vol.Any = vol.In(options) + parent_schema: probatio.In | probatio.Any = probatio.In(options) if self.config["custom_value"]: - parent_schema = vol.Any(parent_schema, str) + parent_schema = probatio.Any(parent_schema, str) if not self.config["multiple"]: - return parent_schema(vol.Schema(str)(data)) + return parent_schema(probatio.Schema(str)(data)) if not isinstance(data, list): - raise vol.Invalid("Value should be a list") - return [parent_schema(vol.Schema(str)(val)) for val in data] + raise probatio.Invalid("Value should be a list") + return [parent_schema(probatio.Schema(str)(val)) for val in data] class SerialPortSelectorConfig(BaseSelectorConfig, total=False): @@ -1954,7 +1977,7 @@ class SerialPortSelector(Selector[SerialPortSelectorConfig]): CONFIG_SCHEMA = make_selector_config_schema( { - vol.Optional("extra_recommended_domains"): [str], + probatio.Optional("extra_recommended_domains"): [str], } ) @@ -1964,7 +1987,7 @@ def __init__(self, config: SerialPortSelectorConfig | None = None) -> None: def __call__(self, data: Any) -> str: """Validate the passed selection.""" - serial: str = vol.Schema(str)(data) + serial: str = probatio.Schema(str)(data) return serial @@ -1984,14 +2007,14 @@ class StateClassSelector(Selector[StateClassSelectorConfig]): @staticmethod def _valid_state_classes(options: list[str]) -> list[str]: """Validate state classes and raise if invalid.""" - vol.In(_enum_options(Platform.SENSOR, "SensorStateClass"))(options) + probatio.In(_enum_options(Platform.SENSOR, "SensorStateClass"))(options) return options - CONFIG_SCHEMA = vol.All( + CONFIG_SCHEMA = probatio.All( make_selector_config_schema( { - vol.Optional("multiple", default=False): cv.boolean, - vol.Optional("state_classes"): vol.All( + probatio.Optional("multiple", default=False): cv.boolean, + probatio.Optional("state_classes"): probatio.All( cv.ensure_list, [str], [_valid_state_classes] ), }, @@ -2010,13 +2033,13 @@ def __call__(self, data: Any) -> Any: for option in _enum_options(Platform.SENSOR, "SensorStateClass") if state_classes_filter is None or option in state_classes_filter ] - options_schema = vol.In(valid_options) + options_schema = probatio.In(valid_options) if not self.config["multiple"]: - return options_schema(vol.Schema(str)(data)) + return options_schema(probatio.Schema(str)(data)) if not isinstance(data, list): - raise vol.Invalid("Value should be a list") - return [options_schema(vol.Schema(str)(val)) for val in data] + raise probatio.Invalid("Value should be a list") + return [options_schema(probatio.Schema(str)(val)) for val in data] class StateSelectorConfig(BaseSelectorConfig, total=False): @@ -2036,10 +2059,10 @@ class StateSelector(Selector[StateSelectorConfig]): CONFIG_SCHEMA = make_selector_config_schema( { - vol.Optional("entity_id"): cv.entity_id, - vol.Optional("hide_states"): [str], - vol.Optional("attribute"): str, - vol.Optional("multiple", default=False): cv.boolean, + probatio.Optional("entity_id"): cv.entity_id, + probatio.Optional("hide_states"): [str], + probatio.Optional("attribute"): str, + probatio.Optional("multiple", default=False): cv.boolean, } ) @@ -2058,11 +2081,11 @@ def __init__(self, config: StateSelectorConfig) -> None: def __call__(self, data: Any) -> str | list[str]: """Validate the passed selection.""" if not self.config["multiple"]: - state: str = vol.Schema(str)(data) + state: str = probatio.Schema(str)(data) return state if not isinstance(data, list): - raise vol.Invalid("Value should be a list") - return [vol.Schema(str)(val) for val in data] + raise probatio.Invalid("Value should be a list") + return [probatio.Schema(str)(val) for val in data] class StatisticSelectorConfig(BaseSelectorConfig, total=False): @@ -2079,7 +2102,7 @@ class StatisticSelector(Selector[StatisticSelectorConfig]): CONFIG_SCHEMA = make_selector_config_schema( { - vol.Optional("multiple", default=False): cv.boolean, + probatio.Optional("multiple", default=False): cv.boolean, } ) @@ -2091,11 +2114,11 @@ def __call__(self, data: Any) -> str | list[str]: """Validate the passed selection.""" if not self.config["multiple"]: - stat: str = vol.Schema(str)(data) + stat: str = probatio.Schema(str)(data) return stat if not isinstance(data, list): - raise vol.Invalid("Value should be a list") - return [vol.Schema(str)(val) for val in data] + raise probatio.Invalid("Value should be a list") + return [probatio.Schema(str)(val) for val in data] class TargetSelectorConfig(BaseSelectorConfig, total=False): @@ -2117,20 +2140,20 @@ class TargetSelector(Selector[TargetSelectorConfig]): CONFIG_SCHEMA = make_selector_config_schema( { - vol.Optional("entity"): vol.All( + probatio.Optional("entity"): probatio.All( cv.ensure_list, [ENTITY_FILTER_SELECTOR_CONFIG_SCHEMA], ), - vol.Optional("device"): vol.All( + probatio.Optional("device"): probatio.All( cv.ensure_list, [DEVICE_FILTER_SELECTOR_CONFIG_SCHEMA], ), - vol.Optional("primary_entities_only"): cv.boolean, + probatio.Optional("primary_entities_only"): cv.boolean, } ) # We want to transition to not including templates in the target selector. - TARGET_SELECTION_SCHEMA = vol.Schema(cv._TARGET_SERVICE_FIELDS_TEMPLATED) # noqa: SLF001 + TARGET_SELECTION_SCHEMA = probatio.Schema(cv._TARGET_SERVICE_FIELDS_TEMPLATED) # noqa: SLF001 def __init__(self, config: TargetSelectorConfig | None = None) -> None: """Instantiate a selector.""" @@ -2201,16 +2224,16 @@ class TextSelector(Selector[TextSelectorConfig]): CONFIG_SCHEMA = make_selector_config_schema( { - vol.Optional("multiline", default=False): bool, - vol.Optional("prefix"): str, - vol.Optional("suffix"): str, + probatio.Optional("multiline", default=False): bool, + probatio.Optional("prefix"): str, + probatio.Optional("suffix"): str, # The "type" controls the input field in the browser, the resulting # data can be any string so we don't validate it. - vol.Optional("type"): vol.All( - vol.Coerce(TextSelectorType), lambda val: val.value + probatio.Optional("type"): probatio.All( + probatio.Coerce(TextSelectorType), lambda val: val.value ), - vol.Optional("autocomplete"): str, - vol.Optional("multiple", default=False): bool, + probatio.Optional("autocomplete"): str, + probatio.Optional("multiple", default=False): bool, } ) @@ -2221,11 +2244,11 @@ def __init__(self, config: TextSelectorConfig | None = None) -> None: def __call__(self, data: Any) -> str | list[str]: """Validate the passed selection.""" if not self.config["multiple"]: - text: str = vol.Schema(str)(data) + text: str = probatio.Schema(str)(data) return text if not isinstance(data, list): - raise vol.Invalid("Value should be a list") - return [vol.Schema(str)(val) for val in data] + raise probatio.Invalid("Value should be a list") + return [probatio.Schema(str)(val) for val in data] class ThemeSelectorConfig(BaseSelectorConfig): @@ -2240,7 +2263,7 @@ class ThemeSelector(Selector[ThemeSelectorConfig]): CONFIG_SCHEMA = make_selector_config_schema( { - vol.Optional("include_default", default=False): cv.boolean, + probatio.Optional("include_default", default=False): cv.boolean, } ) @@ -2250,7 +2273,7 @@ def __init__(self, config: ThemeSelectorConfig | None = None) -> None: def __call__(self, data: Any) -> str: """Validate the passed selection.""" - theme: str = vol.Schema(str)(data) + theme: str = probatio.Schema(str)(data) return theme @@ -2294,7 +2317,7 @@ def __init__(self, config: TriggerSelectorConfig | None = None) -> None: def __call__(self, data: Any) -> Any: """Validate the passed selection.""" - return vol.Schema(cv.TRIGGER_SCHEMA)(data) + return probatio.Schema(cv.TRIGGER_SCHEMA)(data) dumper.add_representer( diff --git a/homeassistant/helpers/service.py b/homeassistant/helpers/service.py index d4e9534c6337b..00c8904136b7a 100644 --- a/homeassistant/helpers/service.py +++ b/homeassistant/helpers/service.py @@ -9,7 +9,7 @@ from types import ModuleType from typing import TYPE_CHECKING, Any, Literal, TypedDict, cast, overload -import voluptuous as vol +import probatio from homeassistant.auth.permissions.const import CAT_ENTITIES, POLICY_CONTROL from homeassistant.config_entries import ConfigEntry, ConfigEntryState @@ -131,26 +131,26 @@ def _validate_option_or_feature(option_or_feature: str, label: str) -> Any: try: domain, enum, option = option_or_feature.split(".", 2) except ValueError as exc: - raise vol.Invalid( + raise probatio.Invalid( f"Invalid {label} '{option_or_feature}', expected .." ) from exc base_components = _base_components() if not (base_component := base_components.get(domain)): - raise vol.Invalid(f"Unknown base component '{domain}'") + raise probatio.Invalid(f"Unknown base component '{domain}'") try: attribute_enum = getattr(base_component, enum) except AttributeError as exc: - raise vol.Invalid(f"Unknown {label} enum '{domain}.{enum}'") from exc + raise probatio.Invalid(f"Unknown {label} enum '{domain}.{enum}'") from exc if not issubclass(attribute_enum, Enum): - raise vol.Invalid(f"Expected {label} '{domain}.{enum}' to be an enum") + raise probatio.Invalid(f"Expected {label} '{domain}.{enum}' to be an enum") try: return getattr(attribute_enum, option).value except AttributeError as exc: - raise vol.Invalid(f"Unknown {label} '{enum}.{option}'") from exc + raise probatio.Invalid(f"Unknown {label} '{enum}.{option}'") from exc def validate_attribute_option(attribute_option: str) -> Any: @@ -165,50 +165,50 @@ def validate_supported_feature(supported_feature: str) -> Any: # Basic schemas which translate attribute and supported feature enum names # to their values. Full validation is done by hassfest.services -_FIELD_SCHEMA = vol.Schema( +_FIELD_SCHEMA = probatio.Schema( { - vol.Optional(CONF_SELECTOR): selector.validate_selector, - vol.Optional("filter"): { - vol.Optional("attribute"): { - vol.Required(str): [vol.All(str, validate_attribute_option)], + probatio.Optional(CONF_SELECTOR): selector.validate_selector, + probatio.Optional("filter"): { + probatio.Optional("attribute"): { + probatio.Required(str): [probatio.All(str, validate_attribute_option)], }, - vol.Optional("supported_features"): [ - vol.All(str, validate_supported_feature) + probatio.Optional("supported_features"): [ + probatio.All(str, validate_supported_feature) ], }, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -_SECTION_SCHEMA = vol.Schema( +_SECTION_SCHEMA = probatio.Schema( { - vol.Required("fields"): vol.Schema({str: _FIELD_SCHEMA}), + probatio.Required("fields"): probatio.Schema({str: _FIELD_SCHEMA}), }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -_SERVICE_SCHEMA = vol.Schema( +_SERVICE_SCHEMA = probatio.Schema( { - vol.Optional("target"): TargetSelector.CONFIG_SCHEMA, - vol.Optional("fields"): vol.Schema( - {str: vol.Any(_SECTION_SCHEMA, _FIELD_SCHEMA)} + probatio.Optional("target"): TargetSelector.CONFIG_SCHEMA, + probatio.Optional("fields"): probatio.Schema( + {str: probatio.Any(_SECTION_SCHEMA, _FIELD_SCHEMA)} ), }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) def starts_with_dot(key: str) -> str: """Check if key starts with dot.""" if not key.startswith("."): - raise vol.Invalid("Key does not start with .") + raise probatio.Invalid("Key does not start with .") return key -_SERVICES_SCHEMA = vol.Schema( +_SERVICES_SCHEMA = probatio.Schema( { - vol.Remove(vol.All(str, starts_with_dot)): object, - cv.slug: vol.Any(None, _SERVICE_SCHEMA), + probatio.Remove(probatio.All(str, starts_with_dot)): object, + cv.slug: probatio.Any(None, _SERVICE_SCHEMA), } ) @@ -268,7 +268,7 @@ def async_prepare_call_from_config( if validate_config: try: config = cv.SERVICE_SCHEMA(config) - except vol.Invalid as ex: + except probatio.Invalid as ex: raise HomeAssistantError( f"Invalid config for calling service: {ex}" ) from ex @@ -286,7 +286,7 @@ def async_prepare_call_from_config( raise HomeAssistantError( f"Error rendering service name template: {ex}" ) from ex - except vol.Invalid as ex: + except probatio.Invalid as ex: raise HomeAssistantError( f"Template rendered invalid service: {domain_service}" ) from ex @@ -314,7 +314,7 @@ def async_prepare_call_from_config( raise HomeAssistantError( f"Error rendering service target template: {ex}" ) from ex - except vol.Invalid as ex: + except probatio.Invalid as ex: raise HomeAssistantError( f"Template rendered invalid entity IDs: {target[CONF_ENTITY_ID]}" ) from ex @@ -457,7 +457,7 @@ def _load_services_file(integration: Integration) -> JSON_TYPE: "Unable to find services.yaml for the %s integration", integration.domain ) return {} - except (HomeAssistantError, vol.Invalid) as ex: + except (HomeAssistantError, probatio.Invalid) as ex: _LOGGER.warning( "Unable to parse services.yaml for the %s integration: %s", integration.domain, @@ -615,7 +615,7 @@ def async_set_service_schema( # Match validation applied to descriptions loaded from services.yaml. try: description["target"] = TargetSelector.CONFIG_SCHEMA(schema["target"]) - except vol.Invalid as err: + except probatio.Invalid as err: _LOGGER.warning( "Invalid target in the description of service %s.%s, ignoring it: %s", domain, @@ -1005,7 +1005,7 @@ def async_register_admin_service( | EntityServiceResponse | None, ], - schema: VolSchemaType = vol.Schema({}, extra=vol.PREVENT_EXTRA), + schema: VolSchemaType = probatio.Schema({}, extra=probatio.PREVENT_EXTRA), supports_response: SupportsResponse = SupportsResponse.NONE, *, description_placeholders: Mapping[str, str] | None = None, diff --git a/homeassistant/helpers/template/extensions/areas.py b/homeassistant/helpers/template/extensions/areas.py index 5f446568f6a4f..7dbd2cd5bf1b5 100644 --- a/homeassistant/helpers/template/extensions/areas.py +++ b/homeassistant/helpers/template/extensions/areas.py @@ -3,7 +3,7 @@ from collections.abc import Iterable from typing import TYPE_CHECKING -import voluptuous as vol +import probatio from homeassistant.helpers import ( area_registry as ar, @@ -92,7 +92,7 @@ def area_name(self, lookup_value: str) -> str | None: try: cv.entity_id(lookup_value) - except vol.Invalid: + except probatio.Invalid: pass else: if entity := ent_reg.async_get(lookup_value): diff --git a/homeassistant/helpers/template/extensions/devices.py b/homeassistant/helpers/template/extensions/devices.py index 271a347ab251f..8d79983628ddf 100644 --- a/homeassistant/helpers/template/extensions/devices.py +++ b/homeassistant/helpers/template/extensions/devices.py @@ -4,7 +4,7 @@ from itertools import chain from typing import TYPE_CHECKING, Any -import voluptuous as vol +import probatio from homeassistant.exceptions import TemplateError from homeassistant.helpers import ( @@ -103,7 +103,7 @@ def device_name(self, lookup_value: str) -> str | None: try: cv.entity_id(lookup_value) - except vol.Invalid: + except probatio.Invalid: pass else: if entity := ent_reg.async_get(lookup_value): diff --git a/homeassistant/helpers/template/extensions/labels.py b/homeassistant/helpers/template/extensions/labels.py index e65d4a0043534..6ebc1be77bbd0 100644 --- a/homeassistant/helpers/template/extensions/labels.py +++ b/homeassistant/helpers/template/extensions/labels.py @@ -3,7 +3,7 @@ from collections.abc import Iterable from typing import TYPE_CHECKING, Any -import voluptuous as vol +import probatio from homeassistant.helpers import ( area_registry as ar, @@ -95,7 +95,7 @@ def labels(self, lookup_value: Any = None) -> Iterable[str | None]: try: cv.entity_id(lookup_value) - except vol.Invalid: + except probatio.Invalid: pass else: if entity := ent_reg.async_get(lookup_value): diff --git a/homeassistant/helpers/template/helpers.py b/homeassistant/helpers/template/helpers.py index 039b6c40b5376..7c94006ad6711 100644 --- a/homeassistant/helpers/template/helpers.py +++ b/homeassistant/helpers/template/helpers.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING, Any, NoReturn, overload -import voluptuous as vol +import probatio from homeassistant.helpers import ( area_registry as ar, @@ -51,7 +51,7 @@ def resolve_area_id(hass: HomeAssistant, lookup_value: Any) -> str | None: # Check if it's an entity ID try: cv.entity_id(lookup_value) - except vol.Invalid: + except probatio.Invalid: pass else: if entity := ent_reg.async_get(lookup_value): @@ -83,7 +83,7 @@ def forgiving_boolean[_T]( """Try to convert value to a boolean.""" try: return cv.boolean(value) - except vol.Invalid: + except probatio.Invalid: if default is _SENTINEL: raise_no_default("bool", value) return default diff --git a/homeassistant/helpers/trigger.py b/homeassistant/helpers/trigger.py index 9451757998c63..0dfe924eac574 100644 --- a/homeassistant/helpers/trigger.py +++ b/homeassistant/helpers/trigger.py @@ -22,7 +22,7 @@ override, ) -import voluptuous as vol +import probatio from homeassistant.const import ( ATTR_ENTITY_ID, @@ -122,33 +122,33 @@ # Basic schemas to sanity check the trigger descriptions, # full validation is done by hassfest.triggers -_FIELD_DESCRIPTION_SCHEMA = vol.Schema( +_FIELD_DESCRIPTION_SCHEMA = probatio.Schema( { - vol.Optional(CONF_SELECTOR): selector.validate_selector, + probatio.Optional(CONF_SELECTOR): selector.validate_selector, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -_TRIGGER_DESCRIPTION_SCHEMA = vol.Schema( +_TRIGGER_DESCRIPTION_SCHEMA = probatio.Schema( { - vol.Optional("target"): TargetSelector.CONFIG_SCHEMA, - vol.Optional("fields"): vol.Schema({str: _FIELD_DESCRIPTION_SCHEMA}), + probatio.Optional("target"): TargetSelector.CONFIG_SCHEMA, + probatio.Optional("fields"): probatio.Schema({str: _FIELD_DESCRIPTION_SCHEMA}), }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) def starts_with_dot(key: str) -> str: """Check if key starts with dot.""" if not key.startswith("."): - raise vol.Invalid("Key does not start with .") + raise probatio.Invalid("Key does not start with .") return key -_TRIGGERS_DESCRIPTION_SCHEMA = vol.Schema( +_TRIGGERS_DESCRIPTION_SCHEMA = probatio.Schema( { - vol.Remove(vol.All(str, starts_with_dot)): object, - cv.underscore_slug: vol.Any(None, _TRIGGER_DESCRIPTION_SCHEMA), + probatio.Remove(probatio.All(str, starts_with_dot)): object, + cv.underscore_slug: probatio.Any(None, _TRIGGER_DESCRIPTION_SCHEMA), } ) @@ -231,8 +231,8 @@ async def _register_trigger_platform( _TRIGGER_SCHEMA = cv.TRIGGER_BASE_SCHEMA.extend( { - vol.Optional(CONF_OPTIONS): object, - vol.Optional(CONF_TARGET): cv.TARGET_FIELDS, + probatio.Optional(CONF_OPTIONS): object, + probatio.Optional(CONF_TARGET): cv.TARGET_FIELDS, } ) @@ -355,21 +355,21 @@ def _backwards_compatible_behavior(value: Any) -> Any: return value -ENTITY_STATE_TRIGGER_SCHEMA = vol.Schema( +ENTITY_STATE_TRIGGER_SCHEMA = probatio.Schema( { - vol.Required(CONF_TARGET): cv.TARGET_FIELDS, - vol.Required(CONF_OPTIONS, default={}): {}, + probatio.Required(CONF_TARGET): cv.TARGET_FIELDS, + probatio.Required(CONF_OPTIONS, default={}): {}, } ) ENTITY_STATE_TRIGGER_SCHEMA_WITH_BEHAVIOR = ENTITY_STATE_TRIGGER_SCHEMA.extend( { - vol.Required(CONF_OPTIONS, default={}): { - vol.Required(ATTR_BEHAVIOR, default=BEHAVIOR_EACH): vol.All( + probatio.Required(CONF_OPTIONS, default={}): { + probatio.Required(ATTR_BEHAVIOR, default=BEHAVIOR_EACH): probatio.All( _backwards_compatible_behavior, - vol.In([BEHAVIOR_FIRST, BEHAVIOR_ALL, BEHAVIOR_EACH]), + probatio.In([BEHAVIOR_FIRST, BEHAVIOR_ALL, BEHAVIOR_EACH]), ), - vol.Optional(CONF_FOR): cv.positive_time_period, + probatio.Optional(CONF_FOR): cv.positive_time_period, }, } ) @@ -391,7 +391,7 @@ class EntityTriggerBase(Trigger): # `_excluded_states`. Subclasses can override to relax the origin # check. _excluded_from_states: ClassVar[frozenset[str]] = _excluded_states - _schema: vol.Schema = ENTITY_STATE_TRIGGER_SCHEMA_WITH_BEHAVIOR + _schema: probatio.Schema = ENTITY_STATE_TRIGGER_SCHEMA_WITH_BEHAVIOR # When True, indirect target expansion (via device/area/floor) skips # entities with an entity_category. _primary_entities_only: ClassVar[bool] = True @@ -791,15 +791,15 @@ class StatelessEntityTriggerBase(EntityTriggerBase): after startup must still fire the trigger. """ - _schema: vol.Schema = ENTITY_STATE_TRIGGER_SCHEMA + _schema: probatio.Schema = ENTITY_STATE_TRIGGER_SCHEMA _excluded_from_states: ClassVar[frozenset[str]] = frozenset({STATE_UNAVAILABLE}) NUMERICAL_ATTRIBUTE_CHANGED_TRIGGER_SCHEMA = ENTITY_STATE_TRIGGER_SCHEMA.extend( { - vol.Required(CONF_OPTIONS, default={}): vol.All( + probatio.Required(CONF_OPTIONS, default={}): probatio.All( { - vol.Required("threshold"): NumericThresholdSelector( + probatio.Required("threshold"): NumericThresholdSelector( NumericThresholdSelectorConfig(mode=NumericThresholdMode.CHANGED) ) }, @@ -1097,13 +1097,13 @@ def is_valid_transition(self, from_state: State, to_state: State) -> bool: def make_numerical_state_changed_with_unit_schema( unit_converter: type[BaseUnitConverter], -) -> vol.Schema: +) -> probatio.Schema: """Factory for numerical state trigger schema with unit option.""" return ENTITY_STATE_TRIGGER_SCHEMA.extend( { - vol.Required(CONF_OPTIONS, default={}): vol.All( + probatio.Required(CONF_OPTIONS, default={}): probatio.All( { - vol.Required("threshold"): NumericThresholdSelector( + probatio.Required("threshold"): NumericThresholdSelector( NumericThresholdSelectorConfig( mode=NumericThresholdMode.CHANGED, unit_of_measurement=list(unit_converter.VALID_UNITS), @@ -1131,8 +1131,8 @@ def __init_subclass__(cls, **kwargs: Any) -> None: NUMERICAL_ATTRIBUTE_CROSSED_THRESHOLD_SCHEMA = ( ENTITY_STATE_TRIGGER_SCHEMA_WITH_BEHAVIOR.extend( { - vol.Required(CONF_OPTIONS): { - vol.Required("threshold"): NumericThresholdSelector( + probatio.Required(CONF_OPTIONS): { + probatio.Required("threshold"): NumericThresholdSelector( NumericThresholdSelectorConfig(mode=NumericThresholdMode.CROSSED) ), }, @@ -1158,7 +1158,7 @@ def is_valid_transition(self, from_state: State, to_state: State) -> bool: def _make_numerical_state_crossed_threshold_with_unit_schema( unit_converter: type[BaseUnitConverter], -) -> vol.Schema: +) -> probatio.Schema: """Trigger for numerical state and state attribute changes. This trigger only fires when the observed attribute @@ -1166,8 +1166,8 @@ def _make_numerical_state_crossed_threshold_with_unit_schema( """ return ENTITY_STATE_TRIGGER_SCHEMA_WITH_BEHAVIOR.extend( { - vol.Required(CONF_OPTIONS, default={}): { - vol.Required("threshold"): NumericThresholdSelector( + probatio.Required(CONF_OPTIONS, default={}): { + probatio.Required("threshold"): NumericThresholdSelector( NumericThresholdSelectorConfig( mode=NumericThresholdMode.CROSSED, unit_of_measurement=list(unit_converter.VALID_UNITS), @@ -1353,7 +1353,7 @@ class TriggerProtocol(Protocol): async def async_get_triggers(self, hass: HomeAssistant) -> dict[str, type[Trigger]]: """Return the triggers provided by this integration.""" - TRIGGER_SCHEMA: vol.Schema + TRIGGER_SCHEMA: probatio.Schema async def async_validate_trigger_config( self, hass: HomeAssistant, config: ConfigType @@ -1634,11 +1634,11 @@ async def _async_get_trigger_platform( try: integration = await async_get_integration(hass, platform) except IntegrationNotFound: - raise vol.Invalid(f"Invalid trigger '{trigger_key}' specified") from None + raise probatio.Invalid(f"Invalid trigger '{trigger_key}' specified") from None try: platform_module = await integration.async_get_platform("trigger") except ImportError: - raise vol.Invalid( + raise probatio.Invalid( f"Integration '{platform}' does not provide trigger support" ) from None @@ -1662,7 +1662,7 @@ async def async_validate_trigger_config( platform_domain, trigger_key ) if not (trigger := trigger_descriptors.get(relative_trigger_key)): - raise vol.Invalid(f"Invalid trigger '{trigger_key}' specified") + raise probatio.Invalid(f"Invalid trigger '{trigger_key}' specified") conf = await trigger.async_validate_complete_config(hass, conf) elif hasattr(platform, "async_validate_trigger_config"): conf = move_options_fields_to_top_level(conf, cv.TRIGGER_BASE_SCHEMA) @@ -1928,7 +1928,7 @@ def _load_triggers_file(integration: Integration) -> dict[str, Any]: "Unable to find triggers.yaml for the %s integration", integration.domain ) return {} - except (HomeAssistantError, vol.Invalid) as ex: + except (HomeAssistantError, probatio.Invalid) as ex: _LOGGER.warning( "Unable to parse triggers.yaml for the %s integration: %s", integration.domain, diff --git a/homeassistant/helpers/trigger_template_entity.py b/homeassistant/helpers/trigger_template_entity.py index 9515fd43f85dc..3a860a2d61d6b 100644 --- a/homeassistant/helpers/trigger_template_entity.py +++ b/homeassistant/helpers/trigger_template_entity.py @@ -5,7 +5,7 @@ from typing import Any, override import jinja2 -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( CONF_STATE_CLASS, @@ -51,24 +51,24 @@ CONF_PICTURE: EntityStateAttribute.ENTITY_PICTURE, } -TEMPLATE_ENTITY_BASE_SCHEMA = vol.Schema( +TEMPLATE_ENTITY_BASE_SCHEMA = probatio.Schema( { - vol.Optional(CONF_ICON): cv.template, - vol.Optional(CONF_NAME): cv.template, - vol.Optional(CONF_PICTURE): cv.template, - vol.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Optional(CONF_ICON): cv.template, + probatio.Optional(CONF_NAME): cv.template, + probatio.Optional(CONF_PICTURE): cv.template, + probatio.Optional(CONF_UNIQUE_ID): cv.string, } ) -def make_template_entity_base_schema(default_name: str) -> vol.Schema: +def make_template_entity_base_schema(default_name: str) -> probatio.Schema: """Return a schema with default name.""" - return vol.Schema( + return probatio.Schema( { - vol.Optional(CONF_ICON): cv.template, - vol.Optional(CONF_NAME, default=default_name): cv.template, - vol.Optional(CONF_PICTURE): cv.template, - vol.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Optional(CONF_ICON): cv.template, + probatio.Optional(CONF_NAME, default=default_name): cv.template, + probatio.Optional(CONF_PICTURE): cv.template, + probatio.Optional(CONF_UNIQUE_ID): cv.string, } ) @@ -94,11 +94,11 @@ def log_triggered_template_error( ) -TEMPLATE_SENSOR_BASE_SCHEMA = vol.Schema( +TEMPLATE_SENSOR_BASE_SCHEMA = probatio.Schema( { - vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, - vol.Optional(CONF_STATE_CLASS): STATE_CLASSES_SCHEMA, - vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, + probatio.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_STATE_CLASS): STATE_CLASSES_SCHEMA, + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, } ).extend(TEMPLATE_ENTITY_BASE_SCHEMA.schema) diff --git a/homeassistant/helpers/typing.py b/homeassistant/helpers/typing.py index 9c044c7ea036c..0ee784b23ce1a 100644 --- a/homeassistant/helpers/typing.py +++ b/homeassistant/helpers/typing.py @@ -4,7 +4,7 @@ from enum import Enum from typing import Any, Never -import voluptuous as vol +import probatio type GPSType = tuple[float, float] type ConfigType = dict[str, Any] @@ -13,8 +13,8 @@ type StateType = str | int | float | None type TemplateVarsType = Mapping[str, Any] | None type NoEventData = Mapping[str, Never] -type VolSchemaType = vol.Schema | vol.All | vol.Any -type VolDictType = dict[str | vol.Marker, Any] +type VolSchemaType = probatio.Schema | probatio.All | probatio.Any +type VolDictType = dict[str | probatio.Marker, Any] # Custom type for recorder Queries type QueryType = Any diff --git a/homeassistant/loader.py b/homeassistant/loader.py index 10f1697c4eee5..11a3260646481 100644 --- a/homeassistant/loader.py +++ b/homeassistant/loader.py @@ -31,8 +31,8 @@ AwesomeVersionException, AwesomeVersionStrategy, ) +import probatio from propcache.api import cached_property -import voluptuous as vol from . import generated from .const import Platform @@ -379,7 +379,7 @@ async def async_get_config_flows( class ComponentProtocol(Protocol): """Define the format of an integration.""" - CONFIG_SCHEMA: vol.Schema + CONFIG_SCHEMA: probatio.Schema DOMAIN: str async def async_setup_entry( diff --git a/homeassistant/util/unit_system.py b/homeassistant/util/unit_system.py index d3e9249a2fa10..5c0e20b4337c7 100644 --- a/homeassistant/util/unit_system.py +++ b/homeassistant/util/unit_system.py @@ -4,7 +4,7 @@ from numbers import Number from typing import TYPE_CHECKING, Final -import voluptuous as vol +import probatio from homeassistant.const import ( ACCUMULATED_PRECIPITATION, @@ -249,10 +249,10 @@ def _deprecated_unit_system(value: str) -> str: return value -validate_unit_system = vol.All( - vol.Lower, +validate_unit_system = probatio.All( + probatio.Lower, _deprecated_unit_system, - vol.Any(_CONF_UNIT_SYSTEM_METRIC, _CONF_UNIT_SYSTEM_US_CUSTOMARY), + probatio.Any(_CONF_UNIT_SYSTEM_METRIC, _CONF_UNIT_SYSTEM_US_CUSTOMARY), ) METRIC_SYSTEM = UnitSystem( From 14f9b7e699d6de2b33901a3decb6a0ca9c8c21df Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 13 Sep 2026 18:09:30 +0200 Subject: [PATCH 03/10] Use probatio directly in all integrations (#182112) --- homeassistant/components/abode/config_flow.py | 24 +- homeassistant/components/abode/services.py | 13 +- homeassistant/components/acaia/config_flow.py | 6 +- .../components/accuweather/config_flow.py | 12 +- .../components/acmeda/config_flow.py | 6 +- .../components/actiontec/device_tracker.py | 8 +- homeassistant/components/adax/config_flow.py | 16 +- homeassistant/components/adguard/__init__.py | 16 +- .../components/adguard/config_flow.py | 16 +- homeassistant/components/ads/__init__.py | 22 +- homeassistant/components/ads/binary_sensor.py | 8 +- homeassistant/components/ads/cover.py | 18 +- homeassistant/components/ads/light.py | 14 +- homeassistant/components/ads/select.py | 8 +- homeassistant/components/ads/sensor.py | 20 +- homeassistant/components/ads/switch.py | 6 +- homeassistant/components/ads/valve.py | 8 +- .../components/advantage_air/config_flow.py | 8 +- .../components/advantage_air/services.py | 4 +- homeassistant/components/aemet/config_flow.py | 18 +- .../components/aftership/config_flow.py | 4 +- homeassistant/components/aftership/const.py | 17 +- .../components/agent_dvr/config_flow.py | 8 +- homeassistant/components/ai_task/__init__.py | 46 +- homeassistant/components/ai_task/http.py | 10 +- homeassistant/components/ai_task/task.py | 6 +- homeassistant/components/aidot/config_flow.py | 10 +- .../components/airgradient/config_flow.py | 4 +- homeassistant/components/airly/config_flow.py | 10 +- .../components/airnow/config_flow.py | 10 +- .../components/airobot/config_flow.py | 18 +- homeassistant/components/airos/config_flow.py | 40 +- .../components/airpatrol/config_flow.py | 8 +- homeassistant/components/airq/config_flow.py | 16 +- .../components/airthings/config_flow.py | 8 +- .../components/airthings_ble/config_flow.py | 6 +- .../components/airtouch4/config_flow.py | 4 +- .../components/airtouch5/config_flow.py | 4 +- .../components/airvisual/config_flow.py | 24 +- .../components/airvisual_pro/config_flow.py | 12 +- .../components/airzone/config_flow.py | 16 +- .../components/airzone_cloud/config_flow.py | 12 +- .../components/aladdin_connect/config_flow.py | 4 +- .../alarm_control_panel/__init__.py | 4 +- .../alarm_control_panel/device_action.py | 12 +- .../alarm_control_panel/device_condition.py | 6 +- .../alarm_control_panel/device_trigger.py | 14 +- .../components/alarmdecoder/config_flow.py | 52 +- .../components/alarmdecoder/services.py | 6 +- homeassistant/components/alert/__init__.py | 34 +- homeassistant/components/alexa/__init__.py | 48 +- .../components/alexa_devices/config_flow.py | 22 +- .../components/alexa_devices/services.py | 20 +- .../components/alexa_devices/todo.py | 4 +- .../components/alpha_vantage/sensor.py | 26 +- .../components/altruist/config_flow.py | 4 +- homeassistant/components/amazon_polly/tts.py | 30 +- .../components/amberelectric/config_flow.py | 12 +- .../components/amberelectric/services.py | 6 +- .../components/ambient_network/config_flow.py | 12 +- .../components/ambient_station/config_flow.py | 6 +- homeassistant/components/amcrest/__init__.py | 58 +- .../components/amcrest/binary_sensor.py | 4 +- homeassistant/components/amcrest/services.py | 14 +- .../components/analytics/__init__.py | 16 +- homeassistant/components/analytics/const.py | 14 +- .../analytics_insights/config_flow.py | 20 +- .../android_ip_webcam/config_flow.py | 12 +- .../components/androidtv/config_flow.py | 66 +- .../components/androidtv/services.py | 12 +- .../androidtv_remote/config_flow.py | 30 +- .../components/anel_pwrctrl/switch.py | 12 +- .../components/anglian_water/config_flow.py | 16 +- homeassistant/components/anova/config_flow.py | 9 +- .../components/anthemav/config_flow.py | 8 +- .../components/anthropic/config_flow.py | 63 +- homeassistant/components/anthropic/entity.py | 13 +- homeassistant/components/anthropic/repairs.py | 8 +- .../components/aosmith/config_flow.py | 10 +- .../components/apache_kafka/__init__.py | 26 +- .../components/apcupsd/config_flow.py | 12 +- homeassistant/components/api/__init__.py | 4 +- .../components/apple_tv/config_flow.py | 10 +- homeassistant/components/apple_tv/services.py | 18 +- .../application_credentials/__init__.py | 20 +- homeassistant/components/apprise/notify.py | 6 +- .../components/aprilaire/config_flow.py | 8 +- .../components/aprs/device_tracker.py | 14 +- .../components/apsystems/config_flow.py | 8 +- .../components/aquacell/config_flow.py | 14 +- .../components/aqualogic/__init__.py | 13 +- .../components/aqualogic/config_flow.py | 8 +- .../components/aquostv/media_player.py | 18 +- .../components/aqvify/config_flow.py | 6 +- .../components/aranet/config_flow.py | 6 +- .../components/arcam_fmj/config_flow.py | 8 +- .../components/arcam_fmj/device_trigger.py | 6 +- .../components/arest/binary_sensor.py | 10 +- homeassistant/components/arest/sensor.py | 18 +- homeassistant/components/arest/switch.py | 16 +- .../arris_tg2492lg/device_tracker.py | 6 +- .../components/aruba/device_tracker.py | 8 +- homeassistant/components/arve/config_flow.py | 8 +- .../components/aseko_pool_live/config_flow.py | 8 +- .../components/assist_pipeline/__init__.py | 10 +- .../components/assist_pipeline/pipeline.py | 40 +- .../assist_pipeline/repair_flows.py | 4 +- .../assist_pipeline/websocket_api.py | 86 +-- .../components/assist_satellite/__init__.py | 62 +- .../components/assist_satellite/intent.py | 4 +- .../assist_satellite/websocket_api.py | 20 +- .../components/asuswrt/config_flow.py | 42 +- homeassistant/components/atag/config_flow.py | 10 +- homeassistant/components/atome/sensor.py | 8 +- .../components/aurora/config_flow.py | 14 +- .../aurora_abb_powerone/config_flow.py | 8 +- .../aussie_broadband/config_flow.py | 12 +- .../components/autarco/config_flow.py | 12 +- homeassistant/components/auth/__init__.py | 38 +- homeassistant/components/auth/login_flow.py | 27 +- .../components/auth/mfa_setup_flow.py | 22 +- .../components/automation/__init__.py | 18 +- homeassistant/components/automation/config.py | 46 +- .../components/autoskope/config_flow.py | 20 +- homeassistant/components/avea/config_flow.py | 10 +- homeassistant/components/awair/config_flow.py | 12 +- homeassistant/components/aws/__init__.py | 48 +- .../components/aws_s3/config_flow.py | 18 +- homeassistant/components/axis/config_flow.py | 52 +- .../azure_data_explorer/__init__.py | 10 +- .../azure_data_explorer/config_flow.py | 18 +- .../components/azure_devops/config_flow.py | 12 +- .../components/azure_event_hub/__init__.py | 24 +- .../components/azure_event_hub/config_flow.py | 24 +- .../components/azure_service_bus/notify.py | 10 +- .../components/azure_storage/config_flow.py | 20 +- .../components/backblaze_b2/config_flow.py | 18 +- homeassistant/components/backup/onboarding.py | 16 +- homeassistant/components/backup/websocket.py | 128 ++-- homeassistant/components/baf/config_flow.py | 6 +- homeassistant/components/baidu/tts.py | 26 +- .../components/balboa/config_flow.py | 8 +- .../components/bang_olufsen/config_flow.py | 8 +- .../components/bang_olufsen/services.py | 16 +- .../components/bayesian/binary_sensor.py | 58 +- .../components/bayesian/config_flow.py | 56 +- .../components/bbox/device_tracker.py | 4 +- homeassistant/components/bbox/sensor.py | 8 +- homeassistant/components/besen/config_flow.py | 14 +- .../components/binary_sensor/__init__.py | 6 +- .../binary_sensor/device_condition.py | 14 +- .../binary_sensor/device_trigger.py | 14 +- homeassistant/components/bitcoin/sensor.py | 8 +- .../components/bitvis/config_flow.py | 6 +- homeassistant/components/bizkaibus/sensor.py | 8 +- .../components/blackbird/media_player.py | 26 +- .../components/blebox/config_flow.py | 18 +- homeassistant/components/blink/config_flow.py | 24 +- homeassistant/components/blink/services.py | 6 +- homeassistant/components/blockchain/sensor.py | 6 +- .../components/blue_current/config_flow.py | 4 +- .../components/blue_current/services.py | 8 +- .../components/bluemaestro/config_flow.py | 6 +- homeassistant/components/blueprint/errors.py | 8 +- .../components/blueprint/importer.py | 8 +- homeassistant/components/blueprint/models.py | 8 +- homeassistant/components/blueprint/schemas.py | 80 ++- .../components/blueprint/websocket_api.py | 36 +- .../components/bluesound/__init__.py | 4 +- .../components/bluesound/config_flow.py | 8 +- .../components/bluetooth/config_flow.py | 12 +- .../components/bluetooth/websocket_api.py | 16 +- .../bluetooth_le_tracker/device_tracker.py | 6 +- homeassistant/components/bond/config_flow.py | 10 +- homeassistant/components/bond/services.py | 16 +- .../components/bosch_alarm/config_flow.py | 24 +- .../components/bosch_alarm/services.py | 12 +- .../components/bosch_shc/config_flow.py | 10 +- homeassistant/components/brands/__init__.py | 4 +- .../components/braviatv/config_flow.py | 18 +- homeassistant/components/bring/config_flow.py | 8 +- homeassistant/components/bring/services.py | 18 +- .../components/broadlink/config_flow.py | 16 +- homeassistant/components/broadlink/remote.py | 28 +- homeassistant/components/broadlink/switch.py | 18 +- .../components/brother/config_flow.py | 40 +- .../brottsplatskartan/config_flow.py | 8 +- homeassistant/components/browser/__init__.py | 6 +- homeassistant/components/brunt/config_flow.py | 8 +- .../bryant_evolution/config_flow.py | 6 +- .../components/bsblan/config_flow.py | 66 +- homeassistant/components/bsblan/services.py | 20 +- .../bt_home_hub_5/device_tracker.py | 4 +- .../components/bt_smarthub/device_tracker.py | 6 +- .../components/bthome/config_flow.py | 10 +- .../components/bthome/device_trigger.py | 4 +- homeassistant/components/buienradar/camera.py | 4 +- .../components/buienradar/config_flow.py | 16 +- homeassistant/components/button/__init__.py | 4 +- .../components/button/device_action.py | 6 +- .../components/button/device_trigger.py | 6 +- homeassistant/components/caldav/calendar.py | 26 +- .../components/caldav/config_flow.py | 16 +- homeassistant/components/calendar/__init__.py | 126 ++-- homeassistant/components/calendar/llm.py | 8 +- homeassistant/components/calendar/trigger.py | 30 +- .../components/cambridge_audio/config_flow.py | 4 +- homeassistant/components/camera/__init__.py | 37 +- homeassistant/components/camera/webrtc.py | 22 +- homeassistant/components/canary/camera.py | 6 +- .../components/canary/config_flow.py | 16 +- .../components/casper_glow/config_flow.py | 6 +- homeassistant/components/cast/config_flow.py | 14 +- .../components/cast/home_assistant_cast.py | 6 +- homeassistant/components/ccm15/config_flow.py | 8 +- .../components/cert_expiry/config_flow.py | 14 +- .../components/chacon_dio/config_flow.py | 8 +- .../components/channels/media_player.py | 10 +- .../components/chef_iq/config_flow.py | 6 +- .../components/chess_com/config_flow.py | 4 +- .../components/cielo_home/config_flow.py | 6 +- .../components/cisco_ios/device_tracker.py | 12 +- .../cisco_mobility_express/device_tracker.py | 12 +- .../components/cisco_webex_teams/notify.py | 7 +- homeassistant/components/citybikes/sensor.py | 18 +- homeassistant/components/clickatell/notify.py | 7 +- homeassistant/components/clicksend/notify.py | 12 +- .../components/clicksend_tts/notify.py | 16 +- homeassistant/components/climate/__init__.py | 28 +- homeassistant/components/climate/condition.py | 8 +- .../components/climate/device_action.py | 24 +- .../components/climate/device_condition.py | 24 +- .../components/climate/device_trigger.py | 46 +- homeassistant/components/climate/intent.py | 26 +- homeassistant/components/climate/trigger.py | 8 +- homeassistant/components/cloud/__init__.py | 66 +- homeassistant/components/cloud/entity.py | 13 +- homeassistant/components/cloud/http_api.py | 88 +-- homeassistant/components/cloud/repairs.py | 4 +- homeassistant/components/cloud/tts.py | 14 +- .../components/cloudflare/config_flow.py | 18 +- .../components/cloudflare_r2/config_flow.py | 18 +- homeassistant/components/cmus/media_player.py | 10 +- .../components/co2signal/config_flow.py | 24 +- .../components/coinbase/config_flow.py | 20 +- .../collection_image/config_flow.py | 6 +- .../components/collection_image/services.py | 6 +- .../components/color_extractor/services.py | 14 +- .../components/comed_hourly_pricing/sensor.py | 14 +- .../components/comelit/config_flow.py | 31 +- .../components/comfoconnect/__init__.py | 20 +- .../components/comfoconnect/sensor.py | 6 +- .../components/command_line/__init__.py | 152 +++-- .../components/compensation/__init__.py | 44 +- .../components/compit/config_flow.py | 12 +- .../concord232/alarm_control_panel.py | 12 +- .../components/concord232/binary_sensor.py | 14 +- .../components/config/area_registry.py | 52 +- homeassistant/components/config/auth.py | 26 +- .../config/auth_provider_homeassistant.py | 32 +- .../components/config/category_registry.py | 30 +- .../components/config/config_entries.py | 42 +- homeassistant/components/config/core.py | 28 +- .../components/config/device_registry.py | 26 +- .../components/config/entity_registry.py | 78 ++- .../components/config/floor_registry.py | 34 +- .../components/config/label_registry.py | 34 +- homeassistant/components/config/view.py | 6 +- .../components/configurator/__init__.py | 4 +- .../components/control4/config_flow.py | 16 +- .../components/conversation/__init__.py | 28 +- .../components/conversation/agent_manager.py | 4 +- .../components/conversation/chat_log.py | 4 +- homeassistant/components/conversation/http.py | 62 +- .../components/conversation/trigger.py | 14 +- .../components/cookidoo/config_flow.py | 16 +- .../components/coolmaster/config_flow.py | 16 +- homeassistant/components/counter/__init__.py | 52 +- homeassistant/components/cover/__init__.py | 18 +- .../components/cover/device_action.py | 24 +- .../components/cover/device_condition.py | 34 +- .../components/cover/device_trigger.py | 40 +- .../components/cppm_tracker/device_tracker.py | 8 +- .../components/crownstone/config_flow.py | 36 +- .../components/currencylayer/sensor.py | 10 +- homeassistant/components/cync/config_flow.py | 10 +- .../components/daikin/config_flow.py | 12 +- .../components/danfoss_air/__init__.py | 7 +- .../components/data_grand_lyon/config_flow.py | 28 +- .../components/datadog/config_flow.py | 24 +- homeassistant/components/date/__init__.py | 4 +- homeassistant/components/datetime/__init__.py | 4 +- .../components/ddwrt/device_tracker.py | 16 +- homeassistant/components/debugpy/__init__.py | 18 +- .../components/deconz/config_flow.py | 16 +- .../components/deconz/device_trigger.py | 4 +- homeassistant/components/deconz/services.py | 18 +- .../components/decora_wifi/config_flow.py | 8 +- homeassistant/components/decora_wifi/light.py | 7 +- homeassistant/components/delijn/sensor.py | 12 +- .../components/deluge/config_flow.py | 16 +- homeassistant/components/demo/config_flow.py | 20 +- homeassistant/components/demo/tts.py | 4 +- .../components/denon/media_player.py | 6 +- .../components/denon_rs232/config_flow.py | 8 +- .../components/denonavr/config_flow.py | 20 +- homeassistant/components/denonavr/services.py | 6 +- .../components/derivative/config_flow.py | 26 +- homeassistant/components/derivative/sensor.py | 26 +- .../components/devialet/config_flow.py | 4 +- .../components/device_automation/__init__.py | 43 +- .../components/device_automation/action.py | 6 +- .../components/device_automation/condition.py | 6 +- .../components/device_automation/entity.py | 14 +- .../components/device_automation/helpers.py | 6 +- .../device_automation/toggle_entity.py | 32 +- .../components/device_automation/trigger.py | 8 +- .../device_sun_light_trigger/__init__.py | 16 +- .../device_tracker/device_condition.py | 6 +- .../device_tracker/device_trigger.py | 14 +- .../components/device_tracker/legacy.py | 54 +- .../devolo_home_control/config_flow.py | 14 +- .../devolo_home_network/config_flow.py | 10 +- .../components/dexcom/config_flow.py | 10 +- .../components/dhcp/websocket_api.py | 4 +- .../components/diagnostics/__init__.py | 8 +- .../components/dialogflow/__init__.py | 4 +- .../components/digital_ocean/__init__.py | 8 +- .../components/digital_ocean/binary_sensor.py | 4 +- .../components/digital_ocean/switch.py | 4 +- .../components/directv/config_flow.py | 4 +- homeassistant/components/discogs/sensor.py | 10 +- .../components/discord/config_flow.py | 4 +- .../components/discovergy/config_flow.py | 8 +- homeassistant/components/dlink/config_flow.py | 20 +- .../components/dlna_dmr/config_flow.py | 22 +- .../components/dlna_dms/config_flow.py | 6 +- homeassistant/components/dnsip/config_flow.py | 28 +- .../components/doods/image_processing.py | 42 +- .../components/doorbird/config_flow.py | 22 +- homeassistant/components/doorbird/repairs.py | 4 +- .../components/dormakaba_dkey/config_flow.py | 12 +- .../components/downloader/config_flow.py | 6 +- .../components/downloader/services.py | 14 +- .../dremel_3d_printer/config_flow.py | 6 +- .../components/droplet/config_flow.py | 13 +- homeassistant/components/dsmr/config_flow.py | 16 +- .../components/dublin_bus_transport/sensor.py | 8 +- .../components/duckdns/config_flow.py | 12 +- homeassistant/components/duckdns/services.py | 10 +- homeassistant/components/duco/config_flow.py | 6 +- .../components/dunehd/config_flow.py | 6 +- .../components/duotecno/config_flow.py | 10 +- .../dwd_weather_warnings/config_flow.py | 8 +- .../components/dynalite/config_flow.py | 8 +- homeassistant/components/dynalite/panel.py | 10 +- homeassistant/components/dynalite/schema.py | 115 ++-- homeassistant/components/dynalite/services.py | 18 +- .../components/dyson_infrared/config_flow.py | 8 +- homeassistant/components/eafm/config_flow.py | 6 +- .../components/earn_e_p1/config_flow.py | 6 +- .../components/easyenergy/services.py | 30 +- homeassistant/components/ebox/sensor.py | 12 +- homeassistant/components/ebusd/__init__.py | 24 +- .../components/ecoal_boiler/__init__.py | 32 +- homeassistant/components/ecobee/climate.py | 14 +- .../components/ecobee/config_flow.py | 14 +- homeassistant/components/ecobee/services.py | 48 +- homeassistant/components/ecobee/util.py | 8 +- .../components/ecoforest/config_flow.py | 10 +- .../components/econet/config_flow.py | 8 +- .../components/ecovacs/config_flow.py | 36 +- .../edifier_infrared/config_flow.py | 8 +- homeassistant/components/edimax/switch.py | 10 +- homeassistant/components/edl21/config_flow.py | 6 +- .../components/efergy/config_flow.py | 6 +- homeassistant/components/egardia/__init__.py | 40 +- .../components/egauge/config_flow.py | 14 +- .../components/eheimdigital/config_flow.py | 10 +- .../components/ekeybionyx/config_flow.py | 18 +- .../components/electrasmart/config_flow.py | 12 +- .../components/elevenlabs/config_flow.py | 48 +- .../components/elgato/config_flow.py | 10 +- homeassistant/components/elkm1/__init__.py | 64 +- .../components/elkm1/alarm_control_panel.py | 16 +- homeassistant/components/elkm1/config_flow.py | 40 +- homeassistant/components/elkm1/const.py | 6 +- homeassistant/components/elkm1/sensor.py | 6 +- homeassistant/components/elkm1/services.py | 14 +- homeassistant/components/elkm1/switch.py | 6 +- homeassistant/components/elmax/config_flow.py | 60 +- homeassistant/components/elv/__init__.py | 10 +- homeassistant/components/elvia/config_flow.py | 12 +- homeassistant/components/emby/media_player.py | 10 +- .../components/emoncms/config_flow.py | 24 +- .../components/emoncms_history/__init__.py | 18 +- .../components/emonitor/config_flow.py | 6 +- .../components/emulated_hue/__init__.py | 38 +- .../components/emulated_kasa/__init__.py | 20 +- .../components/emulated_roku/__init__.py | 24 +- .../components/emulated_roku/config_flow.py | 12 +- .../energenie_power_sockets/config_flow.py | 8 +- .../components/energieleser/config_flow.py | 6 +- homeassistant/components/energy/data.py | 210 +++--- homeassistant/components/energy/helpers.py | 4 +- .../components/energy/websocket_api.py | 30 +- .../components/energyid/config_flow.py | 14 +- .../energyid/energyid_sensor_mapping_flow.py | 6 +- .../components/energyzero/config_flow.py | 6 +- .../components/energyzero/services.py | 18 +- .../components/enigma2/config_flow.py | 28 +- homeassistant/components/enocean/__init__.py | 7 +- .../components/enocean/binary_sensor.py | 10 +- .../components/enocean/config_flow.py | 10 +- homeassistant/components/enocean/light.py | 12 +- homeassistant/components/enocean/sensor.py | 18 +- homeassistant/components/enocean/switch.py | 10 +- .../components/enphase_envoy/config_flow.py | 26 +- .../entur_public_transport/sensor.py | 18 +- .../envertech_evt800/config_flow.py | 8 +- .../components/environment_canada/camera.py | 6 +- .../environment_canada/config_flow.py | 52 +- .../components/environment_canada/services.py | 6 +- .../components/envisalink/__init__.py | 64 +- .../envisalink/alarm_control_panel.py | 8 +- homeassistant/components/ephember/climate.py | 7 +- .../epic_games_store/config_flow.py | 8 +- homeassistant/components/epion/config_flow.py | 6 +- homeassistant/components/epson/config_flow.py | 10 +- homeassistant/components/epson/services.py | 8 +- .../components/eq3btsmart/schemas.py | 12 +- .../components/esphome/assist_satellite.py | 14 +- .../components/esphome/config_flow.py | 24 +- homeassistant/components/esphome/entity.py | 4 +- homeassistant/components/esphome/manager.py | 18 +- homeassistant/components/esphome/repairs.py | 6 +- .../components/esphome/websocket_api.py | 6 +- homeassistant/components/etherscan/sensor.py | 10 +- homeassistant/components/eufy/__init__.py | 24 +- .../components/eufylife_ble/config_flow.py | 6 +- .../eurotronic_cometblue/config_flow.py | 16 +- .../eurotronic_cometblue/services.py | 26 +- homeassistant/components/event/trigger.py | 8 +- homeassistant/components/everlights/light.py | 4 +- .../evil_genius_labs/config_flow.py | 10 +- homeassistant/components/evohome/__init__.py | 20 +- homeassistant/components/evohome/services.py | 38 +- homeassistant/components/ezviz/config_flow.py | 34 +- .../components/faa_delays/config_flow.py | 4 +- homeassistant/components/facebook/notify.py | 4 +- homeassistant/components/fail2ban/sensor.py | 10 +- homeassistant/components/familyhub/camera.py | 6 +- homeassistant/components/fan/__init__.py | 26 +- homeassistant/components/fan/device_action.py | 6 +- .../components/fan/device_condition.py | 6 +- .../components/fan/device_trigger.py | 10 +- homeassistant/components/fan/intent.py | 6 +- .../components/feedreader/config_flow.py | 10 +- homeassistant/components/ffmpeg/__init__.py | 10 +- homeassistant/components/ffmpeg/camera.py | 8 +- homeassistant/components/ffmpeg/services.py | 6 +- .../components/ffmpeg_motion/binary_sensor.py | 26 +- .../components/ffmpeg_noise/binary_sensor.py | 22 +- .../components/fibaro/config_flow.py | 14 +- homeassistant/components/fido/sensor.py | 12 +- homeassistant/components/file/config_flow.py | 20 +- homeassistant/components/file/services.py | 8 +- .../components/file_upload/__init__.py | 6 +- .../components/filesize/config_flow.py | 4 +- .../components/filter/config_flow.py | 52 +- homeassistant/components/filter/sensor.py | 66 +- homeassistant/components/fing/config_flow.py | 10 +- homeassistant/components/fints/sensor.py | 22 +- .../components/firefly_iii/config_flow.py | 12 +- .../components/fireservicerota/config_flow.py | 26 +- homeassistant/components/firmata/__init__.py | 81 +-- .../components/fish_audio/config_flow.py | 36 +- homeassistant/components/fivem/config_flow.py | 8 +- homeassistant/components/fixer/sensor.py | 8 +- .../components/fleetgo/device_tracker.py | 14 +- homeassistant/components/flexit/climate.py | 8 +- .../components/flexit/config_flow.py | 28 +- .../components/flexit_bacnet/config_flow.py | 8 +- .../components/flic/binary_sensor.py | 14 +- homeassistant/components/flipr/config_flow.py | 8 +- homeassistant/components/flo/config_flow.py | 6 +- homeassistant/components/flo/switch.py | 14 +- homeassistant/components/flock/notify.py | 4 +- .../components/flow_it/config_flow.py | 20 +- homeassistant/components/flume/config_flow.py | 16 +- homeassistant/components/flume/services.py | 8 +- homeassistant/components/fluss/config_flow.py | 4 +- homeassistant/components/flux/switch.py | 40 +- .../components/flux_led/config_flow.py | 24 +- homeassistant/components/flux_led/light.py | 64 +- homeassistant/components/folder/sensor.py | 6 +- .../components/folder_watcher/config_flow.py | 10 +- homeassistant/components/foobot/sensor.py | 7 +- .../components/forecast_solar/config_flow.py | 46 +- .../components/forecast_solar/services.py | 14 +- .../components/forked_daapd/config_flow.py | 34 +- .../components/fortios/device_tracker.py | 8 +- homeassistant/components/foscam/camera.py | 10 +- .../components/foscam/config_flow.py | 16 +- .../components/foursquare/__init__.py | 32 +- .../components/free_mobile/notify.py | 7 +- .../components/freebox/config_flow.py | 8 +- homeassistant/components/freedns/__init__.py | 18 +- .../components/freedompro/config_flow.py | 4 +- .../components/freshr/config_flow.py | 12 +- .../fressnapf_tracker/config_flow.py | 10 +- homeassistant/components/fritz/config_flow.py | 56 +- homeassistant/components/fritz/services.py | 18 +- .../components/fritzbox/config_flow.py | 30 +- .../fritzbox_callmonitor/config_flow.py | 32 +- .../components/fronius/config_flow.py | 18 +- homeassistant/components/frontend/__init__.py | 94 +-- homeassistant/components/frontend/storage.py | 34 +- .../frontier_silicon/config_flow.py | 12 +- .../components/fuelprices_dk/config_flow.py | 32 +- .../components/fujitsu_fglair/config_flow.py | 14 +- .../components/fully_kiosk/config_flow.py | 30 +- .../components/fully_kiosk/services.py | 20 +- homeassistant/components/fumis/config_flow.py | 20 +- homeassistant/components/futurenow/light.py | 16 +- homeassistant/components/fyta/config_flow.py | 8 +- homeassistant/components/garadget/cover.py | 16 +- .../garages_amsterdam/config_flow.py | 6 +- .../gardena_bluetooth/config_flow.py | 6 +- homeassistant/components/gatus/config_flow.py | 20 +- homeassistant/components/gc100/__init__.py | 12 +- .../components/gc100/binary_sensor.py | 6 +- homeassistant/components/gc100/switch.py | 6 +- homeassistant/components/gdacs/config_flow.py | 6 +- homeassistant/components/generic/camera.py | 6 +- .../components/generic/config_flow.py | 52 +- .../components/generic_hygrostat/__init__.py | 50 +- .../generic_hygrostat/config_flow.py | 20 +- .../components/generic_thermostat/climate.py | 50 +- .../generic_thermostat/config_flow.py | 36 +- .../components/geniushub/config_flow.py | 14 +- .../components/geniushub/services.py | 20 +- homeassistant/components/geniushub/switch.py | 6 +- .../components/gentex_homelink/config_flow.py | 16 +- .../components/geo_json_events/config_flow.py | 8 +- .../components/geo_location/trigger.py | 10 +- .../components/geo_rss_events/sensor.py | 20 +- homeassistant/components/geofency/__init__.py | 34 +- .../components/geonetnz_quakes/__init__.py | 24 +- .../components/geonetnz_quakes/config_flow.py | 10 +- .../components/geonetnz_volcano/__init__.py | 18 +- .../geonetnz_volcano/config_flow.py | 6 +- .../geosphere_austria_warnings/config_flow.py | 8 +- homeassistant/components/ghost/config_flow.py | 12 +- homeassistant/components/gios/config_flow.py | 6 +- .../components/github/config_flow.py | 6 +- homeassistant/components/gitlab_ci/sensor.py | 10 +- .../components/glances/config_flow.py | 20 +- homeassistant/components/go2rtc/__init__.py | 28 +- .../components/goalzero/config_flow.py | 8 +- .../components/gogogate2/config_flow.py | 14 +- .../components/goodwe/config_flow.py | 6 +- homeassistant/components/google/__init__.py | 32 +- .../components/google/config_flow.py | 8 +- .../google_air_quality/config_flow.py | 30 +- .../components/google_air_quality/services.py | 12 +- .../components/google_assistant/__init__.py | 52 +- .../google_assistant_sdk/config_flow.py | 8 +- .../google_assistant_sdk/services.py | 12 +- .../components/google_cloud/config_flow.py | 12 +- .../components/google_cloud/helpers.py | 44 +- homeassistant/components/google_cloud/tts.py | 10 +- .../config_flow.py | 48 +- .../entity.py | 13 +- .../components/google_mail/services.py | 20 +- .../components/google_maps/device_tracker.py | 8 +- .../components/google_photos/services.py | 10 +- .../components/google_pubsub/__init__.py | 16 +- .../components/google_sheets/services.py | 24 +- .../google_translate/config_flow.py | 10 +- .../components/google_translate/tts.py | 8 +- .../google_travel_time/config_flow.py | 30 +- .../components/google_travel_time/helpers.py | 6 +- .../components/google_travel_time/schemas.py | 30 +- .../components/google_weather/config_flow.py | 21 +- .../components/google_wifi/sensor.py | 10 +- .../components/govee_ble/config_flow.py | 6 +- homeassistant/components/gpsd/config_flow.py | 8 +- .../components/gpslogger/__init__.py | 30 +- homeassistant/components/graphite/__init__.py | 20 +- .../green_planet_energy/services.py | 22 +- .../components/greencell/config_flow.py | 6 +- .../components/greeneye_monitor/__init__.py | 77 ++- homeassistant/components/group/__init__.py | 40 +- .../components/group/binary_sensor.py | 12 +- homeassistant/components/group/button.py | 8 +- homeassistant/components/group/config_flow.py | 65 +- homeassistant/components/group/cover.py | 8 +- homeassistant/components/group/event.py | 8 +- homeassistant/components/group/fan.py | 8 +- homeassistant/components/group/light.py | 10 +- homeassistant/components/group/lock.py | 8 +- .../components/group/media_player.py | 8 +- homeassistant/components/group/notify.py | 12 +- homeassistant/components/group/sensor.py | 20 +- homeassistant/components/group/switch.py | 10 +- homeassistant/components/group/valve.py | 8 +- .../components/growatt_server/config_flow.py | 46 +- homeassistant/components/gtfs/sensor.py | 14 +- .../components/guardian/config_flow.py | 8 +- homeassistant/components/guardian/services.py | 22 +- .../components/guntamatic/config_flow.py | 6 +- .../components/habitica/config_flow.py | 50 +- homeassistant/components/habitica/services.py | 142 ++-- homeassistant/components/hanna/config_flow.py | 6 +- .../components/harbor/config_flow.py | 18 +- .../components/hardware/websocket_api.py | 6 +- .../harman_kardon_avr/media_player.py | 8 +- .../components/harman_luxury/config_flow.py | 4 +- .../components/harmony/config_flow.py | 18 +- homeassistant/components/harmony/remote.py | 4 +- homeassistant/components/hassio/auth.py | 20 +- homeassistant/components/hassio/repairs.py | 4 +- homeassistant/components/hassio/services.py | 72 +- .../components/hassio/websocket_api.py | 50 +- .../components/haveibeenpwned/sensor.py | 6 +- homeassistant/components/hddtemp/sensor.py | 12 +- .../components/hdfury/config_flow.py | 8 +- homeassistant/components/hdmi_cec/__init__.py | 61 +- homeassistant/components/heatmiser/climate.py | 19 +- homeassistant/components/hegel/config_flow.py | 16 +- homeassistant/components/helty/config_flow.py | 4 +- homeassistant/components/heos/config_flow.py | 16 +- homeassistant/components/heos/services.py | 29 +- .../here_travel_time/config_flow.py | 52 +- .../here_travel_time/coordinator.py | 6 +- .../components/hikvision/binary_sensor.py | 22 +- .../components/hikvision/config_flow.py | 14 +- .../components/hikvisioncam/switch.py | 12 +- .../components/hisense_aehw4a1/__init__.py | 16 +- homeassistant/components/history/__init__.py | 10 +- .../components/history/websocket_api.py | 34 +- .../components/history_stats/config_flow.py | 54 +- .../components/history_stats/sensor.py | 34 +- .../components/hitron_coda/device_tracker.py | 10 +- homeassistant/components/hive/climate.py | 6 +- homeassistant/components/hive/config_flow.py | 23 +- homeassistant/components/hive/water_heater.py | 6 +- homeassistant/components/hko/config_flow.py | 6 +- homeassistant/components/hlk_sw16/__init__.py | 23 +- .../components/hlk_sw16/config_flow.py | 8 +- .../components/holiday/config_flow.py | 18 +- .../components/home_connect/config_flow.py | 4 +- .../components/home_connect/services.py | 60 +- .../components/homeassistant/__init__.py | 26 +- .../homeassistant/exposed_entities.py | 22 +- homeassistant/components/homeassistant/llm.py | 12 +- .../components/homeassistant/scene.py | 46 +- .../homeassistant/triggers/event.py | 36 +- .../homeassistant/triggers/homeassistant.py | 6 +- .../homeassistant/triggers/numeric_state.py | 22 +- .../homeassistant/triggers/state.py | 32 +- .../components/homeassistant/triggers/time.py | 30 +- .../homeassistant/triggers/time_pattern.py | 14 +- .../homeassistant_green/config_flow.py | 10 +- .../silabs_multiprotocol_addon.py | 14 +- .../homeassistant_yellow/config_flow.py | 10 +- homeassistant/components/homee/config_flow.py | 28 +- homeassistant/components/homekit/__init__.py | 54 +- .../components/homekit/config_flow.py | 46 +- homeassistant/components/homekit/util.py | 124 ++-- .../homekit_controller/config_flow.py | 14 +- .../homekit_controller/device_trigger.py | 6 +- .../components/homematic/__init__.py | 128 ++-- homeassistant/components/homematic/notify.py | 12 +- .../components/homematicip_cloud/__init__.py | 18 +- .../homematicip_cloud/config_flow.py | 14 +- .../components/homematicip_cloud/services.py | 72 +- .../components/homevolt/config_flow.py | 10 +- .../components/homewizard/config_flow.py | 10 +- .../components/homeworks/__init__.py | 8 +- .../components/homeworks/config_flow.py | 76 +-- .../components/honeywell/config_flow.py | 20 +- .../honeywell_string_lights/config_flow.py | 6 +- .../components/horizon/media_player.py | 8 +- .../components/hortimax/config_flow.py | 6 +- .../components/hotspring/config_flow.py | 6 +- homeassistant/components/hp_ilo/sensor.py | 26 +- .../components/hr_energy_qube/config_flow.py | 6 +- homeassistant/components/html5/config_flow.py | 8 +- homeassistant/components/html5/http.py | 46 +- homeassistant/components/html5/notify.py | 12 +- homeassistant/components/html5/services.py | 48 +- homeassistant/components/http/__init__.py | 40 +- homeassistant/components/http/ban.py | 8 +- homeassistant/components/http/config.py | 40 +- .../components/http/data_validator.py | 10 +- .../components/http/websocket_api.py | 14 +- .../components/huawei_lte/__init__.py | 4 +- .../components/huawei_lte/config_flow.py | 28 +- homeassistant/components/hue/config_flow.py | 18 +- homeassistant/components/hue/scene.py | 16 +- homeassistant/components/hue/services.py | 12 +- .../components/hue/v1/device_trigger.py | 4 +- .../components/hue/v2/device_trigger.py | 8 +- .../components/hue_ble/config_flow.py | 8 +- .../components/huisbaasje/config_flow.py | 6 +- .../components/humidifier/__init__.py | 12 +- .../components/humidifier/condition.py | 8 +- .../components/humidifier/device_action.py | 28 +- .../components/humidifier/device_condition.py | 18 +- .../components/humidifier/device_trigger.py | 48 +- homeassistant/components/humidifier/intent.py | 12 +- .../components/humidifier/trigger.py | 8 +- .../hunterdouglas_powerview/config_flow.py | 6 +- .../husqvarna_automower/services.py | 14 +- .../husqvarna_automower_ble/config_flow.py | 12 +- homeassistant/components/huum/config_flow.py | 12 +- .../components/hvv_departures/config_flow.py | 32 +- .../components/hydrawise/binary_sensor.py | 8 +- .../components/hydrawise/config_flow.py | 14 +- .../components/hyperion/config_flow.py | 24 +- .../components/hypontech/config_flow.py | 18 +- .../components/ialarm/config_flow.py | 8 +- homeassistant/components/iammeter/sensor.py | 8 +- .../components/iaqualink/config_flow.py | 8 +- .../components/ibeacon/config_flow.py | 8 +- .../components/icloud/config_flow.py | 24 +- homeassistant/components/icloud/services.py | 31 +- .../components/idasen_desk/config_flow.py | 6 +- .../components/idrive_e2/config_flow.py | 12 +- .../components/idteck_prox/__init__.py | 16 +- homeassistant/components/ifttt/__init__.py | 26 +- .../components/ifttt/alarm_control_panel.py | 25 +- homeassistant/components/iglo/light.py | 8 +- .../components/igloohome/config_flow.py | 8 +- .../components/ign_sismologia/geo_location.py | 12 +- homeassistant/components/ihc/__init__.py | 7 +- homeassistant/components/ihc/auto_setup.py | 46 +- homeassistant/components/ihc/manual_setup.py | 56 +- homeassistant/components/ihc/services.py | 32 +- homeassistant/components/image/__init__.py | 4 +- .../components/image_processing/__init__.py | 14 +- .../components/image_upload/__init__.py | 14 +- homeassistant/components/imap/__init__.py | 14 +- homeassistant/components/imap/config_flow.py | 48 +- .../components/imeon_inverter/config_flow.py | 10 +- .../components/imgw_pib/config_flow.py | 6 +- .../components/immich/config_flow.py | 18 +- homeassistant/components/immich/services.py | 10 +- homeassistant/components/imou/config_flow.py | 14 +- .../components/improv_ble/config_flow.py | 12 +- .../components/incomfort/config_flow.py | 28 +- .../components/indevolt/config_flow.py | 6 +- homeassistant/components/indevolt/services.py | 18 +- homeassistant/components/influxdb/__init__.py | 46 +- .../components/influxdb/config_flow.py | 30 +- homeassistant/components/influxdb/const.py | 38 +- homeassistant/components/influxdb/sensor.py | 48 +- homeassistant/components/infrared/helpers.py | 4 +- .../components/inkbird/config_flow.py | 6 +- .../components/input_boolean/__init__.py | 24 +- .../components/input_button/__init__.py | 20 +- .../components/input_datetime/__init__.py | 60 +- .../components/input_number/__init__.py | 62 +- .../input_number/reproduce_state.py | 4 +- .../components/input_select/__init__.py | 52 +- .../components/input_text/__init__.py | 62 +- homeassistant/components/insteon/api/aldb.py | 65 +- .../components/insteon/api/config.py | 31 +- .../components/insteon/api/device.py | 22 +- .../components/insteon/api/properties.py | 47 +- .../components/insteon/api/scenes.py | 18 +- homeassistant/components/insteon/schemas.py | 112 ++-- .../components/integration/config_flow.py | 26 +- .../components/integration/sensor.py | 26 +- .../components/intelliclima/config_flow.py | 8 +- .../components/intellifire/config_flow.py | 20 +- homeassistant/components/intent/__init__.py | 44 +- homeassistant/components/intent/timers.py | 50 +- .../components/intent_script/__init__.py | 54 +- .../components/intesishome/climate.py | 8 +- .../components/iometer/config_flow.py | 4 +- homeassistant/components/ios/__init__.py | 136 ++-- .../components/iotawatt/config_flow.py | 14 +- homeassistant/components/iperf3/__init__.py | 46 +- homeassistant/components/ipma/config_flow.py | 8 +- homeassistant/components/ipp/config_flow.py | 14 +- homeassistant/components/iqvia/config_flow.py | 4 +- .../components/irish_rail_transport/sensor.py | 12 +- .../components/irm_kmi/config_flow.py | 10 +- .../components/iron_os/config_flow.py | 6 +- .../components/iseo_argo_ble/config_flow.py | 6 +- homeassistant/components/iskra/config_flow.py | 24 +- .../islamic_prayer_times/config_flow.py | 18 +- .../components/israel_rail/config_flow.py | 8 +- homeassistant/components/iss/config_flow.py | 6 +- .../components/ista_ecotrend/config_flow.py | 8 +- homeassistant/components/isy994/__init__.py | 6 +- .../components/isy994/config_flow.py | 34 +- homeassistant/components/isy994/services.py | 50 +- homeassistant/components/itach/remote.py | 24 +- .../components/itunes/media_player.py | 10 +- .../components/ituran/config_flow.py | 14 +- homeassistant/components/izone/__init__.py | 10 +- homeassistant/components/izone/climate.py | 10 +- homeassistant/components/izone/config_flow.py | 6 +- .../components/jellyfin/config_flow.py | 18 +- homeassistant/components/jellyfin/services.py | 8 +- .../components/jewish_calendar/config_flow.py | 38 +- .../components/jewish_calendar/services.py | 12 +- .../components/joaoapps_join/__init__.py | 18 +- .../components/joaoapps_join/notify.py | 10 +- .../components/justnimbus/config_flow.py | 8 +- .../components/jvc_projector/config_flow.py | 12 +- .../components/kaco_modbus/config_flow.py | 14 +- homeassistant/components/kaiterra/__init__.py | 32 +- .../components/kaleidescape/config_flow.py | 6 +- homeassistant/components/kankun/switch.py | 18 +- .../components/karakeep/config_flow.py | 12 +- homeassistant/components/keba/__init__.py | 22 +- .../components/keenetic_ndms2/config_flow.py | 26 +- homeassistant/components/kef/media_player.py | 40 +- .../components/kegtron/config_flow.py | 6 +- .../components/keyboard_remote/__init__.py | 28 +- .../components/keymitt_ble/config_flow.py | 6 +- .../components/keymitt_ble/switch.py | 8 +- .../components/kiosker/config_flow.py | 22 +- homeassistant/components/kiosker/services.py | 38 +- homeassistant/components/kira/__init__.py | 44 +- .../components/kitchen_sink/config_flow.py | 36 +- .../components/kitchen_sink/repairs.py | 4 +- .../components/kitchen_sink/services.py | 22 +- homeassistant/components/kiwi/lock.py | 7 +- .../klik_aan_klik_uit/config_flow.py | 24 +- .../components/kmtronic/config_flow.py | 14 +- .../components/knocki/config_flow.py | 8 +- homeassistant/components/knx/__init__.py | 10 +- homeassistant/components/knx/config_flow.py | 144 ++-- homeassistant/components/knx/const.py | 2 +- homeassistant/components/knx/diagnostics.py | 4 +- homeassistant/components/knx/repairs.py | 8 +- homeassistant/components/knx/schema.py | 634 +++++++++--------- homeassistant/components/knx/services.py | 46 +- homeassistant/components/knx/validation.py | 76 ++- homeassistant/components/knx/websocket.py | 108 +-- homeassistant/components/kodi/config_flow.py | 20 +- .../components/kodi/device_trigger.py | 6 +- homeassistant/components/kodi/notify.py | 12 +- homeassistant/components/kodi/services.py | 12 +- .../components/konnected/__init__.py | 4 +- .../kostal_plenticore/config_flow.py | 10 +- .../components/kraken/config_flow.py | 10 +- .../components/kulersky/config_flow.py | 10 +- homeassistant/components/kwb/sensor.py | 22 +- .../components/labs/websocket_api.py | 20 +- homeassistant/components/lacrosse/sensor.py | 28 +- .../components/lacrosse_view/config_flow.py | 12 +- .../components/lamarzocco/config_flow.py | 32 +- .../components/lametric/config_flow.py | 12 +- homeassistant/components/lametric/services.py | 32 +- .../landisgyr_heat_meter/config_flow.py | 6 +- homeassistant/components/lannouncer/notify.py | 4 +- .../components/lastfm/config_flow.py | 16 +- .../components/laundrify/config_flow.py | 2 +- homeassistant/components/lcn/config_flow.py | 22 +- .../components/lcn/device_trigger.py | 36 +- homeassistant/components/lcn/schemas.py | 83 ++- homeassistant/components/lcn/services.py | 116 ++-- homeassistant/components/lcn/websocket.py | 49 +- .../components/ld2410_ble/config_flow.py | 6 +- .../components/leaone/config_flow.py | 6 +- .../components/led_ble/config_flow.py | 6 +- .../components/led_infrared/config_flow.py | 18 +- .../components/lektrico/config_flow.py | 6 +- .../components/letpot/config_flow.py | 12 +- .../components/lg_infrared/config_flow.py | 16 +- .../components/lg_netcast/config_flow.py | 10 +- .../components/lg_netcast/device_trigger.py | 4 +- .../components/lg_netcast/triggers/turn_on.py | 12 +- .../components/lg_soundbar/config_flow.py | 6 +- .../components/lg_thinq/config_flow.py | 8 +- homeassistant/components/lg_thinq/repairs.py | 4 +- .../components/lg_tv_rs232/config_flow.py | 8 +- .../libre_hardware_monitor/config_flow.py | 14 +- .../components/librenms/config_flow.py | 20 +- .../components/lichess/config_flow.py | 4 +- .../components/lidarr/config_flow.py | 12 +- .../components/liebherr/config_flow.py | 6 +- homeassistant/components/lifx/__init__.py | 20 +- homeassistant/components/lifx/config_flow.py | 10 +- homeassistant/components/lifx/light.py | 12 +- homeassistant/components/lifx/manager.py | 119 ++-- homeassistant/components/lifx_cloud/scene.py | 10 +- homeassistant/components/light/__init__.py | 108 +-- .../components/light/device_action.py | 20 +- .../components/light/device_condition.py | 6 +- .../components/light/device_trigger.py | 10 +- homeassistant/components/light/intent.py | 6 +- .../components/lightwave/__init__.py | 38 +- .../components/limitlessled/light.py | 22 +- .../components/linkplay/config_flow.py | 4 +- homeassistant/components/linkplay/services.py | 4 +- .../linksys_smart/device_tracker.py | 4 +- homeassistant/components/linode/__init__.py | 8 +- .../components/linode/binary_sensor.py | 4 +- homeassistant/components/linode/switch.py | 4 +- .../components/linux_battery/sensor.py | 8 +- .../components/litejet/config_flow.py | 8 +- homeassistant/components/litejet/trigger.py | 10 +- .../components/litellm/config_flow.py | 16 +- .../components/litterrobot/config_flow.py | 10 +- .../components/litterrobot/services.py | 6 +- .../components/livisi/config_flow.py | 8 +- .../components/llama_cpp/config_flow.py | 32 +- homeassistant/components/llama_cpp/entity.py | 13 +- .../components/llamalab_automate/notify.py | 8 +- homeassistant/components/llm/websocket_api.py | 4 +- .../components/local_calendar/calendar.py | 4 +- .../components/local_calendar/config_flow.py | 14 +- homeassistant/components/local_file/camera.py | 4 +- .../components/local_file/config_flow.py | 10 +- .../components/local_todo/config_flow.py | 6 +- homeassistant/components/locative/__init__.py | 22 +- homeassistant/components/lock/__init__.py | 4 +- .../components/lock/device_action.py | 6 +- .../components/lock/device_condition.py | 6 +- .../components/lock/device_trigger.py | 14 +- homeassistant/components/logbook/__init__.py | 16 +- homeassistant/components/logbook/rest_api.py | 4 +- .../components/logbook/websocket_api.py | 24 +- homeassistant/components/logger/__init__.py | 26 +- .../components/logger/websocket_api.py | 20 +- .../components/lojack/config_flow.py | 10 +- homeassistant/components/london_air/sensor.py | 6 +- .../london_underground/config_flow.py | 10 +- .../components/london_underground/sensor.py | 8 +- .../components/lookin/config_flow.py | 4 +- homeassistant/components/loqed/config_flow.py | 10 +- homeassistant/components/lovelace/__init__.py | 34 +- homeassistant/components/lovelace/const.py | 38 +- .../components/lovelace/dashboard.py | 8 +- .../components/lovelace/resources.py | 12 +- .../components/lovelace/websocket.py | 12 +- homeassistant/components/luci/config_flow.py | 20 +- .../components/luci/device_tracker.py | 12 +- .../components/luftdaten/config_flow.py | 8 +- .../components/lunatone/config_flow.py | 10 +- .../components/lupusec/config_flow.py | 10 +- .../components/lutron/config_flow.py | 14 +- .../components/lutron_caseta/__init__.py | 20 +- .../components/lutron_caseta/config_flow.py | 4 +- .../lutron_caseta/device_trigger.py | 36 +- .../components/lutron_caseta/models.py | 4 +- homeassistant/components/lw12wifi/light.py | 8 +- .../components/lyngdorf/config_flow.py | 8 +- homeassistant/components/lyric/climate.py | 4 +- homeassistant/components/madvr/config_flow.py | 8 +- homeassistant/components/mailgun/__init__.py | 14 +- homeassistant/components/mailgun/notify.py | 7 +- .../components/manual/alarm_control_panel.py | 68 +- .../manual_mqtt/alarm_control_panel.py | 80 +-- .../components/map_tiles/__init__.py | 4 +- .../marantz_infrared/config_flow.py | 8 +- homeassistant/components/marytts/tts.py | 20 +- .../components/mastodon/config_flow.py | 24 +- homeassistant/components/mastodon/services.py | 88 +-- homeassistant/components/matrix/__init__.py | 34 +- homeassistant/components/matrix/notify.py | 4 +- homeassistant/components/matrix/services.py | 24 +- homeassistant/components/matter/api.py | 52 +- .../components/matter/config_flow.py | 10 +- homeassistant/components/matter/services.py | 64 +- homeassistant/components/maxcube/__init__.py | 18 +- homeassistant/components/mcp/config_flow.py | 10 +- homeassistant/components/mcp/coordinator.py | 6 +- .../components/mcp_server/config_flow.py | 14 +- homeassistant/components/mcp_server/server.py | 9 +- .../components/mealie/config_flow.py | 18 +- homeassistant/components/mealie/services.py | 100 +-- .../components/meater/config_flow.py | 8 +- .../components/medcom_ble/config_flow.py | 6 +- .../components/media_extractor/__init__.py | 8 +- .../components/media_extractor/config_flow.py | 4 +- .../components/media_player/__init__.py | 88 +-- .../media_player/device_condition.py | 6 +- .../components/media_player/device_trigger.py | 22 +- .../components/media_player/intent.py | 44 +- homeassistant/components/media_source/http.py | 20 +- .../components/media_source/local_source.py | 12 +- .../components/mediaroom/media_player.py | 10 +- homeassistant/components/melcloud/climate.py | 6 +- .../components/melcloud/config_flow.py | 12 +- .../components/melcloud_home/config_flow.py | 8 +- homeassistant/components/melissa/__init__.py | 12 +- .../components/melnor/config_flow.py | 6 +- .../components/meraki/device_tracker.py | 7 +- .../components/message_bird/notify.py | 8 +- homeassistant/components/met/config_flow.py | 26 +- .../components/met_eireann/config_flow.py | 12 +- .../components/meteo_france/config_flow.py | 16 +- .../components/meteo_lt/config_flow.py | 6 +- .../components/meteoalarm/binary_sensor.py | 10 +- .../components/meteoclimatic/config_flow.py | 6 +- .../components/metoffice/config_flow.py | 14 +- homeassistant/components/mfi/sensor.py | 14 +- homeassistant/components/mfi/switch.py | 14 +- homeassistant/components/microsoft/tts.py | 26 +- homeassistant/components/midea/config_flow.py | 52 +- homeassistant/components/miele/services.py | 24 +- .../components/mikrotik/config_flow.py | 26 +- homeassistant/components/mill/config_flow.py | 15 +- homeassistant/components/mill/services.py | 12 +- .../components/min_max/config_flow.py | 14 +- homeassistant/components/min_max/sensor.py | 16 +- .../minecraft_server/config_flow.py | 8 +- homeassistant/components/minio/__init__.py | 36 +- .../mitsubishi_comfort/config_flow.py | 8 +- .../components/mitsubishi_comfort/repairs.py | 4 +- homeassistant/components/mjpeg/config_flow.py | 18 +- homeassistant/components/moat/config_flow.py | 6 +- homeassistant/components/mobile_app/const.py | 14 +- .../components/mobile_app/device_action.py | 18 +- .../components/mobile_app/device_tracker.py | 26 +- .../components/mobile_app/http_api.py | 28 +- .../mobile_app/live_activity/webhook.py | 10 +- .../components/mobile_app/webhook.py | 124 ++-- .../components/mobile_app/websocket_api.py | 14 +- homeassistant/components/mochad/__init__.py | 12 +- homeassistant/components/mochad/light.py | 14 +- homeassistant/components/mochad/switch.py | 12 +- homeassistant/components/modbus/schemas.py | 322 +++++---- homeassistant/components/modbus/services.py | 22 +- homeassistant/components/modbus/validators.py | 22 +- .../components/modbus/websocket_api.py | 4 +- .../components/modem_callerid/config_flow.py | 8 +- .../components/modern_forms/config_flow.py | 4 +- homeassistant/components/modern_forms/fan.py | 6 +- .../components/modern_forms/light.py | 6 +- .../moehlenhoff_alpha2/config_flow.py | 4 +- .../components/mold_indicator/config_flow.py | 24 +- .../components/mold_indicator/sensor.py | 14 +- .../components/monarch_money/config_flow.py | 12 +- .../components/monoprice/config_flow.py | 14 +- homeassistant/components/monzo/services.py | 16 +- homeassistant/components/moon/condition.py | 12 +- homeassistant/components/moon/trigger.py | 8 +- .../components/mopeka/config_flow.py | 16 +- .../components/motion_blinds/config_flow.py | 22 +- .../components/motion_blinds/cover.py | 14 +- .../motionblinds_ble/config_flow.py | 16 +- homeassistant/components/motioneye/camera.py | 18 +- .../components/motioneye/config_flow.py | 28 +- .../components/motionmount/config_flow.py | 14 +- homeassistant/components/mpd/config_flow.py | 10 +- homeassistant/components/mpd/media_player.py | 10 +- homeassistant/components/mqtt/__init__.py | 41 +- .../components/mqtt/alarm_control_panel.py | 48 +- .../components/mqtt/binary_sensor.py | 20 +- homeassistant/components/mqtt/button.py | 18 +- homeassistant/components/mqtt/camera.py | 14 +- homeassistant/components/mqtt/climate.py | 150 +++-- homeassistant/components/mqtt/config.py | 22 +- homeassistant/components/mqtt/config_flow.py | 164 ++--- .../components/mqtt/config_integration.py | 64 +- homeassistant/components/mqtt/cover.py | 100 +-- homeassistant/components/mqtt/date.py | 10 +- homeassistant/components/mqtt/datetime.py | 12 +- .../components/mqtt/device_automation.py | 8 +- .../components/mqtt/device_tracker.py | 28 +- .../components/mqtt/device_trigger.py | 32 +- homeassistant/components/mqtt/discovery.py | 10 +- homeassistant/components/mqtt/entity.py | 16 +- homeassistant/components/mqtt/event.py | 16 +- homeassistant/components/mqtt/fan.py | 72 +- homeassistant/components/mqtt/humidifier.py | 66 +- homeassistant/components/mqtt/image.py | 29 +- homeassistant/components/mqtt/infrared.py | 44 +- homeassistant/components/mqtt/lawn_mower.py | 32 +- .../components/mqtt/light/__init__.py | 10 +- homeassistant/components/mqtt/light/schema.py | 8 +- .../components/mqtt/light/schema_basic.py | 112 ++-- .../components/mqtt/light/schema_json.py | 58 +- .../components/mqtt/light/schema_template.py | 40 +- homeassistant/components/mqtt/lock.py | 42 +- homeassistant/components/mqtt/notify.py | 14 +- homeassistant/components/mqtt/number.py | 36 +- homeassistant/components/mqtt/repairs.py | 4 +- homeassistant/components/mqtt/scene.py | 14 +- homeassistant/components/mqtt/schemas.py | 126 ++-- homeassistant/components/mqtt/select.py | 14 +- homeassistant/components/mqtt/sensor.py | 38 +- homeassistant/components/mqtt/siren.py | 32 +- homeassistant/components/mqtt/switch.py | 22 +- homeassistant/components/mqtt/tag.py | 12 +- homeassistant/components/mqtt/text.py | 28 +- homeassistant/components/mqtt/time.py | 10 +- homeassistant/components/mqtt/trigger.py | 16 +- homeassistant/components/mqtt/update.py | 50 +- homeassistant/components/mqtt/util.py | 40 +- homeassistant/components/mqtt/vacuum.py | 48 +- homeassistant/components/mqtt/valve.py | 54 +- homeassistant/components/mqtt/water_heater.py | 60 +- .../components/mqtt_eventstream/__init__.py | 16 +- .../components/mqtt_json/device_tracker.py | 18 +- homeassistant/components/mqtt_room/sensor.py | 28 +- .../components/mqtt_statestream/__init__.py | 12 +- homeassistant/components/msteams/notify.py | 4 +- homeassistant/components/mta/config_flow.py | 22 +- .../components/music_assistant/config_flow.py | 8 +- .../components/music_assistant/schemas.py | 126 ++-- .../components/music_assistant/services.py | 80 +-- .../components/mutesync/config_flow.py | 4 +- homeassistant/components/mvglive/sensor.py | 26 +- homeassistant/components/my_pv/config_flow.py | 10 +- .../components/myneomitis/config_flow.py | 8 +- .../components/mysensors/config_flow.py | 42 +- homeassistant/components/mysensors/gateway.py | 8 +- homeassistant/components/mysensors/helpers.py | 27 +- .../components/mystrom/config_flow.py | 8 +- .../components/mythicbeastsdns/__init__.py | 20 +- homeassistant/components/nad/media_player.py | 22 +- homeassistant/components/nam/config_flow.py | 12 +- .../components/namecheapdns/config_flow.py | 14 +- .../components/nanoleaf/config_flow.py | 6 +- .../components/nanoleaf/device_trigger.py | 8 +- .../components/nasweb/config_flow.py | 10 +- homeassistant/components/neato/services.py | 10 +- .../nederlandse_spoorwegen/config_flow.py | 18 +- .../components/neopool/config_flow.py | 48 +- .../components/ness_alarm/__init__.py | 26 +- .../components/ness_alarm/config_flow.py | 26 +- .../components/ness_alarm/services.py | 10 +- homeassistant/components/nest/__init__.py | 28 +- homeassistant/components/nest/config_flow.py | 18 +- .../components/nest/device_trigger.py | 4 +- homeassistant/components/nest/services.py | 4 +- homeassistant/components/netatmo/camera.py | 8 +- homeassistant/components/netatmo/climate.py | 20 +- .../components/netatmo/config_flow.py | 28 +- .../components/netatmo/device_trigger.py | 8 +- homeassistant/components/netdata/sensor.py | 22 +- .../components/netgear/config_flow.py | 22 +- .../components/netgear_lte/config_flow.py | 8 +- .../components/netgear_lte/services.py | 22 +- homeassistant/components/netio/config_flow.py | 16 +- homeassistant/components/netio/switch.py | 12 +- homeassistant/components/network/const.py | 8 +- homeassistant/components/network/websocket.py | 10 +- .../components/neurio_energy/sensor.py | 8 +- .../components/nexblue/config_flow.py | 8 +- homeassistant/components/nexia/climate.py | 20 +- homeassistant/components/nexia/config_flow.py | 10 +- .../components/nextbus/config_flow.py | 16 +- .../components/nextcloud/config_flow.py | 18 +- .../components/nextdns/config_flow.py | 12 +- .../components/nfandroidtv/config_flow.py | 6 +- .../components/nfandroidtv/notify.py | 4 +- .../components/nibe_heatpump/config_flow.py | 28 +- .../components/nice_go/config_flow.py | 8 +- .../components/nightscout/config_flow.py | 6 +- .../niko_home_control/config_flow.py | 6 +- homeassistant/components/nilu/air_quality.py | 18 +- homeassistant/components/nina/config_flow.py | 20 +- .../nintendo_parental_controls/config_flow.py | 6 +- .../nintendo_parental_controls/services.py | 26 +- .../components/nissan_leaf/__init__.py | 40 +- .../components/nmap_tracker/config_flow.py | 28 +- homeassistant/components/nmbs/config_flow.py | 12 +- homeassistant/components/no_ip/__init__.py | 18 +- homeassistant/components/noaa_tides/sensor.py | 12 +- .../components/nobo_hub/config_flow.py | 26 +- .../components/nordpool/config_flow.py | 8 +- homeassistant/components/nordpool/services.py | 27 +- .../components/norway_air/air_quality.py | 12 +- homeassistant/components/notify/__init__.py | 15 +- homeassistant/components/notify/const.py | 12 +- .../components/notify_events/__init__.py | 7 +- .../components/notion/config_flow.py | 12 +- .../novy_cooker_hood/config_flow.py | 12 +- .../components/nrgkick/config_flow.py | 28 +- .../components/nsw_fuel_station/sensor.py | 10 +- .../geo_location.py | 14 +- homeassistant/components/ntfy/config_flow.py | 48 +- homeassistant/components/ntfy/repairs.py | 4 +- homeassistant/components/ntfy/services.py | 80 ++- .../components/nuheat/config_flow.py | 10 +- homeassistant/components/nuki/config_flow.py | 28 +- homeassistant/components/nuki/lock.py | 6 +- homeassistant/components/numato/__init__.py | 52 +- homeassistant/components/number/__init__.py | 4 +- homeassistant/components/number/const.py | 6 +- .../components/number/device_action.py | 14 +- .../components/number/websocket_api.py | 6 +- homeassistant/components/nut/config_flow.py | 35 +- homeassistant/components/nut/device_action.py | 4 +- homeassistant/components/nws/config_flow.py | 18 +- homeassistant/components/nws/weather.py | 4 +- .../components/nx584/alarm_control_panel.py | 12 +- .../components/nx584/binary_sensor.py | 14 +- .../components/nyt_games/config_flow.py | 4 +- .../components/nzbget/config_flow.py | 20 +- homeassistant/components/nzbget/services.py | 14 +- .../components/oasa_telematics/sensor.py | 8 +- .../components/obihai/config_flow.py | 12 +- .../components/octoprint/__init__.py | 58 +- .../components/octoprint/config_flow.py | 24 +- .../components/octoprint/services.py | 12 +- homeassistant/components/oem/climate.py | 12 +- homeassistant/components/ohmconnect/sensor.py | 6 +- homeassistant/components/ohme/config_flow.py | 12 +- homeassistant/components/ohme/services.py | 12 +- .../components/ollama/config_flow.py | 32 +- homeassistant/components/ollama/entity.py | 11 +- homeassistant/components/ombi/__init__.py | 40 +- homeassistant/components/omie/services.py | 12 +- .../components/omnilogic/config_flow.py | 16 +- homeassistant/components/omnilogic/switch.py | 4 +- homeassistant/components/onboarding/views.py | 25 +- .../components/onedrive/config_flow.py | 8 +- homeassistant/components/onedrive/services.py | 18 +- .../onedrive_for_business/config_flow.py | 8 +- .../components/onewire/config_flow.py | 20 +- homeassistant/components/onkyo/config_flow.py | 42 +- homeassistant/components/onkyo/services.py | 10 +- homeassistant/components/onvif/camera.py | 18 +- homeassistant/components/onvif/config_flow.py | 50 +- .../components/open_meteo/config_flow.py | 6 +- .../components/open_router/config_flow.py | 20 +- .../components/open_router/entity.py | 11 +- .../openai_conversation/config_flow.py | 81 +-- .../components/openai_conversation/entity.py | 11 +- .../openalpr_cloud/image_processing.py | 8 +- .../components/opendisplay/config_flow.py | 20 +- .../components/opendisplay/services.py | 28 +- homeassistant/components/openerz/sensor.py | 8 +- .../components/openevse/config_flow.py | 18 +- homeassistant/components/openevse/sensor.py | 8 +- .../openexchangerates/config_flow.py | 12 +- .../components/opengarage/config_flow.py | 12 +- .../components/openhardwaremonitor/sensor.py | 7 +- homeassistant/components/openhome/services.py | 4 +- .../components/openrgb/config_flow.py | 16 +- .../components/opensensemap/air_quality.py | 7 +- .../components/opensensemap/config_flow.py | 4 +- .../components/opensky/config_flow.py | 24 +- .../components/opentherm_gw/config_flow.py | 30 +- .../components/opentherm_gw/services.py | 105 +-- .../components/openuv/config_flow.py | 32 +- .../components/openweathermap/config_flow.py | 18 +- homeassistant/components/opnsense/__init__.py | 18 +- .../components/opnsense/config_flow.py | 18 +- .../components/opower/config_flow.py | 32 +- homeassistant/components/opple/light.py | 6 +- homeassistant/components/oralb/config_flow.py | 6 +- homeassistant/components/oru/sensor.py | 4 +- .../components/orvibo/config_flow.py | 12 +- homeassistant/components/orvibo/switch.py | 12 +- .../components/osoenergy/config_flow.py | 4 +- .../components/osoenergy/water_heater.py | 18 +- .../components/osramlightify/light.py | 16 +- homeassistant/components/otbr/config_flow.py | 4 +- .../components/otbr/websocket_api.py | 12 +- homeassistant/components/otp/config_flow.py | 14 +- .../components/ouman_eh_800/config_flow.py | 16 +- .../components/ourgroceries/config_flow.py | 8 +- .../components/overkiz/config_flow.py | 28 +- homeassistant/components/overkiz/services.py | 10 +- .../components/overseerr/config_flow.py | 8 +- .../components/overseerr/services.py | 36 +- .../ovhcloud_ai_endpoints/config_flow.py | 22 +- .../components/ovo_energy/config_flow.py | 12 +- .../components/owntracks/__init__.py | 27 +- .../components/p1_monitor/config_flow.py | 10 +- .../components/paj_gps/config_flow.py | 8 +- .../components/palazzetti/config_flow.py | 4 +- .../panasonic_bluray/media_player.py | 6 +- .../components/panasonic_viera/__init__.py | 18 +- .../components/panasonic_viera/config_flow.py | 10 +- .../components/panel_custom/__init__.py | 36 +- .../components/paperless_ngx/config_flow.py | 12 +- .../components/peblar/config_flow.py | 22 +- homeassistant/components/peblar/services.py | 18 +- homeassistant/components/peco/config_flow.py | 8 +- .../components/pegel_online/config_flow.py | 12 +- homeassistant/components/pencom/switch.py | 18 +- .../persang_infrared/config_flow.py | 6 +- .../persistent_notification/__init__.py | 20 +- .../persistent_notification/trigger.py | 10 +- homeassistant/components/person/__init__.py | 40 +- .../components/philips_js/config_flow.py | 18 +- .../components/philips_js/device_trigger.py | 4 +- .../components/pi_hole/config_flow.py | 22 +- homeassistant/components/pi_hole/switch.py | 4 +- .../components/picnic/config_flow.py | 18 +- homeassistant/components/picnic/services.py | 18 +- .../components/picotts/config_flow.py | 6 +- homeassistant/components/picotts/tts.py | 4 +- homeassistant/components/pilight/__init__.py | 26 +- .../components/pilight/binary_sensor.py | 16 +- homeassistant/components/pilight/entity.py | 40 +- homeassistant/components/pilight/light.py | 8 +- homeassistant/components/pilight/sensor.py | 10 +- homeassistant/components/pilight/switch.py | 4 +- homeassistant/components/ping/config_flow.py | 14 +- .../components/pioneer/media_player.py | 14 +- .../components/pjlink/config_flow.py | 10 +- .../components/pjlink/media_player.py | 12 +- homeassistant/components/plaato/__init__.py | 32 +- .../components/plaato/config_flow.py | 18 +- homeassistant/components/plant/__init__.py | 46 +- .../playstation_network/config_flow.py | 8 +- homeassistant/components/plex/config_flow.py | 32 +- homeassistant/components/plex/services.py | 6 +- .../components/plugwise/config_flow.py | 14 +- .../components/pocketcasts/sensor.py | 7 +- .../components/pooldose/config_flow.py | 6 +- .../components/poolsense/config_flow.py | 9 +- .../components/portainer/config_flow.py | 14 +- .../components/portainer/services.py | 22 +- .../components/powerfox/config_flow.py | 12 +- .../components/powerfox_local/config_flow.py | 12 +- .../components/powerwall/config_flow.py | 10 +- homeassistant/components/prana/config_flow.py | 6 +- .../private_ble_device/config_flow.py | 4 +- .../components/probe_plus/config_flow.py | 6 +- homeassistant/components/profiler/services.py | 30 +- .../components/progettihwsw/config_flow.py | 22 +- homeassistant/components/proliphix/climate.py | 8 +- .../components/prometheus/__init__.py | 38 +- .../components/prosegur/config_flow.py | 20 +- homeassistant/components/prowl/config_flow.py | 8 +- homeassistant/components/prowl/notify.py | 6 +- .../components/proximity/config_flow.py | 20 +- .../components/proxmoxve/config_flow.py | 30 +- homeassistant/components/proxy/camera.py | 32 +- .../components/prusalink/config_flow.py | 10 +- homeassistant/components/ps4/config_flow.py | 28 +- homeassistant/components/ps4/services.py | 8 +- .../components/ptdevices/config_flow.py | 6 +- .../components/pterodactyl/config_flow.py | 12 +- .../components/pulseaudio_loopback/switch.py | 12 +- .../components/pure_energie/config_flow.py | 6 +- .../components/purpleair/config_flow.py | 34 +- homeassistant/components/push/camera.py | 12 +- .../components/pushbullet/config_flow.py | 8 +- homeassistant/components/pushover/__init__.py | 8 +- .../components/pushover/config_flow.py | 14 +- homeassistant/components/pushsafer/notify.py | 4 +- .../components/pvoutput/config_flow.py | 14 +- .../pvpc_hourly_pricing/config_flow.py | 42 +- .../components/pvpc_hourly_pricing/const.py | 6 +- .../components/pyload/config_flow.py | 22 +- .../components/python_script/__init__.py | 6 +- .../components/qbittorrent/config_flow.py | 12 +- .../components/qingping/config_flow.py | 6 +- .../components/qld_bushfire/geo_location.py | 14 +- homeassistant/components/qnap/config_flow.py | 16 +- .../components/qnap_qsw/config_flow.py | 16 +- .../quantum_gateway/device_tracker.py | 8 +- homeassistant/components/qvr_pro/__init__.py | 22 +- .../components/qwikswitch/__init__.py | 40 +- .../components/rabbitair/config_flow.py | 10 +- .../components/rachio/config_flow.py | 10 +- homeassistant/components/rachio/services.py | 18 +- homeassistant/components/rachio/switch.py | 6 +- .../components/radarr/config_flow.py | 10 +- homeassistant/components/radarr/services.py | 10 +- .../components/radio_frequency/helpers.py | 2 +- .../radio_frequency/websocket_api.py | 4 +- .../components/radiotherm/config_flow.py | 4 +- .../components/rainbird/config_flow.py | 16 +- homeassistant/components/rainbird/services.py | 4 +- .../components/raincloud/__init__.py | 16 +- .../components/raincloud/binary_sensor.py | 8 +- homeassistant/components/raincloud/sensor.py | 8 +- homeassistant/components/raincloud/switch.py | 14 +- .../rainforest_eagle/config_flow.py | 14 +- .../rainforest_raven/config_flow.py | 10 +- .../components/rainmachine/config_flow.py | 22 +- .../components/rainmachine/services.py | 68 +- .../components/rainmachine/switch.py | 4 +- .../components/random/binary_sensor.py | 6 +- .../components/random/config_flow.py | 22 +- homeassistant/components/random/sensor.py | 10 +- .../components/rapt_ble/config_flow.py | 6 +- homeassistant/components/raspyrfm/switch.py | 24 +- homeassistant/components/rdw/config_flow.py | 6 +- .../components/recollect_waste/config_flow.py | 10 +- homeassistant/components/recorder/__init__.py | 36 +- .../recorder/basic_websocket_api.py | 4 +- .../components/recorder/entity_options.py | 6 +- homeassistant/components/recorder/services.py | 63 +- .../components/recorder/statistics.py | 8 +- homeassistant/components/recorder/util.py | 30 +- .../components/recorder/websocket_api.py | 198 +++--- homeassistant/components/recswitch/switch.py | 8 +- homeassistant/components/reddit/sensor.py | 18 +- .../components/redgtech/config_flow.py | 8 +- .../components/rehlko/config_flow.py | 10 +- .../components/rejseplanen/config_flow.py | 16 +- .../components/rejseplanen/sensor.py | 14 +- .../components/remember_the_milk/__init__.py | 20 +- .../remember_the_milk/config_flow.py | 14 +- homeassistant/components/remote/__init__.py | 30 +- .../components/remote/device_action.py | 6 +- .../components/remote/device_condition.py | 6 +- .../components/remote/device_trigger.py | 10 +- .../components/remote_calendar/config_flow.py | 16 +- .../remote_rpi_gpio/binary_sensor.py | 14 +- .../components/remote_rpi_gpio/switch.py | 10 +- .../components/renault/config_flow.py | 24 +- homeassistant/components/renault/services.py | 92 ++- .../components/renson/config_flow.py | 6 +- homeassistant/components/renson/fan.py | 28 +- .../components/reolink/config_flow.py | 20 +- homeassistant/components/reolink/services.py | 10 +- .../components/repairs/issue_handler.py | 4 +- .../components/repairs/websocket_api.py | 26 +- homeassistant/components/repetier/__init__.py | 32 +- homeassistant/components/rest/__init__.py | 4 +- .../components/rest/binary_sensor.py | 4 +- homeassistant/components/rest/notify.py | 30 +- homeassistant/components/rest/schema.py | 68 +- homeassistant/components/rest/sensor.py | 4 +- homeassistant/components/rest/switch.py | 32 +- .../components/rest_command/__init__.py | 38 +- homeassistant/components/rflink/__init__.py | 57 +- .../components/rflink/binary_sensor.py | 18 +- homeassistant/components/rflink/const.py | 10 +- homeassistant/components/rflink/cover.py | 26 +- homeassistant/components/rflink/light.py | 28 +- homeassistant/components/rflink/sensor.py | 18 +- homeassistant/components/rflink/switch.py | 24 +- .../components/rfxtrx/config_flow.py | 48 +- .../components/rfxtrx/device_action.py | 6 +- .../components/rfxtrx/device_trigger.py | 6 +- homeassistant/components/rfxtrx/services.py | 6 +- .../components/rhasspy/config_flow.py | 4 +- .../components/ridwell/config_flow.py | 18 +- homeassistant/components/ring/config_flow.py | 12 +- homeassistant/components/ripple/sensor.py | 6 +- homeassistant/components/risco/config_flow.py | 46 +- homeassistant/components/risco/services.py | 8 +- .../rituals_perfume_genie/config_flow.py | 12 +- .../components/rmvtransport/sensor.py | 24 +- .../components/roborock/config_flow.py | 24 +- homeassistant/components/roborock/services.py | 18 +- homeassistant/components/rocketchat/notify.py | 10 +- homeassistant/components/roku/config_flow.py | 8 +- homeassistant/components/roku/services.py | 4 +- homeassistant/components/romy/config_flow.py | 14 +- .../components/roomba/config_flow.py | 18 +- homeassistant/components/roon/config_flow.py | 8 +- homeassistant/components/roon/services.py | 4 +- homeassistant/components/route53/__init__.py | 22 +- .../route_b_smart_meter/config_flow.py | 12 +- homeassistant/components/rova/config_flow.py | 10 +- .../components/rss_feed_template/__init__.py | 22 +- homeassistant/components/rtorrent/sensor.py | 10 +- .../ruckus_unleashed/config_flow.py | 14 +- .../components/russound_rio/config_flow.py | 26 +- .../components/russound_rnet/media_player.py | 16 +- .../components/ruuvi_gateway/schemata.py | 12 +- .../components/ruuvitag_ble/config_flow.py | 6 +- .../components/rympro/config_flow.py | 8 +- .../components/sabnzbd/config_flow.py | 8 +- homeassistant/components/saj/config_flow.py | 22 +- homeassistant/components/saj/sensor.py | 14 +- .../components/samsung_exlink/config_flow.py | 8 +- .../samsung_infrared/config_flow.py | 8 +- .../components/samsungtv/config_flow.py | 10 +- .../components/samsungtv/device_trigger.py | 4 +- .../components/samsungtv/media_player.py | 4 +- .../components/samsungtv/triggers/turn_on.py | 12 +- homeassistant/components/sanix/config_flow.py | 8 +- .../components/satel_integra/config_flow.py | 60 +- .../components/saunum/config_flow.py | 14 +- homeassistant/components/saunum/services.py | 21 +- homeassistant/components/scene/__init__.py | 20 +- homeassistant/components/schedule/__init__.py | 48 +- homeassistant/components/schlage/__init__.py | 12 +- .../components/schlage/config_flow.py | 8 +- homeassistant/components/schluter/__init__.py | 12 +- homeassistant/components/schluter/climate.py | 8 +- .../components/scorpiontrack/config_flow.py | 4 +- homeassistant/components/scrape/__init__.py | 28 +- .../components/scrape/config_flow.py | 62 +- homeassistant/components/scrape/sensor.py | 6 +- .../components/screenlogic/config_flow.py | 12 +- .../components/screenlogic/services.py | 12 +- homeassistant/components/script/__init__.py | 8 +- homeassistant/components/script/config.py | 54 +- homeassistant/components/search/__init__.py | 8 +- .../components/season/config_flow.py | 8 +- homeassistant/components/select/__init__.py | 8 +- homeassistant/components/select/condition.py | 8 +- .../components/select/device_action.py | 40 +- .../components/select/device_condition.py | 18 +- .../components/select/device_trigger.py | 22 +- homeassistant/components/sendgrid/notify.py | 10 +- homeassistant/components/sense/config_flow.py | 16 +- .../components/sensibo/config_flow.py | 6 +- homeassistant/components/sensibo/services.py | 40 +- .../components/sensirion_ble/config_flow.py | 6 +- homeassistant/components/sensor/const.py | 10 +- .../components/sensor/device_condition.py | 24 +- .../components/sensor/device_trigger.py | 28 +- .../components/sensor/websocket_api.py | 8 +- .../components/sensorpro/config_flow.py | 6 +- .../components/sensorpush/config_flow.py | 6 +- .../sensorpush_cloud/config_flow.py | 8 +- .../components/sensoterra/config_flow.py | 8 +- .../components/sentry/config_flow.py | 30 +- homeassistant/components/serial/sensor.py | 24 +- homeassistant/components/serial_pm/sensor.py | 8 +- homeassistant/components/sesame/lock.py | 6 +- .../seven_segments/image_processing.py | 20 +- .../components/seventeentrack/config_flow.py | 14 +- .../components/seventeentrack/services.py | 22 +- .../components/sfr_box/config_flow.py | 14 +- .../components/sftp_storage/config_flow.py | 16 +- .../components/sharkiq/config_flow.py | 10 +- homeassistant/components/sharkiq/services.py | 6 +- .../components/shell_command/__init__.py | 8 +- homeassistant/components/shelly/__init__.py | 10 +- .../components/shelly/config_flow.py | 56 +- .../components/shelly/device_trigger.py | 6 +- homeassistant/components/shelly/repairs.py | 4 +- homeassistant/components/shelly/services.py | 18 +- homeassistant/components/shodan/sensor.py | 8 +- .../components/shopping_list/__init__.py | 38 +- .../components/shopping_list/common.py | 6 +- .../components/shopping_list/services.py | 10 +- homeassistant/components/sia/config_flow.py | 36 +- homeassistant/components/sigfox/sensor.py | 8 +- .../components/sighthound/image_processing.py | 10 +- .../components/signal_messenger/notify.py | 40 +- .../components/silla_prism/config_flow.py | 8 +- .../components/simplefin/config_flow.py | 6 +- .../components/simplepush/config_flow.py | 12 +- .../components/simplisafe/config_flow.py | 10 +- .../components/simplisafe/services.py | 54 +- homeassistant/components/sinch/notify.py | 10 +- homeassistant/components/siren/__init__.py | 8 +- homeassistant/components/sisyphus/__init__.py | 14 +- .../components/sky_hub/device_tracker.py | 4 +- .../components/sky_remote/config_flow.py | 6 +- homeassistant/components/skybeacon/sensor.py | 6 +- .../components/skybell/config_flow.py | 12 +- homeassistant/components/slack/config_flow.py | 12 +- homeassistant/components/slack/notify.py | 36 +- .../components/sleep_as_android/__init__.py | 14 +- homeassistant/components/sleepiq/__init__.py | 10 +- .../components/sleepiq/config_flow.py | 10 +- homeassistant/components/slide/__init__.py | 16 +- .../components/slide_local/config_flow.py | 16 +- homeassistant/components/sma/config_flow.py | 32 +- homeassistant/components/smappee/__init__.py | 12 +- .../components/smappee/config_flow.py | 12 +- .../components/smarla/config_flow.py | 4 +- .../smart_meter_texas/config_flow.py | 6 +- .../components/smarttub/binary_sensor.py | 10 +- .../components/smarttub/config_flow.py | 12 +- homeassistant/components/smarttub/sensor.py | 14 +- .../components/smarty/config_flow.py | 4 +- homeassistant/components/smhi/config_flow.py | 12 +- .../components/smlight/config_flow.py | 18 +- homeassistant/components/smlight/services.py | 22 +- homeassistant/components/smtp/config_flow.py | 48 +- homeassistant/components/smtp/notify.py | 26 +- homeassistant/components/smtp/services.py | 20 +- .../components/snapcast/config_flow.py | 8 +- homeassistant/components/snapcast/services.py | 4 +- .../components/snmp/device_tracker.py | 12 +- homeassistant/components/snmp/sensor.py | 36 +- homeassistant/components/snmp/switch.py | 44 +- homeassistant/components/snoo/config_flow.py | 8 +- homeassistant/components/snooz/config_flow.py | 6 +- homeassistant/components/snooz/fan.py | 18 +- homeassistant/components/sofar/config_flow.py | 14 +- homeassistant/components/sofar/services.py | 30 +- .../components/solaredge/config_flow.py | 28 +- .../components/solaredge_local/sensor.py | 6 +- .../solaredge_modbus/config_flow.py | 28 +- .../components/solarlog/config_flow.py | 24 +- .../components/solarman/config_flow.py | 6 +- homeassistant/components/solax/config_flow.py | 23 +- homeassistant/components/soma/__init__.py | 15 +- homeassistant/components/soma/config_flow.py | 10 +- .../components/somfy_mylink/config_flow.py | 18 +- .../components/sonarr/config_flow.py | 26 +- homeassistant/components/sonarr/services.py | 30 +- homeassistant/components/songpal/__init__.py | 15 +- .../components/songpal/config_flow.py | 8 +- homeassistant/components/songpal/services.py | 6 +- homeassistant/components/sonos/__init__.py | 18 +- homeassistant/components/sonos/services.py | 24 +- .../components/sony_projector/switch.py | 6 +- .../components/soundtouch/__init__.py | 24 +- .../components/soundtouch/config_flow.py | 6 +- homeassistant/components/spaceapi/__init__.py | 147 ++-- homeassistant/components/spc/__init__.py | 12 +- .../specialized_turbo/config_flow.py | 18 +- .../components/speedtestdotnet/config_flow.py | 8 +- homeassistant/components/splunk/__init__.py | 22 +- .../components/splunk/config_flow.py | 32 +- homeassistant/components/sql/__init__.py | 34 +- homeassistant/components/sql/config_flow.py | 30 +- homeassistant/components/sql/services.py | 8 +- homeassistant/components/sql/util.py | 4 +- .../components/squeezebox/config_flow.py | 36 +- .../components/squeezebox/services.py | 14 +- .../components/srp_energy/config_flow.py | 14 +- .../components/ssdp/websocket_api.py | 4 +- .../components/starline/config_flow.py | 35 +- homeassistant/components/starline/services.py | 18 +- .../components/starlingbank/sensor.py | 16 +- .../components/starlink/config_flow.py | 6 +- homeassistant/components/startca/sensor.py | 12 +- .../components/statistics/config_flow.py | 40 +- homeassistant/components/statistics/sensor.py | 34 +- homeassistant/components/statsd/__init__.py | 22 +- .../components/steam_online/config_flow.py | 14 +- .../components/steamist/config_flow.py | 10 +- .../components/stiebel_eltron/config_flow.py | 10 +- .../components/stookwijzer/config_flow.py | 6 +- .../components/stookwijzer/services.py | 6 +- homeassistant/components/stream/__init__.py | 28 +- .../components/streamlabswater/config_flow.py | 6 +- .../components/streamlabswater/services.py | 10 +- homeassistant/components/stt/__init__.py | 6 +- .../components/subaru/config_flow.py | 32 +- homeassistant/components/subaru/services.py | 4 +- .../components/suez_water/config_flow.py | 10 +- homeassistant/components/sun/condition.py | 40 +- homeassistant/components/sun/trigger.py | 50 +- .../components/sunricher_dali/config_flow.py | 10 +- .../components/sunsynk/config_flow.py | 8 +- .../components/supervisord/sensor.py | 4 +- homeassistant/components/supla/__init__.py | 20 +- .../components/surepetcare/config_flow.py | 10 +- .../components/surepetcare/services.py | 18 +- .../swiss_hydrological_data/sensor.py | 10 +- .../swiss_public_transport/config_flow.py | 28 +- .../swiss_public_transport/services.py | 8 +- .../components/swisscom/config_flow.py | 10 +- .../components/swisscom/device_tracker.py | 4 +- homeassistant/components/switch/__init__.py | 4 +- .../components/switch/device_action.py | 6 +- .../components/switch/device_condition.py | 6 +- .../components/switch/device_trigger.py | 10 +- homeassistant/components/switch/light.py | 6 +- .../components/switch_as_x/__init__.py | 6 +- .../components/switch_as_x/config_flow.py | 14 +- .../components/switchbee/config_flow.py | 10 +- .../components/switchbot/config_flow.py | 40 +- .../components/switchbot/services.py | 12 +- .../components/switchbot_cloud/config_flow.py | 8 +- .../components/switchbot_cloud/services.py | 10 +- .../components/switcher_kis/config_flow.py | 8 +- .../components/switcher_kis/switch.py | 8 +- homeassistant/components/switchmate/switch.py | 8 +- .../components/syncthing/config_flow.py | 10 +- .../components/syncthru/config_flow.py | 12 +- .../components/synology_chat/notify.py | 6 +- .../components/synology_dsm/config_flow.py | 56 +- .../components/synology_dsm/repairs.py | 8 +- .../components/synology_dsm/services.py | 4 +- .../components/synology_srm/device_tracker.py | 14 +- homeassistant/components/syslog/notify.py | 14 +- .../components/system_bridge/config_flow.py | 14 +- .../components/system_bridge/services.py | 44 +- .../components/system_health/__init__.py | 4 +- .../components/system_log/__init__.py | 26 +- .../components/systemmonitor/config_flow.py | 10 +- .../components/systemnexa2/config_flow.py | 6 +- homeassistant/components/tado/climate.py | 14 +- homeassistant/components/tado/config_flow.py | 8 +- homeassistant/components/tado/services.py | 8 +- homeassistant/components/tado/water_heater.py | 6 +- homeassistant/components/tag/__init__.py | 24 +- homeassistant/components/tag/trigger.py | 8 +- .../components/tailscale/config_flow.py | 10 +- .../components/tailwind/config_flow.py | 22 +- homeassistant/components/tami4/config_flow.py | 6 +- .../components/tank_utility/sensor.py | 10 +- .../components/tankerkoenig/config_flow.py | 26 +- .../components/tapsaff/binary_sensor.py | 6 +- .../components/tasmota/config_flow.py | 8 +- .../components/tasmota/device_trigger.py | 14 +- .../components/tautulli/config_flow.py | 14 +- homeassistant/components/tcp/common.py | 26 +- .../components/technove/config_flow.py | 4 +- homeassistant/components/ted5000/sensor.py | 8 +- homeassistant/components/tedee/config_flow.py | 18 +- homeassistant/components/telegram/notify.py | 4 +- .../components/telegram_bot/config_flow.py | 46 +- .../components/telegram_bot/services.py | 350 +++++----- .../components/teleinfo/config_flow.py | 6 +- .../components/tellduslive/__init__.py | 16 +- .../components/tellduslive/config_flow.py | 6 +- .../components/tellstick/__init__.py | 18 +- homeassistant/components/tellstick/sensor.py | 18 +- homeassistant/components/telnet/switch.py | 24 +- .../components/teltonika/config_flow.py | 24 +- homeassistant/components/temper/sensor.py | 8 +- homeassistant/components/template/__init__.py | 10 +- .../template/alarm_control_panel.py | 28 +- .../components/template/binary_sensor.py | 30 +- homeassistant/components/template/button.py | 14 +- homeassistant/components/template/config.py | 66 +- .../components/template/config_flow.py | 234 ++++--- homeassistant/components/template/cover.py | 30 +- .../components/template/device_tracker.py | 24 +- homeassistant/components/template/event.py | 14 +- homeassistant/components/template/fan.py | 30 +- homeassistant/components/template/helpers.py | 16 +- homeassistant/components/template/image.py | 14 +- homeassistant/components/template/light.py | 50 +- homeassistant/components/template/lock.py | 14 +- homeassistant/components/template/number.py | 18 +- homeassistant/components/template/repairs.py | 6 +- homeassistant/components/template/schemas.py | 40 +- homeassistant/components/template/select.py | 10 +- homeassistant/components/template/sensor.py | 20 +- homeassistant/components/template/switch.py | 10 +- .../components/template/template_entity.py | 10 +- homeassistant/components/template/trigger.py | 10 +- .../components/template/trigger_entity.py | 6 +- homeassistant/components/template/update.py | 26 +- homeassistant/components/template/vacuum.py | 30 +- .../components/template/validators.py | 18 +- homeassistant/components/template/weather.py | 124 ++-- .../components/tesla_fleet/config_flow.py | 14 +- .../tesla_wall_connector/config_flow.py | 12 +- .../components/teslemetry/config_flow.py | 18 +- .../components/teslemetry/services.py | 125 ++-- .../components/tessie/config_flow.py | 4 +- homeassistant/components/text/__init__.py | 4 +- homeassistant/components/text/condition.py | 6 +- .../components/text/device_action.py | 14 +- .../components/thermobeacon/config_flow.py | 6 +- .../components/thermopro/config_flow.py | 6 +- .../thethingsnetwork/config_flow.py | 10 +- .../components/thingspeak/__init__.py | 14 +- .../components/thinkingcleaner/sensor.py | 6 +- .../components/thinkingcleaner/switch.py | 6 +- .../components/thomson/device_tracker.py | 8 +- .../components/thread/websocket_api.py | 32 +- .../components/threshold/binary_sensor.py | 22 +- .../components/threshold/config_flow.py | 24 +- homeassistant/components/tibber/services.py | 8 +- homeassistant/components/tile/config_flow.py | 16 +- .../components/tilt_ble/config_flow.py | 6 +- .../components/tilt_pi/config_flow.py | 4 +- homeassistant/components/time/__init__.py | 4 +- .../components/time_date/config_flow.py | 14 +- homeassistant/components/time_date/sensor.py | 6 +- homeassistant/components/timer/__init__.py | 38 +- homeassistant/components/timer/trigger.py | 6 +- homeassistant/components/tmb/sensor.py | 18 +- homeassistant/components/tod/binary_sensor.py | 18 +- homeassistant/components/tod/config_flow.py | 12 +- homeassistant/components/todo/__init__.py | 52 +- homeassistant/components/todo/intent.py | 6 +- homeassistant/components/todo/llm.py | 10 +- homeassistant/components/todo/trigger.py | 8 +- homeassistant/components/todoist/calendar.py | 27 +- .../components/todoist/config_flow.py | 6 +- homeassistant/components/todoist/services.py | 38 +- .../components/togrill/config_flow.py | 6 +- homeassistant/components/tolo/config_flow.py | 6 +- .../components/tomato/device_tracker.py | 18 +- .../components/tomorrowio/config_flow.py | 16 +- .../components/tonewinner/config_flow.py | 6 +- homeassistant/components/toon/__init__.py | 16 +- homeassistant/components/toon/config_flow.py | 6 +- homeassistant/components/torque/sensor.py | 6 +- .../components/totalconnect/config_flow.py | 21 +- homeassistant/components/touchline/climate.py | 6 +- .../components/touchline/config_flow.py | 6 +- .../components/touchline_sl/config_flow.py | 8 +- .../components/tplink/config_flow.py | 24 +- homeassistant/components/tplink/light.py | 84 +-- .../components/tplink_lte/__init__.py | 6 +- .../components/tplink_omada/config_flow.py | 22 +- .../components/tplink_omada/services.py | 18 +- homeassistant/components/traccar/__init__.py | 30 +- .../components/traccar_server/config_flow.py | 32 +- homeassistant/components/trace/__init__.py | 6 +- .../components/trace/websocket_api.py | 72 +- .../components/tractive/config_flow.py | 6 +- .../components/tradfri/config_flow.py | 12 +- .../trafikverket_camera/config_flow.py | 22 +- .../trafikverket_ferry/config_flow.py | 24 +- .../trafikverket_train/config_flow.py | 28 +- .../config_flow.py | 16 +- homeassistant/components/trane/config_flow.py | 6 +- .../components/transmission/config_flow.py | 34 +- .../components/transmission/services.py | 34 +- .../components/transport_nsw/sensor.py | 12 +- homeassistant/components/travisci/sensor.py | 16 +- .../components/trend/binary_sensor.py | 32 +- homeassistant/components/trend/config_flow.py | 30 +- .../components/triggercmd/config_flow.py | 4 +- homeassistant/components/trmnl/config_flow.py | 4 +- homeassistant/components/tts/__init__.py | 24 +- homeassistant/components/tts/legacy.py | 28 +- homeassistant/components/tts/notify.py | 16 +- homeassistant/components/tuya/config_flow.py | 18 +- homeassistant/components/tuya/services.py | 22 +- .../components/twentemilieu/config_flow.py | 10 +- homeassistant/components/twilio/__init__.py | 12 +- .../components/twilio_call/notify.py | 6 +- homeassistant/components/twilio_sms/notify.py | 6 +- .../components/twinkly/config_flow.py | 2 +- homeassistant/components/twitter/notify.py | 12 +- .../components/ubus/device_tracker.py | 14 +- homeassistant/components/uhoo/config_flow.py | 6 +- .../components/uk_transport/sensor.py | 18 +- .../components/ukraine_alarm/config_flow.py | 6 +- homeassistant/components/unifi/config_flow.py | 62 +- homeassistant/components/unifi/services.py | 6 +- .../components/unifi_access/config_flow.py | 26 +- .../components/unifi_access/services.py | 12 +- .../components/unifi_direct/config_flow.py | 12 +- .../components/unifi_direct/device_tracker.py | 10 +- .../components/unifiprotect/config_flow.py | 48 +- .../components/unifiprotect/repairs.py | 8 +- .../components/unifiprotect/services.py | 28 +- .../components/universal/media_player.py | 22 +- homeassistant/components/upb/config_flow.py | 8 +- homeassistant/components/upb/const.py | 24 +- .../components/upc_connect/device_tracker.py | 6 +- .../components/upcloud/config_flow.py | 8 +- homeassistant/components/update/__init__.py | 12 +- .../components/update/device_trigger.py | 10 +- homeassistant/components/upnp/config_flow.py | 10 +- .../components/uptime/config_flow.py | 4 +- .../components/uptime_kuma/config_flow.py | 14 +- .../components/uptimerobot/config_flow.py | 4 +- homeassistant/components/usb/__init__.py | 8 +- .../usgs_earthquakes_feed/geo_location.py | 14 +- .../components/utility_meter/__init__.py | 47 +- .../components/utility_meter/config_flow.py | 34 +- .../components/utility_meter/sensor.py | 8 +- .../components/utility_meter/services.py | 4 +- homeassistant/components/uvc/camera.py | 12 +- homeassistant/components/v2c/config_flow.py | 6 +- homeassistant/components/vacuum/__init__.py | 10 +- .../components/vacuum/device_action.py | 6 +- .../components/vacuum/device_condition.py | 6 +- .../components/vacuum/device_trigger.py | 14 +- homeassistant/components/vacuum/intent.py | 10 +- homeassistant/components/vacuum/websocket.py | 6 +- homeassistant/components/vallox/__init__.py | 16 +- .../components/vallox/config_flow.py | 6 +- homeassistant/components/vallox/services.py | 16 +- homeassistant/components/valve/__init__.py | 8 +- homeassistant/components/vasttrafik/sensor.py | 18 +- .../components/vegehub/config_flow.py | 6 +- .../components/velbus/config_flow.py | 20 +- homeassistant/components/velbus/services.py | 28 +- homeassistant/components/velux/config_flow.py | 16 +- homeassistant/components/venstar/climate.py | 18 +- .../components/venstar/config_flow.py | 14 +- homeassistant/components/vera/config_flow.py | 12 +- .../components/verisure/config_flow.py | 36 +- .../components/versasense/__init__.py | 7 +- .../components/version/config_flow.py | 36 +- .../components/vesync/config_flow.py | 8 +- .../components/viaggiatreno/sensor.py | 8 +- homeassistant/components/vicare/climate.py | 4 +- .../components/victron_ble/config_flow.py | 10 +- .../components/victron_gx/config_flow.py | 28 +- .../victron_remote_monitoring/config_flow.py | 14 +- homeassistant/components/vilfo/config_flow.py | 8 +- .../components/vistapool/config_flow.py | 10 +- .../components/vivotek/config_flow.py | 30 +- homeassistant/components/vizio/config_flow.py | 41 +- homeassistant/components/vizio/remote.py | 6 +- homeassistant/components/vizio/services.py | 14 +- .../components/vlc_telnet/config_flow.py | 14 +- .../vodafone_station/config_flow.py | 20 +- homeassistant/components/voicerss/tts.py | 16 +- homeassistant/components/voip/config_flow.py | 10 +- .../components/volkszaehler/sensor.py | 14 +- .../components/volumio/config_flow.py | 6 +- homeassistant/components/volvo/config_flow.py | 10 +- homeassistant/components/volvo/services.py | 8 +- homeassistant/components/w800rf32/__init__.py | 7 +- .../components/w800rf32/binary_sensor.py | 14 +- .../components/wake_on_lan/__init__.py | 12 +- .../components/wake_on_lan/config_flow.py | 14 +- .../components/wake_on_lan/switch.py | 14 +- .../components/wake_word/__init__.py | 4 +- .../components/wallbox/config_flow.py | 10 +- homeassistant/components/waqi/config_flow.py | 10 +- .../components/water_heater/__init__.py | 10 +- .../components/water_heater/condition.py | 8 +- .../components/water_heater/device_action.py | 6 +- .../components/water_heater/trigger.py | 8 +- .../components/waterfurnace/__init__.py | 12 +- .../components/waterfurnace/config_flow.py | 8 +- .../components/watergate/config_flow.py | 6 +- homeassistant/components/watts/services.py | 8 +- .../components/watttime/config_flow.py | 32 +- .../components/wattwaechter/config_flow.py | 20 +- .../waze_travel_time/config_flow.py | 34 +- .../components/waze_travel_time/services.py | 34 +- homeassistant/components/weather/__init__.py | 4 +- homeassistant/components/weather/intent.py | 4 +- .../components/weather/websocket_api.py | 12 +- .../weatherflow_cloud/config_flow.py | 6 +- .../components/weatherkit/config_flow.py | 14 +- homeassistant/components/web_rtc/__init__.py | 18 +- .../components/webdav/config_flow.py | 14 +- homeassistant/components/webhook/__init__.py | 14 +- homeassistant/components/webhook/trigger.py | 14 +- .../components/webmin/config_flow.py | 16 +- .../components/webostv/config_flow.py | 16 +- .../components/webostv/device_trigger.py | 4 +- homeassistant/components/webostv/services.py | 10 +- .../components/webostv/triggers/turn_on.py | 12 +- .../components/websocket_api/auth.py | 14 +- .../components/websocket_api/commands.py | 151 +++-- .../components/websocket_api/connection.py | 14 +- .../components/websocket_api/decorators.py | 10 +- .../components/websocket_api/messages.py | 12 +- homeassistant/components/wemo/__init__.py | 18 +- homeassistant/components/wemo/config_flow.py | 14 +- .../components/wemo/device_trigger.py | 4 +- homeassistant/components/wemo/fan.py | 6 +- .../components/whirlpool/config_flow.py | 18 +- homeassistant/components/whois/config_flow.py | 6 +- homeassistant/components/wiffi/config_flow.py | 12 +- homeassistant/components/wiim/config_flow.py | 4 +- homeassistant/components/wilight/support.py | 6 +- homeassistant/components/wilight/switch.py | 22 +- .../components/wirelesstag/__init__.py | 12 +- .../components/wirelesstag/binary_sensor.py | 6 +- .../components/wirelesstag/sensor.py | 6 +- .../components/wirelesstag/switch.py | 6 +- homeassistant/components/wiz/config_flow.py | 10 +- homeassistant/components/wled/config_flow.py | 8 +- .../components/wmspro/config_flow.py | 6 +- homeassistant/components/wmspro/services.py | 10 +- .../components/wolflink/config_flow.py | 6 +- homeassistant/components/workday/__init__.py | 4 +- .../components/workday/config_flow.py | 32 +- homeassistant/components/workday/repairs.py | 14 +- .../components/worldclock/config_flow.py | 14 +- .../components/worldtidesinfo/sensor.py | 10 +- .../components/worxlandroid/sensor.py | 10 +- homeassistant/components/ws66i/config_flow.py | 12 +- homeassistant/components/wsdot/config_flow.py | 8 +- homeassistant/components/wsdot/sensor.py | 11 +- .../components/wyoming/config_flow.py | 8 +- .../components/wyoming/websocket_api.py | 4 +- homeassistant/components/x10/light.py | 11 +- homeassistant/components/xbox/config_flow.py | 6 +- homeassistant/components/xeoma/camera.py | 22 +- homeassistant/components/xiaomi/camera.py | 18 +- .../components/xiaomi/device_tracker.py | 8 +- .../components/xiaomi_aqara/__init__.py | 32 +- .../components/xiaomi_aqara/config_flow.py | 20 +- .../components/xiaomi_ble/config_flow.py | 20 +- .../components/xiaomi_ble/device_trigger.py | 6 +- .../components/xiaomi_miio/config_flow.py | 36 +- .../components/xiaomi_miio/device_tracker.py | 8 +- .../components/xiaomi_miio/remote.py | 30 +- .../components/xiaomi_miio/services.py | 72 +- .../components/xiaomi_miio/typing.py | 4 +- .../components/xiaomi_tv/media_player.py | 6 +- homeassistant/components/xmpp/notify.py | 16 +- homeassistant/components/xs1/__init__.py | 18 +- .../components/xthings_cloud/config_flow.py | 8 +- .../yale_smart_alarm/config_flow.py | 18 +- .../components/yalexs_ble/config_flow.py | 20 +- .../components/yamaha/media_player.py | 23 +- .../yamaha_musiccast/config_flow.py | 4 +- .../components/yandex_transport/sensor.py | 10 +- homeassistant/components/yandextts/tts.py | 22 +- .../components/yardian/config_flow.py | 8 +- homeassistant/components/yardian/switch.py | 4 +- homeassistant/components/yeelight/__init__.py | 54 +- .../components/yeelight/config_flow.py | 30 +- homeassistant/components/yeelight/light.py | 40 +- .../components/yeelightsunflower/light.py | 6 +- homeassistant/components/yi/camera.py | 16 +- .../components/yolink/device_trigger.py | 4 +- homeassistant/components/yolink/services.py | 18 +- .../components/youless/config_flow.py | 4 +- .../components/youtube/config_flow.py | 10 +- homeassistant/components/zabbix/__init__.py | 22 +- homeassistant/components/zabbix/sensor.py | 14 +- homeassistant/components/zamg/config_flow.py | 8 +- homeassistant/components/zengge/light.py | 6 +- homeassistant/components/zeroconf/__init__.py | 14 +- .../components/zeroconf/websocket_api.py | 4 +- homeassistant/components/zestimate/sensor.py | 8 +- .../components/zeversolar/config_flow.py | 6 +- homeassistant/components/zha/__init__.py | 28 +- homeassistant/components/zha/config_flow.py | 58 +- homeassistant/components/zha/device_action.py | 76 ++- .../components/zha/device_trigger.py | 4 +- homeassistant/components/zha/helpers.py | 55 +- homeassistant/components/zha/lock.py | 12 +- homeassistant/components/zha/radio_manager.py | 36 +- homeassistant/components/zha/websocket_api.py | 290 ++++---- .../components/zhong_hong/climate.py | 8 +- .../components/zhong_hong/config_flow.py | 10 +- .../ziggo_mediabox_xl/media_player.py | 4 +- homeassistant/components/zimi/config_flow.py | 12 +- .../components/zinvolt/config_flow.py | 8 +- homeassistant/components/zone/__init__.py | 42 +- homeassistant/components/zone/condition.py | 22 +- homeassistant/components/zone/trigger.py | 28 +- .../components/zoneminder/__init__.py | 23 +- homeassistant/components/zoneminder/sensor.py | 8 +- .../components/zoneminder/services.py | 6 +- homeassistant/components/zoneminder/switch.py | 6 +- .../components/zonneplan/config_flow.py | 10 +- homeassistant/components/zwave_js/api.py | 426 ++++++------ .../components/zwave_js/condition.py | 60 +- .../components/zwave_js/config_flow.py | 56 +- .../components/zwave_js/config_validation.py | 20 +- .../components/zwave_js/device_action.py | 102 +-- .../components/zwave_js/device_condition.py | 61 +- .../components/zwave_js/device_trigger.py | 129 ++-- homeassistant/components/zwave_js/helpers.py | 26 +- homeassistant/components/zwave_js/sensor.py | 6 +- homeassistant/components/zwave_js/services.py | 244 ++++--- .../components/zwave_js/triggers/event.py | 38 +- .../zwave_js/triggers/value_updated.py | 30 +- .../components/zwave_me/config_flow.py | 12 +- 2037 files changed, 21669 insertions(+), 19522 deletions(-) diff --git a/homeassistant/components/abode/config_flow.py b/homeassistant/components/abode/config_flow.py index 0be9749ca8689..14fc2758200fc 100644 --- a/homeassistant/components/abode/config_flow.py +++ b/homeassistant/components/abode/config_flow.py @@ -10,8 +10,8 @@ Exception as AbodeException, ) from jaraco.abode.helpers.errors import MFA_CODE_REQUIRED +import probatio from requests.exceptions import ConnectTimeout, HTTPError -import voluptuous as vol from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -29,11 +29,11 @@ class AbodeFlowHandler(ConfigFlow, domain=DOMAIN): def __init__(self) -> None: """Initialize.""" self.data_schema = { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } self.mfa_data_schema = { - vol.Required(CONF_MFA): str, + probatio.Required(CONF_MFA): str, } self._mfa_code: str | None = None @@ -67,7 +67,9 @@ async def _async_abode_login(self, step_id: str) -> ConfigFlowResult: if errors: return self.async_show_form( - step_id=step_id, data_schema=vol.Schema(self.data_schema), errors=errors + step_id=step_id, + data_schema=probatio.Schema(self.data_schema), + errors=errors, ) return await self._async_create_entry() @@ -84,7 +86,7 @@ async def _async_abode_mfa_login(self) -> ConfigFlowResult: except AbodeAuthenticationException: return self.async_show_form( step_id="mfa", - data_schema=vol.Schema(self.mfa_data_schema), + data_schema=probatio.Schema(self.mfa_data_schema), errors={"base": "invalid_mfa_code"}, ) @@ -119,7 +121,7 @@ async def async_step_user( """Handle a flow initialized by the user.""" if user_input is None: return self.async_show_form( - step_id="user", data_schema=vol.Schema(self.data_schema) + step_id="user", data_schema=probatio.Schema(self.data_schema) ) self._username = user_input[CONF_USERNAME] @@ -133,7 +135,7 @@ async def async_step_mfa( """Handle a multi-factor authentication (MFA) flow.""" if user_input is None: return self.async_show_form( - step_id="mfa", data_schema=vol.Schema(self.mfa_data_schema) + step_id="mfa", data_schema=probatio.Schema(self.mfa_data_schema) ) self._mfa_code = user_input[CONF_MFA] @@ -155,10 +157,10 @@ async def async_step_reauth_confirm( if user_input is None: return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_USERNAME, default=self._username): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME, default=self._username): str, + probatio.Required(CONF_PASSWORD): str, } ), ) diff --git a/homeassistant/components/abode/services.py b/homeassistant/components/abode/services.py index a650507959e35..6e716ab5fe602 100644 --- a/homeassistant/components/abode/services.py +++ b/homeassistant/components/abode/services.py @@ -3,7 +3,7 @@ from typing import TYPE_CHECKING from jaraco.abode.exceptions import Exception as AbodeException -import voluptuous as vol +import probatio from homeassistant.const import ATTR_ENTITY_ID from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -20,13 +20,16 @@ ATTR_VALUE = "value" -CHANGE_SETTING_SCHEMA = vol.Schema( - {vol.Required(ATTR_SETTING): cv.string, vol.Required(ATTR_VALUE): cv.string} +CHANGE_SETTING_SCHEMA = probatio.Schema( + { + probatio.Required(ATTR_SETTING): cv.string, + probatio.Required(ATTR_VALUE): cv.string, + } ) -CAPTURE_IMAGE_SCHEMA = vol.Schema({ATTR_ENTITY_ID: cv.entity_ids}) +CAPTURE_IMAGE_SCHEMA = probatio.Schema({ATTR_ENTITY_ID: cv.entity_ids}) -AUTOMATION_SCHEMA = vol.Schema({ATTR_ENTITY_ID: cv.entity_ids}) +AUTOMATION_SCHEMA = probatio.Schema({ATTR_ENTITY_ID: cv.entity_ids}) def _get_abode_system(hass: HomeAssistant) -> AbodeSystem: diff --git a/homeassistant/components/acaia/config_flow.py b/homeassistant/components/acaia/config_flow.py index a52c5a009f802..dc0a4794433da 100644 --- a/homeassistant/components/acaia/config_flow.py +++ b/homeassistant/components/acaia/config_flow.py @@ -5,7 +5,7 @@ from aioacaia.discovery import is_new_scale from aioacaia.exceptions import AcaiaDeviceNotFound, AcaiaError, AcaiaUnknownDevice -import voluptuous as vol +import probatio from homeassistant.components.bluetooth import ( BluetoothServiceInfoBleak, @@ -82,9 +82,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_ADDRESS): SelectSelector( + probatio.Required(CONF_ADDRESS): SelectSelector( SelectSelectorConfig( options=options, mode=SelectSelectorMode.DROPDOWN, diff --git a/homeassistant/components/accuweather/config_flow.py b/homeassistant/components/accuweather/config_flow.py index 62c66335e2a31..a4a628276c514 100644 --- a/homeassistant/components/accuweather/config_flow.py +++ b/homeassistant/components/accuweather/config_flow.py @@ -7,7 +7,7 @@ from accuweather import AccuWeather, ApiError, InvalidApiKeyError, RequestsExceededError from aiohttp import ClientError from aiohttp.client_exceptions import ClientConnectorError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE @@ -63,13 +63,13 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_API_KEY): str, - vol.Optional( + probatio.Required(CONF_API_KEY): str, + probatio.Optional( CONF_LATITUDE, default=self.hass.config.latitude ): cv.latitude, - vol.Optional( + probatio.Optional( CONF_LONGITUDE, default=self.hass.config.longitude ): cv.longitude, } @@ -116,6 +116,6 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema({vol.Required(CONF_API_KEY): str}), + data_schema=probatio.Schema({probatio.Required(CONF_API_KEY): str}), errors=errors, ) diff --git a/homeassistant/components/acmeda/config_flow.py b/homeassistant/components/acmeda/config_flow.py index df334a276f302..1c2d88b4b38c9 100644 --- a/homeassistant/components/acmeda/config_flow.py +++ b/homeassistant/components/acmeda/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override import aiopulse -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_ID @@ -58,9 +58,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_ID): vol.In( + probatio.Required(CONF_ID): probatio.In( {hub.id: f"{hub.id} {hub.host}" for hub in hubs} ) } diff --git a/homeassistant/components/actiontec/device_tracker.py b/homeassistant/components/actiontec/device_tracker.py index dfb6bd033d6ad..123ac4634214b 100644 --- a/homeassistant/components/actiontec/device_tracker.py +++ b/homeassistant/components/actiontec/device_tracker.py @@ -3,8 +3,8 @@ import logging from typing import Final, override +import probatio import telnetlib # pylint: disable=deprecated-module -import voluptuous as vol from homeassistant.components.device_tracker import ( DOMAIN as DEVICE_TRACKER_DOMAIN, @@ -23,9 +23,9 @@ PLATFORM_SCHEMA: Final = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_USERNAME): cv.string, } ) diff --git a/homeassistant/components/adax/config_flow.py b/homeassistant/components/adax/config_flow.py index 6b66cc9ca10fb..b45205db11fe9 100644 --- a/homeassistant/components/adax/config_flow.py +++ b/homeassistant/components/adax/config_flow.py @@ -5,7 +5,7 @@ import adax import adax_local -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -44,9 +44,9 @@ async def async_step_user( self, user_input: dict[str, Any] | None = None ) -> ConfigFlowResult: """Handle the initial step.""" - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONNECTION_TYPE, default=CLOUD): vol.In( + probatio.Required(CONNECTION_TYPE, default=CLOUD): probatio.In( ( CLOUD, LOCAL, @@ -69,10 +69,10 @@ async def async_step_local( self, user_input: dict[str, Any] | None = None ) -> ConfigFlowResult: """Handle the local step.""" - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(WIFI_SSID): str, - vol.Required(WIFI_PSWD): TextSelector( + probatio.Required(WIFI_SSID): str, + probatio.Required(WIFI_PSWD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", @@ -124,8 +124,8 @@ async def async_step_cloud( self, user_input: dict[str, Any] | None = None ) -> ConfigFlowResult: """Handle the cloud step.""" - data_schema = vol.Schema( - {vol.Required(ACCOUNT_ID): int, vol.Required(CONF_PASSWORD): str} + data_schema = probatio.Schema( + {probatio.Required(ACCOUNT_ID): int, probatio.Required(CONF_PASSWORD): str} ) if user_input is None: return self.async_show_form(step_id="cloud", data_schema=data_schema) diff --git a/homeassistant/components/adguard/__init__.py b/homeassistant/components/adguard/__init__.py index ec806e3558fb7..bd32ac1c82833 100644 --- a/homeassistant/components/adguard/__init__.py +++ b/homeassistant/components/adguard/__init__.py @@ -3,7 +3,7 @@ from dataclasses import dataclass from adguardhome import AdGuardHome, AdGuardHomeConnectionError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( @@ -33,15 +33,17 @@ SERVICE_REMOVE_URL, ) -SERVICE_URL_SCHEMA = vol.Schema({vol.Required(CONF_URL): vol.Any(cv.url, cv.path)}) -SERVICE_ADD_URL_SCHEMA = vol.Schema( +SERVICE_URL_SCHEMA = probatio.Schema( + {probatio.Required(CONF_URL): probatio.Any(cv.url, cv.path)} +) +SERVICE_ADD_URL_SCHEMA = probatio.Schema( { - vol.Required(CONF_NAME): cv.string, - vol.Required(CONF_URL): vol.Any(cv.url, cv.path), + probatio.Required(CONF_NAME): cv.string, + probatio.Required(CONF_URL): probatio.Any(cv.url, cv.path), } ) -SERVICE_REFRESH_SCHEMA = vol.Schema( - {vol.Optional(CONF_FORCE, default=False): cv.boolean} +SERVICE_REFRESH_SCHEMA = probatio.Schema( + {probatio.Optional(CONF_FORCE, default=False): cv.boolean} ) CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN) diff --git a/homeassistant/components/adguard/config_flow.py b/homeassistant/components/adguard/config_flow.py index dc526e15cec6a..7c4c91a2800ad 100644 --- a/homeassistant/components/adguard/config_flow.py +++ b/homeassistant/components/adguard/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from adguardhome import AdGuardHome, AdGuardHomeConnectionError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -33,14 +33,14 @@ async def _show_setup_form( """Show the setup form to the user.""" return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=3000): vol.Coerce(int), - vol.Optional(CONF_USERNAME): str, - vol.Optional(CONF_PASSWORD): str, - vol.Required(CONF_SSL, default=True): bool, - vol.Required(CONF_VERIFY_SSL, default=True): bool, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=3000): probatio.Coerce(int), + probatio.Optional(CONF_USERNAME): str, + probatio.Optional(CONF_PASSWORD): str, + probatio.Required(CONF_SSL, default=True): bool, + probatio.Required(CONF_VERIFY_SSL, default=True): bool, } ), errors=errors or {}, diff --git a/homeassistant/components/ads/__init__.py b/homeassistant/components/ads/__init__.py index da34bd36e2c79..06728a5ea6dad 100644 --- a/homeassistant/components/ads/__init__.py +++ b/homeassistant/components/ads/__init__.py @@ -2,8 +2,8 @@ import logging +import probatio import pyads -import voluptuous as vol from homeassistant.const import ( CONF_DEVICE, @@ -48,24 +48,24 @@ SERVICE_WRITE_DATA_BY_NAME = "write_data_by_name" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_DEVICE): cv.string, - vol.Required(CONF_PORT): cv.port, - vol.Optional(CONF_IP_ADDRESS): cv.string, + probatio.Required(CONF_DEVICE): cv.string, + probatio.Required(CONF_PORT): cv.port, + probatio.Optional(CONF_IP_ADDRESS): cv.string, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -SCHEMA_SERVICE_WRITE_DATA_BY_NAME = vol.Schema( +SCHEMA_SERVICE_WRITE_DATA_BY_NAME = probatio.Schema( { - vol.Required(CONF_ADS_TYPE): vol.Coerce(AdsType), - vol.Required(CONF_ADS_VALUE): vol.Coerce(int), - vol.Required(CONF_ADS_VAR): cv.string, + probatio.Required(CONF_ADS_TYPE): probatio.Coerce(AdsType), + probatio.Required(CONF_ADS_VALUE): probatio.Coerce(int), + probatio.Required(CONF_ADS_VAR): cv.string, } ) diff --git a/homeassistant/components/ads/binary_sensor.py b/homeassistant/components/ads/binary_sensor.py index b2ec6148c425a..26e3cc637d5f4 100644 --- a/homeassistant/components/ads/binary_sensor.py +++ b/homeassistant/components/ads/binary_sensor.py @@ -2,8 +2,8 @@ from typing import override +import probatio import pyads -import voluptuous as vol from homeassistant.components.binary_sensor import ( DEVICE_CLASSES_SCHEMA, @@ -24,9 +24,9 @@ DEFAULT_NAME = "ADS binary sensor" PLATFORM_SCHEMA = BINARY_SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ADS_VAR): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, + probatio.Required(CONF_ADS_VAR): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, } ) diff --git a/homeassistant/components/ads/cover.py b/homeassistant/components/ads/cover.py index acb146f66fab7..381c07e04c623 100644 --- a/homeassistant/components/ads/cover.py +++ b/homeassistant/components/ads/cover.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio import pyads -import voluptuous as vol from homeassistant.components.cover import ( ATTR_POSITION, @@ -35,14 +35,14 @@ PLATFORM_SCHEMA = COVER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ADS_VAR): cv.string, - vol.Optional(CONF_ADS_VAR_POSITION): cv.string, - vol.Optional(CONF_ADS_VAR_SET_POS): cv.string, - vol.Optional(CONF_ADS_VAR_CLOSE): cv.string, - vol.Optional(CONF_ADS_VAR_OPEN): cv.string, - vol.Optional(CONF_ADS_VAR_STOP): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, + probatio.Required(CONF_ADS_VAR): cv.string, + probatio.Optional(CONF_ADS_VAR_POSITION): cv.string, + probatio.Optional(CONF_ADS_VAR_SET_POS): cv.string, + probatio.Optional(CONF_ADS_VAR_CLOSE): cv.string, + probatio.Optional(CONF_ADS_VAR_OPEN): cv.string, + probatio.Optional(CONF_ADS_VAR_STOP): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, } ) diff --git a/homeassistant/components/ads/light.py b/homeassistant/components/ads/light.py index 12a5a25cc82a7..345ae0b03e2de 100644 --- a/homeassistant/components/ads/light.py +++ b/homeassistant/components/ads/light.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio import pyads -import voluptuous as vol from homeassistant.components.light import ( ATTR_BRIGHTNESS, @@ -35,12 +35,12 @@ DEFAULT_NAME = "ADS Light" PLATFORM_SCHEMA = LIGHT_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ADS_VAR): cv.string, - vol.Optional(CONF_ADS_VAR_BRIGHTNESS): cv.string, - vol.Optional(CONF_ADS_VAR_COLOR_TEMP_KELVIN): cv.string, - vol.Optional(CONF_MIN_COLOR_TEMP_KELVIN): cv.positive_int, - vol.Optional(CONF_MAX_COLOR_TEMP_KELVIN): cv.positive_int, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_ADS_VAR): cv.string, + probatio.Optional(CONF_ADS_VAR_BRIGHTNESS): cv.string, + probatio.Optional(CONF_ADS_VAR_COLOR_TEMP_KELVIN): cv.string, + probatio.Optional(CONF_MIN_COLOR_TEMP_KELVIN): cv.positive_int, + probatio.Optional(CONF_MAX_COLOR_TEMP_KELVIN): cv.positive_int, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/ads/select.py b/homeassistant/components/ads/select.py index e170f207bf470..5f9db6f321211 100644 --- a/homeassistant/components/ads/select.py +++ b/homeassistant/components/ads/select.py @@ -2,8 +2,8 @@ from typing import override +import probatio import pyads -import voluptuous as vol from homeassistant.components.select import ( PLATFORM_SCHEMA as SELECT_PLATFORM_SCHEMA, @@ -23,9 +23,9 @@ PLATFORM_SCHEMA = SELECT_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ADS_VAR): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Required(CONF_OPTIONS): vol.All(cv.ensure_list, [cv.string]), + probatio.Required(CONF_ADS_VAR): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_OPTIONS): probatio.All(cv.ensure_list, [cv.string]), } ) diff --git a/homeassistant/components/ads/sensor.py b/homeassistant/components/ads/sensor.py index d92d0ffecea04..8ccd8a638020a 100644 --- a/homeassistant/components/ads/sensor.py +++ b/homeassistant/components/ads/sensor.py @@ -2,7 +2,7 @@ from typing import override -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( CONF_STATE_CLASS, @@ -28,11 +28,11 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ADS_VAR): cv.string, - vol.Optional(CONF_ADS_FACTOR): cv.positive_int, - vol.Optional(CONF_ADS_TYPE, default=AdsType.INT): vol.All( - vol.Coerce(AdsType), - vol.In( + probatio.Required(CONF_ADS_VAR): cv.string, + probatio.Optional(CONF_ADS_FACTOR): cv.positive_int, + probatio.Optional(CONF_ADS_TYPE, default=AdsType.INT): probatio.All( + probatio.Coerce(AdsType), + probatio.In( [ AdsType.BOOL, AdsType.BYTE, @@ -49,10 +49,10 @@ ] ), ), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_DEVICE_CLASS): SENSOR_DEVICE_CLASSES_SCHEMA, - vol.Optional(CONF_STATE_CLASS): SENSOR_STATE_CLASSES_SCHEMA, - vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_DEVICE_CLASS): SENSOR_DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_STATE_CLASS): SENSOR_STATE_CLASSES_SCHEMA, + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, } ) diff --git a/homeassistant/components/ads/switch.py b/homeassistant/components/ads/switch.py index 060a9a3992190..bc20b4795641c 100644 --- a/homeassistant/components/ads/switch.py +++ b/homeassistant/components/ads/switch.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio import pyads -import voluptuous as vol from homeassistant.components.switch import ( PLATFORM_SCHEMA as SWITCH_PLATFORM_SCHEMA, @@ -22,8 +22,8 @@ PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ADS_VAR): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_ADS_VAR): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/ads/valve.py b/homeassistant/components/ads/valve.py index 6f823673a3093..2bb510fb1c2c8 100644 --- a/homeassistant/components/ads/valve.py +++ b/homeassistant/components/ads/valve.py @@ -2,8 +2,8 @@ from typing import override +import probatio import pyads -import voluptuous as vol from homeassistant.components.valve import ( DEVICE_CLASSES_SCHEMA as VALVE_DEVICE_CLASSES_SCHEMA, @@ -26,9 +26,9 @@ PLATFORM_SCHEMA = VALVE_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ADS_VAR): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_DEVICE_CLASS): VALVE_DEVICE_CLASSES_SCHEMA, + probatio.Required(CONF_ADS_VAR): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_DEVICE_CLASS): VALVE_DEVICE_CLASSES_SCHEMA, } ) diff --git a/homeassistant/components/advantage_air/config_flow.py b/homeassistant/components/advantage_air/config_flow.py index 27e5f0d6ae232..a1954b639f552 100644 --- a/homeassistant/components/advantage_air/config_flow.py +++ b/homeassistant/components/advantage_air/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from advantage_air import ApiError, advantage_air -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_IP_ADDRESS, CONF_PORT @@ -13,10 +13,10 @@ ADVANTAGE_AIR_DEFAULT_PORT = 2025 -ADVANTAGE_AIR_SCHEMA = vol.Schema( +ADVANTAGE_AIR_SCHEMA = probatio.Schema( { - vol.Required(CONF_IP_ADDRESS): str, - vol.Optional(CONF_PORT, default=ADVANTAGE_AIR_DEFAULT_PORT): int, + probatio.Required(CONF_IP_ADDRESS): str, + probatio.Optional(CONF_PORT, default=ADVANTAGE_AIR_DEFAULT_PORT): int, } ) diff --git a/homeassistant/components/advantage_air/services.py b/homeassistant/components/advantage_air/services.py index ebcc4a699b781..8021652cbad30 100644 --- a/homeassistant/components/advantage_air/services.py +++ b/homeassistant/components/advantage_air/services.py @@ -1,6 +1,6 @@ """Services for Advantage Air integration.""" -import voluptuous as vol +import probatio from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN from homeassistant.core import HomeAssistant, callback @@ -18,6 +18,6 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, "set_time_to", entity_domain=SENSOR_DOMAIN, - schema={vol.Required("minutes"): cv.positive_int}, + schema={probatio.Required("minutes"): cv.positive_int}, func="set_time_to", ) diff --git a/homeassistant/components/aemet/config_flow.py b/homeassistant/components/aemet/config_flow.py index 7d2ca59483f73..7c0ba3c8d6f75 100644 --- a/homeassistant/components/aemet/config_flow.py +++ b/homeassistant/components/aemet/config_flow.py @@ -4,7 +4,7 @@ from aemet_opendata.exceptions import AuthError from aemet_opendata.interface import AEMET, ConnectionOptions -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigEntry, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME @@ -17,10 +17,10 @@ from .const import CONF_RADAR_UPDATES, CONF_STATION_UPDATES, DEFAULT_NAME, DOMAIN -OPTIONS_SCHEMA = vol.Schema( +OPTIONS_SCHEMA = probatio.Schema( { - vol.Required(CONF_RADAR_UPDATES, default=False): bool, - vol.Required(CONF_STATION_UPDATES, default=True): bool, + probatio.Required(CONF_RADAR_UPDATES, default=False): bool, + probatio.Required(CONF_STATION_UPDATES, default=True): bool, } ) OPTIONS_FLOW = { @@ -57,16 +57,16 @@ async def async_step_user( title=user_input[CONF_NAME], data=user_input ) - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required(CONF_API_KEY): str, + probatio.Required(CONF_API_KEY): str, # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Optional(CONF_NAME, default=DEFAULT_NAME): str, - vol.Optional( + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): str, + probatio.Optional( CONF_LATITUDE, default=self.hass.config.latitude ): cv.latitude, - vol.Optional( + probatio.Optional( CONF_LONGITUDE, default=self.hass.config.longitude ): cv.longitude, } diff --git a/homeassistant/components/aftership/config_flow.py b/homeassistant/components/aftership/config_flow.py index 50d399a0ba112..ea354bef1ee47 100644 --- a/homeassistant/components/aftership/config_flow.py +++ b/homeassistant/components/aftership/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from pyaftership import AfterShip, AfterShipException -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY @@ -42,6 +42,6 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_API_KEY): str}), + data_schema=probatio.Schema({probatio.Required(CONF_API_KEY): str}), errors=errors, ) diff --git a/homeassistant/components/aftership/const.py b/homeassistant/components/aftership/const.py index 781e682308e1c..473e9756ee30e 100644 --- a/homeassistant/components/aftership/const.py +++ b/homeassistant/components/aftership/const.py @@ -3,7 +3,7 @@ from datetime import timedelta from typing import Final -import voluptuous as vol +import probatio from homeassistant.helpers import config_validation as cv @@ -26,14 +26,17 @@ SERVICE_ADD_TRACKING: Final = "add_tracking" SERVICE_REMOVE_TRACKING: Final = "remove_tracking" -ADD_TRACKING_SERVICE_SCHEMA: Final = vol.Schema( +ADD_TRACKING_SERVICE_SCHEMA: Final = probatio.Schema( { - vol.Required(CONF_TRACKING_NUMBER): cv.string, - vol.Optional(CONF_TITLE): cv.string, - vol.Optional(CONF_SLUG): cv.string, + probatio.Required(CONF_TRACKING_NUMBER): cv.string, + probatio.Optional(CONF_TITLE): cv.string, + probatio.Optional(CONF_SLUG): cv.string, } ) -REMOVE_TRACKING_SERVICE_SCHEMA: Final = vol.Schema( - {vol.Required(CONF_SLUG): cv.string, vol.Required(CONF_TRACKING_NUMBER): cv.string} +REMOVE_TRACKING_SERVICE_SCHEMA: Final = probatio.Schema( + { + probatio.Required(CONF_SLUG): cv.string, + probatio.Required(CONF_TRACKING_NUMBER): cv.string, + } ) diff --git a/homeassistant/components/agent_dvr/config_flow.py b/homeassistant/components/agent_dvr/config_flow.py index 523fb89854875..03dbb8e7c5abc 100644 --- a/homeassistant/components/agent_dvr/config_flow.py +++ b/homeassistant/components/agent_dvr/config_flow.py @@ -5,7 +5,7 @@ from agent import AgentConnectionError, AgentError from agent.a import Agent -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PORT @@ -63,12 +63,12 @@ async def async_step_user( errors["base"] = "cannot_connect" data = { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, } return self.async_show_form( step_id="user", - data_schema=vol.Schema(data), + data_schema=probatio.Schema(data), errors=errors, ) diff --git a/homeassistant/components/ai_task/__init__.py b/homeassistant/components/ai_task/__init__.py index c20b6cf1fb543..831e140c353e5 100644 --- a/homeassistant/components/ai_task/__init__.py +++ b/homeassistant/components/ai_task/__init__.py @@ -3,7 +3,7 @@ import logging from typing import Any -import voluptuous as vol +import probatio from homeassistant.components.media_source import local_source from homeassistant.config_entries import ConfigEntry @@ -61,26 +61,28 @@ CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN) -STRUCTURE_FIELD_SCHEMA = vol.Schema( +STRUCTURE_FIELD_SCHEMA = probatio.Schema( { - vol.Optional(CONF_DESCRIPTION): str, - vol.Optional(ATTR_REQUIRED): bool, - vol.Required(CONF_SELECTOR): selector.validate_selector, + probatio.Optional(CONF_DESCRIPTION): str, + probatio.Optional(ATTR_REQUIRED): bool, + probatio.Required(CONF_SELECTOR): selector.validate_selector, } ) -def _validate_structure_fields(value: dict[str, Any]) -> vol.Schema: - """Validate the structure fields as a voluptuous Schema.""" +def _validate_structure_fields(value: dict[str, Any]) -> probatio.Schema: + """Validate the structure fields as a probatio Schema.""" if not isinstance(value, dict): - raise vol.Invalid("Structure must be a dictionary") + raise probatio.Invalid("Structure must be a dictionary") fields = {} for k, v in value.items(): - field_class = vol.Required if v.get(ATTR_REQUIRED, False) else vol.Optional + field_class = ( + probatio.Required if v.get(ATTR_REQUIRED, False) else probatio.Optional + ) fields[field_class(k, description=v.get(CONF_DESCRIPTION))] = selector.selector( v[CONF_SELECTOR] ) - return vol.Schema(fields, extra=vol.PREVENT_EXTRA) + return probatio.Schema(fields, extra=probatio.PREVENT_EXTRA) async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: @@ -97,16 +99,16 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: DOMAIN, SERVICE_GENERATE_DATA, async_service_generate_data, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(ATTR_TASK_NAME): cv.string, - vol.Optional(ATTR_ENTITY_ID): cv.entity_id, - vol.Required(ATTR_INSTRUCTIONS): cv.string, - vol.Optional(ATTR_STRUCTURE): vol.All( - vol.Schema({str: STRUCTURE_FIELD_SCHEMA}), + probatio.Required(ATTR_TASK_NAME): cv.string, + probatio.Optional(ATTR_ENTITY_ID): cv.entity_id, + probatio.Required(ATTR_INSTRUCTIONS): cv.string, + probatio.Optional(ATTR_STRUCTURE): probatio.All( + probatio.Schema({str: STRUCTURE_FIELD_SCHEMA}), _validate_structure_fields, ), - vol.Optional(ATTR_ATTACHMENTS): selector.MediaSelector( + probatio.Optional(ATTR_ATTACHMENTS): selector.MediaSelector( {"accept": ["*/*"], "multiple": True} ), } @@ -118,12 +120,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: DOMAIN, SERVICE_GENERATE_IMAGE, async_service_generate_image, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(ATTR_TASK_NAME): cv.string, - vol.Optional(ATTR_ENTITY_ID): cv.entity_id, - vol.Required(ATTR_INSTRUCTIONS): cv.string, - vol.Optional(ATTR_ATTACHMENTS): selector.MediaSelector( + probatio.Required(ATTR_TASK_NAME): cv.string, + probatio.Optional(ATTR_ENTITY_ID): cv.entity_id, + probatio.Required(ATTR_INSTRUCTIONS): cv.string, + probatio.Optional(ATTR_ATTACHMENTS): selector.MediaSelector( {"accept": ["*/*"], "multiple": True} ), } diff --git a/homeassistant/components/ai_task/http.py b/homeassistant/components/ai_task/http.py index ba6aa63415bea..d616895bfe723 100644 --- a/homeassistant/components/ai_task/http.py +++ b/homeassistant/components/ai_task/http.py @@ -2,7 +2,7 @@ from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.core import HomeAssistant, callback @@ -19,7 +19,7 @@ def async_setup(hass: HomeAssistant) -> None: @websocket_api.websocket_command( { - vol.Required("type"): "ai_task/preferences/get", + probatio.Required("type"): "ai_task/preferences/get", } ) @callback @@ -35,9 +35,9 @@ def websocket_get_preferences( @websocket_api.websocket_command( { - vol.Required("type"): "ai_task/preferences/set", - vol.Optional("gen_data_entity_id"): vol.Any(str, None), - vol.Optional("gen_image_entity_id"): vol.Any(str, None), + probatio.Required("type"): "ai_task/preferences/set", + probatio.Optional("gen_data_entity_id"): probatio.Any(str, None), + probatio.Optional("gen_image_entity_id"): probatio.Any(str, None), } ) @websocket_api.require_admin diff --git a/homeassistant/components/ai_task/task.py b/homeassistant/components/ai_task/task.py index a29d186537baf..f05057e30bb6f 100644 --- a/homeassistant/components/ai_task/task.py +++ b/homeassistant/components/ai_task/task.py @@ -8,7 +8,7 @@ import tempfile from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components import camera, conversation, image, media_source from homeassistant.components.http.auth import async_sign_path @@ -116,7 +116,7 @@ async def async_generate_data( task_name: str, entity_id: str | None = None, instructions: str, - structure: vol.Schema | None = None, + structure: probatio.Schema | None = None, attachments: list[dict] | None = None, llm_api: llm.API | None = None, context: Context | None = None, @@ -254,7 +254,7 @@ class GenDataTask: instructions: str """Instructions on what needs to be done.""" - structure: vol.Schema | None = None + structure: probatio.Schema | None = None """Optional structure for the data to be generated.""" attachments: list[conversation.Attachment] | None = None diff --git a/homeassistant/components/aidot/config_flow.py b/homeassistant/components/aidot/config_flow.py index dfc77f1c108fb..4db174aa0f03b 100644 --- a/homeassistant/components/aidot/config_flow.py +++ b/homeassistant/components/aidot/config_flow.py @@ -6,7 +6,7 @@ from aidot.const import CONF_ID, DEFAULT_COUNTRY_CODE, SUPPORTED_COUNTRY_CODES from aidot.exceptions import AidotUserOrPassIncorrect from aiohttp import ClientError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_COUNTRY_CODE, CONF_PASSWORD, CONF_USERNAME @@ -15,9 +15,9 @@ from .const import DOMAIN -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required( + probatio.Required( CONF_COUNTRY_CODE, default=DEFAULT_COUNTRY_CODE, ): selector.CountrySelector( @@ -25,8 +25,8 @@ countries=SUPPORTED_COUNTRY_CODES, ) ), - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/airgradient/config_flow.py b/homeassistant/components/airgradient/config_flow.py index 52405c53b0547..f364275d3effd 100644 --- a/homeassistant/components/airgradient/config_flow.py +++ b/homeassistant/components/airgradient/config_flow.py @@ -11,7 +11,7 @@ ConfigurationControl, ) from awesomeversion import AwesomeVersion, AwesomeVersionException -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_RECONFIGURE, @@ -157,7 +157,7 @@ async def async_step_user( ) return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_HOST): str}), + data_schema=probatio.Schema({probatio.Required(CONF_HOST): str}), errors=errors, ) diff --git a/homeassistant/components/airly/config_flow.py b/homeassistant/components/airly/config_flow.py index 510e64f34a50c..97d80d60600b4 100644 --- a/homeassistant/components/airly/config_flow.py +++ b/homeassistant/components/airly/config_flow.py @@ -8,7 +8,7 @@ from aiohttp import ClientConnectorError, ClientSession from airly import Airly from airly.exceptions import AirlyError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE @@ -88,13 +88,13 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_API_KEY): str, - vol.Optional( + probatio.Required(CONF_API_KEY): str, + probatio.Optional( CONF_LATITUDE, default=self.hass.config.latitude ): cv.latitude, - vol.Optional( + probatio.Optional( CONF_LONGITUDE, default=self.hass.config.longitude ): cv.longitude, } diff --git a/homeassistant/components/airnow/config_flow.py b/homeassistant/components/airnow/config_flow.py index 9940c7fee5e24..239606cd67924 100644 --- a/homeassistant/components/airnow/config_flow.py +++ b/homeassistant/components/airnow/config_flow.py @@ -3,9 +3,9 @@ import logging from typing import Any, override +import probatio from pyairnow import WebServiceAPI from pyairnow.errors import AirNowError, EmptyResponseError, InvalidKeyError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE @@ -95,13 +95,13 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_API_KEY): str, - vol.Optional( + probatio.Required(CONF_API_KEY): str, + probatio.Optional( CONF_LATITUDE, default=self.hass.config.latitude ): cv.latitude, - vol.Optional( + probatio.Optional( CONF_LONGITUDE, default=self.hass.config.longitude ): cv.longitude, } diff --git a/homeassistant/components/airobot/config_flow.py b/homeassistant/components/airobot/config_flow.py index 3e135c397815e..be23e10e52199 100644 --- a/homeassistant/components/airobot/config_flow.py +++ b/homeassistant/components/airobot/config_flow.py @@ -6,6 +6,7 @@ import logging from typing import Any, override +import probatio from pyairobotrest import AirobotClient from pyairobotrest.exceptions import ( AirobotAuthError, @@ -13,7 +14,6 @@ AirobotError, AirobotTimeoutError, ) -import voluptuous as vol from homeassistant.config_entries import ConfigFlow as BaseConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_MAC, CONF_PASSWORD, CONF_USERNAME @@ -26,11 +26,11 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) @@ -143,9 +143,9 @@ async def async_step_dhcp_confirm( # Only ask for password since we already have the device_id from discovery return self.async_show_form( step_id="dhcp_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ), description_placeholders={ @@ -256,9 +256,9 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ), description_placeholders={ diff --git a/homeassistant/components/airos/config_flow.py b/homeassistant/components/airos/config_flow.py index 291af1a499bda..26420387b974e 100644 --- a/homeassistant/components/airos/config_flow.py +++ b/homeassistant/components/airos/config_flow.py @@ -20,7 +20,7 @@ AirOSTLSCompatibilityError, ) from airos.helpers import DetectDeviceData, async_get_firmware_data -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -66,15 +66,17 @@ # Discovery duration in seconds, airOS announces every 20 seconds DISCOVER_INTERVAL: int = 30 -STEP_DISCOVERY_DATA_SCHEMA = vol.Schema( +STEP_DISCOVERY_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME, default=DEFAULT_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Required(SECTION_ADDITIONAL_SETTINGS): section( - vol.Schema( + probatio.Required(CONF_USERNAME, default=DEFAULT_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Required(SECTION_ADDITIONAL_SETTINGS): section( + probatio.Schema( { - vol.Required(CONF_SSL, default=DEFAULT_SSL): bool, - vol.Required(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): bool, + probatio.Required(CONF_SSL, default=DEFAULT_SSL): bool, + probatio.Required( + CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL + ): bool, } ), {"collapsed": True}, @@ -83,7 +85,7 @@ ) STEP_MANUAL_DATA_SCHEMA = STEP_DISCOVERY_DATA_SCHEMA.extend( - {vol.Required(CONF_HOST): str} + {probatio.Required(CONF_HOST): str} ) @@ -223,9 +225,9 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", @@ -255,24 +257,24 @@ async def async_step_reconfigure( return self.async_show_form( step_id="reconfigure", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", ) ), - vol.Required(SECTION_ADDITIONAL_SETTINGS): section( - vol.Schema( + probatio.Required(SECTION_ADDITIONAL_SETTINGS): section( + probatio.Schema( { - vol.Required( + probatio.Required( CONF_SSL, default=current_data[SECTION_ADDITIONAL_SETTINGS][ CONF_SSL ], ): bool, - vol.Required( + probatio.Required( CONF_VERIFY_SSL, default=current_data[SECTION_ADDITIONAL_SETTINGS][ CONF_VERIFY_SSL @@ -349,7 +351,9 @@ async def async_step_select_device( return self.async_show_form( step_id="select_device", - data_schema=vol.Schema({vol.Required(MAC_ADDRESS): vol.In(list_options)}), + data_schema=probatio.Schema( + {probatio.Required(MAC_ADDRESS): probatio.In(list_options)} + ), ) async def async_step_configure_device( diff --git a/homeassistant/components/airpatrol/config_flow.py b/homeassistant/components/airpatrol/config_flow.py index 08327e640d6f8..69ad22d124b1b 100644 --- a/homeassistant/components/airpatrol/config_flow.py +++ b/homeassistant/components/airpatrol/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from airpatrol.api import AirPatrolAPI, AirPatrolAuthenticationError, AirPatrolError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_ACCESS_TOKEN, CONF_EMAIL, CONF_PASSWORD @@ -18,15 +18,15 @@ from .const import DOMAIN -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_EMAIL): TextSelector( + probatio.Required(CONF_EMAIL): TextSelector( TextSelectorConfig( type=TextSelectorType.EMAIL, autocomplete="email", ) ), - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", diff --git a/homeassistant/components/airq/config_flow.py b/homeassistant/components/airq/config_flow.py index 33bcb41775b91..41bc21c19dfe6 100644 --- a/homeassistant/components/airq/config_flow.py +++ b/homeassistant/components/airq/config_flow.py @@ -5,7 +5,7 @@ from aioairq import AirQ, InvalidAuth from aiohttp.client_exceptions import ClientConnectionError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigEntry, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_IP_ADDRESS, CONF_PASSWORD @@ -25,18 +25,18 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_IP_ADDRESS): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_IP_ADDRESS): str, + probatio.Required(CONF_PASSWORD): str, } ) OPTIONS_FLOW = { "init": SchemaFlowFormStep( - schema=vol.Schema( + schema=probatio.Schema( { - vol.Optional(CONF_RETURN_AVERAGE, default=True): BooleanSelector(), - vol.Optional(CONF_CLIP_NEGATIVE, default=True): BooleanSelector(), + probatio.Optional(CONF_RETURN_AVERAGE, default=True): BooleanSelector(), + probatio.Optional(CONF_CLIP_NEGATIVE, default=True): BooleanSelector(), } ) ), @@ -144,7 +144,7 @@ async def async_step_discovery_confirm( return self.async_show_form( step_id="discovery_confirm", - data_schema=vol.Schema({vol.Required(CONF_PASSWORD): str}), + data_schema=probatio.Schema({probatio.Required(CONF_PASSWORD): str}), description_placeholders={"name": self._discovered_name}, errors=errors, ) diff --git a/homeassistant/components/airthings/config_flow.py b/homeassistant/components/airthings/config_flow.py index fa850efab24f9..bb95c65fa244b 100644 --- a/homeassistant/components/airthings/config_flow.py +++ b/homeassistant/components/airthings/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override import airthings -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_ID @@ -14,10 +14,10 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_ID): str, - vol.Required(CONF_SECRET): str, + probatio.Required(CONF_ID): str, + probatio.Required(CONF_SECRET): str, } ) diff --git a/homeassistant/components/airthings_ble/config_flow.py b/homeassistant/components/airthings_ble/config_flow.py index 7ac53279fa054..aecf230a8b2b7 100644 --- a/homeassistant/components/airthings_ble/config_flow.py +++ b/homeassistant/components/airthings_ble/config_flow.py @@ -11,7 +11,7 @@ ) from bleak import BleakError from habluetooth import BluetoothServiceInfoBleak -import voluptuous as vol +import probatio from homeassistant.components import bluetooth from homeassistant.components.bluetooth import ( @@ -221,9 +221,9 @@ async def async_step_user( } return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_ADDRESS): vol.In(titles), + probatio.Required(CONF_ADDRESS): probatio.In(titles), }, ), ) diff --git a/homeassistant/components/airtouch4/config_flow.py b/homeassistant/components/airtouch4/config_flow.py index 393dbe7fb8a1c..cc01067794d0f 100644 --- a/homeassistant/components/airtouch4/config_flow.py +++ b/homeassistant/components/airtouch4/config_flow.py @@ -3,14 +3,14 @@ from typing import Any, override from airtouch4pyapi import AirTouch, AirTouchStatus -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST from .const import DOMAIN -DATA_SCHEMA = vol.Schema({vol.Required(CONF_HOST): str}) +DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_HOST): str}) class AirtouchConfigFlow(ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/components/airtouch5/config_flow.py b/homeassistant/components/airtouch5/config_flow.py index a4a4401f03a61..b61838789db8b 100644 --- a/homeassistant/components/airtouch5/config_flow.py +++ b/homeassistant/components/airtouch5/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from airtouch5py.airtouch5_simple_client import Airtouch5SimpleClient -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST @@ -13,7 +13,7 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema({vol.Required(CONF_HOST): str}) +STEP_USER_DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_HOST): str}) class AirTouch5ConfigFlow(ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/components/airvisual/config_flow.py b/homeassistant/components/airvisual/config_flow.py index 34beb3b06ad9e..9b6dcdc0abfc9 100644 --- a/homeassistant/components/airvisual/config_flow.py +++ b/homeassistant/components/airvisual/config_flow.py @@ -4,6 +4,7 @@ from collections.abc import Mapping from typing import Any, override +import probatio from pyairvisual.cloud_api import ( CloudAPI, InvalidKeyError, @@ -12,7 +13,6 @@ UnauthorizedError, ) from pyairvisual.errors import AirVisualError -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -45,17 +45,17 @@ LOGGER, ) -API_KEY_DATA_SCHEMA = vol.Schema({vol.Required(CONF_API_KEY): cv.string}) +API_KEY_DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_API_KEY): cv.string}) GEOGRAPHY_NAME_SCHEMA = API_KEY_DATA_SCHEMA.extend( { - vol.Required(CONF_CITY): cv.string, - vol.Required(CONF_STATE): cv.string, - vol.Required(CONF_COUNTRY): cv.string, + probatio.Required(CONF_CITY): cv.string, + probatio.Required(CONF_STATE): cv.string, + probatio.Required(CONF_COUNTRY): cv.string, } ) -PICK_INTEGRATION_TYPE_SCHEMA = vol.Schema( +PICK_INTEGRATION_TYPE_SCHEMA = probatio.Schema( { - vol.Required("type"): vol.In( + probatio.Required("type"): probatio.In( [ INTEGRATION_TYPE_GEOGRAPHY_COORDS, INTEGRATION_TYPE_GEOGRAPHY_NAME, @@ -64,8 +64,8 @@ } ) -OPTIONS_SCHEMA = vol.Schema( - {vol.Required(CONF_SHOW_ON_MAP): bool}, +OPTIONS_SCHEMA = probatio.Schema( + {probatio.Required(CONF_SHOW_ON_MAP): bool}, ) OPTIONS_FLOW = { "init": SchemaFlowFormStep(OPTIONS_SCHEMA), @@ -83,14 +83,14 @@ def __init__(self) -> None: self._geo_id: str | None = None @property - def geography_coords_schema(self) -> vol.Schema: + def geography_coords_schema(self) -> probatio.Schema: """Return the data schema for the cloud API.""" return API_KEY_DATA_SCHEMA.extend( { - vol.Required( + probatio.Required( CONF_LATITUDE, default=self.hass.config.latitude ): cv.latitude, - vol.Required( + probatio.Required( CONF_LONGITUDE, default=self.hass.config.longitude ): cv.longitude, } diff --git a/homeassistant/components/airvisual_pro/config_flow.py b/homeassistant/components/airvisual_pro/config_flow.py index 07447c9af7ca9..b26209c34e68b 100644 --- a/homeassistant/components/airvisual_pro/config_flow.py +++ b/homeassistant/components/airvisual_pro/config_flow.py @@ -4,29 +4,29 @@ from dataclasses import dataclass, field from typing import Any, override +import probatio from pyairvisual.node import ( InvalidAuthenticationError, NodeConnectionError, NodeProError, NodeSamba, ) -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_IP_ADDRESS, CONF_PASSWORD from .const import DOMAIN, LOGGER -STEP_REAUTH_SCHEMA = vol.Schema( +STEP_REAUTH_SCHEMA = probatio.Schema( { - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ) -STEP_USER_SCHEMA = vol.Schema( +STEP_USER_SCHEMA = probatio.Schema( { - vol.Required(CONF_IP_ADDRESS): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_IP_ADDRESS): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/airzone/config_flow.py b/homeassistant/components/airzone/config_flow.py index aab8b5348bc48..3906df256469c 100644 --- a/homeassistant/components/airzone/config_flow.py +++ b/homeassistant/components/airzone/config_flow.py @@ -6,7 +6,7 @@ from aioairzone.const import DEFAULT_PORT, DEFAULT_SYSTEM_ID from aioairzone.exceptions import AirzoneError, InvalidSystem from aioairzone.localapi import AirzoneLocalApi, ConnectionOptions -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_ID, CONF_PORT @@ -19,15 +19,15 @@ _LOGGER = logging.getLogger(__name__) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, } ) SYSTEM_ID_SCHEMA = CONFIG_SCHEMA.extend( { - vol.Required(CONF_ID, default=1): int, + probatio.Required(CONF_ID, default=1): int, } ) @@ -134,7 +134,7 @@ async def async_step_discovered_connection( assert self._discovered_mac is not None errors = {} - base_schema = {vol.Required(CONF_PORT, default=DEFAULT_PORT): int} + base_schema = {probatio.Required(CONF_PORT, default=DEFAULT_PORT): int} if user_input is not None: airzone = AirzoneLocalApi( @@ -149,7 +149,7 @@ async def async_step_discovered_connection( try: mac = await airzone.validate() except InvalidSystem: - base_schema[vol.Required(CONF_ID, default=1)] = int + base_schema[probatio.Required(CONF_ID, default=1)] = int errors[CONF_ID] = "invalid_system_id" except AirzoneError: errors["base"] = "cannot_connect" @@ -172,6 +172,6 @@ async def async_step_discovered_connection( return self.async_show_form( step_id="discovered_connection", - data_schema=vol.Schema(base_schema), + data_schema=probatio.Schema(base_schema), errors=errors, ) diff --git a/homeassistant/components/airzone_cloud/config_flow.py b/homeassistant/components/airzone_cloud/config_flow.py index 37bf272511fde..a5867e8d7f6b7 100644 --- a/homeassistant/components/airzone_cloud/config_flow.py +++ b/homeassistant/components/airzone_cloud/config_flow.py @@ -6,7 +6,7 @@ from aioairzone_cloud.common import ConnectionOptions from aioairzone_cloud.const import AZD_ID, AZD_NAME, AZD_WEBSERVERS from aioairzone_cloud.exceptions import AirzoneCloudError, LoginError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_ID, CONF_PASSWORD, CONF_USERNAME @@ -61,9 +61,9 @@ async def async_step_inst_pick( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_ID): SelectSelector( + probatio.Required(CONF_ID): SelectSelector( SelectSelectorConfig( options=[ SelectOptionDict(value=k, label=v) @@ -106,10 +106,10 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, diff --git a/homeassistant/components/aladdin_connect/config_flow.py b/homeassistant/components/aladdin_connect/config_flow.py index ffee0082e7d38..371dcdc644b1b 100644 --- a/homeassistant/components/aladdin_connect/config_flow.py +++ b/homeassistant/components/aladdin_connect/config_flow.py @@ -6,7 +6,7 @@ from genie_partner_sdk.client import AladdinConnectClient import jwt -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlowResult from homeassistant.helpers import aiohttp_client, config_entry_oauth2_flow @@ -49,7 +49,7 @@ async def async_step_reauth_confirm( if user_input is None: return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema({}), + data_schema=probatio.Schema({}), ) return await self.async_step_user() diff --git a/homeassistant/components/alarm_control_panel/__init__.py b/homeassistant/components/alarm_control_panel/__init__.py index 299de8a6bf656..f20dfd2b83d89 100644 --- a/homeassistant/components/alarm_control_panel/__init__.py +++ b/homeassistant/components/alarm_control_panel/__init__.py @@ -4,8 +4,8 @@ import logging from typing import Any, Final, final, override +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( # noqa: F401 @@ -49,7 +49,7 @@ CONF_DEFAULT_CODE = "default_code" ALARM_SERVICE_SCHEMA: Final = make_entity_service_schema( - {vol.Optional(ATTR_CODE): cv.string} + {probatio.Optional(ATTR_CODE): cv.string} ) diff --git a/homeassistant/components/alarm_control_panel/device_action.py b/homeassistant/components/alarm_control_panel/device_action.py index ccf0c4593efd7..47697c414ccee 100644 --- a/homeassistant/components/alarm_control_panel/device_action.py +++ b/homeassistant/components/alarm_control_panel/device_action.py @@ -2,7 +2,7 @@ from typing import Final -import voluptuous as vol +import probatio from homeassistant.components.device_automation import async_validate_entity_schema from homeassistant.const import ( @@ -39,9 +39,9 @@ _ACTION_SCHEMA: Final = cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): vol.In(ACTION_TYPES), - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Optional(CONF_CODE): cv.string, + probatio.Required(CONF_TYPE): probatio.In(ACTION_TYPES), + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Optional(CONF_CODE): cv.string, } ) @@ -120,7 +120,7 @@ async def async_call_action_from_config( async def async_get_action_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List action capabilities.""" # We need to refer to the state directly because CODE_ARM_REQUIRED is not a # capability attribute @@ -138,4 +138,4 @@ async def async_get_action_capabilities( ): return {} - return {"extra_fields": vol.Schema({vol.Optional(CONF_CODE): str})} + return {"extra_fields": probatio.Schema({probatio.Optional(CONF_CODE): str})} diff --git a/homeassistant/components/alarm_control_panel/device_condition.py b/homeassistant/components/alarm_control_panel/device_condition.py index fece5f4d30f59..150b75166e584 100644 --- a/homeassistant/components/alarm_control_panel/device_condition.py +++ b/homeassistant/components/alarm_control_panel/device_condition.py @@ -2,7 +2,7 @@ from typing import Final -import voluptuous as vol +import probatio from homeassistant.const import ( ATTR_ENTITY_ID, @@ -46,8 +46,8 @@ CONDITION_SCHEMA: Final = DEVICE_CONDITION_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In(CONDITION_TYPES), + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In(CONDITION_TYPES), } ) diff --git a/homeassistant/components/alarm_control_panel/device_trigger.py b/homeassistant/components/alarm_control_panel/device_trigger.py index b1265fcc22447..8bb005ac1b450 100644 --- a/homeassistant/components/alarm_control_panel/device_trigger.py +++ b/homeassistant/components/alarm_control_panel/device_trigger.py @@ -2,7 +2,7 @@ from typing import Final -import voluptuous as vol +import probatio from homeassistant.components.device_automation import DEVICE_TRIGGER_BASE_SCHEMA from homeassistant.components.homeassistant.triggers import state as state_trigger @@ -33,9 +33,9 @@ TRIGGER_SCHEMA: Final = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In(TRIGGER_TYPES), - vol.Optional(CONF_FOR): cv.positive_time_period_dict, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In(TRIGGER_TYPES), + probatio.Optional(CONF_FOR): cv.positive_time_period_dict, } ) @@ -103,11 +103,11 @@ async def async_get_triggers( async def async_get_trigger_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List trigger capabilities.""" return { - "extra_fields": vol.Schema( - {vol.Optional(CONF_FOR): cv.positive_time_period_dict} + "extra_fields": probatio.Schema( + {probatio.Optional(CONF_FOR): cv.positive_time_period_dict} ) } diff --git a/homeassistant/components/alarmdecoder/config_flow.py b/homeassistant/components/alarmdecoder/config_flow.py index d2287be60bffe..b055e946dc8b8 100644 --- a/homeassistant/components/alarmdecoder/config_flow.py +++ b/homeassistant/components/alarmdecoder/config_flow.py @@ -6,7 +6,7 @@ from adext import AdExt from alarmdecoder.devices import Device, SerialDevice, SocketDevice from alarmdecoder.util import NoDeviceError -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import ( DEVICE_CLASSES_SCHEMA as BINARY_SENSOR_DEVICE_CLASSES_SCHEMA, @@ -83,9 +83,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PROTOCOL): vol.In( + probatio.Required(CONF_PROTOCOL): probatio.In( [PROTOCOL_SOCKET, PROTOCOL_SERIAL] ), } @@ -137,19 +137,23 @@ def test_connection(): _LOGGER.exception("Unexpected exception during AlarmDecoder setup") errors["base"] = "unknown" - schema: vol.Schema + schema: probatio.Schema if self.protocol == PROTOCOL_SOCKET: - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required(CONF_HOST, default=DEFAULT_DEVICE_HOST): str, - vol.Required(CONF_PORT, default=DEFAULT_DEVICE_PORT): int, + probatio.Required(CONF_HOST, default=DEFAULT_DEVICE_HOST): str, + probatio.Required(CONF_PORT, default=DEFAULT_DEVICE_PORT): int, } ) if self.protocol == PROTOCOL_SERIAL: - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required(CONF_DEVICE_PATH, default=DEFAULT_DEVICE_PATH): str, - vol.Required(CONF_DEVICE_BAUD, default=DEFAULT_DEVICE_BAUD): int, + probatio.Required( + CONF_DEVICE_PATH, default=DEFAULT_DEVICE_PATH + ): str, + probatio.Required( + CONF_DEVICE_BAUD, default=DEFAULT_DEVICE_BAUD + ): int, } ) @@ -184,9 +188,9 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(EDIT_KEY, default=EDIT_SETTINGS): vol.In( + probatio.Required(EDIT_KEY, default=EDIT_SETTINGS): probatio.In( [EDIT_SETTINGS, EDIT_ZONES] ) }, @@ -205,16 +209,16 @@ async def async_step_arm_settings( return self.async_show_form( step_id="arm_settings", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_ALT_NIGHT_MODE, default=self.arm_options[CONF_ALT_NIGHT_MODE], ): bool, - vol.Optional( + probatio.Optional( CONF_AUTO_BYPASS, default=self.arm_options[CONF_AUTO_BYPASS] ): bool, - vol.Optional( + probatio.Optional( CONF_CODE_ARM_REQUIRED, default=self.arm_options[CONF_CODE_ARM_REQUIRED], ): bool, @@ -236,7 +240,7 @@ async def async_step_zone_select( return self.async_show_form( step_id="zone_select", - data_schema=vol.Schema({vol.Required(CONF_ZONE_NUMBER): str}), + data_schema=probatio.Schema({probatio.Required(CONF_ZONE_NUMBER): str}), errors=errors, ) @@ -265,9 +269,9 @@ async def async_step_zone_details( return self.async_show_form( step_id="zone_details", description_placeholders={CONF_ZONE_NUMBER: self.selected_zone}, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_ZONE_NAME, description={ "suggested_value": existing_zone_settings.get( @@ -275,13 +279,13 @@ async def async_step_zone_details( ) }, ): str, - vol.Optional( + probatio.Optional( CONF_ZONE_TYPE, default=existing_zone_settings.get( CONF_ZONE_TYPE, DEFAULT_ZONE_TYPE ), ): BINARY_SENSOR_DEVICE_CLASSES_SCHEMA, - vol.Optional( + probatio.Optional( CONF_ZONE_RFID, description={ "suggested_value": existing_zone_settings.get( @@ -289,7 +293,7 @@ async def async_step_zone_details( ) }, ): str, - vol.Optional( + probatio.Optional( CONF_ZONE_LOOP, description={ "suggested_value": existing_zone_settings.get( @@ -297,7 +301,7 @@ async def async_step_zone_details( ) }, ): str, - vol.Optional( + probatio.Optional( CONF_RELAY_ADDR, description={ "suggested_value": existing_zone_settings.get( @@ -305,7 +309,7 @@ async def async_step_zone_details( ) }, ): str, - vol.Optional( + probatio.Optional( CONF_RELAY_CHAN, description={ "suggested_value": existing_zone_settings.get( diff --git a/homeassistant/components/alarmdecoder/services.py b/homeassistant/components/alarmdecoder/services.py index cff0684bd7609..a2bcaf328fa09 100644 --- a/homeassistant/components/alarmdecoder/services.py +++ b/homeassistant/components/alarmdecoder/services.py @@ -1,6 +1,6 @@ """Support for AlarmDecoder-based alarm control panels (Honeywell/DSC).""" -import voluptuous as vol +import probatio from homeassistant.components.alarm_control_panel import ( DOMAIN as ALARM_CONTROL_PANEL_DOMAIN, @@ -24,7 +24,7 @@ def async_setup_services(hass: HomeAssistant) -> None: "alarm_toggle_chime", entity_domain=ALARM_CONTROL_PANEL_DOMAIN, schema={ - vol.Required(ATTR_CODE): cv.string, + probatio.Required(ATTR_CODE): cv.string, }, func="alarm_toggle_chime", ) @@ -35,7 +35,7 @@ def async_setup_services(hass: HomeAssistant) -> None: "alarm_keypress", entity_domain=ALARM_CONTROL_PANEL_DOMAIN, schema={ - vol.Required(ATTR_KEYPRESS): cv.string, + probatio.Required(ATTR_KEYPRESS): cv.string, }, func="alarm_keypress", ) diff --git a/homeassistant/components/alert/__init__.py b/homeassistant/components/alert/__init__.py index 33e5f1dd234a1..10bd279f05b8e 100644 --- a/homeassistant/components/alert/__init__.py +++ b/homeassistant/components/alert/__init__.py @@ -3,7 +3,7 @@ DEVELOPMENT OF THE ALERT INTEGRATION IS FROZEN. """ -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_ENTITY_ID, @@ -35,31 +35,31 @@ ) from .entity import AlertEntity -ALERT_SCHEMA = vol.Schema( +ALERT_SCHEMA = probatio.Schema( { - vol.Required(CONF_NAME): cv.string, - vol.Required(CONF_ENTITY_ID): cv.entity_id, - vol.Optional(CONF_STATE, default=STATE_ON): cv.string, - vol.Required(CONF_REPEAT): vol.All( + probatio.Required(CONF_NAME): cv.string, + probatio.Required(CONF_ENTITY_ID): cv.entity_id, + probatio.Optional(CONF_STATE, default=STATE_ON): cv.string, + probatio.Required(CONF_REPEAT): probatio.All( cv.ensure_list, - [vol.Coerce(float)], + [probatio.Coerce(float)], # Minimum delay is 1 second = 0.016 minutes - [vol.Range(min=0.016)], + [probatio.Range(min=0.016)], ), - vol.Optional(CONF_CAN_ACK, default=DEFAULT_CAN_ACK): cv.boolean, - vol.Optional(CONF_SKIP_FIRST, default=DEFAULT_SKIP_FIRST): cv.boolean, - vol.Optional(CONF_ALERT_MESSAGE): cv.template, - vol.Optional(CONF_DONE_MESSAGE): cv.template, - vol.Optional(CONF_TITLE): cv.template, - vol.Optional(CONF_DATA): dict, - vol.Optional(CONF_NOTIFIERS, default=list): vol.All( + probatio.Optional(CONF_CAN_ACK, default=DEFAULT_CAN_ACK): cv.boolean, + probatio.Optional(CONF_SKIP_FIRST, default=DEFAULT_SKIP_FIRST): cv.boolean, + probatio.Optional(CONF_ALERT_MESSAGE): cv.template, + probatio.Optional(CONF_DONE_MESSAGE): cv.template, + probatio.Optional(CONF_TITLE): cv.template, + probatio.Optional(CONF_DATA): dict, + probatio.Optional(CONF_NOTIFIERS, default=list): probatio.All( cv.ensure_list, [cv.string] ), } ) -CONFIG_SCHEMA = vol.Schema( - {DOMAIN: cv.schema_with_slug_keys(ALERT_SCHEMA)}, extra=vol.ALLOW_EXTRA +CONFIG_SCHEMA = probatio.Schema( + {DOMAIN: cv.schema_with_slug_keys(ALERT_SCHEMA)}, extra=probatio.ALLOW_EXTRA ) diff --git a/homeassistant/components/alexa/__init__.py b/homeassistant/components/alexa/__init__.py index 7347b3419a939..d667791f0e610 100644 --- a/homeassistant/components/alexa/__init__.py +++ b/homeassistant/components/alexa/__init__.py @@ -2,7 +2,7 @@ from typing import Any -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_CLIENT_ID, @@ -44,51 +44,53 @@ ] -ALEXA_ENTITY_SCHEMA = vol.Schema( +ALEXA_ENTITY_SCHEMA = probatio.Schema( { - vol.Optional(CONF_DESCRIPTION): cv.string, - vol.Optional(CONF_DISPLAY_CATEGORIES): cv.string, - vol.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_DESCRIPTION): cv.string, + probatio.Optional(CONF_DISPLAY_CATEGORIES): cv.string, + probatio.Optional(CONF_NAME): cv.string, } ) -SMART_HOME_SCHEMA = vol.Schema( +SMART_HOME_SCHEMA = probatio.Schema( { - vol.Optional(CONF_ENDPOINT): vol.All(vol.Lower, vol.In(VALID_ENDPOINTS)), - vol.Optional(CONF_CLIENT_ID): cv.string, - vol.Optional(CONF_CLIENT_SECRET): cv.string, - vol.Optional(CONF_LOCALE, default=DEFAULT_LOCALE): vol.In( + probatio.Optional(CONF_ENDPOINT): probatio.All( + probatio.Lower, probatio.In(VALID_ENDPOINTS) + ), + probatio.Optional(CONF_CLIENT_ID): cv.string, + probatio.Optional(CONF_CLIENT_SECRET): cv.string, + probatio.Optional(CONF_LOCALE, default=DEFAULT_LOCALE): probatio.In( CONF_SUPPORTED_LOCALES ), - vol.Optional(CONF_FILTER, default={}): entityfilter.FILTER_SCHEMA, - vol.Optional(CONF_ENTITY_CONFIG): {cv.entity_id: ALEXA_ENTITY_SCHEMA}, + probatio.Optional(CONF_FILTER, default={}): entityfilter.FILTER_SCHEMA, + probatio.Optional(CONF_ENTITY_CONFIG): {cv.entity_id: ALEXA_ENTITY_SCHEMA}, } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { DOMAIN: { CONF_FLASH_BRIEFINGS: { - vol.Required(CONF_PASSWORD): cv.string, - cv.string: vol.All( + probatio.Required(CONF_PASSWORD): cv.string, + cv.string: probatio.All( cv.ensure_list, [ { - vol.Optional(CONF_UID): cv.string, - vol.Required(CONF_TITLE): cv.template, - vol.Optional(CONF_AUDIO): cv.template, - vol.Required(CONF_TEXT, default=""): cv.template, - vol.Optional(CONF_DISPLAY_URL): cv.template, + probatio.Optional(CONF_UID): cv.string, + probatio.Required(CONF_TITLE): cv.template, + probatio.Optional(CONF_AUDIO): cv.template, + probatio.Required(CONF_TEXT, default=""): cv.template, + probatio.Optional(CONF_DISPLAY_URL): cv.template, } ], ), }, - # vol.Optional here would mean we couldn't distinguish between an empty + # probatio.Optional here would mean we couldn't distinguish between an empty # smart_home: and none at all. - CONF_SMART_HOME: vol.Any(SMART_HOME_SCHEMA, None), + CONF_SMART_HOME: probatio.Any(SMART_HOME_SCHEMA, None), } }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/alexa_devices/config_flow.py b/homeassistant/components/alexa_devices/config_flow.py index 1b82f8358d1e7..1864708bf81df 100644 --- a/homeassistant/components/alexa_devices/config_flow.py +++ b/homeassistant/components/alexa_devices/config_flow.py @@ -12,7 +12,7 @@ CannotRetrieveData, ) from aioamazondevices.structures import AmazonSaveDataConfig -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_CODE, CONF_PASSWORD, CONF_USERNAME @@ -22,23 +22,23 @@ from .const import CONF_LOGIN_DATA, DOMAIN -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Required(CONF_CODE): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_CODE): cv.string, } ) -STEP_REAUTH_DATA_SCHEMA = vol.Schema( +STEP_REAUTH_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_PASSWORD): cv.string, - vol.Required(CONF_CODE): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_CODE): cv.string, } ) -STEP_RECONFIGURE = vol.Schema( +STEP_RECONFIGURE = probatio.Schema( { - vol.Required(CONF_PASSWORD): cv.string, - vol.Required(CONF_CODE): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_CODE): cv.string, } ) diff --git a/homeassistant/components/alexa_devices/services.py b/homeassistant/components/alexa_devices/services.py index a755e61fe7362..686be03c0d3b3 100644 --- a/homeassistant/components/alexa_devices/services.py +++ b/homeassistant/components/alexa_devices/services.py @@ -2,7 +2,7 @@ from aioamazondevices.const.metadata import ALEXA_INFO_SKILLS from aioamazondevices.const.sounds import SOUNDS_LIST -import voluptuous as vol +import probatio from homeassistant.const import ATTR_DEVICE_ID from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -20,22 +20,22 @@ ATTR_SOUND = "sound" ATTR_INFO_SKILL = "info_skill" -SCHEMA_SOUND_SERVICE = vol.Schema( +SCHEMA_SOUND_SERVICE = probatio.Schema( { - vol.Required(ATTR_SOUND): cv.string, - vol.Required(ATTR_DEVICE_ID): cv.string, + probatio.Required(ATTR_SOUND): cv.string, + probatio.Required(ATTR_DEVICE_ID): cv.string, }, ) -SCHEMA_CUSTOM_COMMAND = vol.Schema( +SCHEMA_CUSTOM_COMMAND = probatio.Schema( { - vol.Required(ATTR_TEXT_COMMAND): cv.string, - vol.Required(ATTR_DEVICE_ID): cv.string, + probatio.Required(ATTR_TEXT_COMMAND): cv.string, + probatio.Required(ATTR_DEVICE_ID): cv.string, } ) -SCHEMA_INFO_SKILL = vol.Schema( +SCHEMA_INFO_SKILL = probatio.Schema( { - vol.Required(ATTR_INFO_SKILL): cv.string, - vol.Required(ATTR_DEVICE_ID): cv.string, + probatio.Required(ATTR_INFO_SKILL): cv.string, + probatio.Required(ATTR_DEVICE_ID): cv.string, } ) diff --git a/homeassistant/components/alexa_devices/todo.py b/homeassistant/components/alexa_devices/todo.py index fa145d1232e4f..5b9190a070393 100644 --- a/homeassistant/components/alexa_devices/todo.py +++ b/homeassistant/components/alexa_devices/todo.py @@ -113,7 +113,7 @@ async def async_create_todo_item(self, item: TodoItem) -> None: ) # For passing type checking, existence of summary - # is already checked by voluptuous + # is already checked by probatio if TYPE_CHECKING: assert item.summary is not None @@ -165,7 +165,7 @@ async def async_update_todo_item(self, item: TodoItem) -> None: list_items_lookup = self.coordinator.todo_list_items[self._list.id] # For passing type checking, existence of UID and summary - # is already checked by voluptuous + # is already checked by probatio if TYPE_CHECKING: assert item.uid is not None assert item.summary is not None diff --git a/homeassistant/components/alpha_vantage/sensor.py b/homeassistant/components/alpha_vantage/sensor.py index c9d87b1edd22f..07856d678ccc8 100644 --- a/homeassistant/components/alpha_vantage/sensor.py +++ b/homeassistant/components/alpha_vantage/sensor.py @@ -5,7 +5,7 @@ from alpha_vantage.foreignexchange import ForeignExchange from alpha_vantage.timeseries import TimeSeries -import voluptuous as vol +import probatio from homeassistant.components import persistent_notification from homeassistant.components.sensor import ( @@ -44,27 +44,29 @@ SCAN_INTERVAL = timedelta(minutes=5) -SYMBOL_SCHEMA = vol.Schema( +SYMBOL_SCHEMA = probatio.Schema( { - vol.Required(CONF_SYMBOL): cv.string, - vol.Optional(CONF_CURRENCY): cv.string, - vol.Optional(CONF_NAME): cv.string, + probatio.Required(CONF_SYMBOL): cv.string, + probatio.Optional(CONF_CURRENCY): cv.string, + probatio.Optional(CONF_NAME): cv.string, } ) -CURRENCY_SCHEMA = vol.Schema( +CURRENCY_SCHEMA = probatio.Schema( { - vol.Required(CONF_FROM): cv.string, - vol.Required(CONF_TO): cv.string, - vol.Optional(CONF_NAME): cv.string, + probatio.Required(CONF_FROM): cv.string, + probatio.Required(CONF_TO): cv.string, + probatio.Optional(CONF_NAME): cv.string, } ) PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_API_KEY): cv.string, - vol.Optional(CONF_FOREIGN_EXCHANGE): vol.All(cv.ensure_list, [CURRENCY_SCHEMA]), - vol.Optional(CONF_SYMBOLS): vol.All(cv.ensure_list, [SYMBOL_SCHEMA]), + probatio.Required(CONF_API_KEY): cv.string, + probatio.Optional(CONF_FOREIGN_EXCHANGE): probatio.All( + cv.ensure_list, [CURRENCY_SCHEMA] + ), + probatio.Optional(CONF_SYMBOLS): probatio.All(cv.ensure_list, [SYMBOL_SCHEMA]), } ) diff --git a/homeassistant/components/altruist/config_flow.py b/homeassistant/components/altruist/config_flow.py index 204619b79499b..968cf6b1b9325 100644 --- a/homeassistant/components/altruist/config_flow.py +++ b/homeassistant/components/altruist/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from altruistclient import AltruistClient, AltruistDeviceModel, AltruistError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST @@ -50,7 +50,7 @@ async def async_step_user( ) data_schema = self.add_suggested_values_to_schema( - vol.Schema({vol.Required(CONF_HOST): str}), + probatio.Schema({probatio.Required(CONF_HOST): str}), {CONF_HOST: ip_address}, ) diff --git a/homeassistant/components/amazon_polly/tts.py b/homeassistant/components/amazon_polly/tts.py index 1328bdd1aa330..e33d47dcbef56 100644 --- a/homeassistant/components/amazon_polly/tts.py +++ b/homeassistant/components/amazon_polly/tts.py @@ -6,7 +6,7 @@ import boto3 import botocore -import voluptuous as vol +import probatio from homeassistant.components.tts import ( PLATFORM_SCHEMA as TTS_PLATFORM_SCHEMA, @@ -52,19 +52,25 @@ PLATFORM_SCHEMA: Final = TTS_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_REGION, default=DEFAULT_REGION): vol.In(SUPPORTED_REGIONS), - vol.Inclusive(CONF_ACCESS_KEY_ID, ATTR_CREDENTIALS): cv.string, - vol.Inclusive(CONF_SECRET_ACCESS_KEY, ATTR_CREDENTIALS): cv.string, - vol.Exclusive(CONF_PROFILE_NAME, ATTR_CREDENTIALS): cv.string, - vol.Optional(CONF_VOICE, default=DEFAULT_VOICE): vol.In(SUPPORTED_VOICES), - vol.Optional(CONF_ENGINE, default=DEFAULT_ENGINE): vol.In(SUPPORTED_ENGINES), - vol.Optional(CONF_OUTPUT_FORMAT, default=DEFAULT_OUTPUT_FORMAT): vol.In( - SUPPORTED_OUTPUT_FORMATS + probatio.Optional(CONF_REGION, default=DEFAULT_REGION): probatio.In( + SUPPORTED_REGIONS ), - vol.Optional(CONF_SAMPLE_RATE): vol.All( - cv.string, vol.In(SUPPORTED_SAMPLE_RATES) + probatio.Inclusive(CONF_ACCESS_KEY_ID, ATTR_CREDENTIALS): cv.string, + probatio.Inclusive(CONF_SECRET_ACCESS_KEY, ATTR_CREDENTIALS): cv.string, + probatio.Exclusive(CONF_PROFILE_NAME, ATTR_CREDENTIALS): cv.string, + probatio.Optional(CONF_VOICE, default=DEFAULT_VOICE): probatio.In( + SUPPORTED_VOICES ), - vol.Optional(CONF_TEXT_TYPE, default=DEFAULT_TEXT_TYPE): vol.In( + probatio.Optional(CONF_ENGINE, default=DEFAULT_ENGINE): probatio.In( + SUPPORTED_ENGINES + ), + probatio.Optional( + CONF_OUTPUT_FORMAT, default=DEFAULT_OUTPUT_FORMAT + ): probatio.In(SUPPORTED_OUTPUT_FORMATS), + probatio.Optional(CONF_SAMPLE_RATE): probatio.All( + cv.string, probatio.In(SUPPORTED_SAMPLE_RATES) + ), + probatio.Optional(CONF_TEXT_TYPE, default=DEFAULT_TEXT_TYPE): probatio.In( SUPPORTED_TEXT_TYPES ), } diff --git a/homeassistant/components/amberelectric/config_flow.py b/homeassistant/components/amberelectric/config_flow.py index b0f05d405f57a..c49d166cac35c 100644 --- a/homeassistant/components/amberelectric/config_flow.py +++ b/homeassistant/components/amberelectric/config_flow.py @@ -5,7 +5,7 @@ import amberelectric from amberelectric.models.site import Site from amberelectric.models.site_status import SiteStatus -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_TOKEN @@ -107,9 +107,9 @@ async def async_step_user( return self.async_show_form( step_id="user", description_placeholders={"api_url": API_URL}, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_API_TOKEN, default=user_input[CONF_API_TOKEN] ): str, } @@ -136,9 +136,9 @@ async def async_step_site( return self.async_show_form( step_id="site", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_SITE_ID): SelectSelector( + probatio.Required(CONF_SITE_ID): SelectSelector( SelectSelectorConfig( options=[ SelectOptionDict( @@ -150,7 +150,7 @@ async def async_step_site( mode=SelectSelectorMode.DROPDOWN, ) ), - vol.Optional(CONF_SITE_NAME): str, + probatio.Optional(CONF_SITE_NAME): str, } ), errors=self._errors, diff --git a/homeassistant/components/amberelectric/services.py b/homeassistant/components/amberelectric/services.py index f936d4a3d3c2b..3ad10521fc632 100644 --- a/homeassistant/components/amberelectric/services.py +++ b/homeassistant/components/amberelectric/services.py @@ -1,7 +1,7 @@ """Amber Electric Service class.""" from amberelectric.models.channel import ChannelType -import voluptuous as vol +import probatio from homeassistant.const import ATTR_CONFIG_ENTRY_ID from homeassistant.core import ( @@ -26,10 +26,10 @@ from .coordinator import AmberConfigEntry from .helpers import format_cents_to_dollars, normalize_descriptor -GET_FORECASTS_SCHEMA = vol.Schema( +GET_FORECASTS_SCHEMA = probatio.Schema( { ATTR_CONFIG_ENTRY_ID: ConfigEntrySelector({"integration": DOMAIN}), - ATTR_CHANNEL_TYPE: vol.In( + ATTR_CHANNEL_TYPE: probatio.In( [GENERAL_CHANNEL, CONTROLLED_LOAD_CHANNEL, FEED_IN_CHANNEL] ), } diff --git a/homeassistant/components/ambient_network/config_flow.py b/homeassistant/components/ambient_network/config_flow.py index bd40336ad9dc6..3409d3cde8bbb 100644 --- a/homeassistant/components/ambient_network/config_flow.py +++ b/homeassistant/components/ambient_network/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from aioambient import OpenAPI -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -90,10 +90,10 @@ async def async_step_user( errors = {"base": "no_stations_found"} - schema: vol.Schema = self.add_suggested_values_to_schema( - vol.Schema( + schema: probatio.Schema = self.add_suggested_values_to_schema( + probatio.Schema( { - vol.Required( + probatio.Required( CONF_LOCATION, ): LocationSelector(LocationSelectorConfig(radius=True)), } @@ -140,9 +140,9 @@ async def async_step_station( for mac_address, station in self._stations.items() ] - schema: vol.Schema = vol.Schema( + schema: probatio.Schema = probatio.Schema( { - vol.Required(CONF_STATION): SelectSelector( + probatio.Required(CONF_STATION): SelectSelector( SelectSelectorConfig(options=options, multiple=False, sort=True), ) } diff --git a/homeassistant/components/ambient_station/config_flow.py b/homeassistant/components/ambient_station/config_flow.py index 6bcbfbcb93438..f3425bc353b7b 100644 --- a/homeassistant/components/ambient_station/config_flow.py +++ b/homeassistant/components/ambient_station/config_flow.py @@ -4,7 +4,7 @@ from aioambient import API from aioambient.errors import AmbientError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY @@ -20,8 +20,8 @@ class AmbientStationFlowHandler(ConfigFlow, domain=DOMAIN): def __init__(self) -> None: """Initialize the config flow.""" - self.data_schema = vol.Schema( - {vol.Required(CONF_API_KEY): str, vol.Required(CONF_APP_KEY): str} + self.data_schema = probatio.Schema( + {probatio.Required(CONF_API_KEY): str, probatio.Required(CONF_APP_KEY): str} ) async def _show_form(self, errors: dict | None = None) -> ConfigFlowResult: diff --git a/homeassistant/components/amcrest/__init__.py b/homeassistant/components/amcrest/__init__.py index 361fbb0d85e03..693b858c1560d 100644 --- a/homeassistant/components/amcrest/__init__.py +++ b/homeassistant/components/amcrest/__init__.py @@ -12,7 +12,7 @@ import aiohttp from amcrest import AmcrestError, ApiWrapper, LoginError import httpx -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_AUTHENTICATION, @@ -75,47 +75,47 @@ def _has_unique_names(devices: list[dict[str, Any]]) -> list[dict[str, Any]]: names = [device[CONF_NAME] for device in devices] - vol.Schema(vol.Unique())(names) + probatio.Schema(probatio.Unique())(names) return devices -AMCREST_SCHEMA = vol.Schema( +AMCREST_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_AUTHENTICATION, default=HTTP_BASIC_AUTHENTICATION): vol.All( - vol.In(AUTHENTICATION_LIST) + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional( + CONF_AUTHENTICATION, default=HTTP_BASIC_AUTHENTICATION + ): probatio.All(probatio.In(AUTHENTICATION_LIST)), + probatio.Optional(CONF_RESOLUTION, default=DEFAULT_RESOLUTION): probatio.All( + probatio.In(RESOLUTION_LIST) ), - vol.Optional(CONF_RESOLUTION, default=DEFAULT_RESOLUTION): vol.All( - vol.In(RESOLUTION_LIST) - ), - vol.Optional(CONF_STREAM_SOURCE, default=STREAM_SOURCE_LIST[0]): vol.All( - vol.In(STREAM_SOURCE_LIST) - ), - vol.Optional(CONF_FFMPEG_ARGUMENTS, default=DEFAULT_ARGUMENTS): cv.string, - vol.Optional(CONF_SCAN_INTERVAL, default=SCAN_INTERVAL): cv.time_period, - vol.Optional(CONF_BINARY_SENSORS): vol.All( + probatio.Optional( + CONF_STREAM_SOURCE, default=STREAM_SOURCE_LIST[0] + ): probatio.All(probatio.In(STREAM_SOURCE_LIST)), + probatio.Optional(CONF_FFMPEG_ARGUMENTS, default=DEFAULT_ARGUMENTS): cv.string, + probatio.Optional(CONF_SCAN_INTERVAL, default=SCAN_INTERVAL): cv.time_period, + probatio.Optional(CONF_BINARY_SENSORS): probatio.All( cv.ensure_list, - [vol.In(BINARY_SENSOR_KEYS)], - vol.Unique(), + [probatio.In(BINARY_SENSOR_KEYS)], + probatio.Unique(), check_binary_sensors, ), - vol.Optional(CONF_SWITCHES): vol.All( - cv.ensure_list, [vol.In(SWITCH_KEYS)], vol.Unique() + probatio.Optional(CONF_SWITCHES): probatio.All( + cv.ensure_list, [probatio.In(SWITCH_KEYS)], probatio.Unique() ), - vol.Optional(CONF_SENSORS): vol.All( - cv.ensure_list, [vol.In(SENSOR_KEYS)], vol.Unique() + probatio.Optional(CONF_SENSORS): probatio.All( + cv.ensure_list, [probatio.In(SENSOR_KEYS)], probatio.Unique() ), - vol.Optional(CONF_CONTROL_LIGHT, default=True): cv.boolean, + probatio.Optional(CONF_CONTROL_LIGHT, default=True): cv.boolean, } ) -CONFIG_SCHEMA = vol.Schema( - {DOMAIN: vol.All(cv.ensure_list, [AMCREST_SCHEMA], _has_unique_names)}, - extra=vol.ALLOW_EXTRA, +CONFIG_SCHEMA = probatio.Schema( + {DOMAIN: probatio.All(cv.ensure_list, [AMCREST_SCHEMA], _has_unique_names)}, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/amcrest/binary_sensor.py b/homeassistant/components/amcrest/binary_sensor.py index 2f3cef093e57c..581a6192d4148 100644 --- a/homeassistant/components/amcrest/binary_sensor.py +++ b/homeassistant/components/amcrest/binary_sensor.py @@ -7,7 +7,7 @@ from typing import TYPE_CHECKING, override from amcrest import AmcrestError -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import ( BinarySensorDeviceClass, @@ -125,7 +125,7 @@ def check_binary_sensors(value: list[str]) -> list[str]: """Validate binary sensor configurations.""" for exclusive_options in _EXCLUSIVE_OPTIONS: if len(set(value) & exclusive_options) > 1: - raise vol.Invalid( + raise probatio.Invalid( f"must contain at most one of {', '.join(exclusive_options)}." ) return value diff --git a/homeassistant/components/amcrest/services.py b/homeassistant/components/amcrest/services.py index 187f3f299cc6c..24930d0d5a793 100644 --- a/homeassistant/components/amcrest/services.py +++ b/homeassistant/components/amcrest/services.py @@ -1,6 +1,6 @@ """Services for Amcrest IP cameras.""" -import voluptuous as vol +import probatio from homeassistant.components.camera import DOMAIN as CAMERA_DOMAIN from homeassistant.core import HomeAssistant, callback @@ -41,7 +41,11 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, "goto_preset", entity_domain=CAMERA_DOMAIN, - schema={vol.Required(_ATTR_PRESET): vol.All(vol.Coerce(int), vol.Range(min=1))}, + schema={ + probatio.Required(_ATTR_PRESET): probatio.All( + probatio.Coerce(int), probatio.Range(min=1) + ) + }, func="async_goto_preset", ) service.async_register_platform_entity_service( @@ -49,7 +53,7 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, "set_color_bw", entity_domain=CAMERA_DOMAIN, - schema={vol.Required(ATTR_COLOR_BW): vol.In(CBW)}, + schema={probatio.Required(ATTR_COLOR_BW): probatio.In(CBW)}, func="async_set_color_bw", ) service.async_register_platform_entity_service( @@ -58,8 +62,8 @@ def async_setup_services(hass: HomeAssistant) -> None: "ptz_control", entity_domain=CAMERA_DOMAIN, schema={ - vol.Required(_ATTR_PTZ_MOV): vol.In(MOV), - vol.Optional(_ATTR_PTZ_TT, default=_DEFAULT_TT): cv.small_float, + probatio.Required(_ATTR_PTZ_MOV): probatio.In(MOV), + probatio.Optional(_ATTR_PTZ_TT, default=_DEFAULT_TT): cv.small_float, }, func="async_ptz_control", ) diff --git a/homeassistant/components/analytics/__init__.py b/homeassistant/components/analytics/__init__.py index 2cbf3497d1d98..14afacd66c161 100644 --- a/homeassistant/components/analytics/__init__.py +++ b/homeassistant/components/analytics/__init__.py @@ -2,7 +2,7 @@ from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import labs, websocket_api from homeassistant.components.hassio import HassioNotReadyError @@ -41,15 +41,15 @@ CONF_SNAPSHOTS_URL = "snapshots_url" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Optional(CONF_SNAPSHOTS_URL): vol.Any(str, None), + probatio.Optional(CONF_SNAPSHOTS_URL): probatio.Any(str, None), } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) DATA_COMPONENT: HassKey[Analytics] = HassKey(DOMAIN) @@ -123,7 +123,7 @@ async def start_schedule(hass: HomeAssistant) -> None: @callback @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required("type"): "analytics"}) +@websocket_api.websocket_command({probatio.Required("type"): "analytics"}) def websocket_analytics( hass: HomeAssistant, connection: websocket_api.connection.ActiveConnection, @@ -142,8 +142,8 @@ def websocket_analytics( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "analytics/preferences", - vol.Required("preferences", default={}): PREFERENCE_SCHEMA, + probatio.Required("type"): "analytics/preferences", + probatio.Required("preferences", default={}): PREFERENCE_SCHEMA, } ) @websocket_api.async_response diff --git a/homeassistant/components/analytics/const.py b/homeassistant/components/analytics/const.py index 0396399811a7f..683fcf01851f3 100644 --- a/homeassistant/components/analytics/const.py +++ b/homeassistant/components/analytics/const.py @@ -3,7 +3,7 @@ from datetime import timedelta import logging -import voluptuous as vol +import probatio DOMAIN = "analytics" INTERVAL = timedelta(days=1) @@ -53,12 +53,12 @@ ATTR_VERSION = "version" -PREFERENCE_SCHEMA = vol.Schema( +PREFERENCE_SCHEMA = probatio.Schema( { - vol.Optional(ATTR_BASE): bool, - vol.Optional(ATTR_SNAPSHOTS): bool, - vol.Optional(ATTR_DIAGNOSTICS): bool, - vol.Optional(ATTR_STATISTICS): bool, - vol.Optional(ATTR_USAGE): bool, + probatio.Optional(ATTR_BASE): bool, + probatio.Optional(ATTR_SNAPSHOTS): bool, + probatio.Optional(ATTR_DIAGNOSTICS): bool, + probatio.Optional(ATTR_STATISTICS): bool, + probatio.Optional(ATTR_USAGE): bool, } ) diff --git a/homeassistant/components/analytics_insights/config_flow.py b/homeassistant/components/analytics_insights/config_flow.py index 81344b1e84161..17ffdcdc2750c 100644 --- a/homeassistant/components/analytics_insights/config_flow.py +++ b/homeassistant/components/analytics_insights/config_flow.py @@ -2,12 +2,12 @@ from typing import Any, override +import probatio from python_homeassistant_analytics import ( HomeassistantAnalyticsClient, HomeassistantAnalyticsConnectionError, ) from python_homeassistant_analytics.models import Environment, IntegrationType -import voluptuous as vol from homeassistant.config_entries import ( ConfigFlow, @@ -107,23 +107,23 @@ async def async_step_user( return self.async_show_form( step_id="user", errors=errors, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional(CONF_TRACKED_APPS): SelectSelector( + probatio.Optional(CONF_TRACKED_APPS): SelectSelector( SelectSelectorConfig( options=list(apps), multiple=True, sort=True, ) ), - vol.Optional(CONF_TRACKED_INTEGRATIONS): SelectSelector( + probatio.Optional(CONF_TRACKED_INTEGRATIONS): SelectSelector( SelectSelectorConfig( options=options, multiple=True, sort=True, ) ), - vol.Optional(CONF_TRACKED_CUSTOM_INTEGRATIONS): SelectSelector( + probatio.Optional(CONF_TRACKED_CUSTOM_INTEGRATIONS): SelectSelector( SelectSelectorConfig( options=list(custom_integrations), multiple=True, @@ -189,23 +189,25 @@ async def async_step_init( step_id="init", errors=errors, data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Optional(CONF_TRACKED_APPS): SelectSelector( + probatio.Optional(CONF_TRACKED_APPS): SelectSelector( SelectSelectorConfig( options=list(apps), multiple=True, sort=True, ) ), - vol.Optional(CONF_TRACKED_INTEGRATIONS): SelectSelector( + probatio.Optional(CONF_TRACKED_INTEGRATIONS): SelectSelector( SelectSelectorConfig( options=options, multiple=True, sort=True, ) ), - vol.Optional(CONF_TRACKED_CUSTOM_INTEGRATIONS): SelectSelector( + probatio.Optional( + CONF_TRACKED_CUSTOM_INTEGRATIONS + ): SelectSelector( SelectSelectorConfig( options=list(custom_integrations), multiple=True, diff --git a/homeassistant/components/android_ip_webcam/config_flow.py b/homeassistant/components/android_ip_webcam/config_flow.py index 51913f2f76277..6387470693aef 100644 --- a/homeassistant/components/android_ip_webcam/config_flow.py +++ b/homeassistant/components/android_ip_webcam/config_flow.py @@ -2,9 +2,9 @@ from typing import Any, override +import probatio from pydroid_ipcam import PyDroidIPCam from pydroid_ipcam.exceptions import PyDroidIPCamException, Unauthorized -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_PORT, CONF_USERNAME @@ -14,12 +14,12 @@ from .const import DEFAULT_PORT, DOMAIN -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Inclusive(CONF_USERNAME, "authentication"): str, - vol.Inclusive(CONF_PASSWORD, "authentication"): str, + probatio.Required(CONF_HOST): str, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Inclusive(CONF_USERNAME, "authentication"): str, + probatio.Inclusive(CONF_PASSWORD, "authentication"): str, } ) diff --git a/homeassistant/components/androidtv/config_flow.py b/homeassistant/components/androidtv/config_flow.py index b55f8bd5ccee6..4db81221833ff 100644 --- a/homeassistant/components/androidtv/config_flow.py +++ b/homeassistant/components/androidtv/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from androidtv import state_detection_rules_validator -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -86,10 +86,12 @@ def _show_setup_form( ) -> ConfigFlowResult: """Show the setup form to the user.""" host = user_input.get(CONF_HOST, "") if user_input else "" - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_HOST, default=host): str, - vol.Required(CONF_DEVICE_CLASS, default=DEVICE_AUTO): SelectSelector( + probatio.Required(CONF_HOST, default=host): str, + probatio.Required( + CONF_DEVICE_CLASS, default=DEVICE_AUTO + ): SelectSelector( SelectSelectorConfig( options=[ SelectOptionDict(value=k, label=v) @@ -98,13 +100,13 @@ def _show_setup_form( translation_key="device_class", ) ), - vol.Required(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Required(CONF_MORE_OPTIONS): section( - vol.Schema( + probatio.Required(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Required(CONF_MORE_OPTIONS): section( + probatio.Schema( { - vol.Optional(CONF_ADBKEY): str, - vol.Optional(CONF_ADB_SERVER_IP): str, - vol.Optional( + probatio.Optional(CONF_ADBKEY): str, + probatio.Optional(CONF_ADB_SERVER_IP): str, + probatio.Optional( CONF_ADB_SERVER_PORT, default=DEFAULT_ADB_SERVER_PORT, ): cv.port, @@ -251,40 +253,40 @@ def _async_init_form(self) -> ConfigFlowResult: rules = [RULES_NEW_ID, *self._state_det_rules] options = self.config_entry.options - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Optional(CONF_APPS): SelectSelector( + probatio.Optional(CONF_APPS): SelectSelector( SelectSelectorConfig(options=apps, mode=SelectSelectorMode.DROPDOWN) ), - vol.Optional( + probatio.Optional( CONF_GET_SOURCES, default=options.get(CONF_GET_SOURCES, DEFAULT_GET_SOURCES), ): bool, - vol.Optional( + probatio.Optional( CONF_EXCLUDE_UNNAMED_APPS, default=options.get( CONF_EXCLUDE_UNNAMED_APPS, DEFAULT_EXCLUDE_UNNAMED_APPS ), ): bool, - vol.Required( + probatio.Required( CONF_SCREENCAP_INTERVAL, default=options.get( CONF_SCREENCAP_INTERVAL, DEFAULT_SCREENCAP_INTERVAL ), - ): vol.All(vol.Coerce(int), vol.Clamp(min=0, max=15)), - vol.Optional( + ): probatio.All(probatio.Coerce(int), probatio.Clamp(min=0, max=15)), + probatio.Optional( CONF_TURN_OFF_COMMAND, description={ "suggested_value": options.get(CONF_TURN_OFF_COMMAND, "") }, ): str, - vol.Optional( + probatio.Optional( CONF_TURN_ON_COMMAND, description={ "suggested_value": options.get(CONF_TURN_ON_COMMAND, "") }, ): str, - vol.Optional(CONF_STATE_DETECTION_RULES): SelectSelector( + probatio.Optional(CONF_STATE_DETECTION_RULES): SelectSelector( SelectSelectorConfig( options=rules, mode=SelectSelectorMode.DROPDOWN ) @@ -316,16 +318,18 @@ async def async_step_apps( def _async_apps_form(self, app_id: str) -> ConfigFlowResult: """Return configuration form for apps.""" app_schema = { - vol.Optional( + probatio.Optional( CONF_APP_NAME, description={"suggested_value": self._apps.get(app_id, "")}, ): str, } if app_id == APPS_NEW_ID: - data_schema = vol.Schema({**app_schema, vol.Optional(CONF_APP_ID): str}) + data_schema = probatio.Schema( + {**app_schema, probatio.Optional(CONF_APP_ID): str} + ) else: - data_schema = vol.Schema( - {**app_schema, vol.Optional(CONF_APP_DELETE, default=False): bool} + data_schema = probatio.Schema( + {**app_schema, probatio.Optional(CONF_APP_DELETE, default=False): bool} ) return self.async_show_form( @@ -367,17 +371,23 @@ def _async_rules_form( ) -> ConfigFlowResult: """Return configuration form for detection rules.""" rule_schema = { - vol.Optional( + probatio.Optional( CONF_RULE_VALUES, default=self._state_det_rules.get(rule_id) ): ObjectSelector() } if rule_id == RULES_NEW_ID: - data_schema = vol.Schema( - {vol.Optional(CONF_RULE_ID, default=default_id): str, **rule_schema} + data_schema = probatio.Schema( + { + probatio.Optional(CONF_RULE_ID, default=default_id): str, + **rule_schema, + } ) else: - data_schema = vol.Schema( - {**rule_schema, vol.Optional(CONF_RULE_DELETE, default=False): bool} + data_schema = probatio.Schema( + { + **rule_schema, + probatio.Optional(CONF_RULE_DELETE, default=False): bool, + } ) return self.async_show_form( diff --git a/homeassistant/components/androidtv/services.py b/homeassistant/components/androidtv/services.py index 1788235f84919..121ea0e9672f0 100644 --- a/homeassistant/components/androidtv/services.py +++ b/homeassistant/components/androidtv/services.py @@ -1,6 +1,6 @@ """Services for Android/Fire TV devices.""" -import voluptuous as vol +import probatio from homeassistant.components.media_player import DOMAIN as MEDIA_PLAYER_DOMAIN from homeassistant.const import ATTR_COMMAND @@ -24,7 +24,7 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, "adb_command", entity_domain=MEDIA_PLAYER_DOMAIN, - schema={vol.Required(ATTR_COMMAND): cv.string}, + schema={probatio.Required(ATTR_COMMAND): cv.string}, func="adb_command", supports_response=SupportsResponse.OPTIONAL, ) @@ -42,8 +42,8 @@ def async_setup_services(hass: HomeAssistant) -> None: "download", entity_domain=MEDIA_PLAYER_DOMAIN, schema={ - vol.Required(ATTR_DEVICE_PATH): cv.string, - vol.Required(ATTR_LOCAL_PATH): cv.string, + probatio.Required(ATTR_DEVICE_PATH): cv.string, + probatio.Required(ATTR_LOCAL_PATH): cv.string, }, func="service_download", ) @@ -53,8 +53,8 @@ def async_setup_services(hass: HomeAssistant) -> None: "upload", entity_domain=MEDIA_PLAYER_DOMAIN, schema={ - vol.Required(ATTR_DEVICE_PATH): cv.string, - vol.Required(ATTR_LOCAL_PATH): cv.string, + probatio.Required(ATTR_DEVICE_PATH): cv.string, + probatio.Required(ATTR_LOCAL_PATH): cv.string, }, func="service_upload", ) diff --git a/homeassistant/components/androidtv_remote/config_flow.py b/homeassistant/components/androidtv_remote/config_flow.py index d1a48698b65df..08855f580563b 100644 --- a/homeassistant/components/androidtv_remote/config_flow.py +++ b/homeassistant/components/androidtv_remote/config_flow.py @@ -10,7 +10,7 @@ ConnectionClosed, InvalidAuth, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -44,9 +44,9 @@ f"https://play.google.com/store/apps/details?id={_EXAMPLE_APP_ID}" ) -STEP_PAIR_DATA_SCHEMA = vol.Schema( +STEP_PAIR_DATA_SCHEMA = probatio.Schema( { - vol.Required("pin"): str, + probatio.Required("pin"): str, } ) @@ -96,13 +96,13 @@ async def async_step_user( errors["base"] = "cannot_connect" else: user_input = {} - default_host = user_input.get(CONF_HOST, vol.UNDEFINED) + default_host = user_input.get(CONF_HOST, probatio.UNDEFINED) if self.source == SOURCE_RECONFIGURE: default_host = self._get_reconfigure_entry().data[CONF_HOST] return self.async_show_form( step_id="reconfigure" if self.source == SOURCE_RECONFIGURE else "user", - data_schema=vol.Schema( - {vol.Required(CONF_HOST, default=default_host): str} + data_schema=probatio.Schema( + {probatio.Required(CONF_HOST, default=default_host): str} ), errors=errors, ) @@ -293,16 +293,16 @@ async def async_step_init( ] return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional(CONF_APPS): SelectSelector( + probatio.Optional(CONF_APPS): SelectSelector( SelectSelectorConfig( options=apps, mode=SelectSelectorMode.DROPDOWN, translation_key="apps", ) ), - vol.Required( + probatio.Required( CONF_ENABLE_IME, default=get_enable_ime(self.config_entry), ): bool, @@ -336,7 +336,7 @@ def _async_apps_form(self, app_id: str) -> ConfigFlowResult: """Return configuration form for apps.""" app_schema = { - vol.Optional( + probatio.Optional( CONF_APP_NAME, description={ "suggested_value": self._apps[app_id].get(CONF_APP_NAME, "") @@ -344,7 +344,7 @@ def _async_apps_form(self, app_id: str) -> ConfigFlowResult: else "" }, ): str, - vol.Optional( + probatio.Optional( CONF_APP_ICON, description={ "suggested_value": self._apps[app_id].get(CONF_APP_ICON, "") @@ -354,10 +354,12 @@ def _async_apps_form(self, app_id: str) -> ConfigFlowResult: ): str, } if app_id == APPS_NEW_ID: - data_schema = vol.Schema({**app_schema, vol.Optional(CONF_APP_ID): str}) + data_schema = probatio.Schema( + {**app_schema, probatio.Optional(CONF_APP_ID): str} + ) else: - data_schema = vol.Schema( - {**app_schema, vol.Optional(CONF_APP_DELETE, default=False): bool} + data_schema = probatio.Schema( + {**app_schema, probatio.Optional(CONF_APP_DELETE, default=False): bool} ) return self.async_show_form( diff --git a/homeassistant/components/anel_pwrctrl/switch.py b/homeassistant/components/anel_pwrctrl/switch.py index 66c1bb0e711db..5d9580b60adee 100644 --- a/homeassistant/components/anel_pwrctrl/switch.py +++ b/homeassistant/components/anel_pwrctrl/switch.py @@ -5,7 +5,7 @@ from typing import Any, override from anel_pwrctrl import Device, DeviceMaster, Switch -import voluptuous as vol +import probatio from homeassistant.components.switch import ( PLATFORM_SCHEMA as SWITCH_PLATFORM_SCHEMA, @@ -27,11 +27,11 @@ PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_PORT_RECV): cv.port, - vol.Required(CONF_PORT_SEND): cv.port, - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_HOST): cv.string, + probatio.Required(CONF_PORT_RECV): cv.port, + probatio.Required(CONF_PORT_SEND): cv.port, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_HOST): cv.string, } ) diff --git a/homeassistant/components/anglian_water/config_flow.py b/homeassistant/components/anglian_water/config_flow.py index 971e663f6101f..0fb501d758065 100644 --- a/homeassistant/components/anglian_water/config_flow.py +++ b/homeassistant/components/anglian_water/config_flow.py @@ -4,6 +4,7 @@ from typing import TYPE_CHECKING, Any, override from aiohttp import CookieJar +import probatio from pyanglianwater import AnglianWater from pyanglianwater.auth import MSOB2CAuth from pyanglianwater.exceptions import ( @@ -13,7 +14,6 @@ SelfAssertedError, SmartMeterUnavailableError, ) -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -29,18 +29,18 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): selector.TextSelector(), - vol.Required(CONF_PASSWORD): selector.TextSelector( + probatio.Required(CONF_USERNAME): selector.TextSelector(), + probatio.Required(CONF_PASSWORD): selector.TextSelector( selector.TextSelectorConfig(type=selector.TextSelectorType.PASSWORD) ), } ) -STEP_MFA_DATA_SCHEMA = vol.Schema( +STEP_MFA_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_CODE): selector.TextSelector(), + probatio.Required(CONF_CODE): selector.TextSelector(), } ) @@ -179,9 +179,9 @@ async def async_step_select_account( return await self.async_step_complete(user_input) return self.async_show_form( step_id="select_account", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_ACCOUNT_NUMBER): selector.SelectSelector( + probatio.Required(CONF_ACCOUNT_NUMBER): selector.SelectSelector( selector.SelectSelectorConfig( options=self.accounts, multiple=False, diff --git a/homeassistant/components/anova/config_flow.py b/homeassistant/components/anova/config_flow.py index 84968b88722bc..3c58cdd967d01 100644 --- a/homeassistant/components/anova/config_flow.py +++ b/homeassistant/components/anova/config_flow.py @@ -4,7 +4,7 @@ from typing import override from anova_wifi import AnovaApi, InvalidLogin -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -53,8 +53,11 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_USERNAME): str, vol.Required(CONF_PASSWORD): str} + data_schema=probatio.Schema( + { + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + } ), errors=errors, ) diff --git a/homeassistant/components/anthemav/config_flow.py b/homeassistant/components/anthemav/config_flow.py index dd7dfbb17f57f..9121b259e6b1f 100644 --- a/homeassistant/components/anthemav/config_flow.py +++ b/homeassistant/components/anthemav/config_flow.py @@ -6,7 +6,7 @@ import anthemav from anthemav.connection import Connection from anthemav.device_error import DeviceError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_MAC, CONF_MODEL, CONF_PORT @@ -17,10 +17,10 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, } ) diff --git a/homeassistant/components/anthropic/config_flow.py b/homeassistant/components/anthropic/config_flow.py index 7baecd07347f5..dc29978ce54e4 100644 --- a/homeassistant/components/anthropic/config_flow.py +++ b/homeassistant/components/anthropic/config_flow.py @@ -6,8 +6,7 @@ from typing import TYPE_CHECKING, Any, cast, override import anthropic -from probatio import to_openapi -import voluptuous as vol +import probatio from homeassistant.components.zone import ENTITY_ID_HOME from homeassistant.config_entries import ( @@ -71,9 +70,9 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_KEY): str, + probatio.Required(CONF_API_KEY): str, } ) @@ -250,13 +249,13 @@ async def async_step_init( default_name = DEFAULT_AI_TASK_NAME else: default_name = DEFAULT_CONVERSATION_NAME - step_schema[vol.Required(CONF_NAME, default=default_name)] = str + step_schema[probatio.Required(CONF_NAME, default=default_name)] = str if self._subentry_type == "conversation": step_schema.update( { - vol.Optional(CONF_PROMPT): TemplateSelector(), - vol.Optional( + probatio.Optional(CONF_PROMPT): TemplateSelector(), + probatio.Optional( CONF_LLM_HASS_API, ): SelectSelector( SelectSelectorConfig(options=hass_apis, multiple=True) @@ -265,7 +264,7 @@ async def async_step_init( ) step_schema[ - vol.Required( + probatio.Required( CONF_RECOMMENDED, default=self.options.get(CONF_RECOMMENDED, False) ) ] = bool @@ -299,7 +298,7 @@ async def async_step_init( return self.async_show_form( step_id="init", data_schema=self.add_suggested_values_to_schema( - vol.Schema(step_schema), self.options + probatio.Schema(step_schema), self.options ), errors=errors or None, ) @@ -312,13 +311,13 @@ async def async_step_additional( description_placeholders: dict[str, str] = {} step_schema: VolDictType = { - vol.Optional( + probatio.Optional( CONF_CHAT_MODEL, default=DEFAULT[CONF_CHAT_MODEL], ): SelectSelector( SelectSelectorConfig(options=self._get_model_list(), custom_value=True) ), - vol.Optional( + probatio.Optional( CONF_PROMPT_CACHING, default=DEFAULT[CONF_PROMPT_CACHING], ): SelectSelector( @@ -358,7 +357,7 @@ async def async_step_additional( return self.async_show_form( step_id="additional", data_schema=self.add_suggested_values_to_schema( - vol.Schema(step_schema), self.options + probatio.Schema(step_schema), self.options ), errors=errors, description_placeholders=description_placeholders, @@ -371,14 +370,14 @@ async def async_step_model( errors: dict[str, str] = {} step_schema: VolDictType = { - vol.Optional( + probatio.Optional( CONF_MAX_TOKENS, default=DEFAULT[CONF_MAX_TOKENS], - ): vol.All( + ): probatio.All( NumberSelector( NumberSelectorConfig(min=0, max=self.model_info.max_tokens) ), - vol.Coerce(int), + probatio.Coerce(int), ) if self.model_info.max_tokens else cv.positive_int, @@ -390,15 +389,15 @@ async def async_step_model( and not self.model_info.capabilities.thinking.types.adaptive.supported ): step_schema[ - vol.Optional( + probatio.Optional( CONF_THINKING_BUDGET, default=DEFAULT[CONF_THINKING_BUDGET] ) ] = ( - vol.All( + probatio.All( NumberSelector( NumberSelectorConfig(min=0, max=self.model_info.max_tokens) ), - vol.Coerce(int), + probatio.Coerce(int), ) if self.model_info.max_tokens else cv.positive_int @@ -424,7 +423,7 @@ async def async_step_model( if effort_capability.max.supported: effort_options.append("max") step_schema[ - vol.Optional( + probatio.Optional( CONF_THINKING_EFFORT, default=DEFAULT[CONF_THINKING_EFFORT], ) @@ -440,27 +439,27 @@ async def async_step_model( step_schema.update( { - vol.Optional( + probatio.Optional( CONF_CODE_EXECUTION, default=DEFAULT[CONF_CODE_EXECUTION], ): bool, - vol.Optional( + probatio.Optional( CONF_WEB_SEARCH, default=DEFAULT[CONF_WEB_SEARCH], ): bool, - vol.Optional( + probatio.Optional( CONF_WEB_SEARCH_MAX_USES, default=DEFAULT[CONF_WEB_SEARCH_MAX_USES], ): cv.positive_int, - vol.Optional( + probatio.Optional( CONF_WEB_SEARCH_USER_LOCATION, default=DEFAULT[CONF_WEB_SEARCH_USER_LOCATION], ): bool, - vol.Optional( + probatio.Optional( CONF_WEB_FETCH, default=DEFAULT[CONF_WEB_FETCH], ): bool, - vol.Optional( + probatio.Optional( CONF_WEB_FETCH_MAX_USES, default=DEFAULT[CONF_WEB_FETCH_MAX_USES], ): cv.positive_int, @@ -476,7 +475,7 @@ async def async_step_model( if not model.startswith(tuple(TOOL_SEARCH_UNSUPPORTED_MODELS)): step_schema[ - vol.Optional( + probatio.Optional( CONF_TOOL_SEARCH, default=DEFAULT[CONF_TOOL_SEARCH], ) @@ -523,7 +522,7 @@ async def async_step_model( return self.async_show_form( step_id="model", data_schema=self.add_suggested_values_to_schema( - vol.Schema(step_schema), self.options + probatio.Schema(step_schema), self.options ), errors=errors or None, last_step=True, @@ -548,15 +547,15 @@ async def _get_location_data(self) -> dict[str, str]: client = await async_create_client( self.hass, self._get_entry().data[CONF_API_KEY] ) - location_schema = vol.Schema( + location_schema = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_WEB_SEARCH_CITY, description=( "Free text input for the city, e.g. `San Francisco`" ), ): str, - vol.Optional( + probatio.Optional( CONF_WEB_SEARCH_REGION, description="Free text input for the region, e.g. `California`", ): str, @@ -577,7 +576,9 @@ async def _get_location_data(self) -> dict[str, str]: "format": { "type": "json_schema", "schema": { - **to_openapi(location_schema, openapi_version="3.1.0"), + **probatio.to_openapi( + location_schema, openapi_version="3.1.0" + ), "additionalProperties": False, }, } diff --git a/homeassistant/components/anthropic/entity.py b/homeassistant/components/anthropic/entity.py index 7f079e17c9892..87a4340016f1a 100644 --- a/homeassistant/components/anthropic/entity.py +++ b/homeassistant/components/anthropic/entity.py @@ -103,8 +103,7 @@ from anthropic.types.web_fetch_tool_result_block_param import ( Content as WebFetchToolResultBlockParamContentParam, ) -from probatio import to_openapi -import voluptuous as vol +import probatio from homeassistant.components import conversation from homeassistant.config_entries import ConfigSubentry @@ -150,7 +149,7 @@ def _format_tool( ) -> ToolParam: """Format tool specification.""" unsupported_keys = {"oneOf", "anyOf", "allOf"} - schema = to_openapi( + schema = probatio.to_openapi( tool.parameters, custom_serializer=custom_serializer, openapi_version="3.1.0" ) schema = {k: v for k, v in schema.items() if k not in unsupported_keys} @@ -929,7 +928,7 @@ async def _get_model_args( # noqa: C901 self, chat_log: conversation.ChatLog, structure_name: str | None = None, - structure: vol.Schema | None = None, + structure: probatio.Schema | None = None, ) -> tuple[MessageCreateParamsStreaming, str | None]: """Get the model arguments.""" options: dict[str, Any] = DEFAULT | self.subentry.data @@ -1111,7 +1110,7 @@ async def _get_model_args( # noqa: C901 ] = JSONOutputFormatParam( type="json_schema", schema={ - **to_openapi( + **probatio.to_openapi( structure, custom_serializer=chat_log.llm_api.custom_serializer if chat_log.llm_api @@ -1160,7 +1159,7 @@ async def _get_model_args( # noqa: C901 ToolParam( name=structure_name, description="Use this tool to reply to the user", - input_schema=to_openapi( + input_schema=probatio.to_openapi( structure, custom_serializer=chat_log.llm_api.custom_serializer if chat_log.llm_api @@ -1191,7 +1190,7 @@ async def _async_handle_chat_log( self, chat_log: conversation.ChatLog, structure_name: str | None = None, - structure: vol.Schema | None = None, + structure: probatio.Schema | None = None, max_iterations: int = MAX_TOOL_ITERATIONS, ) -> None: """Generate an answer for the chat log.""" diff --git a/homeassistant/components/anthropic/repairs.py b/homeassistant/components/anthropic/repairs.py index d16dd8a9bd600..a7dc921eab1a2 100644 --- a/homeassistant/components/anthropic/repairs.py +++ b/homeassistant/components/anthropic/repairs.py @@ -5,7 +5,7 @@ import anthropic from anthropic.resources.messages.messages import DEPRECATED_MODELS -import voluptuous as vol +import probatio from homeassistant.components.repairs import RepairsFlow, RepairsFlowResult from homeassistant.config_entries import ConfigEntryState, ConfigSubentry @@ -81,12 +81,12 @@ async def async_step_init( reverse=True, ) ), - vol.UNDEFINED, + probatio.UNDEFINED, ) - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required( + probatio.Required( CONF_CHAT_MODEL, default=suggested_model, ): SelectSelector( diff --git a/homeassistant/components/aosmith/config_flow.py b/homeassistant/components/aosmith/config_flow.py index 70f48a549efe6..d31fff60c7fef 100644 --- a/homeassistant/components/aosmith/config_flow.py +++ b/homeassistant/components/aosmith/config_flow.py @@ -4,8 +4,8 @@ import logging from typing import Any, override +import probatio from py_aosmith import AOSmithAPIClient, AOSmithInvalidCredentialsException -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_EMAIL, CONF_PASSWORD @@ -63,10 +63,10 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_EMAIL): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_EMAIL): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, @@ -97,7 +97,7 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema({vol.Required(CONF_PASSWORD): str}), + data_schema=probatio.Schema({probatio.Required(CONF_PASSWORD): str}), description_placeholders={CONF_EMAIL: self._reauth_email}, errors=errors, ) diff --git a/homeassistant/components/apache_kafka/__init__.py b/homeassistant/components/apache_kafka/__init__.py index c8f8d50a6a18e..76a2d868d9322 100644 --- a/homeassistant/components/apache_kafka/__init__.py +++ b/homeassistant/components/apache_kafka/__init__.py @@ -5,7 +5,7 @@ from typing import Any, Literal, override from aiokafka import AIOKafkaProducer -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_IP_ADDRESS, @@ -27,23 +27,23 @@ CONF_TOPIC = "topic" CONF_SECURITY_PROTOCOL = "security_protocol" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_IP_ADDRESS): cv.string, - vol.Required(CONF_PORT): cv.port, - vol.Required(CONF_TOPIC): cv.string, - vol.Optional(CONF_FILTER, default={}): FILTER_SCHEMA, - vol.Optional(CONF_SECURITY_PROTOCOL, default="PLAINTEXT"): vol.In( - ["PLAINTEXT", "SSL", "SASL_SSL"] - ), - vol.Optional(CONF_USERNAME): cv.string, - vol.Optional(CONF_PASSWORD): cv.string, + probatio.Required(CONF_IP_ADDRESS): cv.string, + probatio.Required(CONF_PORT): cv.port, + probatio.Required(CONF_TOPIC): cv.string, + probatio.Optional(CONF_FILTER, default={}): FILTER_SCHEMA, + probatio.Optional( + CONF_SECURITY_PROTOCOL, default="PLAINTEXT" + ): probatio.In(["PLAINTEXT", "SSL", "SASL_SSL"]), + probatio.Optional(CONF_USERNAME): cv.string, + probatio.Optional(CONF_PASSWORD): cv.string, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/apcupsd/config_flow.py b/homeassistant/components/apcupsd/config_flow.py index 623d55e3f5c71..18462e669f30e 100644 --- a/homeassistant/components/apcupsd/config_flow.py +++ b/homeassistant/components/apcupsd/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override import aioapcaccess -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PORT @@ -13,19 +13,19 @@ from .const import CONNECTION_TIMEOUT, DOMAIN from .coordinator import APCUPSdData -_PORT_SELECTOR = vol.All( +_PORT_SELECTOR = probatio.All( selector.NumberSelector( selector.NumberSelectorConfig( min=1, max=65535, mode=selector.NumberSelectorMode.BOX ), ), - vol.Coerce(int), + probatio.Coerce(int), ) -_SCHEMA = vol.Schema( +_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST, default="localhost"): cv.string, - vol.Required(CONF_PORT, default=3551): _PORT_SELECTOR, + probatio.Required(CONF_HOST, default="localhost"): cv.string, + probatio.Required(CONF_PORT, default=3551): _PORT_SELECTOR, } ) diff --git a/homeassistant/components/api/__init__.py b/homeassistant/components/api/__init__.py index 5b1d161112244..a66f75403c21c 100644 --- a/homeassistant/components/api/__init__.py +++ b/homeassistant/components/api/__init__.py @@ -9,7 +9,7 @@ from aiohttp import web from aiohttp.web_exceptions import HTTPBadRequest -import voluptuous as vol +import probatio from homeassistant import core as ha from homeassistant.auth.models import User @@ -455,7 +455,7 @@ def _async_save_changed_entities( f"api service call {domain}.{service}", ) ) - except (vol.Invalid, ServiceNotFound) as ex: + except (probatio.Invalid, ServiceNotFound) as ex: raise HTTPBadRequest from ex except ServiceValidationError as ex: return self.json_message(str(ex), HTTPStatus.BAD_REQUEST) diff --git a/homeassistant/components/apple_tv/config_flow.py b/homeassistant/components/apple_tv/config_flow.py index 397e05160c6e0..6670c095e17b5 100644 --- a/homeassistant/components/apple_tv/config_flow.py +++ b/homeassistant/components/apple_tv/config_flow.py @@ -8,12 +8,12 @@ from random import randrange from typing import Any, Self, override +import probatio from pyatv import exceptions, pair, scan from pyatv.const import DeviceModel, PairingRequirement, Protocol from pyatv.convert import model_str, protocol_str from pyatv.helpers import get_unique_id from pyatv.interface import BaseConfig, PairingHandler -import voluptuous as vol from homeassistant.components import zeroconf from homeassistant.config_entries import ( @@ -42,15 +42,15 @@ DEVICE_INPUT = "device_input" -INPUT_PIN_SCHEMA = vol.Schema({vol.Required(CONF_PIN, default=""): cv.string}) +INPUT_PIN_SCHEMA = probatio.Schema({probatio.Required(CONF_PIN, default=""): cv.string}) DEFAULT_START_OFF = False DISCOVERY_AGGREGATION_TIME = 15 # seconds -OPTIONS_SCHEMA = vol.Schema( +OPTIONS_SCHEMA = probatio.Schema( { - vol.Optional(CONF_START_OFF, default=DEFAULT_START_OFF): bool, + probatio.Optional(CONF_START_OFF, default=DEFAULT_START_OFF): bool, } ) OPTIONS_FLOW = { @@ -202,7 +202,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(DEVICE_INPUT): str}), + data_schema=probatio.Schema({probatio.Required(DEVICE_INPUT): str}), errors=errors, ) diff --git a/homeassistant/components/apple_tv/services.py b/homeassistant/components/apple_tv/services.py index 6dcdd577a9520..32d56e244bb16 100644 --- a/homeassistant/components/apple_tv/services.py +++ b/homeassistant/components/apple_tv/services.py @@ -1,9 +1,9 @@ """Define services for the Apple TV integration.""" +import probatio from pyatv.const import KeyboardFocusState from pyatv.exceptions import NotSupportedError, ProtocolError from pyatv.interface import AppleTV as AppleTVInterface -import voluptuous as vol from homeassistant.const import ATTR_CONFIG_ENTRY_ID from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -13,25 +13,25 @@ from .const import ATTR_TEXT, DOMAIN SERVICE_SET_KEYBOARD_TEXT = "set_keyboard_text" -SERVICE_SET_KEYBOARD_TEXT_SCHEMA = vol.Schema( +SERVICE_SET_KEYBOARD_TEXT_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): cv.string, - vol.Required(ATTR_TEXT): cv.string, + probatio.Required(ATTR_CONFIG_ENTRY_ID): cv.string, + probatio.Required(ATTR_TEXT): cv.string, } ) SERVICE_APPEND_KEYBOARD_TEXT = "append_keyboard_text" -SERVICE_APPEND_KEYBOARD_TEXT_SCHEMA = vol.Schema( +SERVICE_APPEND_KEYBOARD_TEXT_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): cv.string, - vol.Required(ATTR_TEXT): cv.string, + probatio.Required(ATTR_CONFIG_ENTRY_ID): cv.string, + probatio.Required(ATTR_TEXT): cv.string, } ) SERVICE_CLEAR_KEYBOARD_TEXT = "clear_keyboard_text" -SERVICE_CLEAR_KEYBOARD_TEXT_SCHEMA = vol.Schema( +SERVICE_CLEAR_KEYBOARD_TEXT_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): cv.string, + probatio.Required(ATTR_CONFIG_ENTRY_ID): cv.string, } ) diff --git a/homeassistant/components/application_credentials/__init__.py b/homeassistant/components/application_credentials/__init__.py index 3fb6dc52fe6d0..99dfd79cb979b 100644 --- a/homeassistant/components/application_credentials/__init__.py +++ b/homeassistant/components/application_credentials/__init__.py @@ -10,7 +10,7 @@ import logging from typing import Any, Protocol, override -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.components.websocket_api import ActiveConnection @@ -52,11 +52,11 @@ DEFAULT_IMPORT_NAME = "Import from configuration.yaml" CREATE_FIELDS: VolDictType = { - vol.Required(CONF_DOMAIN): cv.string, - vol.Required(CONF_CLIENT_ID): vol.All(cv.string, vol.Strip), - vol.Required(CONF_CLIENT_SECRET): vol.All(cv.string, vol.Strip), - vol.Optional(CONF_AUTH_DOMAIN): cv.string, - vol.Optional(CONF_NAME): cv.string, + probatio.Required(CONF_DOMAIN): cv.string, + probatio.Required(CONF_CLIENT_ID): probatio.All(cv.string, probatio.Strip), + probatio.Required(CONF_CLIENT_SECRET): probatio.All(cv.string, probatio.Strip), + probatio.Optional(CONF_AUTH_DOMAIN): cv.string, + probatio.Optional(CONF_NAME): cv.string, } UPDATE_FIELDS: VolDictType = {} # Not supported @@ -83,7 +83,7 @@ class AuthorizationServer: class ApplicationCredentialsStorageCollection(collection.DictStorageCollection): """Application credential collection stored in storage.""" - CREATE_SCHEMA = vol.Schema(CREATE_FIELDS) + CREATE_SCHEMA = probatio.Schema(CREATE_FIELDS) @override async def _process_create_data(self, data: dict[str, str]) -> dict[str, str]: @@ -326,7 +326,7 @@ async def _async_integration_config(hass: HomeAssistant, domain: str) -> dict[st @websocket_api.websocket_command( - {vol.Required("type"): "application_credentials/config"} + {probatio.Required("type"): "application_credentials/config"} ) @websocket_api.async_response async def handle_integration_list( @@ -345,8 +345,8 @@ async def handle_integration_list( @websocket_api.websocket_command( { - vol.Required("type"): "application_credentials/config_entry", - vol.Required("config_entry_id"): str, + probatio.Required("type"): "application_credentials/config_entry", + probatio.Required("config_entry_id"): str, } ) @websocket_api.require_admin diff --git a/homeassistant/components/apprise/notify.py b/homeassistant/components/apprise/notify.py index a646e10c4d527..a1841936ee90a 100644 --- a/homeassistant/components/apprise/notify.py +++ b/homeassistant/components/apprise/notify.py @@ -4,7 +4,7 @@ from typing import Any, override import apprise -import voluptuous as vol +import probatio from homeassistant.components.notify import ( ATTR_TARGET, @@ -24,8 +24,8 @@ PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_URL): vol.All(cv.ensure_list, [str]), - vol.Optional(CONF_FILE): cv.string, + probatio.Optional(CONF_URL): probatio.All(cv.ensure_list, [str]), + probatio.Optional(CONF_FILE): cv.string, } ) diff --git a/homeassistant/components/aprilaire/config_flow.py b/homeassistant/components/aprilaire/config_flow.py index 728726c0b005b..e31e30f6edcc5 100644 --- a/homeassistant/components/aprilaire/config_flow.py +++ b/homeassistant/components/aprilaire/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from pyaprilaire.const import Attribute -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PORT @@ -14,10 +14,10 @@ from .const import DOMAIN from .coordinator import AprilaireCoordinator -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=7000): cv.port, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=7000): cv.port, } ) diff --git a/homeassistant/components/aprs/device_tracker.py b/homeassistant/components/aprs/device_tracker.py index 534c9824cc674..964a1196cd59a 100644 --- a/homeassistant/components/aprs/device_tracker.py +++ b/homeassistant/components/aprs/device_tracker.py @@ -7,7 +7,7 @@ import aprslib from aprslib import ConnectionError as AprsConnectionError, LoginError import geopy.distance -import voluptuous as vol +import probatio from homeassistant.components.device_tracker import ( PLATFORM_SCHEMA as DEVICE_TRACKER_PLATFORM_SCHEMA, @@ -53,11 +53,13 @@ PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_CALLSIGNS): cv.ensure_list, - vol.Required(CONF_USERNAME): cv.string, - vol.Optional(CONF_PASSWORD, default=DEFAULT_PASSWORD): cv.string, - vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, - vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): vol.Coerce(float), + probatio.Required(CONF_CALLSIGNS): cv.ensure_list, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Optional(CONF_PASSWORD, default=DEFAULT_PASSWORD): cv.string, + probatio.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, + probatio.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): probatio.Coerce( + float + ), } ) diff --git a/homeassistant/components/apsystems/config_flow.py b/homeassistant/components/apsystems/config_flow.py index baeabf2519b48..5898b0865f6cc 100644 --- a/homeassistant/components/apsystems/config_flow.py +++ b/homeassistant/components/apsystems/config_flow.py @@ -4,7 +4,7 @@ from aiohttp.client_exceptions import ClientConnectionError from APsystemsEZ1 import APsystemsEZ1M -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_IP_ADDRESS, CONF_PORT @@ -13,10 +13,10 @@ from .const import DEFAULT_PORT, DOMAIN -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_IP_ADDRESS): cv.string, - vol.Optional(CONF_PORT): cv.port, + probatio.Required(CONF_IP_ADDRESS): cv.string, + probatio.Optional(CONF_PORT): cv.port, } ) diff --git a/homeassistant/components/aquacell/config_flow.py b/homeassistant/components/aquacell/config_flow.py index ddba8fbd23b45..01f6fe2925ccc 100644 --- a/homeassistant/components/aquacell/config_flow.py +++ b/homeassistant/components/aquacell/config_flow.py @@ -7,7 +7,7 @@ from aioaquacell import ApiException, AquacellApi, AuthenticationFailed from aioaquacell.const import SUPPORTED_BRANDS, Brand -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_EMAIL, CONF_PASSWORD @@ -22,19 +22,19 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_BRAND, default=Brand.AQUACELL): vol.In( + probatio.Required(CONF_BRAND, default=Brand.AQUACELL): probatio.In( {key: brand.name for key, brand in SUPPORTED_BRANDS.items()} ), - vol.Required(CONF_EMAIL): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_EMAIL): str, + probatio.Required(CONF_PASSWORD): str, } ) -STEP_REAUTH_SCHEMA = vol.Schema( +STEP_REAUTH_SCHEMA = probatio.Schema( { - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/aqualogic/__init__.py b/homeassistant/components/aqualogic/__init__.py index 016dd3b4ca548..401da031bcccc 100644 --- a/homeassistant/components/aqualogic/__init__.py +++ b/homeassistant/components/aqualogic/__init__.py @@ -8,7 +8,7 @@ from typing import override from aqualogic.core import AquaLogic -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry from homeassistant.const import CONF_HOST, CONF_PORT @@ -25,13 +25,16 @@ RECONNECT_INTERVAL = timedelta(seconds=10) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( - {vol.Required(CONF_HOST): cv.string, vol.Required(CONF_PORT): cv.port} + DOMAIN: probatio.Schema( + { + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_PORT): cv.port, + } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) type AquaLogicConfigEntry = ConfigEntry[AquaLogicProcessor] diff --git a/homeassistant/components/aqualogic/config_flow.py b/homeassistant/components/aqualogic/config_flow.py index 9e7b3f893e0d0..0da295c51559a 100644 --- a/homeassistant/components/aqualogic/config_flow.py +++ b/homeassistant/components/aqualogic/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from aqualogic.core import AquaLogic -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PORT @@ -13,10 +13,10 @@ from .const import DOMAIN -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT): cv.port, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT): cv.port, } ) diff --git a/homeassistant/components/aquostv/media_player.py b/homeassistant/components/aquostv/media_player.py index 0cac2fc1a5343..52ed7e3bc9492 100644 --- a/homeassistant/components/aquostv/media_player.py +++ b/homeassistant/components/aquostv/media_player.py @@ -4,8 +4,8 @@ import logging from typing import Any, Concatenate, override +import probatio import sharp_aquos_rc -import voluptuous as vol from homeassistant.components.media_player import ( PLATFORM_SCHEMA as MEDIA_PLAYER_PLATFORM_SCHEMA, @@ -37,14 +37,14 @@ PLATFORM_SCHEMA = MEDIA_PLAYER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_USERNAME, default=DEFAULT_USERNAME): cv.string, - vol.Optional(CONF_PASSWORD, default=DEFAULT_PASSWORD): cv.string, - vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.string, - vol.Optional("retries", default=DEFAULT_RETRIES): cv.string, - vol.Optional("power_on_enabled", default=False): cv.boolean, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_USERNAME, default=DEFAULT_USERNAME): cv.string, + probatio.Optional(CONF_PASSWORD, default=DEFAULT_PASSWORD): cv.string, + probatio.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.string, + probatio.Optional("retries", default=DEFAULT_RETRIES): cv.string, + probatio.Optional("power_on_enabled", default=False): cv.boolean, } ) diff --git a/homeassistant/components/aqvify/config_flow.py b/homeassistant/components/aqvify/config_flow.py index 1fa435d447025..26c44a18a10cd 100644 --- a/homeassistant/components/aqvify/config_flow.py +++ b/homeassistant/components/aqvify/config_flow.py @@ -5,8 +5,8 @@ from typing import Any, override from aiohttp import ClientResponseError +import probatio from pyaqvify import AqvifyAPI, AqvifyAuthException -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_RECONFIGURE, @@ -20,9 +20,9 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_KEY): str, + probatio.Required(CONF_API_KEY): str, } ) diff --git a/homeassistant/components/aranet/config_flow.py b/homeassistant/components/aranet/config_flow.py index bd75c31610b30..d1da89c977c03 100644 --- a/homeassistant/components/aranet/config_flow.py +++ b/homeassistant/components/aranet/config_flow.py @@ -4,7 +4,7 @@ from aranet4.client import Aranet4Advertisement, Version as AranetVersion from bluetooth_data_tools import human_readable_name -import voluptuous as vol +import probatio from homeassistant.components.bluetooth import ( BluetoothServiceInfoBleak, @@ -109,9 +109,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_ADDRESS): vol.In( + probatio.Required(CONF_ADDRESS): probatio.In( { addr: dev[0] for (addr, dev) in self._discovered_devices.items() diff --git a/homeassistant/components/arcam_fmj/config_flow.py b/homeassistant/components/arcam_fmj/config_flow.py index 9d9786f4138bc..9cb467e133109 100644 --- a/homeassistant/components/arcam_fmj/config_flow.py +++ b/homeassistant/components/arcam_fmj/config_flow.py @@ -7,7 +7,7 @@ from arcam.fmj import ConnectionFailed from arcam.fmj.client import Client from arcam.fmj.utils import get_uniqueid_from_host, get_uniqueid_from_udn -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PORT @@ -16,10 +16,10 @@ from .const import DEFAULT_NAME, DEFAULT_PORT, DOMAIN -STEP_DATA_SCHEMA = vol.Schema( +STEP_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, } ) diff --git a/homeassistant/components/arcam_fmj/device_trigger.py b/homeassistant/components/arcam_fmj/device_trigger.py index cbe3b9cde45ef..500c61693f65b 100644 --- a/homeassistant/components/arcam_fmj/device_trigger.py +++ b/homeassistant/components/arcam_fmj/device_trigger.py @@ -1,6 +1,6 @@ """Provides device automations for Arcam FMJ Receiver control.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import DEVICE_TRIGGER_BASE_SCHEMA from homeassistant.components.media_player import DOMAIN as MEDIA_PLAYER_DOMAIN @@ -22,8 +22,8 @@ TRIGGER_TYPES = {"turn_on"} TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In(TRIGGER_TYPES), + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In(TRIGGER_TYPES), } ) diff --git a/homeassistant/components/arest/binary_sensor.py b/homeassistant/components/arest/binary_sensor.py index 7e7ec8505fda8..d720ba01fe2ba 100644 --- a/homeassistant/components/arest/binary_sensor.py +++ b/homeassistant/components/arest/binary_sensor.py @@ -4,8 +4,8 @@ from http import HTTPStatus import logging +import probatio import requests -import voluptuous as vol from homeassistant.components.binary_sensor import ( DEVICE_CLASSES_SCHEMA, @@ -25,10 +25,10 @@ PLATFORM_SCHEMA = BINARY_SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_RESOURCE): cv.url, - vol.Optional(CONF_NAME): cv.string, - vol.Required(CONF_PIN): cv.string, - vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, + probatio.Required(CONF_RESOURCE): cv.url, + probatio.Optional(CONF_NAME): cv.string, + probatio.Required(CONF_PIN): cv.string, + probatio.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, } ) diff --git a/homeassistant/components/arest/sensor.py b/homeassistant/components/arest/sensor.py index 0eb28be205b85..314f7fa30984b 100644 --- a/homeassistant/components/arest/sensor.py +++ b/homeassistant/components/arest/sensor.py @@ -4,8 +4,8 @@ from http import HTTPStatus import logging +import probatio import requests -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -34,22 +34,22 @@ DEFAULT_NAME = "aREST sensor" -PIN_VARIABLE_SCHEMA = vol.Schema( +PIN_VARIABLE_SCHEMA = probatio.Schema( { - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, + probatio.Optional(CONF_VALUE_TEMPLATE): cv.template, } ) PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_RESOURCE): cv.url, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_PINS, default={}): vol.Schema( + probatio.Required(CONF_RESOURCE): cv.url, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_PINS, default={}): probatio.Schema( {cv.string: PIN_VARIABLE_SCHEMA} ), - vol.Optional(CONF_MONITORED_VARIABLES, default={}): vol.Schema( + probatio.Optional(CONF_MONITORED_VARIABLES, default={}): probatio.Schema( {cv.string: PIN_VARIABLE_SCHEMA} ), } diff --git a/homeassistant/components/arest/switch.py b/homeassistant/components/arest/switch.py index 0b44005d42077..e2919496ecbbb 100644 --- a/homeassistant/components/arest/switch.py +++ b/homeassistant/components/arest/switch.py @@ -4,8 +4,8 @@ import logging from typing import Any, override +import probatio import requests -import voluptuous as vol from homeassistant.components.switch import ( PLATFORM_SCHEMA as SWITCH_PLATFORM_SCHEMA, @@ -25,21 +25,21 @@ DEFAULT_NAME = "aREST switch" -PIN_FUNCTION_SCHEMA = vol.Schema( +PIN_FUNCTION_SCHEMA = probatio.Schema( { - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_INVERT, default=False): cv.boolean, + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_INVERT, default=False): cv.boolean, } ) PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_RESOURCE): cv.url, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_PINS, default={}): vol.Schema( + probatio.Required(CONF_RESOURCE): cv.url, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_PINS, default={}): probatio.Schema( {cv.string: PIN_FUNCTION_SCHEMA} ), - vol.Optional(CONF_FUNCTIONS, default={}): vol.Schema( + probatio.Optional(CONF_FUNCTIONS, default={}): probatio.Schema( {cv.string: PIN_FUNCTION_SCHEMA} ), } diff --git a/homeassistant/components/arris_tg2492lg/device_tracker.py b/homeassistant/components/arris_tg2492lg/device_tracker.py index af99e65bd9767..7021c53aa239b 100644 --- a/homeassistant/components/arris_tg2492lg/device_tracker.py +++ b/homeassistant/components/arris_tg2492lg/device_tracker.py @@ -4,7 +4,7 @@ from aiohttp.client_exceptions import ClientResponseError from arris_tg2492lg import ConnectBox, Device -import voluptuous as vol +import probatio from homeassistant.components.device_tracker import ( DOMAIN as DEVICE_TRACKER_DOMAIN, @@ -21,8 +21,8 @@ PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, } ) diff --git a/homeassistant/components/aruba/device_tracker.py b/homeassistant/components/aruba/device_tracker.py index 25d75719ea810..f35016dca5284 100644 --- a/homeassistant/components/aruba/device_tracker.py +++ b/homeassistant/components/aruba/device_tracker.py @@ -5,7 +5,7 @@ from typing import Any, override import pexpect -import voluptuous as vol +import probatio from homeassistant.components.device_tracker import ( DOMAIN as DEVICE_TRACKER_DOMAIN, @@ -27,9 +27,9 @@ PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_USERNAME): cv.string, } ) diff --git a/homeassistant/components/arve/config_flow.py b/homeassistant/components/arve/config_flow.py index 80f712eb02fbb..980a630f5cc69 100644 --- a/homeassistant/components/arve/config_flow.py +++ b/homeassistant/components/arve/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from asyncarve import Arve, ArveConnectionError, ArveCustomer -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_ACCESS_TOKEN, CONF_CLIENT_SECRET @@ -45,10 +45,10 @@ async def async_step_user( ) return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_ACCESS_TOKEN): str, - vol.Required(CONF_CLIENT_SECRET): str, + probatio.Required(CONF_ACCESS_TOKEN): str, + probatio.Required(CONF_CLIENT_SECRET): str, } ), errors=errors, diff --git a/homeassistant/components/aseko_pool_live/config_flow.py b/homeassistant/components/aseko_pool_live/config_flow.py index bc6fee8a72d04..c829309ebc5f7 100644 --- a/homeassistant/components/aseko_pool_live/config_flow.py +++ b/homeassistant/components/aseko_pool_live/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from aioaseko import Aseko, AsekoAPIError, AsekoInvalidCredentials -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_EMAIL, CONF_PASSWORD, CONF_UNIQUE_ID @@ -20,10 +20,10 @@ class AsekoConfigFlow(ConfigFlow, domain=DOMAIN): VERSION = 2 - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_EMAIL): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_EMAIL): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/assist_pipeline/__init__.py b/homeassistant/components/assist_pipeline/__init__.py index b1d4857659c04..3e4aaf9bf1092 100644 --- a/homeassistant/components/assist_pipeline/__init__.py +++ b/homeassistant/components/assist_pipeline/__init__.py @@ -3,7 +3,7 @@ from collections.abc import AsyncIterable from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import stt from homeassistant.core import Context, HomeAssistant @@ -66,15 +66,15 @@ "async_update_pipeline", ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Optional(CONF_DEBUG_RECORDING_DIR): str, + probatio.Optional(CONF_DEBUG_RECORDING_DIR): str, }, ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/assist_pipeline/pipeline.py b/homeassistant/components/assist_pipeline/pipeline.py index 0ad020df7a3a1..81547264e29ec 100644 --- a/homeassistant/components/assist_pipeline/pipeline.py +++ b/homeassistant/components/assist_pipeline/pipeline.py @@ -15,7 +15,7 @@ import wave import hass_nabucasa -import voluptuous as vol +import probatio from homeassistant.components import ( conversation, @@ -109,24 +109,26 @@ def validate_language(data: dict[str, Any]) -> Any: """Validate language settings.""" for engine, language in ENGINE_LANGUAGE_PAIRS: if data[engine] is not None and data[language] is None: - raise vol.Invalid(f"Need language {language} for {engine} {data[engine]}") + raise probatio.Invalid( + f"Need language {language} for {engine} {data[engine]}" + ) return data PIPELINE_FIELDS: VolDictType = { - vol.Required("conversation_engine"): str, - vol.Required("conversation_language"): str, - vol.Required("language"): str, - vol.Required("name"): str, - vol.Required("stt_engine"): vol.Any(str, None), - vol.Required("stt_language"): vol.Any(str, None), - vol.Required("tts_engine"): vol.Any(str, None), - vol.Required("tts_language"): vol.Any(str, None), - vol.Required("tts_voice"): vol.Any(str, None), - vol.Required("wake_word_entity"): vol.Any(str, None), - vol.Required("wake_word_id"): vol.Any(str, None), - vol.Optional("prefer_local_intents"): bool, - vol.Optional("acknowledge_media_id"): str, + probatio.Required("conversation_engine"): str, + probatio.Required("conversation_language"): str, + probatio.Required("language"): str, + probatio.Required("name"): str, + probatio.Required("stt_engine"): probatio.Any(str, None), + probatio.Required("stt_language"): probatio.Any(str, None), + probatio.Required("tts_engine"): probatio.Any(str, None), + probatio.Required("tts_language"): probatio.Any(str, None), + probatio.Required("tts_voice"): probatio.Any(str, None), + probatio.Required("wake_word_entity"): probatio.Any(str, None), + probatio.Required("wake_word_id"): probatio.Any(str, None), + probatio.Optional("prefer_local_intents"): bool, + probatio.Optional("acknowledge_media_id"): str, } STORED_PIPELINE_RUNS = 10 @@ -2021,8 +2023,8 @@ def async_setup(self, hass: HomeAssistant) -> None: self.ws_get_item, websocket_api.BASE_COMMAND_MESSAGE_SCHEMA.extend( { - vol.Required("type"): f"{self.api_prefix}/get", - vol.Optional(self.item_id_key): str, + probatio.Required("type"): f"{self.api_prefix}/get", + probatio.Optional(self.item_id_key): str, } ), ) @@ -2035,8 +2037,8 @@ def async_setup(self, hass: HomeAssistant) -> None: ), websocket_api.BASE_COMMAND_MESSAGE_SCHEMA.extend( { - vol.Required("type"): f"{self.api_prefix}/set_preferred", - vol.Required(self.item_id_key): str, + probatio.Required("type"): f"{self.api_prefix}/set_preferred", + probatio.Required(self.item_id_key): str, } ), ) diff --git a/homeassistant/components/assist_pipeline/repair_flows.py b/homeassistant/components/assist_pipeline/repair_flows.py index 12b726df9a955..67eaa325ed108 100644 --- a/homeassistant/components/assist_pipeline/repair_flows.py +++ b/homeassistant/components/assist_pipeline/repair_flows.py @@ -2,7 +2,7 @@ from typing import cast -import voluptuous as vol +import probatio from homeassistant.components.assist_satellite import DOMAIN as ASSIST_SATELLITE_DOMAIN from homeassistant.components.repairs import RepairsFlow, RepairsFlowResult @@ -47,6 +47,6 @@ async def async_step_confirm_disable_entity( } return self.async_show_form( step_id="confirm_disable_entity", - data_schema=vol.Schema({}), + data_schema=probatio.Schema({}), description_placeholders=description_placeholders, ) diff --git a/homeassistant/components/assist_pipeline/websocket_api.py b/homeassistant/components/assist_pipeline/websocket_api.py index a332d91b26cdc..7d05877d4ec6b 100644 --- a/homeassistant/components/assist_pipeline/websocket_api.py +++ b/homeassistant/components/assist_pipeline/websocket_api.py @@ -9,7 +9,7 @@ from typing import Any, Final import audioop # pylint: disable=deprecated-module -import voluptuous as vol +import probatio from homeassistant.components import conversation, stt, tts, websocket_api from homeassistant.const import ATTR_DEVICE_ID, ATTR_SECONDS, MATCH_ALL @@ -64,58 +64,58 @@ def async_register_websocket_api(hass: HomeAssistant) -> None: @websocket_api.websocket_command( - vol.All( + probatio.All( websocket_api.BASE_COMMAND_MESSAGE_SCHEMA.extend( { - vol.Required("type"): "assist_pipeline/run", + probatio.Required("type"): "assist_pipeline/run", # pylint: disable-next=unnecessary-lambda - vol.Required("start_stage"): lambda val: PipelineStage(val), + probatio.Required("start_stage"): lambda val: PipelineStage(val), # pylint: disable-next=unnecessary-lambda - vol.Required("end_stage"): lambda val: PipelineStage(val), - vol.Optional("input"): dict, - vol.Optional("pipeline"): str, - vol.Optional("conversation_id"): vol.Any(str, None), - vol.Optional("device_id"): vol.Any(str, None), - vol.Optional("timeout"): vol.Any(int, float), + probatio.Required("end_stage"): lambda val: PipelineStage(val), + probatio.Optional("input"): dict, + probatio.Optional("pipeline"): str, + probatio.Optional("conversation_id"): probatio.Any(str, None), + probatio.Optional("device_id"): probatio.Any(str, None), + probatio.Optional("timeout"): probatio.Any(int, float), }, ), cv.key_value_schemas( "start_stage", { - PipelineStage.WAKE_WORD: vol.Schema( + PipelineStage.WAKE_WORD: probatio.Schema( { - vol.Required("input"): { - vol.Required("sample_rate"): int, - vol.Optional("timeout"): vol.Any(int, float), - vol.Optional("audio_seconds_to_buffer"): vol.Any( + probatio.Required("input"): { + probatio.Required("sample_rate"): int, + probatio.Optional("timeout"): probatio.Any(int, float), + probatio.Optional("audio_seconds_to_buffer"): probatio.Any( int, float ), # Audio enhancement - vol.Optional("noise_suppression_level"): int, - vol.Optional("auto_gain_dbfs"): int, - vol.Optional("volume_multiplier"): float, + probatio.Optional("noise_suppression_level"): int, + probatio.Optional("auto_gain_dbfs"): int, + probatio.Optional("volume_multiplier"): float, # Advanced use cases/testing - vol.Optional("no_vad"): bool, + probatio.Optional("no_vad"): bool, } }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ), - PipelineStage.STT: vol.Schema( + PipelineStage.STT: probatio.Schema( { - vol.Required("input"): { - vol.Required("sample_rate"): int, - vol.Optional("wake_word_phrase"): str, + probatio.Required("input"): { + probatio.Required("sample_rate"): int, + probatio.Optional("wake_word_phrase"): str, } }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ), - PipelineStage.INTENT: vol.Schema( - {vol.Required("input"): {"text": str}}, - extra=vol.ALLOW_EXTRA, + PipelineStage.INTENT: probatio.Schema( + {probatio.Required("input"): {"text": str}}, + extra=probatio.ALLOW_EXTRA, ), - PipelineStage.TTS: vol.Schema( - {vol.Required("input"): {"text": str}}, - extra=vol.ALLOW_EXTRA, + PipelineStage.TTS: probatio.Schema( + {probatio.Required("input"): {"text": str}}, + extra=probatio.ALLOW_EXTRA, ), }, ), @@ -278,8 +278,8 @@ def handle_binary( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "assist_pipeline/pipeline_debug/list", - vol.Required("pipeline_id"): str, + probatio.Required("type"): "assist_pipeline/pipeline_debug/list", + probatio.Required("pipeline_id"): str, } ) def websocket_list_runs( @@ -315,7 +315,7 @@ def websocket_list_runs( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "assist_pipeline/device/list", + probatio.Required("type"): "assist_pipeline/device/list", } ) def websocket_list_devices( @@ -344,9 +344,9 @@ def websocket_list_devices( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "assist_pipeline/pipeline_debug/get", - vol.Required("pipeline_id"): str, - vol.Required("pipeline_run_id"): str, + probatio.Required("type"): "assist_pipeline/pipeline_debug/get", + probatio.Required("pipeline_id"): str, + probatio.Required("pipeline_run_id"): str, } ) def websocket_get_run( @@ -385,7 +385,7 @@ def websocket_get_run( @websocket_api.websocket_command( { - vol.Required("type"): "assist_pipeline/language/list", + probatio.Required("type"): "assist_pipeline/language/list", } ) @callback @@ -444,12 +444,12 @@ def websocket_list_languages( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "assist_pipeline/device/capture", - vol.Required("device_id"): str, - vol.Required("timeout"): vol.All( + probatio.Required("type"): "assist_pipeline/device/capture", + probatio.Required("device_id"): str, + probatio.Required("timeout"): probatio.All( # 0 < timeout <= MAX_CAPTURE_TIMEOUT - vol.Coerce(float), - vol.Range(min=0, min_included=False, max=MAX_CAPTURE_TIMEOUT), + probatio.Coerce(float), + probatio.Range(min=0, min_included=False, max=MAX_CAPTURE_TIMEOUT), ), } ) diff --git a/homeassistant/components/assist_satellite/__init__.py b/homeassistant/components/assist_satellite/__init__.py index a1fd10f07ab6c..c353f9ad19264 100644 --- a/homeassistant/components/assist_satellite/__init__.py +++ b/homeassistant/components/assist_satellite/__init__.py @@ -14,7 +14,7 @@ PUNCTUATION_START, PUNCTUATION_START_WORD, ) -import voluptuous as vol +import probatio from homeassistant.auth.permissions.const import CAT_ENTITIES, POLICY_CONTROL from homeassistant.components.http import StaticPathConfig @@ -71,13 +71,13 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: component.async_register_entity_service( "announce", - vol.All( + probatio.All( cv.make_entity_service_schema( { - vol.Optional("message"): str, - vol.Optional("media_id"): _media_id_validator, - vol.Optional("preannounce", default=True): bool, - vol.Optional("preannounce_media_id"): _media_id_validator, + probatio.Optional("message"): str, + probatio.Optional("media_id"): _media_id_validator, + probatio.Optional("preannounce", default=True): bool, + probatio.Optional("preannounce_media_id"): _media_id_validator, } ), cv.has_at_least_one_key("message", "media_id"), @@ -88,14 +88,14 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: component.async_register_entity_service( "start_conversation", - vol.All( + probatio.All( cv.make_entity_service_schema( { - vol.Optional("start_message"): str, - vol.Optional("start_media_id"): _media_id_validator, - vol.Optional("preannounce", default=True): bool, - vol.Optional("preannounce_media_id"): _media_id_validator, - vol.Optional("extra_system_prompt"): str, + probatio.Optional("start_message"): str, + probatio.Optional("start_media_id"): _media_id_validator, + probatio.Optional("preannounce", default=True): bool, + probatio.Optional("preannounce_media_id"): _media_id_validator, + probatio.Optional("extra_system_prompt"): str, } ), cv.has_at_least_one_key("start_message", "start_media_id"), @@ -154,17 +154,17 @@ async def handle_ask_question(call: ServiceCall) -> dict[str, Any]: domain=DOMAIN, service="ask_question", service_func=handle_ask_question, - schema=vol.All( + schema=probatio.All( { - vol.Required(ATTR_ENTITY_ID): cv.entity_domain(DOMAIN), - vol.Optional("question"): str, - vol.Optional("question_media_id"): _media_id_validator, - vol.Optional("preannounce", default=True): bool, - vol.Optional("preannounce_media_id"): _media_id_validator, - vol.Optional("answers"): [ + probatio.Required(ATTR_ENTITY_ID): cv.entity_domain(DOMAIN), + probatio.Optional("question"): str, + probatio.Optional("question_media_id"): _media_id_validator, + probatio.Optional("preannounce", default=True): bool, + probatio.Optional("preannounce_media_id"): _media_id_validator, + probatio.Optional("answers"): [ { - vol.Required("id"): str, - vol.Required("sentences"): vol.All( + probatio.Required("id"): str, + probatio.Required("sentences"): probatio.All( cv.ensure_list, [cv.string], has_one_non_empty_item, @@ -215,7 +215,7 @@ def has_no_punctuation(value: list[str]) -> list[str]: or PUNCTUATION_START_WORD.search(sentence) or PUNCTUATION_END_WORD.search(sentence) ): - raise vol.Invalid("sentence should not contain punctuation") + raise probatio.Invalid("sentence should not contain punctuation") return value @@ -231,31 +231,31 @@ def is_valid_sentence(value: list[str]) -> list[str]: try: parse_sentence(sentence) except ParseError as err: - raise vol.Invalid(f"invalid sentence: {err}") from err + raise probatio.Invalid(f"invalid sentence: {err}") from err return value def has_one_non_empty_item(value: list[str]) -> list[str]: """Validate result has at least one item.""" if len(value) < 1: - raise vol.Invalid("at least one sentence is required") + raise probatio.Invalid("at least one sentence is required") for sentence in value: if not sentence: - raise vol.Invalid("sentences cannot be empty") + raise probatio.Invalid("sentences cannot be empty") return value # Validator for media_id fields that accepts both string and media selector format -_media_id_validator = vol.Any( +_media_id_validator = probatio.Any( cv.string, # Plain string format - vol.All( - vol.Schema( + probatio.All( + probatio.Schema( { - vol.Required("media_content_id"): cv.string, - vol.Required("media_content_type"): cv.string, - vol.Remove("metadata"): dict, # Ignore metadata if present + probatio.Required("media_content_id"): cv.string, + probatio.Required("media_content_type"): cv.string, + probatio.Remove("metadata"): dict, # Ignore metadata if present } ), # Extract media_content_id from media selector format diff --git a/homeassistant/components/assist_satellite/intent.py b/homeassistant/components/assist_satellite/intent.py index f365a7bc9dd13..9a2919c1e177b 100644 --- a/homeassistant/components/assist_satellite/intent.py +++ b/homeassistant/components/assist_satellite/intent.py @@ -2,7 +2,7 @@ from typing import Final, override -import voluptuous as vol +import probatio from homeassistant.core import HomeAssistant from homeassistant.helpers import entity_registry as er, intent @@ -27,7 +27,7 @@ class BroadcastIntentHandler(intent.IntentHandler): @override def slot_schema(self) -> dict | None: """Return a slot schema.""" - return {vol.Required("message"): str} + return {probatio.Required("message"): str} @override async def async_handle(self, intent_obj: intent.Intent) -> intent.IntentResponse: diff --git a/homeassistant/components/assist_satellite/websocket_api.py b/homeassistant/components/assist_satellite/websocket_api.py index 18f512d2f2190..679b080d758c9 100644 --- a/homeassistant/components/assist_satellite/websocket_api.py +++ b/homeassistant/components/assist_satellite/websocket_api.py @@ -4,7 +4,7 @@ from dataclasses import asdict, replace from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.core import HomeAssistant, callback @@ -35,8 +35,8 @@ def async_register_websocket_api(hass: HomeAssistant) -> None: @websocket_api.websocket_command( { - vol.Required("type"): "assist_satellite/intercept_wake_word", - vol.Required("entity_id"): cv.entity_domain(DOMAIN), + probatio.Required("type"): "assist_satellite/intercept_wake_word", + probatio.Required("entity_id"): cv.entity_domain(DOMAIN), } ) @websocket_api.require_admin @@ -75,8 +75,8 @@ async def intercept_wake_word() -> None: @callback @websocket_api.websocket_command( { - vol.Required("type"): "assist_satellite/get_configuration", - vol.Required("entity_id"): cv.entity_domain(DOMAIN), + probatio.Required("type"): "assist_satellite/get_configuration", + probatio.Required("entity_id"): cv.entity_domain(DOMAIN), } ) def websocket_get_configuration( @@ -110,9 +110,9 @@ def websocket_get_configuration( @websocket_api.websocket_command( { - vol.Required("type"): "assist_satellite/set_wake_words", - vol.Required("entity_id"): cv.entity_domain(DOMAIN), - vol.Required("wake_word_ids"): [str], + probatio.Required("type"): "assist_satellite/set_wake_words", + probatio.Required("entity_id"): cv.entity_domain(DOMAIN), + probatio.Required("wake_word_ids"): [str], } ) @websocket_api.require_admin @@ -161,8 +161,8 @@ async def websocket_set_wake_words( @websocket_api.websocket_command( { - vol.Required("type"): "assist_satellite/test_connection", - vol.Required("entity_id"): cv.entity_domain(DOMAIN), + probatio.Required("type"): "assist_satellite/test_connection", + probatio.Required("entity_id"): cv.entity_domain(DOMAIN), } ) @websocket_api.require_admin diff --git a/homeassistant/components/asuswrt/config_flow.py b/homeassistant/components/asuswrt/config_flow.py index aa3f9b135ed19..8b2a56dd5cc24 100644 --- a/homeassistant/components/asuswrt/config_flow.py +++ b/homeassistant/components/asuswrt/config_flow.py @@ -6,7 +6,7 @@ from typing import Any, cast, override from asusrouter import AsusRouterError -import voluptuous as vol +import probatio from homeassistant.components.device_tracker import ( CONF_CONSIDER_HOME, @@ -65,25 +65,25 @@ _LOGGER = logging.getLogger(__name__) -LEGACY_SCHEMA = vol.Schema( +LEGACY_SCHEMA = probatio.Schema( { - vol.Required(CONF_MODE, default=MODE_ROUTER): vol.In( + probatio.Required(CONF_MODE, default=MODE_ROUTER): probatio.In( {MODE_ROUTER: "Router", MODE_AP: "Access Point"} ), } ) -OPTIONS_SCHEMA = vol.Schema( +OPTIONS_SCHEMA = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_CONSIDER_HOME, default=DEFAULT_CONSIDER_HOME.total_seconds() - ): vol.All(vol.Coerce(int), vol.Clamp(min=0, max=900)), - vol.Optional(CONF_TRACK_UNKNOWN, default=DEFAULT_TRACK_UNKNOWN): bool, + ): probatio.All(probatio.Coerce(int), probatio.Clamp(min=0, max=900)), + probatio.Optional(CONF_TRACK_UNKNOWN, default=DEFAULT_TRACK_UNKNOWN): bool, } ) -async def get_options_schema(handler: SchemaCommonFlowHandler) -> vol.Schema: +async def get_options_schema(handler: SchemaCommonFlowHandler) -> probatio.Schema: """Get options schema.""" options_flow: SchemaOptionsFlowHandler options_flow = cast(SchemaOptionsFlowHandler, handler.parent_handler) @@ -91,14 +91,14 @@ async def get_options_schema(handler: SchemaCommonFlowHandler) -> vol.Schema: if used_protocol in [PROTOCOL_SSH, PROTOCOL_TELNET]: data_schema = OPTIONS_SCHEMA.extend( { - vol.Required(CONF_INTERFACE, default=DEFAULT_INTERFACE): str, - vol.Required(CONF_DNSMASQ, default=DEFAULT_DNSMASQ): str, + probatio.Required(CONF_INTERFACE, default=DEFAULT_INTERFACE): str, + probatio.Required(CONF_DNSMASQ, default=DEFAULT_DNSMASQ): str, } ) if options_flow.config_entry.data[CONF_MODE] == MODE_AP: return data_schema.extend( { - vol.Optional(CONF_REQUIRE_IP, default=True): bool, + probatio.Optional(CONF_REQUIRE_IP, default=True): bool, } ) return data_schema @@ -141,10 +141,12 @@ def _show_setup_form(self, error: str | None = None) -> ConfigFlowResult: user_input = self._config_data schema = { - vol.Required(CONF_HOST, default=user_input.get(CONF_HOST, "")): str, - vol.Required(CONF_USERNAME, default=user_input.get(CONF_USERNAME, "")): str, - vol.Optional(CONF_PASSWORD): str, - vol.Required( + probatio.Required(CONF_HOST, default=user_input.get(CONF_HOST, "")): str, + probatio.Required( + CONF_USERNAME, default=user_input.get(CONF_USERNAME, "") + ): str, + probatio.Optional(CONF_PASSWORD): str, + probatio.Required( CONF_PROTOCOL, default=user_input.get(CONF_PROTOCOL, PROTOCOL_HTTPS), ): SelectSelector( @@ -152,11 +154,11 @@ def _show_setup_form(self, error: str | None = None) -> ConfigFlowResult: options=ALLOWED_PROTOCOL, translation_key="protocols" ) ), - vol.Required(CONF_MORE_OPTIONS): section( - vol.Schema( + probatio.Required(CONF_MORE_OPTIONS): section( + probatio.Schema( { - vol.Optional(CONF_PORT): cv.port, - vol.Optional(CONF_SSH_KEY): str, + probatio.Optional(CONF_PORT): cv.port, + probatio.Optional(CONF_SSH_KEY): str, } ), SectionConfig(collapsed=True), @@ -165,7 +167,7 @@ def _show_setup_form(self, error: str | None = None) -> ConfigFlowResult: return self.async_show_form( step_id="user", - data_schema=vol.Schema(schema), + data_schema=probatio.Schema(schema), errors={CONF_BASE: error} if error else None, ) diff --git a/homeassistant/components/atag/config_flow.py b/homeassistant/components/atag/config_flow.py index 90bbbc258d6ac..98c6de988e52c 100644 --- a/homeassistant/components/atag/config_flow.py +++ b/homeassistant/components/atag/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio import pyatag -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PORT @@ -12,8 +12,10 @@ from . import DOMAIN DATA_SCHEMA = { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=pyatag.const.DEFAULT_PORT): vol.Coerce(int), + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=pyatag.const.DEFAULT_PORT): probatio.Coerce( + int + ), } @@ -51,6 +53,6 @@ async def _show_form( """Show the form to the user.""" return self.async_show_form( step_id="user", - data_schema=vol.Schema(DATA_SCHEMA), + data_schema=probatio.Schema(DATA_SCHEMA), errors=errors or {}, ) diff --git a/homeassistant/components/atome/sensor.py b/homeassistant/components/atome/sensor.py index fa94297d292a9..dd41bcc35a8a6 100644 --- a/homeassistant/components/atome/sensor.py +++ b/homeassistant/components/atome/sensor.py @@ -3,8 +3,8 @@ from datetime import timedelta import logging +import probatio from pyatome.client import AtomeClient, PyAtomeError -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -49,9 +49,9 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/aurora/config_flow.py b/homeassistant/components/aurora/config_flow.py index 1720eef1f1080..1d7a7422deb69 100644 --- a/homeassistant/components/aurora/config_flow.py +++ b/homeassistant/components/aurora/config_flow.py @@ -5,7 +5,7 @@ from aiohttp import ClientError from auroranoaa import AuroraForecast -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigEntry, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_LATITUDE, CONF_LONGITUDE @@ -20,10 +20,10 @@ _LOGGER = logging.getLogger(__name__) -OPTIONS_SCHEMA = vol.Schema( +OPTIONS_SCHEMA = probatio.Schema( { - vol.Required(CONF_THRESHOLD, default=DEFAULT_THRESHOLD): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) + probatio.Required(CONF_THRESHOLD, default=DEFAULT_THRESHOLD): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) ), } ) @@ -79,10 +79,10 @@ async def async_step_user( return self.async_show_form( step_id="user", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_LONGITUDE): cv.longitude, - vol.Required(CONF_LATITUDE): cv.latitude, + probatio.Required(CONF_LONGITUDE): cv.longitude, + probatio.Required(CONF_LATITUDE): cv.latitude, } ), { diff --git a/homeassistant/components/aurora_abb_powerone/config_flow.py b/homeassistant/components/aurora_abb_powerone/config_flow.py index 6e622fe2a9010..a80942292d7bc 100644 --- a/homeassistant/components/aurora_abb_powerone/config_flow.py +++ b/homeassistant/components/aurora_abb_powerone/config_flow.py @@ -5,7 +5,7 @@ from typing import TYPE_CHECKING, Any, override from aurorapy.client import AuroraError, AuroraSerialClient -import voluptuous as vol +import probatio from homeassistant.components import usb from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -126,13 +126,13 @@ async def async_step_user( # If no user input, must be first pass through the config. Show initial form. config_options = { - vol.Required(CONF_PORT, default=self._default_com_port): vol.In( + probatio.Required(CONF_PORT, default=self._default_com_port): probatio.In( self._com_ports_list ), - vol.Required(CONF_ADDRESS, default=DEFAULT_ADDRESS): vol.In( + probatio.Required(CONF_ADDRESS, default=DEFAULT_ADDRESS): probatio.In( range(MIN_ADDRESS, MAX_ADDRESS + 1) ), } - schema = vol.Schema(config_options) + schema = probatio.Schema(config_options) return self.async_show_form(step_id="user", data_schema=schema, errors=errors) diff --git a/homeassistant/components/aussie_broadband/config_flow.py b/homeassistant/components/aussie_broadband/config_flow.py index 4829c18eb7cd4..4ce55c5d3d600 100644 --- a/homeassistant/components/aussie_broadband/config_flow.py +++ b/homeassistant/components/aussie_broadband/config_flow.py @@ -6,7 +6,7 @@ from aiohttp import ClientError from aussiebb.asyncio import AussieBB, AuthenticationException from aussiebb.const import FETCH_TYPES -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -68,10 +68,10 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, @@ -106,9 +106,9 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", description_placeholders={"username": self._reauth_username}, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, diff --git a/homeassistant/components/autarco/config_flow.py b/homeassistant/components/autarco/config_flow.py index 331f9274e0941..e1decbfd3c8db 100644 --- a/homeassistant/components/autarco/config_flow.py +++ b/homeassistant/components/autarco/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from autarco import Autarco, AutarcoAuthenticationError, AutarcoConnectionError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_EMAIL, CONF_PASSWORD @@ -12,16 +12,16 @@ from .const import DOMAIN -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_EMAIL): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_EMAIL): str, + probatio.Required(CONF_PASSWORD): str, } ) -STEP_REAUTH_SCHEMA = vol.Schema( +STEP_REAUTH_SCHEMA = probatio.Schema( { - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/auth/__init__.py b/homeassistant/components/auth/__init__.py index 6e0bc549fd6c1..170e552ef4047 100644 --- a/homeassistant/components/auth/__init__.py +++ b/homeassistant/components/auth/__init__.py @@ -133,7 +133,7 @@ from aiohttp import web from multidict import MultiDictProxy -import voluptuous as vol +import probatio from homeassistant.auth import InvalidAuthError from homeassistant.auth.models import ( @@ -415,7 +415,7 @@ def __init__(self, retrieve_credentials: RetrieveResultType) -> None: """Initialize the link user view.""" self._retrieve_credentials = retrieve_credentials - @RequestDataValidator(vol.Schema({"code": str, "client_id": str})) + @RequestDataValidator(probatio.Schema({"code": str, "client_id": str})) async def post(self, request: web.Request, data: dict[str, Any]) -> web.Response: """Link a user.""" hass = request.app[KEY_HASS] @@ -478,7 +478,7 @@ def retrieve_result(client_id: str, code: str) -> Credentials | None: return store_result, retrieve_result -@websocket_api.websocket_command({vol.Required("type"): "auth/current_user"}) +@websocket_api.websocket_command({probatio.Required("type"): "auth/current_user"}) @websocket_api.ws_require_user() @websocket_api.async_response async def websocket_current_user( @@ -518,10 +518,10 @@ async def websocket_current_user( @websocket_api.websocket_command( { - vol.Required("type"): "auth/long_lived_access_token", - vol.Required("lifespan"): int, # days - vol.Required("client_name"): str, - vol.Optional("client_icon"): str, + probatio.Required("type"): "auth/long_lived_access_token", + probatio.Required("lifespan"): int, # days + probatio.Required("client_name"): str, + probatio.Optional("client_icon"): str, } ) @websocket_api.ws_require_user() @@ -547,7 +547,7 @@ async def websocket_create_long_lived_access_token( connection.send_result(msg["id"], access_token) -@websocket_api.websocket_command({vol.Required("type"): "auth/refresh_tokens"}) +@websocket_api.websocket_command({probatio.Required("type"): "auth/refresh_tokens"}) @websocket_api.ws_require_user() @callback def websocket_refresh_tokens( @@ -589,8 +589,8 @@ def websocket_refresh_tokens( @callback @websocket_api.websocket_command( { - vol.Required("type"): "auth/delete_refresh_token", - vol.Required("refresh_token_id"): str, + probatio.Required("type"): "auth/delete_refresh_token", + probatio.Required("refresh_token_id"): str, } ) @websocket_api.ws_require_user() @@ -612,9 +612,9 @@ def websocket_delete_refresh_token( @callback @websocket_api.websocket_command( { - vol.Required("type"): "auth/delete_all_refresh_tokens", - vol.Optional("token_type"): cv.string, - vol.Optional("delete_current_token", default=True): bool, + probatio.Required("type"): "auth/delete_all_refresh_tokens", + probatio.Optional("token_type"): cv.string, + probatio.Optional("delete_current_token", default=True): bool, } ) @websocket_api.ws_require_user() @@ -684,9 +684,9 @@ async def _delete_current_token_soon(current_refresh_token: RefreshToken) -> Non @websocket_api.websocket_command( { - vol.Required("type"): "auth/sign_path", - vol.Required("path"): str, - vol.Optional("expires", default=30): int, + probatio.Required("type"): "auth/sign_path", + probatio.Required("path"): str, + probatio.Optional("expires", default=30): int, } ) @websocket_api.ws_require_user() @@ -712,9 +712,9 @@ def websocket_sign_path( @callback @websocket_api.websocket_command( { - vol.Required("type"): "auth/refresh_token_set_expiry", - vol.Required("refresh_token_id"): str, - vol.Required("enable_expiry"): bool, + probatio.Required("type"): "auth/refresh_token_set_expiry", + probatio.Required("refresh_token_id"): str, + probatio.Required("enable_expiry"): bool, } ) @websocket_api.ws_require_user() diff --git a/homeassistant/components/auth/login_flow.py b/homeassistant/components/auth/login_flow.py index a19508f3918ec..68d2551a965f7 100644 --- a/homeassistant/components/auth/login_flow.py +++ b/homeassistant/components/auth/login_flow.py @@ -70,8 +70,7 @@ from typing import TYPE_CHECKING, Any, cast from aiohttp import web -from probatio import to_field_list -import voluptuous as vol +import probatio from homeassistant import data_entry_flow from homeassistant.auth import AuthManagerFlowManager, InvalidAuthError @@ -258,7 +257,7 @@ def _prepare_result_json(result: AuthFlowResult) -> dict[str, Any]: if (schema := result["data_schema"]) is None: data["data_schema"] = [] else: - data["data_schema"] = to_field_list(schema) + data["data_schema"] = probatio.to_field_list(schema) return data @@ -339,14 +338,16 @@ async def get(self, request: web.Request) -> web.Response: return web.Response(status=HTTPStatus.METHOD_NOT_ALLOWED) @RequestDataValidator( - vol.Schema( + probatio.Schema( { - vol.Required("client_id"): str, - vol.Required("handler"): vol.All( - [vol.Any(str, None)], vol.Length(2, 2), vol.Coerce(tuple) + probatio.Required("client_id"): str, + probatio.Required("handler"): probatio.All( + [probatio.Any(str, None)], + probatio.Length(2, 2), + probatio.Coerce(tuple), ), - vol.Required("redirect_uri"): str, - vol.Optional( + probatio.Required("redirect_uri"): str, + probatio.Optional( "type", default="authorize" ): str, # not used, kept for backwards compatibility } @@ -392,9 +393,9 @@ async def get(self, request: web.Request) -> web.Response: return self.json_message("Invalid flow specified", HTTPStatus.NOT_FOUND) @RequestDataValidator( - vol.Schema( - {vol.Required("client_id"): str}, - extra=vol.ALLOW_EXTRA, + probatio.Schema( + {probatio.Required("client_id"): str}, + extra=probatio.ALLOW_EXTRA, ) ) @log_invalid_auth @@ -415,7 +416,7 @@ async def post( result = await self._flow_mgr.async_configure(flow_id, data) except data_entry_flow.UnknownFlow: return self.json_message("Invalid flow specified", HTTPStatus.NOT_FOUND) - except vol.Invalid: + except probatio.Invalid: return self.json_message("User input malformed", HTTPStatus.BAD_REQUEST) return await self._async_flow_result_to_response(request, client_id, result) diff --git a/homeassistant/components/auth/mfa_setup_flow.py b/homeassistant/components/auth/mfa_setup_flow.py index 256c97586b4cc..5e5383961986b 100644 --- a/homeassistant/components/auth/mfa_setup_flow.py +++ b/homeassistant/components/auth/mfa_setup_flow.py @@ -3,8 +3,7 @@ import logging from typing import Any, override -from probatio import to_field_list -import voluptuous as vol +import probatio from homeassistant import data_entry_flow from homeassistant.components import websocket_api @@ -61,13 +60,13 @@ def async_setup(hass: HomeAssistant) -> None: @callback @websocket_api.websocket_command( - vol.All( - vol.Schema( + probatio.All( + probatio.Schema( { - vol.Required("type"): "auth/setup_mfa", - vol.Exclusive("mfa_module_id", "module_or_flow_id"): str, - vol.Exclusive("flow_id", "module_or_flow_id"): str, - vol.Optional("user_input"): object, + probatio.Required("type"): "auth/setup_mfa", + probatio.Exclusive("mfa_module_id", "module_or_flow_id"): str, + probatio.Exclusive("flow_id", "module_or_flow_id"): str, + probatio.Optional("user_input"): object, } ), cv.has_at_least_one_key("mfa_module_id", "flow_id"), @@ -112,7 +111,10 @@ async def async_setup_flow(msg: dict[str, Any]) -> None: @callback @websocket_api.websocket_command( - {vol.Required("type"): "auth/depose_mfa", vol.Required("mfa_module_id"): str} + { + probatio.Required("type"): "auth/depose_mfa", + probatio.Required("mfa_module_id"): str, + } ) @websocket_api.ws_require_user(allow_system_user=False) def websocket_depose_mfa( @@ -153,6 +155,6 @@ def _prepare_result_json(result: data_entry_flow.FlowResult) -> dict[str, Any]: if (schema := result["data_schema"]) is None: data["data_schema"] = [] else: - data["data_schema"] = to_field_list(schema) + data["data_schema"] = probatio.to_field_list(schema) return data diff --git a/homeassistant/components/automation/__init__.py b/homeassistant/components/automation/__init__.py index b4bac8dd3d763..9cf80728504bf 100644 --- a/homeassistant/components/automation/__init__.py +++ b/homeassistant/components/automation/__init__.py @@ -7,8 +7,8 @@ import logging from typing import Any, cast, override +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.components import websocket_api from homeassistant.components.blueprint import CONF_USE_BLUEPRINT @@ -272,8 +272,8 @@ async def trigger_service_handler( component.async_register_entity_service( SERVICE_TRIGGER, { - vol.Optional(ATTR_VARIABLES, default={}): dict, - vol.Optional(CONF_SKIP_CONDITION, default=True): bool, + probatio.Optional(ATTR_VARIABLES, default={}): dict, + probatio.Optional(CONF_SKIP_CONDITION, default=True): bool, }, trigger_service_handler, ) @@ -281,7 +281,11 @@ async def trigger_service_handler( component.async_register_entity_service(SERVICE_TURN_ON, None, "async_turn_on") component.async_register_entity_service( SERVICE_TURN_OFF, - {vol.Optional(CONF_STOP_ACTIONS, default=DEFAULT_STOP_ACTIONS): cv.boolean}, + { + probatio.Optional( + CONF_STOP_ACTIONS, default=DEFAULT_STOP_ACTIONS + ): cv.boolean + }, "async_turn_off", ) @@ -307,7 +311,7 @@ def reload_targets(service_call: ServiceCall) -> set[str | None]: DOMAIN, SERVICE_RELOAD, reload_helper.execute_service, - schema=vol.Schema({vol.Optional(CONF_ID): str}), + schema=probatio.Schema({probatio.Optional(CONF_ID): str}), ) websocket_api.async_register_command(hass, websocket_config) @@ -735,7 +739,7 @@ async def async_trigger( if not skip_condition and self._condition is not None: try: conditions_pass = self._condition.async_check(variables=variables) - except (vol.Invalid, HomeAssistantError) as err: + except (probatio.Invalid, HomeAssistantError) as err: self._logger.error( "Error while checking conditions of automation %s: %s", self.entity_id, @@ -802,7 +806,7 @@ def started_action() -> None: }, ) automation_trace.set_error(err) - except (vol.Invalid, HomeAssistantError) as err: + except (probatio.Invalid, HomeAssistantError) as err: self._logger.error( "Error while executing automation %s: %s", self.entity_id, diff --git a/homeassistant/components/automation/config.py b/homeassistant/components/automation/config.py index e67374cd12362..77a76f1e26aa8 100644 --- a/homeassistant/components/automation/config.py +++ b/homeassistant/components/automation/config.py @@ -5,8 +5,8 @@ from enum import StrEnum from typing import Any -import voluptuous as vol -from voluptuous.humanize import humanize_error +import probatio +from probatio.humanize import humanize_error from homeassistant.components import blueprint from homeassistant.components.trace import TRACE_CONFIG_SCHEMA @@ -43,13 +43,13 @@ PACKAGE_MERGE_HINT = "list" -_MINIMAL_PLATFORM_SCHEMA = vol.Schema( +_MINIMAL_PLATFORM_SCHEMA = probatio.Schema( { CONF_ID: str, CONF_ALIAS: cv.string, - vol.Optional(CONF_DESCRIPTION): cv.string, + probatio.Optional(CONF_DESCRIPTION): cv.string, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) @@ -61,7 +61,7 @@ def _backward_compat_schema(value: Any | None) -> Any: return cv.renamed(CONF_CONDITION, CONF_CONDITIONS)(value) -PLATFORM_SCHEMA = vol.All( +PLATFORM_SCHEMA = probatio.All( _backward_compat_schema, cv.deprecated(CONF_HIDE_ENTITY), script.make_script_schema( @@ -69,21 +69,21 @@ def _backward_compat_schema(value: Any | None) -> Any: # str on purpose CONF_ID: str, CONF_ALIAS: cv.string, - vol.Optional(CONF_DESCRIPTION): cv.string, - vol.Optional(CONF_TRACE, default={}): TRACE_CONFIG_SCHEMA, - vol.Optional(CONF_INITIAL_STATE): cv.boolean, - vol.Optional(CONF_HIDE_ENTITY): cv.boolean, - vol.Required(CONF_TRIGGERS): cv.TRIGGER_SCHEMA, - vol.Optional(CONF_CONDITIONS): cv.CONDITIONS_SCHEMA, - vol.Optional(CONF_VARIABLES): cv.SCRIPT_VARIABLES_SCHEMA, - vol.Optional(CONF_TRIGGER_VARIABLES): cv.SCRIPT_VARIABLES_SCHEMA, - vol.Required(CONF_ACTIONS): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_DESCRIPTION): cv.string, + probatio.Optional(CONF_TRACE, default={}): TRACE_CONFIG_SCHEMA, + probatio.Optional(CONF_INITIAL_STATE): cv.boolean, + probatio.Optional(CONF_HIDE_ENTITY): cv.boolean, + probatio.Required(CONF_TRIGGERS): cv.TRIGGER_SCHEMA, + probatio.Optional(CONF_CONDITIONS): cv.CONDITIONS_SCHEMA, + probatio.Optional(CONF_VARIABLES): cv.SCRIPT_VARIABLES_SCHEMA, + probatio.Optional(CONF_TRIGGER_VARIABLES): cv.SCRIPT_VARIABLES_SCHEMA, + probatio.Required(CONF_ACTIONS): cv.SCRIPT_SCHEMA, }, script.SCRIPT_MODE_SINGLE, ), ) -AUTOMATION_BLUEPRINT_SCHEMA = vol.All( +AUTOMATION_BLUEPRINT_SCHEMA = probatio.All( _backward_compat_schema, blueprint.schemas.BLUEPRINT_SCHEMA ) @@ -102,8 +102,8 @@ async def _async_validate_config_item( # noqa: C901 raw_config = dict(config) def _humanize(err: Exception, config: ConfigType) -> str: - """Humanize vol.Invalid, stringify other exceptions.""" - if isinstance(err, vol.Invalid): + """Humanize probatio.Invalid, stringify other exceptions.""" + if isinstance(err, probatio.Invalid): return humanize_error(config, err) return str(err) @@ -204,7 +204,7 @@ def _minimal_config( try: validated_config = PLATFORM_SCHEMA(config) - except vol.Invalid as err: + except probatio.Invalid as err: _log_invalid_automation(err, automation_name, "could not be validated", config) if raise_on_errors: raise @@ -219,7 +219,7 @@ def _minimal_config( hass, validated_config[CONF_TRIGGERS] ) except ( - vol.Invalid, + probatio.Invalid, HomeAssistantError, ) as err: _log_invalid_automation( @@ -238,7 +238,7 @@ def _minimal_config( hass, validated_config[CONF_CONDITIONS] ) except ( - vol.Invalid, + probatio.Invalid, HomeAssistantError, ) as err: _log_invalid_automation( @@ -259,7 +259,7 @@ def _minimal_config( hass, validated_config[CONF_ACTIONS] ) except ( - vol.Invalid, + probatio.Invalid, HomeAssistantError, ) as err: _log_invalid_automation( @@ -302,7 +302,7 @@ async def _try_async_validate_config_item( """Validate config item.""" try: return await _async_validate_config_item(hass, config, False, True) - except vol.Invalid, HomeAssistantError: + except probatio.Invalid, HomeAssistantError: return None diff --git a/homeassistant/components/autoskope/config_flow.py b/homeassistant/components/autoskope/config_flow.py index a353b62338fcb..1a0aa849cafe1 100644 --- a/homeassistant/components/autoskope/config_flow.py +++ b/homeassistant/components/autoskope/config_flow.py @@ -5,7 +5,7 @@ from autoskope_client.api import AutoskopeApi from autoskope_client.models import CannotConnect, InvalidAuth -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME @@ -19,16 +19,16 @@ from .const import DEFAULT_HOST, DOMAIN, SECTION_ADDITIONAL_SETTINGS -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), - vol.Required(SECTION_ADDITIONAL_SETTINGS): section( - vol.Schema( + probatio.Required(SECTION_ADDITIONAL_SETTINGS): section( + probatio.Schema( { - vol.Required(CONF_HOST, default=DEFAULT_HOST): TextSelector( + probatio.Required(CONF_HOST, default=DEFAULT_HOST): TextSelector( TextSelectorConfig(type=TextSelectorType.URL) ), } @@ -38,9 +38,9 @@ } ) -STEP_REAUTH_DATA_SCHEMA = vol.Schema( +STEP_REAUTH_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } @@ -83,7 +83,7 @@ async def async_step_user( try: cv.url(host) - except vol.Invalid: + except probatio.Invalid: errors["base"] = "invalid_url" if not errors: diff --git a/homeassistant/components/avea/config_flow.py b/homeassistant/components/avea/config_flow.py index a4ef48b0ef039..2339564342d34 100644 --- a/homeassistant/components/avea/config_flow.py +++ b/homeassistant/components/avea/config_flow.py @@ -6,7 +6,7 @@ import avea from bleak.exc import BleakError -import voluptuous as vol +import probatio from homeassistant.components import bluetooth from homeassistant.components.bluetooth import ( @@ -178,17 +178,17 @@ async def async_step_user( if self._discovery_info: disc = self._discovery_info - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_ADDRESS, default=disc.address): vol.In( + probatio.Required(CONF_ADDRESS, default=disc.address): probatio.In( {disc.address: _discovery_label(disc)} ) } ) else: - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_ADDRESS): vol.In( + probatio.Required(CONF_ADDRESS): probatio.In( { service_info.address: _discovery_label(service_info) for service_info in self._discovered_devices.values() diff --git a/homeassistant/components/awair/config_flow.py b/homeassistant/components/awair/config_flow.py index c99f8f1a02800..d1aabb4528866 100644 --- a/homeassistant/components/awair/config_flow.py +++ b/homeassistant/components/awair/config_flow.py @@ -4,10 +4,10 @@ from typing import Any, Self, cast, override from aiohttp.client_exceptions import ClientError +import probatio from python_awair import Awair, AwairLocal, AwairLocalDevice from python_awair.exceptions import AuthError, AwairError from python_awair.user import AwairUser -import voluptuous as vol from homeassistant.components import onboarding from homeassistant.config_entries import SOURCE_ZEROCONF, ConfigFlow, ConfigFlowResult @@ -109,7 +109,7 @@ async def async_step_cloud(self, user_input: Mapping[str, Any]) -> ConfigFlowRes return self.async_show_form( step_id="cloud", - data_schema=vol.Schema({vol.Optional(CONF_ACCESS_TOKEN): str}), + data_schema=probatio.Schema({probatio.Optional(CONF_ACCESS_TOKEN): str}), description_placeholders={ "url": "https://developer.getawair.com/onboard/login" }, @@ -181,11 +181,13 @@ async def async_step_local_pick( discovered = self._get_discovered_entries() if not discovered or (user_input and user_input.get(CONF_DEVICE) == "manual"): - data_schema = vol.Schema({vol.Required(CONF_HOST): str}) + data_schema = probatio.Schema({probatio.Required(CONF_HOST): str}) elif discovered: discovered["manual"] = "Manual" - data_schema = vol.Schema({vol.Required(CONF_DEVICE): vol.In(discovered)}) + data_schema = probatio.Schema( + {probatio.Required(CONF_DEVICE): probatio.In(discovered)} + ) return self.async_show_form( step_id="local_pick", @@ -221,7 +223,7 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema({vol.Required(CONF_ACCESS_TOKEN): str}), + data_schema=probatio.Schema({probatio.Required(CONF_ACCESS_TOKEN): str}), errors=errors, ) diff --git a/homeassistant/components/aws/__init__.py b/homeassistant/components/aws/__init__.py index 04eb622f5f5fa..ee8ab17b29a08 100644 --- a/homeassistant/components/aws/__init__.py +++ b/homeassistant/components/aws/__init__.py @@ -7,7 +7,7 @@ from typing import Any from aiobotocore.session import AioSession -import voluptuous as vol +import probatio from homeassistant import config_entries from homeassistant.config_entries import ConfigEntry @@ -48,13 +48,13 @@ class AWSData: sessions: OrderedDict[str, AioSession] -AWS_CREDENTIAL_SCHEMA = vol.Schema( +AWS_CREDENTIAL_SCHEMA = probatio.Schema( { - vol.Required(CONF_NAME): cv.string, - vol.Inclusive(CONF_ACCESS_KEY_ID, ATTR_CREDENTIALS): cv.string, - vol.Inclusive(CONF_SECRET_ACCESS_KEY, ATTR_CREDENTIALS): cv.string, - vol.Exclusive(CONF_PROFILE_NAME, ATTR_CREDENTIALS): cv.string, - vol.Optional(CONF_VALIDATE, default=True): cv.boolean, + probatio.Required(CONF_NAME): cv.string, + probatio.Inclusive(CONF_ACCESS_KEY_ID, ATTR_CREDENTIALS): cv.string, + probatio.Inclusive(CONF_SECRET_ACCESS_KEY, ATTR_CREDENTIALS): cv.string, + probatio.Exclusive(CONF_PROFILE_NAME, ATTR_CREDENTIALS): cv.string, + probatio.Optional(CONF_VALIDATE, default=True): cv.boolean, } ) @@ -64,35 +64,35 @@ class AWSData: SUPPORTED_SERVICES = ["lambda", "sns", "sqs", "events"] -NOTIFY_PLATFORM_SCHEMA = vol.Schema( +NOTIFY_PLATFORM_SCHEMA = probatio.Schema( { - vol.Optional(CONF_NAME): cv.string, - vol.Required(CONF_SERVICE): vol.All( - cv.string, vol.Lower, vol.In(SUPPORTED_SERVICES) + probatio.Optional(CONF_NAME): cv.string, + probatio.Required(CONF_SERVICE): probatio.All( + cv.string, probatio.Lower, probatio.In(SUPPORTED_SERVICES) ), - vol.Required(CONF_REGION): vol.All(cv.string, vol.Lower), - vol.Inclusive(CONF_ACCESS_KEY_ID, ATTR_CREDENTIALS): cv.string, - vol.Inclusive(CONF_SECRET_ACCESS_KEY, ATTR_CREDENTIALS): cv.string, - vol.Exclusive(CONF_PROFILE_NAME, ATTR_CREDENTIALS): cv.string, - vol.Exclusive(CONF_CREDENTIAL_NAME, ATTR_CREDENTIALS): cv.string, - vol.Optional(CONF_CONTEXT): vol.Coerce(dict), + probatio.Required(CONF_REGION): probatio.All(cv.string, probatio.Lower), + probatio.Inclusive(CONF_ACCESS_KEY_ID, ATTR_CREDENTIALS): cv.string, + probatio.Inclusive(CONF_SECRET_ACCESS_KEY, ATTR_CREDENTIALS): cv.string, + probatio.Exclusive(CONF_PROFILE_NAME, ATTR_CREDENTIALS): cv.string, + probatio.Exclusive(CONF_CREDENTIAL_NAME, ATTR_CREDENTIALS): cv.string, + probatio.Optional(CONF_CONTEXT): probatio.Coerce(dict), } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Optional(CONF_CREDENTIALS, default=DEFAULT_CREDENTIAL): vol.All( - cv.ensure_list, [AWS_CREDENTIAL_SCHEMA] - ), - vol.Optional(CONF_NOTIFY, default=[]): vol.All( + probatio.Optional( + CONF_CREDENTIALS, default=DEFAULT_CREDENTIAL + ): probatio.All(cv.ensure_list, [AWS_CREDENTIAL_SCHEMA]), + probatio.Optional(CONF_NOTIFY, default=[]): probatio.All( cv.ensure_list, [NOTIFY_PLATFORM_SCHEMA] ), } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/aws_s3/config_flow.py b/homeassistant/components/aws_s3/config_flow.py index 4b01794771a15..793e70d016fc4 100644 --- a/homeassistant/components/aws_s3/config_flow.py +++ b/homeassistant/components/aws_s3/config_flow.py @@ -6,7 +6,7 @@ from aiobotocore.config import AioConfig from aiobotocore.session import AioSession from botocore.exceptions import ClientError, ConnectionError, ParamValidationError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PREFIX @@ -29,17 +29,17 @@ DOMAIN, ) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_ACCESS_KEY_ID): cv.string, - vol.Required(CONF_SECRET_ACCESS_KEY): TextSelector( + probatio.Required(CONF_ACCESS_KEY_ID): cv.string, + probatio.Required(CONF_SECRET_ACCESS_KEY): TextSelector( config=TextSelectorConfig(type=TextSelectorType.PASSWORD) ), - vol.Required(CONF_BUCKET): cv.string, - vol.Required(CONF_ENDPOINT_URL, default=DEFAULT_ENDPOINT_URL): TextSelector( - config=TextSelectorConfig(type=TextSelectorType.URL) - ), - vol.Optional(CONF_PREFIX, default=""): cv.string, + probatio.Required(CONF_BUCKET): cv.string, + probatio.Required( + CONF_ENDPOINT_URL, default=DEFAULT_ENDPOINT_URL + ): TextSelector(config=TextSelectorConfig(type=TextSelectorType.URL)), + probatio.Optional(CONF_PREFIX, default=""): cv.string, } ) diff --git a/homeassistant/components/axis/config_flow.py b/homeassistant/components/axis/config_flow.py index 7464b1a183d43..985ab9b1db72a 100644 --- a/homeassistant/components/axis/config_flow.py +++ b/homeassistant/components/axis/config_flow.py @@ -5,7 +5,7 @@ from typing import TYPE_CHECKING, Any, override from urllib.parse import urlsplit -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -129,17 +129,17 @@ async def async_step_user( return await self._create_entry() data = self.discovery_schema or { - vol.Required(CONF_PROTOCOL): vol.In(PROTOCOL_CHOICES), - vol.Required(CONF_HOST): str, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Required(CONF_PROTOCOL): probatio.In(PROTOCOL_CHOICES), + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, } return self.async_show_form( step_id="user", description_placeholders=self.config, - data_schema=vol.Schema(data), + data_schema=probatio.Schema(data), errors=errors, ) @@ -181,11 +181,13 @@ async def _redo_configuration( protocol = entry_data.get(CONF_PROTOCOL, "http") password = entry_data[CONF_PASSWORD] if keep_password else "" self.discovery_schema = { - vol.Required(CONF_PROTOCOL, default=protocol): vol.In(PROTOCOL_CHOICES), - vol.Required(CONF_HOST, default=entry_data[CONF_HOST]): str, - vol.Required(CONF_USERNAME, default=entry_data[CONF_USERNAME]): str, - vol.Required(CONF_PASSWORD, default=password): str, - vol.Required(CONF_PORT, default=entry_data[CONF_PORT]): int, + probatio.Required(CONF_PROTOCOL, default=protocol): probatio.In( + PROTOCOL_CHOICES + ), + probatio.Required(CONF_HOST, default=entry_data[CONF_HOST]): str, + probatio.Required(CONF_USERNAME, default=entry_data[CONF_USERNAME]): str, + probatio.Required(CONF_PASSWORD, default=password): str, + probatio.Required(CONF_PORT, default=entry_data[CONF_PORT]): int, } return await self.async_step_user() @@ -260,13 +262,13 @@ async def _process_discovered_device( ) self.discovery_schema = { - vol.Required(CONF_PROTOCOL): vol.In(PROTOCOL_CHOICES), - vol.Required(CONF_HOST, default=discovery_info[CONF_HOST]): TextSelector( - TextSelectorConfig(read_only=True) - ), - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Required(CONF_PROTOCOL): probatio.In(PROTOCOL_CHOICES), + probatio.Required( + CONF_HOST, default=discovery_info[CONF_HOST] + ): TextSelector(TextSelectorConfig(read_only=True)), + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, } return await self.async_step_user() @@ -319,10 +321,10 @@ async def async_step_configure_stream( stream_profiles.extend(profile.name for profile in vapix.streaming_profiles) schema[ - vol.Optional( + probatio.Optional( CONF_STREAM_PROFILE, default=self.hub.config.stream_profile ) - ] = vol.In(stream_profiles) + ] = probatio.In(stream_profiles) # Video sources @@ -339,9 +341,11 @@ async def async_step_configure_stream( video_sources[int(idx) + 1] = video_source.name schema[ - vol.Optional(CONF_VIDEO_SOURCE, default=self.hub.config.video_source) - ] = vol.In(video_sources) + probatio.Optional( + CONF_VIDEO_SOURCE, default=self.hub.config.video_source + ) + ] = probatio.In(video_sources) return self.async_show_form( - step_id="configure_stream", data_schema=vol.Schema(schema) + step_id="configure_stream", data_schema=probatio.Schema(schema) ) diff --git a/homeassistant/components/azure_data_explorer/__init__.py b/homeassistant/components/azure_data_explorer/__init__.py index 9f6e03f88d297..33cb350b47dc3 100644 --- a/homeassistant/components/azure_data_explorer/__init__.py +++ b/homeassistant/components/azure_data_explorer/__init__.py @@ -8,7 +8,7 @@ import logging from azure.kusto.data.exceptions import KustoAuthenticationError, KustoServiceError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigEntry from homeassistant.const import MATCH_ALL @@ -33,15 +33,15 @@ _LOGGER = logging.getLogger(__name__) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Optional(CONF_FILTER, default={}): FILTER_SCHEMA, + probatio.Optional(CONF_FILTER, default={}): FILTER_SCHEMA, }, ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) DATA_COMPONENT: HassKey[EntityFilter] = HassKey(DOMAIN) diff --git a/homeassistant/components/azure_data_explorer/config_flow.py b/homeassistant/components/azure_data_explorer/config_flow.py index 60952df3ce6b6..30f5bde597ae4 100644 --- a/homeassistant/components/azure_data_explorer/config_flow.py +++ b/homeassistant/components/azure_data_explorer/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from azure.kusto.data.exceptions import KustoAuthenticationError, KustoServiceError -import voluptuous as vol +import probatio from homeassistant import config_entries from homeassistant.config_entries import ConfigFlowResult @@ -25,15 +25,15 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_ADX_CLUSTER_INGEST_URI): str, - vol.Required(CONF_ADX_DATABASE_NAME): str, - vol.Required(CONF_ADX_TABLE_NAME): str, - vol.Required(CONF_APP_REG_ID): str, - vol.Required(CONF_APP_REG_SECRET): str, - vol.Required(CONF_AUTHORITY_ID): str, - vol.Required(CONF_USE_QUEUED_CLIENT, default=False): BooleanSelector(), + probatio.Required(CONF_ADX_CLUSTER_INGEST_URI): str, + probatio.Required(CONF_ADX_DATABASE_NAME): str, + probatio.Required(CONF_ADX_TABLE_NAME): str, + probatio.Required(CONF_APP_REG_ID): str, + probatio.Required(CONF_APP_REG_SECRET): str, + probatio.Required(CONF_AUTHORITY_ID): str, + probatio.Required(CONF_USE_QUEUED_CLIENT, default=False): BooleanSelector(), } ) diff --git a/homeassistant/components/azure_devops/config_flow.py b/homeassistant/components/azure_devops/config_flow.py index c417572cfb597..6cc4862fef35f 100644 --- a/homeassistant/components/azure_devops/config_flow.py +++ b/homeassistant/components/azure_devops/config_flow.py @@ -5,7 +5,7 @@ from aioazuredevops.client import DevOpsClient import aiohttp -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.helpers.aiohttp_client import async_get_clientsession @@ -30,11 +30,11 @@ async def _show_setup_form( """Show the setup form to the user.""" return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_ORG, default=self._organization): str, - vol.Required(CONF_PROJECT, default=self._project): str, - vol.Optional(CONF_PAT): str, + probatio.Required(CONF_ORG, default=self._organization): str, + probatio.Required(CONF_PROJECT, default=self._project): str, + probatio.Optional(CONF_PAT): str, } ), errors=errors or {}, @@ -118,7 +118,7 @@ async def async_step_reauth_confirm( description_placeholders={ "project_url": f"{self._organization}/{self._project}" }, - data_schema=vol.Schema({vol.Required(CONF_PAT): str}), + data_schema=probatio.Schema({probatio.Required(CONF_PAT): str}), errors=errors or {}, ) diff --git a/homeassistant/components/azure_event_hub/__init__.py b/homeassistant/components/azure_event_hub/__init__.py index 0b3120bf4982c..cb3c93274296c 100644 --- a/homeassistant/components/azure_event_hub/__init__.py +++ b/homeassistant/components/azure_event_hub/__init__.py @@ -10,7 +10,7 @@ from azure.eventhub import EventData, EventDataBatch from azure.eventhub.aio import EventHubProducerClient from azure.eventhub.exceptions import EventHubError -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry from homeassistant.const import MATCH_ALL @@ -43,22 +43,22 @@ _LOGGER = logging.getLogger(__name__) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Optional(CONF_EVENT_HUB_INSTANCE_NAME): cv.string, - vol.Optional(CONF_EVENT_HUB_CON_STRING): cv.string, - vol.Optional(CONF_EVENT_HUB_NAMESPACE): cv.string, - vol.Optional(CONF_EVENT_HUB_SAS_POLICY): cv.string, - vol.Optional(CONF_EVENT_HUB_SAS_KEY): cv.string, - vol.Optional(CONF_SEND_INTERVAL): cv.positive_int, - vol.Optional(CONF_MAX_DELAY): cv.positive_int, - vol.Optional(CONF_FILTER, default={}): FILTER_SCHEMA, + probatio.Optional(CONF_EVENT_HUB_INSTANCE_NAME): cv.string, + probatio.Optional(CONF_EVENT_HUB_CON_STRING): cv.string, + probatio.Optional(CONF_EVENT_HUB_NAMESPACE): cv.string, + probatio.Optional(CONF_EVENT_HUB_SAS_POLICY): cv.string, + probatio.Optional(CONF_EVENT_HUB_SAS_KEY): cv.string, + probatio.Optional(CONF_SEND_INTERVAL): cv.positive_int, + probatio.Optional(CONF_MAX_DELAY): cv.positive_int, + probatio.Optional(CONF_FILTER, default={}): FILTER_SCHEMA, }, ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) DATA_COMPONENT: HassKey[EntityFilter] = HassKey(DOMAIN) diff --git a/homeassistant/components/azure_event_hub/config_flow.py b/homeassistant/components/azure_event_hub/config_flow.py index 5a047c708bf25..875da527c5ef0 100644 --- a/homeassistant/components/azure_event_hub/config_flow.py +++ b/homeassistant/components/azure_event_hub/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from azure.eventhub.exceptions import EventHubError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigEntry, ConfigFlow, ConfigFlowResult from homeassistant.core import callback @@ -33,30 +33,30 @@ _LOGGER = logging.getLogger(__name__) -BASE_SCHEMA = vol.Schema( +BASE_SCHEMA = probatio.Schema( { - vol.Required(CONF_EVENT_HUB_INSTANCE_NAME): str, - vol.Optional(CONF_USE_CONN_STRING, default=False): bool, + probatio.Required(CONF_EVENT_HUB_INSTANCE_NAME): str, + probatio.Optional(CONF_USE_CONN_STRING, default=False): bool, } ) -CONN_STRING_SCHEMA = vol.Schema( +CONN_STRING_SCHEMA = probatio.Schema( { - vol.Required(CONF_EVENT_HUB_CON_STRING): str, + probatio.Required(CONF_EVENT_HUB_CON_STRING): str, } ) -SAS_SCHEMA = vol.Schema( +SAS_SCHEMA = probatio.Schema( { - vol.Required(CONF_EVENT_HUB_NAMESPACE): str, - vol.Required(CONF_EVENT_HUB_SAS_POLICY): str, - vol.Required(CONF_EVENT_HUB_SAS_KEY): str, + probatio.Required(CONF_EVENT_HUB_NAMESPACE): str, + probatio.Required(CONF_EVENT_HUB_SAS_POLICY): str, + probatio.Required(CONF_EVENT_HUB_SAS_KEY): str, } ) -OPTIONS_SCHEMA = vol.Schema( +OPTIONS_SCHEMA = probatio.Schema( { - vol.Required(CONF_SEND_INTERVAL): int, + probatio.Required(CONF_SEND_INTERVAL): int, } ) OPTIONS_FLOW = { diff --git a/homeassistant/components/azure_service_bus/notify.py b/homeassistant/components/azure_service_bus/notify.py index 711e9196916dd..1f3b2c2822dc6 100644 --- a/homeassistant/components/azure_service_bus/notify.py +++ b/homeassistant/components/azure_service_bus/notify.py @@ -11,7 +11,7 @@ ServiceBusConnectionError, ServiceBusError, ) -import voluptuous as vol +import probatio from homeassistant.components.notify import ( ATTR_DATA, @@ -33,15 +33,15 @@ ATTR_ASB_TITLE = "title" ATTR_ASB_TARGET = "target" -PLATFORM_SCHEMA = vol.All( +PLATFORM_SCHEMA = probatio.All( cv.has_at_least_one_key(CONF_QUEUE_NAME, CONF_TOPIC_NAME), NOTIFY_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_CONNECTION_STRING): cv.string, - vol.Exclusive( + probatio.Required(CONF_CONNECTION_STRING): cv.string, + probatio.Exclusive( CONF_QUEUE_NAME, "output", "Can only send to a queue or a topic." ): cv.string, - vol.Exclusive( + probatio.Exclusive( CONF_TOPIC_NAME, "output", "Can only send to a queue or a topic." ): cv.string, } diff --git a/homeassistant/components/azure_storage/config_flow.py b/homeassistant/components/azure_storage/config_flow.py index 94b8b0883e476..3aabcdc71c871 100644 --- a/homeassistant/components/azure_storage/config_flow.py +++ b/homeassistant/components/azure_storage/config_flow.py @@ -9,7 +9,7 @@ AioHttpTransport, ) # need to import from private file, as it is not properly imported in the init from azure.storage.blob.aio import ContainerClient -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.helpers.aiohttp_client import async_get_clientsession @@ -89,13 +89,13 @@ async def async_step_user( ) return self.async_show_form( - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_ACCOUNT_NAME): str, - vol.Required( + probatio.Required(CONF_ACCOUNT_NAME): str, + probatio.Required( CONF_CONTAINER_NAME, default="home-assistant-backups" ): str, - vol.Required(CONF_STORAGE_ACCOUNT_KEY): str, + probatio.Required(CONF_STORAGE_ACCOUNT_KEY): str, } ), errors=errors, @@ -129,9 +129,9 @@ async def async_step_reauth_confirm( ) return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_STORAGE_ACCOUNT_KEY): str, + probatio.Required(CONF_STORAGE_ACCOUNT_KEY): str, } ), errors=errors, @@ -157,13 +157,13 @@ async def async_step_reconfigure( data={**reconfigure_entry.data, **user_input}, ) return self.async_show_form( - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_CONTAINER_NAME, default=reconfigure_entry.data[CONF_CONTAINER_NAME], ): str, - vol.Required( + probatio.Required( CONF_STORAGE_ACCOUNT_KEY, default=reconfigure_entry.data[CONF_STORAGE_ACCOUNT_KEY], ): str, diff --git a/homeassistant/components/backblaze_b2/config_flow.py b/homeassistant/components/backblaze_b2/config_flow.py index 682ae6805538c..ee54df66f5059 100644 --- a/homeassistant/components/backblaze_b2/config_flow.py +++ b/homeassistant/components/backblaze_b2/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from b2sdk.v2 import exception -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigEntry, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PREFIX @@ -31,14 +31,14 @@ # Constants REQUIRED_CAPABILITIES = {"writeFiles", "listFiles", "deleteFiles", "readFiles"} -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_KEY_ID): cv.string, - vol.Required(CONF_APPLICATION_KEY): TextSelector( + probatio.Required(CONF_KEY_ID): cv.string, + probatio.Required(CONF_APPLICATION_KEY): TextSelector( config=TextSelectorConfig(type=TextSelectorType.PASSWORD) ), - vol.Required(CONF_BUCKET): cv.string, - vol.Optional(CONF_PREFIX, default=""): cv.string, + probatio.Required(CONF_BUCKET): cv.string, + probatio.Optional(CONF_PREFIX, default=""): cv.string, } ) @@ -250,10 +250,10 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_KEY_ID): cv.string, - vol.Required(CONF_APPLICATION_KEY): TextSelector( + probatio.Required(CONF_KEY_ID): cv.string, + probatio.Required(CONF_APPLICATION_KEY): TextSelector( config=TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } diff --git a/homeassistant/components/backup/onboarding.py b/homeassistant/components/backup/onboarding.py index dc5a56ec1d870..49bbf5659b1e3 100644 --- a/homeassistant/components/backup/onboarding.py +++ b/homeassistant/components/backup/onboarding.py @@ -7,7 +7,7 @@ from aiohttp import web from aiohttp.web_exceptions import HTTPUnauthorized -import voluptuous as vol +import probatio from homeassistant.components.http import KEY_HASS from homeassistant.components.http.data_validator import RequestDataValidator @@ -89,14 +89,14 @@ class RestoreBackupView(NoAuthBaseOnboardingView): name = "api:onboarding:backup:restore" @RequestDataValidator( - vol.Schema( + probatio.Schema( { - vol.Required("backup_id"): str, - vol.Required("agent_id"): str, - vol.Optional("password"): str, - vol.Optional("restore_addons"): [str], - vol.Optional("restore_database", default=True): bool, - vol.Optional("restore_folders"): [vol.Coerce(Folder)], + probatio.Required("backup_id"): str, + probatio.Required("agent_id"): str, + probatio.Optional("password"): str, + probatio.Optional("restore_addons"): [str], + probatio.Optional("restore_database", default=True): bool, + probatio.Optional("restore_folders"): [probatio.Coerce(Folder)], } ) ) diff --git a/homeassistant/components/backup/websocket.py b/homeassistant/components/backup/websocket.py index db00a6d978b73..21b75f5d18aef 100644 --- a/homeassistant/components/backup/websocket.py +++ b/homeassistant/components/backup/websocket.py @@ -2,7 +2,7 @@ from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.core import HomeAssistant, callback @@ -41,7 +41,7 @@ def async_register_websocket_handlers(hass: HomeAssistant, with_hassio: bool) -> @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required("type"): "backup/info"}) +@websocket_api.websocket_command({probatio.Required("type"): "backup/info"}) @websocket_api.async_response async def handle_info( hass: HomeAssistant, @@ -79,8 +79,8 @@ async def handle_info( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "backup/details", - vol.Required("backup_id"): str, + probatio.Required("type"): "backup/details", + probatio.Required("backup_id"): str, } ) @websocket_api.async_response @@ -107,8 +107,8 @@ async def handle_details( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "backup/delete", - vol.Required("backup_id"): str, + probatio.Required("type"): "backup/delete", + probatio.Required("backup_id"): str, } ) @websocket_api.async_response @@ -132,14 +132,14 @@ async def handle_delete( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "backup/restore", - vol.Required("backup_id"): str, - vol.Required("agent_id"): str, - vol.Optional("password"): str, - vol.Optional("restore_addons"): [str], - vol.Optional("restore_database", default=True): bool, - vol.Optional("restore_folders"): [vol.Coerce(Folder)], - vol.Optional("restore_homeassistant", default=True): bool, + probatio.Required("type"): "backup/restore", + probatio.Required("backup_id"): str, + probatio.Required("agent_id"): str, + probatio.Optional("password"): str, + probatio.Optional("restore_addons"): [str], + probatio.Optional("restore_database", default=True): bool, + probatio.Optional("restore_folders"): [probatio.Coerce(Folder)], + probatio.Optional("restore_homeassistant", default=True): bool, } ) @websocket_api.async_response @@ -170,10 +170,10 @@ async def handle_restore( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "backup/can_decrypt_on_download", - vol.Required("backup_id"): str, - vol.Required("agent_id"): str, - vol.Required("password"): str, + probatio.Required("type"): "backup/can_decrypt_on_download", + probatio.Required("backup_id"): str, + probatio.Required("agent_id"): str, + probatio.Required("password"): str, } ) @websocket_api.async_response @@ -204,15 +204,15 @@ async def handle_can_decrypt_on_download( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "backup/generate", - vol.Required("agent_ids"): [str], - vol.Optional("include_addons"): [str], - vol.Optional("include_all_addons", default=False): bool, - vol.Optional("include_database", default=True): bool, - vol.Optional("include_folders"): [vol.Coerce(Folder)], - vol.Optional("include_homeassistant", default=True): bool, - vol.Optional("name"): vol.Any(str, None), - vol.Optional("password"): vol.Any(str, None), + probatio.Required("type"): "backup/generate", + probatio.Required("agent_ids"): [str], + probatio.Optional("include_addons"): [str], + probatio.Optional("include_all_addons", default=False): bool, + probatio.Optional("include_database", default=True): bool, + probatio.Optional("include_folders"): [probatio.Coerce(Folder)], + probatio.Optional("include_homeassistant", default=True): bool, + probatio.Optional("name"): probatio.Any(str, None), + probatio.Optional("password"): probatio.Any(str, None), } ) @websocket_api.async_response @@ -239,7 +239,7 @@ async def handle_create( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "backup/generate_with_automatic_settings", + probatio.Required("type"): "backup/generate_with_automatic_settings", } ) @websocket_api.async_response @@ -266,7 +266,7 @@ async def handle_create_with_automatic_settings( @websocket_api.ws_require_user(only_supervisor=True) -@websocket_api.websocket_command({vol.Required("type"): "backup/start"}) +@websocket_api.websocket_command({probatio.Required("type"): "backup/start"}) @websocket_api.async_response async def handle_backup_start( hass: HomeAssistant, @@ -287,7 +287,7 @@ async def handle_backup_start( @websocket_api.ws_require_user(only_supervisor=True) -@websocket_api.websocket_command({vol.Required("type"): "backup/end"}) +@websocket_api.websocket_command({probatio.Required("type"): "backup/end"}) @websocket_api.async_response async def handle_backup_end( hass: HomeAssistant, @@ -308,7 +308,7 @@ async def handle_backup_end( @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required("type"): "backup/agents/info"}) +@websocket_api.websocket_command({probatio.Required("type"): "backup/agents/info"}) @websocket_api.async_response async def backup_agents_info( hass: HomeAssistant, @@ -329,7 +329,7 @@ async def backup_agents_info( @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required("type"): "backup/config/info"}) +@websocket_api.websocket_command({probatio.Required("type"): "backup/config/info"}) @websocket_api.async_response async def handle_config_info( hass: HomeAssistant, @@ -359,22 +359,22 @@ async def handle_config_info( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "backup/config/update", - vol.Optional("agents"): vol.Schema( + probatio.Required("type"): "backup/config/update", + probatio.Optional("agents"): probatio.Schema( { str: { - vol.Optional("protected"): bool, - vol.Optional("retention"): vol.Any( - vol.Schema( + probatio.Optional("protected"): bool, + probatio.Optional("retention"): probatio.Any( + probatio.Schema( { # Note: We can't use cv.positive_int # because it allows 0 even # though 0 is not positive. - vol.Optional("copies"): vol.Any( - vol.All(int, vol.Range(min=1)), None + probatio.Optional("copies"): probatio.Any( + probatio.All(int, probatio.Range(min=1)), None ), - vol.Optional("days"): vol.Any( - vol.All(int, vol.Range(min=1)), None + probatio.Optional("days"): probatio.Any( + probatio.All(int, probatio.Range(min=1)), None ), }, ), @@ -383,39 +383,43 @@ async def handle_config_info( } } ), - vol.Optional("automatic_backups_configured"): bool, - vol.Optional("create_backup"): vol.Schema( + probatio.Optional("automatic_backups_configured"): bool, + probatio.Optional("create_backup"): probatio.Schema( { - vol.Optional("agent_ids"): vol.All([str], vol.Unique()), - vol.Optional("include_addons"): vol.Any( - vol.All([str], vol.Unique()), None + probatio.Optional("agent_ids"): probatio.All([str], probatio.Unique()), + probatio.Optional("include_addons"): probatio.Any( + probatio.All([str], probatio.Unique()), None ), - vol.Optional("include_all_addons"): bool, - vol.Optional("include_database"): bool, - vol.Optional("include_folders"): vol.Any( - vol.All([vol.Coerce(Folder)], vol.Unique()), None + probatio.Optional("include_all_addons"): bool, + probatio.Optional("include_database"): bool, + probatio.Optional("include_folders"): probatio.Any( + probatio.All([probatio.Coerce(Folder)], probatio.Unique()), None ), - vol.Optional("name"): vol.Any(str, None), - vol.Optional("password"): vol.Any(str, None), + probatio.Optional("name"): probatio.Any(str, None), + probatio.Optional("password"): probatio.Any(str, None), }, ), - vol.Optional("retention"): vol.Schema( + probatio.Optional("retention"): probatio.Schema( { # Note: We can't use cv.positive_int because it allows 0 even # though 0 is not positive. - vol.Optional("copies"): vol.Any(vol.All(int, vol.Range(min=1)), None), - vol.Optional("days"): vol.Any(vol.All(int, vol.Range(min=1)), None), + probatio.Optional("copies"): probatio.Any( + probatio.All(int, probatio.Range(min=1)), None + ), + probatio.Optional("days"): probatio.Any( + probatio.All(int, probatio.Range(min=1)), None + ), }, ), - vol.Optional("schedule"): vol.Schema( + probatio.Optional("schedule"): probatio.Schema( { - vol.Optional("days"): vol.Any( - vol.All([vol.Coerce(Day)], vol.Unique()), + probatio.Optional("days"): probatio.Any( + probatio.All([probatio.Coerce(Day)], probatio.Unique()), ), - vol.Optional("recurrence"): vol.All( - str, vol.Coerce(ScheduleRecurrence) + probatio.Optional("recurrence"): probatio.All( + str, probatio.Coerce(ScheduleRecurrence) ), - vol.Optional("time"): vol.Any(cv.time, None), + probatio.Optional("time"): probatio.Any(cv.time, None), } ), } @@ -435,7 +439,7 @@ def handle_config_update( @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required("type"): "backup/subscribe_events"}) +@websocket_api.websocket_command({probatio.Required("type"): "backup/subscribe_events"}) @websocket_api.async_response async def handle_subscribe_events( hass: HomeAssistant, diff --git a/homeassistant/components/baf/config_flow.py b/homeassistant/components/baf/config_flow.py index acc2466cfafec..74a0a4fa95a96 100644 --- a/homeassistant/components/baf/config_flow.py +++ b/homeassistant/components/baf/config_flow.py @@ -6,7 +6,7 @@ from aiobafi6 import Device, Service from aiobafi6.discovery import PORT -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_IP_ADDRESS @@ -111,8 +111,8 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_IP_ADDRESS, default=ip_address): str} + data_schema=probatio.Schema( + {probatio.Required(CONF_IP_ADDRESS, default=ip_address): str} ), errors=errors, ) diff --git a/homeassistant/components/baidu/tts.py b/homeassistant/components/baidu/tts.py index 5fff3e1f629aa..9662dda0afaaa 100644 --- a/homeassistant/components/baidu/tts.py +++ b/homeassistant/components/baidu/tts.py @@ -4,7 +4,7 @@ from typing import Any, override from aip import AipSpeech -import voluptuous as vol +import probatio from homeassistant.components.tts import ( CONF_LANG, @@ -30,20 +30,22 @@ PLATFORM_SCHEMA = TTS_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_LANG, default=DEFAULT_LANG): vol.In(SUPPORTED_LANGUAGES), - vol.Required(CONF_APP_ID): cv.string, - vol.Required(CONF_API_KEY): cv.string, - vol.Required(CONF_SECRET_KEY): cv.string, - vol.Optional(CONF_SPEED, default=5): vol.All( - vol.Coerce(int), vol.Range(min=0, max=9) + probatio.Optional(CONF_LANG, default=DEFAULT_LANG): probatio.In( + SUPPORTED_LANGUAGES ), - vol.Optional(CONF_PITCH, default=5): vol.All( - vol.Coerce(int), vol.Range(min=0, max=9) + probatio.Required(CONF_APP_ID): cv.string, + probatio.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_SECRET_KEY): cv.string, + probatio.Optional(CONF_SPEED, default=5): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=9) ), - vol.Optional(CONF_VOLUME, default=5): vol.All( - vol.Coerce(int), vol.Range(min=0, max=15) + probatio.Optional(CONF_PITCH, default=5): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=9) ), - vol.Optional(CONF_PERSON, default=0): vol.In(SUPPORTED_PERSON), + probatio.Optional(CONF_VOLUME, default=5): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=15) + ), + probatio.Optional(CONF_PERSON, default=0): probatio.In(SUPPORTED_PERSON), } ) diff --git a/homeassistant/components/balboa/config_flow.py b/homeassistant/components/balboa/config_flow.py index 7fd5847ea67a1..3e04fadf685fe 100644 --- a/homeassistant/components/balboa/config_flow.py +++ b/homeassistant/components/balboa/config_flow.py @@ -3,9 +3,9 @@ import logging from typing import Any, override +import probatio from pybalboa import SpaClient from pybalboa.exceptions import SpaConnectionError -import voluptuous as vol from homeassistant.config_entries import ConfigEntry, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_MODEL @@ -22,11 +22,11 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema({vol.Required(CONF_HOST): str}) +DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_HOST): str}) -OPTIONS_SCHEMA = vol.Schema( +OPTIONS_SCHEMA = probatio.Schema( { - vol.Required(CONF_SYNC_TIME, default=False): bool, + probatio.Required(CONF_SYNC_TIME, default=False): bool, } ) OPTIONS_FLOW = { diff --git a/homeassistant/components/bang_olufsen/config_flow.py b/homeassistant/components/bang_olufsen/config_flow.py index a01d625964024..1fd1fce5df278 100644 --- a/homeassistant/components/bang_olufsen/config_flow.py +++ b/homeassistant/components/bang_olufsen/config_flow.py @@ -6,7 +6,7 @@ from aiohttp.client_exceptions import ClientConnectorError from mozart_api.exceptions import ApiException from mozart_api.mozart_client import MozartClient -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_MODEL @@ -66,10 +66,10 @@ async def async_step_user( self, user_input: dict[str, Any] | None = None ) -> ConfigFlowResult: """Handle the initial step.""" - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_MODEL, default=DEFAULT_MODEL): SelectSelector( + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_MODEL, default=DEFAULT_MODEL): SelectSelector( SelectSelectorConfig(options=SELECTABLE_MODELS) ), } diff --git a/homeassistant/components/bang_olufsen/services.py b/homeassistant/components/bang_olufsen/services.py index db98053306ac8..e79016bcb8447 100644 --- a/homeassistant/components/bang_olufsen/services.py +++ b/homeassistant/components/bang_olufsen/services.py @@ -1,6 +1,6 @@ """Services for Bang & Olufsen integration.""" -import voluptuous as vol +import probatio from homeassistant.components.media_player import DOMAIN as MEDIA_PLAYER_DOMAIN from homeassistant.core import HomeAssistant, callback @@ -13,7 +13,7 @@ def async_setup_services(hass: HomeAssistant) -> None: """Home Assistant services.""" - jid_regex = vol.Match( + jid_regex = probatio.Match( r"(^\d{4})[.](\d{7})[.](\d{8})(@products\.bang-olufsen\.com)$" ) @@ -23,8 +23,8 @@ def async_setup_services(hass: HomeAssistant) -> None: "beolink_join", entity_domain=MEDIA_PLAYER_DOMAIN, schema={ - vol.Optional("beolink_jid"): jid_regex, - vol.Optional("source_id"): vol.In(BEOLINK_JOIN_SOURCES), + probatio.Optional("beolink_jid"): jid_regex, + probatio.Optional("source_id"): probatio.In(BEOLINK_JOIN_SOURCES), }, func="async_beolink_join", ) @@ -35,12 +35,12 @@ def async_setup_services(hass: HomeAssistant) -> None: "beolink_expand", entity_domain=MEDIA_PLAYER_DOMAIN, schema={ - vol.Exclusive("all_discovered", "devices", ""): cv.boolean, - vol.Exclusive( + probatio.Exclusive("all_discovered", "devices", ""): cv.boolean, + probatio.Exclusive( "beolink_jids", "devices", "Define either specific Beolink JIDs or all discovered", - ): vol.All( + ): probatio.All( cv.ensure_list, [jid_regex], ), @@ -54,7 +54,7 @@ def async_setup_services(hass: HomeAssistant) -> None: "beolink_unexpand", entity_domain=MEDIA_PLAYER_DOMAIN, schema={ - vol.Required("beolink_jids"): vol.All( + probatio.Required("beolink_jids"): probatio.All( cv.ensure_list, [jid_regex], ), diff --git a/homeassistant/components/bayesian/binary_sensor.py b/homeassistant/components/bayesian/binary_sensor.py index 5435c8c11cedf..f20fa5d362e3c 100644 --- a/homeassistant/components/bayesian/binary_sensor.py +++ b/homeassistant/components/bayesian/binary_sensor.py @@ -7,7 +7,7 @@ from typing import TYPE_CHECKING, Any, NamedTuple, override from uuid import UUID -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import ( PLATFORM_SCHEMA as BINARY_SENSOR_PLATFORM_SCHEMA, @@ -87,7 +87,7 @@ def above_greater_than_below(config: dict[str, Any]) -> dict[str, Any]: " must be specified", config[CONF_ENTITY_ID], ) - raise vol.Invalid("above_or_below") + raise probatio.Invalid("above_or_below") if above is not None and below is not None: if above > below: _LOGGER.error( @@ -96,19 +96,19 @@ def above_greater_than_below(config: dict[str, Any]) -> dict[str, Any]: above, below, ) - raise vol.Invalid("above_below") + raise probatio.Invalid("above_below") return config -NUMERIC_STATE_SCHEMA = vol.All( - vol.Schema( +NUMERIC_STATE_SCHEMA = probatio.All( + probatio.Schema( { CONF_PLATFORM: CONF_NUMERIC_STATE, - vol.Required(CONF_ENTITY_ID): cv.entity_id, - vol.Optional(CONF_ABOVE): vol.Coerce(float), - vol.Optional(CONF_BELOW): vol.Coerce(float), - vol.Required(CONF_P_GIVEN_T): vol.Coerce(float), - vol.Optional(CONF_P_GIVEN_F): vol.Coerce(float), + probatio.Required(CONF_ENTITY_ID): cv.entity_id, + probatio.Optional(CONF_ABOVE): probatio.Coerce(float), + probatio.Optional(CONF_BELOW): probatio.Coerce(float), + probatio.Required(CONF_P_GIVEN_T): probatio.Coerce(float), + probatio.Optional(CONF_P_GIVEN_F): probatio.Coerce(float), }, required=True, ), @@ -155,49 +155,49 @@ class NumericConfig(NamedTuple): intervals[i + 1].above, intervals[i + 1].below, ) - raise vol.Invalid( + raise probatio.Invalid( "overlapping_ranges", ) return configs -STATE_SCHEMA = vol.Schema( +STATE_SCHEMA = probatio.Schema( { CONF_PLATFORM: CONF_STATE, - vol.Required(CONF_ENTITY_ID): cv.entity_id, - vol.Required(CONF_TO_STATE): cv.string, - vol.Required(CONF_P_GIVEN_T): vol.Coerce(float), - vol.Optional(CONF_P_GIVEN_F): vol.Coerce(float), + probatio.Required(CONF_ENTITY_ID): cv.entity_id, + probatio.Required(CONF_TO_STATE): cv.string, + probatio.Required(CONF_P_GIVEN_T): probatio.Coerce(float), + probatio.Optional(CONF_P_GIVEN_F): probatio.Coerce(float), }, required=True, ) -TEMPLATE_SCHEMA = vol.Schema( +TEMPLATE_SCHEMA = probatio.Schema( { CONF_PLATFORM: CONF_TEMPLATE, - vol.Required(CONF_VALUE_TEMPLATE): cv.template, - vol.Required(CONF_P_GIVEN_T): vol.Coerce(float), - vol.Optional(CONF_P_GIVEN_F): vol.Coerce(float), + probatio.Required(CONF_VALUE_TEMPLATE): cv.template, + probatio.Required(CONF_P_GIVEN_T): probatio.Coerce(float), + probatio.Optional(CONF_P_GIVEN_F): probatio.Coerce(float), }, required=True, ) PLATFORM_SCHEMA = BINARY_SENSOR_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_UNIQUE_ID): cv.string, - vol.Optional(CONF_DEVICE_CLASS): cv.string, - vol.Required(CONF_OBSERVATIONS): vol.Schema( - vol.All( + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Optional(CONF_DEVICE_CLASS): cv.string, + probatio.Required(CONF_OBSERVATIONS): probatio.Schema( + probatio.All( cv.ensure_list, - [vol.Any(TEMPLATE_SCHEMA, STATE_SCHEMA, NUMERIC_STATE_SCHEMA)], + [probatio.Any(TEMPLATE_SCHEMA, STATE_SCHEMA, NUMERIC_STATE_SCHEMA)], no_overlapping, ) ), - vol.Required(CONF_PRIOR): vol.Coerce(float), - vol.Optional( + probatio.Required(CONF_PRIOR): probatio.Coerce(float), + probatio.Optional( CONF_PROBABILITY_THRESHOLD, default=DEFAULT_PROBABILITY_THRESHOLD - ): vol.Coerce(float), + ): probatio.Coerce(float), } ) diff --git a/homeassistant/components/bayesian/config_flow.py b/homeassistant/components/bayesian/config_flow.py index 4c0e6a0486ccd..6bc31f2790cfa 100644 --- a/homeassistant/components/bayesian/config_flow.py +++ b/homeassistant/components/bayesian/config_flow.py @@ -6,7 +6,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.alarm_control_panel import DOMAIN as ALARM_DOMAIN from homeassistant.components.binary_sensor import DOMAIN as BINARY_SENSOR_DOMAIN @@ -125,11 +125,11 @@ class OptionsFlowSteps(StrEnum): ADD_OBSERVATION = OBSERVATION_SELECTOR -OPTIONS_SCHEMA = vol.Schema( +OPTIONS_SCHEMA = probatio.Schema( { - vol.Required( + probatio.Required( CONF_PROBABILITY_THRESHOLD, default=DEFAULT_PROBABILITY_THRESHOLD * 100 - ): vol.All( + ): probatio.All( selector.NumberSelector( selector.NumberSelectorConfig( mode=selector.NumberSelectorMode.SLIDER, @@ -139,7 +139,7 @@ class OptionsFlowSteps(StrEnum): unit_of_measurement="%", ), ), - vol.Range( + probatio.Range( min=0, max=100, min_included=False, @@ -147,7 +147,9 @@ class OptionsFlowSteps(StrEnum): msg="extreme_threshold_error", ), ), - vol.Required(CONF_PRIOR, default=DEFAULT_PROBABILITY_THRESHOLD * 100): vol.All( + probatio.Required( + CONF_PRIOR, default=DEFAULT_PROBABILITY_THRESHOLD * 100 + ): probatio.All( selector.NumberSelector( selector.NumberSelectorConfig( mode=selector.NumberSelectorMode.SLIDER, @@ -157,7 +159,7 @@ class OptionsFlowSteps(StrEnum): unit_of_measurement="%", ), ), - vol.Range( + probatio.Range( min=0, max=100, min_included=False, @@ -165,21 +167,21 @@ class OptionsFlowSteps(StrEnum): msg="extreme_prior_error", ), ), - vol.Optional(CONF_DEVICE_CLASS): selector.DeviceClassSelector( + probatio.Optional(CONF_DEVICE_CLASS): selector.DeviceClassSelector( selector.DeviceClassSelectorConfig(domain=Platform.BINARY_SENSOR) ), } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Required(CONF_NAME, default=DEFAULT_NAME): selector.TextSelector(), + probatio.Required(CONF_NAME, default=DEFAULT_NAME): selector.TextSelector(), } ).extend(OPTIONS_SCHEMA.schema) -OBSERVATION_BOILERPLATE = vol.Schema( +OBSERVATION_BOILERPLATE = probatio.Schema( { - vol.Required(CONF_P_GIVEN_T): vol.All( + probatio.Required(CONF_P_GIVEN_T): probatio.All( selector.NumberSelector( selector.NumberSelectorConfig( mode=selector.NumberSelectorMode.SLIDER, @@ -189,7 +191,7 @@ class OptionsFlowSteps(StrEnum): unit_of_measurement="%", ), ), - vol.Range( + probatio.Range( min=0, max=100, min_included=False, @@ -197,7 +199,7 @@ class OptionsFlowSteps(StrEnum): msg="extreme_prob_given_error", ), ), - vol.Required(CONF_P_GIVEN_F): vol.All( + probatio.Required(CONF_P_GIVEN_F): probatio.All( selector.NumberSelector( selector.NumberSelectorConfig( mode=selector.NumberSelectorMode.SLIDER, @@ -207,7 +209,7 @@ class OptionsFlowSteps(StrEnum): unit_of_measurement="%", ), ), - vol.Range( + probatio.Range( min=0, max=100, min_included=False, @@ -215,16 +217,16 @@ class OptionsFlowSteps(StrEnum): msg="extreme_prob_given_error", ), ), - vol.Required(CONF_NAME): selector.TextSelector(), + probatio.Required(CONF_NAME): selector.TextSelector(), } ) -STATE_SUBSCHEMA = vol.Schema( +STATE_SUBSCHEMA = probatio.Schema( { - vol.Required(CONF_ENTITY_ID): selector.EntitySelector( + probatio.Required(CONF_ENTITY_ID): selector.EntitySelector( selector.EntitySelectorConfig(domain=ALLOWED_STATE_DOMAINS) ), - vol.Required(CONF_TO_STATE): selector.TextSelector( + probatio.Required(CONF_TO_STATE): selector.TextSelector( selector.TextSelectorConfig( multiline=False, type=selector.TextSelectorType.TEXT, multiple=False ) # ideally this would be a state selector @@ -233,17 +235,17 @@ class OptionsFlowSteps(StrEnum): }, ).extend(OBSERVATION_BOILERPLATE.schema) -NUMERIC_STATE_SUBSCHEMA = vol.Schema( +NUMERIC_STATE_SUBSCHEMA = probatio.Schema( { - vol.Required(CONF_ENTITY_ID): selector.EntitySelector( + probatio.Required(CONF_ENTITY_ID): selector.EntitySelector( selector.EntitySelectorConfig(domain=ALLOWED_NUMERIC_DOMAINS) ), - vol.Optional(CONF_ABOVE): selector.NumberSelector( + probatio.Optional(CONF_ABOVE): selector.NumberSelector( selector.NumberSelectorConfig( mode=selector.NumberSelectorMode.BOX, step="any" ), ), - vol.Optional(CONF_BELOW): selector.NumberSelector( + probatio.Optional(CONF_BELOW): selector.NumberSelector( selector.NumberSelectorConfig( mode=selector.NumberSelectorMode.BOX, step="any" ), @@ -252,9 +254,9 @@ class OptionsFlowSteps(StrEnum): ).extend(OBSERVATION_BOILERPLATE.schema) -TEMPLATE_SUBSCHEMA = vol.Schema( +TEMPLATE_SUBSCHEMA = probatio.Schema( { - vol.Required(CONF_VALUE_TEMPLATE): selector.TemplateSelector( + probatio.Required(CONF_VALUE_TEMPLATE): selector.TemplateSelector( selector.TemplateSelectorConfig(), ), }, @@ -303,7 +305,7 @@ def _convert_fractions_to_percentages( def _select_observation_schema( obs_type: ObservationTypes, -) -> vol.Schema: +) -> probatio.Schema: """Return the schema for editing the correct observation (SubEntry) type.""" if obs_type == str(ObservationTypes.STATE): return STATE_SUBSCHEMA @@ -368,7 +370,7 @@ def _validate_observation_subentry( try: above_greater_than_below(user_input) no_overlapping([*other_subentries, user_input]) - except vol.Invalid as err: + except probatio.Invalid as err: raise SchemaFlowError(err) from err _LOGGER.debug("Processed observation with settings: %s", user_input) diff --git a/homeassistant/components/bbox/device_tracker.py b/homeassistant/components/bbox/device_tracker.py index 8b9622edc7194..b9c200424411d 100644 --- a/homeassistant/components/bbox/device_tracker.py +++ b/homeassistant/components/bbox/device_tracker.py @@ -5,8 +5,8 @@ import logging from typing import override +import probatio import pybbox -import voluptuous as vol from homeassistant.components.device_tracker import ( DOMAIN as DEVICE_TRACKER_DOMAIN, @@ -26,7 +26,7 @@ MIN_TIME_BETWEEN_SCANS = timedelta(seconds=60) PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( - {vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string} + {probatio.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string} ) diff --git a/homeassistant/components/bbox/sensor.py b/homeassistant/components/bbox/sensor.py index 5eb55667de33b..9e726fa4fe13c 100644 --- a/homeassistant/components/bbox/sensor.py +++ b/homeassistant/components/bbox/sensor.py @@ -3,9 +3,9 @@ from datetime import timedelta import logging +import probatio import pybbox import requests -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -80,10 +80,10 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_MONITORED_VARIABLES): vol.All( - cv.ensure_list, [vol.In(SENSOR_KEYS)] + probatio.Required(CONF_MONITORED_VARIABLES): probatio.All( + cv.ensure_list, [probatio.In(SENSOR_KEYS)] ), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/besen/config_flow.py b/homeassistant/components/besen/config_flow.py index 59f9dbded70fa..6b91618ea193c 100644 --- a/homeassistant/components/besen/config_flow.py +++ b/homeassistant/components/besen/config_flow.py @@ -6,7 +6,7 @@ from besen.client import BesenClient from besen.const import DEFAULT_PIN from besen.exceptions import CannotConnect, InvalidAuth, NoConnectablePath -import voluptuous as vol +import probatio from homeassistant import config_entries from homeassistant.components import bluetooth @@ -40,27 +40,27 @@ def _normalize_address(address: str) -> str: ) ) -PIN_ONLY_SCHEMA = vol.Schema( +PIN_ONLY_SCHEMA = probatio.Schema( { - vol.Required(CONF_PIN, default=DEFAULT_PIN): PIN_SCHEMA, + probatio.Required(CONF_PIN, default=DEFAULT_PIN): PIN_SCHEMA, } ) def _user_schema( discoveries: dict[str, BluetoothServiceInfoBleak], -) -> vol.Schema: +) -> probatio.Schema: """Return the user step schema.""" - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_ADDRESS): vol.In( + probatio.Required(CONF_ADDRESS): probatio.In( { address: discovery.name or address for address, discovery in discoveries.items() } ), - vol.Required(CONF_PIN, default=DEFAULT_PIN): PIN_SCHEMA, + probatio.Required(CONF_PIN, default=DEFAULT_PIN): PIN_SCHEMA, } ) diff --git a/homeassistant/components/binary_sensor/__init__.py b/homeassistant/components/binary_sensor/__init__.py index 03c450d39b9ce..14767114bb23c 100644 --- a/homeassistant/components/binary_sensor/__init__.py +++ b/homeassistant/components/binary_sensor/__init__.py @@ -5,8 +5,8 @@ import logging from typing import Final, Literal, final, override +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.config_entries import ConfigEntry from homeassistant.const import STATE_OFF, STATE_ON, EntityCategory @@ -116,7 +116,9 @@ class BinarySensorDeviceClass(StrEnum): WINDOW = "window" -DEVICE_CLASSES_SCHEMA = vol.All(vol.Lower, vol.Coerce(BinarySensorDeviceClass)) +DEVICE_CLASSES_SCHEMA = probatio.All( + probatio.Lower, probatio.Coerce(BinarySensorDeviceClass) +) DEVICE_CLASSES = [cls.value for cls in BinarySensorDeviceClass] # mypy: disallow-any-generics diff --git a/homeassistant/components/binary_sensor/device_condition.py b/homeassistant/components/binary_sensor/device_condition.py index 1829a0a5ab0a4..7e5c1f514043e 100644 --- a/homeassistant/components/binary_sensor/device_condition.py +++ b/homeassistant/components/binary_sensor/device_condition.py @@ -1,6 +1,6 @@ """Implement device conditions for binary sensor.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import CONF_IS_OFF, CONF_IS_ON from homeassistant.const import ( @@ -255,9 +255,9 @@ CONDITION_SCHEMA = cv.DEVICE_CONDITION_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In(IS_OFF + IS_ON), - vol.Optional(CONF_FOR): cv.positive_time_period_dict, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In(IS_OFF + IS_ON), + probatio.Optional(CONF_FOR): cv.positive_time_period_dict, } ) @@ -320,10 +320,10 @@ def async_condition_from_config( async def async_get_condition_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List condition capabilities.""" return { - "extra_fields": vol.Schema( - {vol.Optional(CONF_FOR): cv.positive_time_period_dict} + "extra_fields": probatio.Schema( + {probatio.Optional(CONF_FOR): cv.positive_time_period_dict} ) } diff --git a/homeassistant/components/binary_sensor/device_trigger.py b/homeassistant/components/binary_sensor/device_trigger.py index 803aff97197a4..f9958ae0a0467 100644 --- a/homeassistant/components/binary_sensor/device_trigger.py +++ b/homeassistant/components/binary_sensor/device_trigger.py @@ -1,6 +1,6 @@ """Provides device triggers for binary sensors.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import ( CONF_TURNED_OFF, @@ -196,9 +196,9 @@ TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In(TURNED_OFF + TURNED_ON), - vol.Optional(CONF_FOR): cv.positive_time_period_dict, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In(TURNED_OFF + TURNED_ON), + probatio.Optional(CONF_FOR): cv.positive_time_period_dict, } ) @@ -266,10 +266,10 @@ async def async_get_triggers( async def async_get_trigger_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List trigger capabilities.""" return { - "extra_fields": vol.Schema( - {vol.Optional(CONF_FOR): cv.positive_time_period_dict} + "extra_fields": probatio.Schema( + {probatio.Optional(CONF_FOR): cv.positive_time_period_dict} ) } diff --git a/homeassistant/components/bitcoin/sensor.py b/homeassistant/components/bitcoin/sensor.py index f499a679a0d53..a072700a2b0df 100644 --- a/homeassistant/components/bitcoin/sensor.py +++ b/homeassistant/components/bitcoin/sensor.py @@ -4,7 +4,7 @@ import logging from blockchain import exchangerates, statistics -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -127,10 +127,10 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_DISPLAY_OPTIONS, default=[]): vol.All( - cv.ensure_list, [vol.In(OPTION_KEYS)] + probatio.Required(CONF_DISPLAY_OPTIONS, default=[]): probatio.All( + cv.ensure_list, [probatio.In(OPTION_KEYS)] ), - vol.Optional(CONF_CURRENCY, default=DEFAULT_CURRENCY): cv.string, + probatio.Optional(CONF_CURRENCY, default=DEFAULT_CURRENCY): cv.string, } ) diff --git a/homeassistant/components/bitvis/config_flow.py b/homeassistant/components/bitvis/config_flow.py index 21f8aff7e324c..8db2abee1f3c7 100644 --- a/homeassistant/components/bitvis/config_flow.py +++ b/homeassistant/components/bitvis/config_flow.py @@ -12,7 +12,7 @@ async_verify_udp_port_bindable, normalize_host, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PORT @@ -27,9 +27,9 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): cv.string, + probatio.Required(CONF_HOST): cv.string, } ) diff --git a/homeassistant/components/bizkaibus/sensor.py b/homeassistant/components/bizkaibus/sensor.py index 0f2a4d6db3bb0..8e61ce693906c 100644 --- a/homeassistant/components/bizkaibus/sensor.py +++ b/homeassistant/components/bizkaibus/sensor.py @@ -3,7 +3,7 @@ from contextlib import suppress from bizkaibus.bizkaibus import BizkaibusData -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -24,9 +24,9 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_STOP_ID): cv.string, - vol.Required(CONF_ROUTE): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_STOP_ID): cv.string, + probatio.Required(CONF_ROUTE): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/blackbird/media_player.py b/homeassistant/components/blackbird/media_player.py index f5f0caf492dec..8a0ee2a0a29f0 100644 --- a/homeassistant/components/blackbird/media_player.py +++ b/homeassistant/components/blackbird/media_player.py @@ -3,9 +3,9 @@ import logging from typing import override +import probatio from pyblackbird import get_blackbird from serialx import SerialException -import voluptuous as vol from homeassistant.components.media_player import ( PLATFORM_SCHEMA as MEDIA_PLAYER_PLATFORM_SCHEMA, @@ -29,11 +29,11 @@ _LOGGER = logging.getLogger(__name__) -MEDIA_PLAYER_SCHEMA = vol.Schema({ATTR_ENTITY_ID: cv.comp_entity_ids}) +MEDIA_PLAYER_SCHEMA = probatio.Schema({ATTR_ENTITY_ID: cv.comp_entity_ids}) -ZONE_SCHEMA = vol.Schema({vol.Required(CONF_NAME): cv.string}) +ZONE_SCHEMA = probatio.Schema({probatio.Required(CONF_NAME): cv.string}) -SOURCE_SCHEMA = vol.Schema({vol.Required(CONF_NAME): cv.string}) +SOURCE_SCHEMA = probatio.Schema({probatio.Required(CONF_NAME): cv.string}) CONF_ZONES = "zones" CONF_SOURCES = "sources" @@ -43,24 +43,26 @@ ATTR_SOURCE = "source" BLACKBIRD_SETALLZONES_SCHEMA = MEDIA_PLAYER_SCHEMA.extend( - {vol.Required(ATTR_SOURCE): cv.string} + {probatio.Required(ATTR_SOURCE): cv.string} ) # Valid zone ids: 1-8 -ZONE_IDS = vol.All(vol.Coerce(int), vol.Range(min=1, max=8)) +ZONE_IDS = probatio.All(probatio.Coerce(int), probatio.Range(min=1, max=8)) # Valid source ids: 1-8 -SOURCE_IDS = vol.All(vol.Coerce(int), vol.Range(min=1, max=8)) +SOURCE_IDS = probatio.All(probatio.Coerce(int), probatio.Range(min=1, max=8)) -PLATFORM_SCHEMA = vol.All( +PLATFORM_SCHEMA = probatio.All( cv.has_at_least_one_key(CONF_PORT, CONF_HOST), MEDIA_PLAYER_PLATFORM_SCHEMA.extend( { - vol.Exclusive(CONF_PORT, CONF_TYPE): cv.string, - vol.Exclusive(CONF_HOST, CONF_TYPE): cv.string, - vol.Required(CONF_ZONES): vol.Schema({ZONE_IDS: ZONE_SCHEMA}), - vol.Required(CONF_SOURCES): vol.Schema({SOURCE_IDS: SOURCE_SCHEMA}), + probatio.Exclusive(CONF_PORT, CONF_TYPE): cv.string, + probatio.Exclusive(CONF_HOST, CONF_TYPE): cv.string, + probatio.Required(CONF_ZONES): probatio.Schema({ZONE_IDS: ZONE_SCHEMA}), + probatio.Required(CONF_SOURCES): probatio.Schema( + {SOURCE_IDS: SOURCE_SCHEMA} + ), } ), ) diff --git a/homeassistant/components/blebox/config_flow.py b/homeassistant/components/blebox/config_flow.py index fb1a7d9bc2b4a..e864d1d50eee1 100644 --- a/homeassistant/components/blebox/config_flow.py +++ b/homeassistant/components/blebox/config_flow.py @@ -12,7 +12,7 @@ UnsupportedBoxVersion, ) from blebox_uniapi.session import ApiHost -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_PORT, CONF_USERNAME @@ -36,12 +36,12 @@ _LOGGER = logging.getLogger(__name__) -STEP_SCHEMA = vol.Schema( +STEP_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST, default=DEFAULT_HOST): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, - vol.Inclusive(CONF_USERNAME, "auth"): str, - vol.Inclusive(CONF_PASSWORD, "auth"): str, + probatio.Required(CONF_HOST, default=DEFAULT_HOST): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Inclusive(CONF_USERNAME, "auth"): str, + probatio.Inclusive(CONF_PASSWORD, "auth"): str, } ) @@ -320,10 +320,10 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Inclusive(CONF_USERNAME, "auth"): str, - vol.Inclusive(CONF_PASSWORD, "auth"): str, + probatio.Inclusive(CONF_USERNAME, "auth"): str, + probatio.Inclusive(CONF_PASSWORD, "auth"): str, } ), errors=errors, diff --git a/homeassistant/components/blink/config_flow.py b/homeassistant/components/blink/config_flow.py index 5c0f8c395c7f5..e388ffb755e0c 100644 --- a/homeassistant/components/blink/config_flow.py +++ b/homeassistant/components/blink/config_flow.py @@ -6,7 +6,7 @@ from blinkpy.auth import Auth, BlinkTwoFARequiredError, LoginError, TokenRefreshFailed from blinkpy.blinkpy import Blink, BlinkSetupError -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -85,10 +85,10 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, @@ -116,8 +116,8 @@ async def async_step_2fa( return self.async_show_form( step_id="2fa", - data_schema=vol.Schema( - {vol.Optional(CONF_PIN): vol.All(str, vol.Length(min=1))} + data_schema=probatio.Schema( + {probatio.Optional(CONF_PIN): probatio.All(str, probatio.Length(min=1))} ), errors=errors, ) @@ -147,12 +147,12 @@ async def async_step_reauth_confirm( config_entry = self._get_reauth_entry() return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_USERNAME, default=config_entry.data[CONF_USERNAME] ): str, - vol.Required( + probatio.Required( CONF_PASSWORD, default=config_entry.data[CONF_PASSWORD] ): str, } @@ -180,12 +180,12 @@ async def async_step_reconfigure( config_entry = self._get_reconfigure_entry() return self.async_show_form( step_id="reconfigure", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_USERNAME, default=config_entry.data[CONF_USERNAME] ): str, - vol.Required( + probatio.Required( CONF_PASSWORD, default=config_entry.data[CONF_PASSWORD] ): str, } diff --git a/homeassistant/components/blink/services.py b/homeassistant/components/blink/services.py index a93c60a2002da..b75c2df760900 100644 --- a/homeassistant/components/blink/services.py +++ b/homeassistant/components/blink/services.py @@ -1,6 +1,6 @@ """Services for the Blink integration.""" -import voluptuous as vol +import probatio from homeassistant.components.camera import DOMAIN as CAMERA_DOMAIN from homeassistant.const import CONF_FILE_PATH, CONF_FILENAME @@ -40,7 +40,7 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, SERVICE_SAVE_RECENT_CLIPS, entity_domain=CAMERA_DOMAIN, - schema={vol.Required(CONF_FILE_PATH): cv.string}, + schema={probatio.Required(CONF_FILE_PATH): cv.string}, func="save_recent_clips", ) service.async_register_platform_entity_service( @@ -48,6 +48,6 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, SERVICE_SAVE_VIDEO, entity_domain=CAMERA_DOMAIN, - schema={vol.Required(CONF_FILENAME): cv.string}, + schema={probatio.Required(CONF_FILENAME): cv.string}, func="save_video", ) diff --git a/homeassistant/components/blockchain/sensor.py b/homeassistant/components/blockchain/sensor.py index 816c23628bf07..2c1c31c42e26f 100644 --- a/homeassistant/components/blockchain/sensor.py +++ b/homeassistant/components/blockchain/sensor.py @@ -3,8 +3,8 @@ from datetime import timedelta import logging +import probatio from pyblockchain import get_balance, validate_address -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -26,8 +26,8 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ADDRESSES): [cv.string], - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_ADDRESSES): [cv.string], + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/blue_current/config_flow.py b/homeassistant/components/blue_current/config_flow.py index ed6879baecc55..132825db9ff2f 100644 --- a/homeassistant/components/blue_current/config_flow.py +++ b/homeassistant/components/blue_current/config_flow.py @@ -10,14 +10,14 @@ RequestLimitReached, WebsocketError, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_TOKEN from .const import DOMAIN, LOGGER -DATA_SCHEMA = vol.Schema({vol.Required(CONF_API_TOKEN): str}) +DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_API_TOKEN): str}) class BlueCurrentConfigFlow(ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/components/blue_current/services.py b/homeassistant/components/blue_current/services.py index aab9e7b44b86e..e42aeca63659f 100644 --- a/homeassistant/components/blue_current/services.py +++ b/homeassistant/components/blue_current/services.py @@ -1,6 +1,6 @@ """The Blue Current integration.""" -import voluptuous as vol +import probatio from homeassistant.const import CONF_DEVICE_ID from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -8,12 +8,12 @@ from .const import BCU_APP, CHARGING_CARD_ID, DOMAIN, SERVICE_START_CHARGE_SESSION -SERVICE_START_CHARGE_SESSION_SCHEMA = vol.Schema( +SERVICE_START_CHARGE_SESSION_SCHEMA = probatio.Schema( { - vol.Required(CONF_DEVICE_ID): cv.string, + probatio.Required(CONF_DEVICE_ID): cv.string, # When no charging card is provided, use no charging card # (BCU_APP = no charging card). - vol.Optional(CHARGING_CARD_ID, default=BCU_APP): cv.string, + probatio.Optional(CHARGING_CARD_ID, default=BCU_APP): cv.string, } ) diff --git a/homeassistant/components/bluemaestro/config_flow.py b/homeassistant/components/bluemaestro/config_flow.py index 8a43fcfff5cb1..ce675b8bbe0c1 100644 --- a/homeassistant/components/bluemaestro/config_flow.py +++ b/homeassistant/components/bluemaestro/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from bluemaestro_ble import BlueMaestroBluetoothDeviceData as DeviceData -import voluptuous as vol +import probatio from homeassistant.components.bluetooth import ( BluetoothServiceInfoBleak, @@ -88,7 +88,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_ADDRESS): vol.In(self._discovered_devices)} + data_schema=probatio.Schema( + {probatio.Required(CONF_ADDRESS): probatio.In(self._discovered_devices)} ), ) diff --git a/homeassistant/components/blueprint/errors.py b/homeassistant/components/blueprint/errors.py index 2261df212b9f5..6f03a2b0ebf27 100644 --- a/homeassistant/components/blueprint/errors.py +++ b/homeassistant/components/blueprint/errors.py @@ -3,8 +3,8 @@ from collections.abc import Iterable from typing import Any -import voluptuous as vol -from voluptuous.humanize import humanize_error +import probatio +from probatio.humanize import humanize_error from homeassistant.exceptions import HomeAssistantError @@ -45,10 +45,10 @@ def __init__( domain: str | None, blueprint_name: str | None, blueprint_data: Any, - msg_or_exc: str | vol.Invalid, + msg_or_exc: str | probatio.Invalid, ) -> None: """Initialize an invalid blueprint error.""" - if isinstance(msg_or_exc, vol.Invalid): + if isinstance(msg_or_exc, probatio.Invalid): msg_or_exc = humanize_error(blueprint_data, msg_or_exc) super().__init__( diff --git a/homeassistant/components/blueprint/importer.py b/homeassistant/components/blueprint/importer.py index 380a83028bed2..89207bf6134a7 100644 --- a/homeassistant/components/blueprint/importer.py +++ b/homeassistant/components/blueprint/importer.py @@ -6,7 +6,7 @@ import re from typing import TYPE_CHECKING -import voluptuous as vol +import probatio import yarl from homeassistant.core import HomeAssistant @@ -33,13 +33,13 @@ r"^https://(?P[a-z0-9-]+)\.home-assistant\.io/(?P.+).yaml$" ) -COMMUNITY_TOPIC_SCHEMA = vol.Schema( +COMMUNITY_TOPIC_SCHEMA = probatio.Schema( { "slug": str, "title": str, "post_stream": {"posts": [{"updated_at": cv.datetime, "cooked": str}]}, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) @@ -144,7 +144,7 @@ async def fetch_blueprint_from_community_post( ) -> ImportedBlueprint: """Get blueprints from a community post url. - Method can raise aiohttp client exceptions, vol.Invalid. + Method can raise aiohttp client exceptions, probatio.Invalid. Caller needs to implement own timeout. """ diff --git a/homeassistant/components/blueprint/models.py b/homeassistant/components/blueprint/models.py index 3af1acfa0147c..d0b2640051c65 100644 --- a/homeassistant/components/blueprint/models.py +++ b/homeassistant/components/blueprint/models.py @@ -8,8 +8,8 @@ from typing import Any from awesomeversion import AwesomeVersion -import voluptuous as vol -from voluptuous.humanize import humanize_error +import probatio +from probatio.humanize import humanize_error from homeassistant import loader from homeassistant.const import ( @@ -59,7 +59,7 @@ def __init__( """Initialize a blueprint.""" try: data = self.data = schema(data) - except vol.Invalid as err: + except probatio.Invalid as err: raise InvalidBlueprint(expected_domain, path, data, err) from err # In future, we will treat this as "incorrect" and allow to recover from this @@ -310,7 +310,7 @@ async def async_inputs_from_config( """Process a blueprint config.""" try: config_with_blueprint = BLUEPRINT_INSTANCE_FIELDS(config_with_blueprint) - except vol.Invalid as err: + except probatio.Invalid as err: raise InvalidBlueprintInputs( self.domain, humanize_error(config_with_blueprint, err) ) from err diff --git a/homeassistant/components/blueprint/schemas.py b/homeassistant/components/blueprint/schemas.py index 6aaa4091e07df..410bb92a118f7 100644 --- a/homeassistant/components/blueprint/schemas.py +++ b/homeassistant/components/blueprint/schemas.py @@ -2,7 +2,7 @@ from typing import Any -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_DEFAULT, @@ -31,17 +31,19 @@ def version_validator(value: Any) -> str: """Validate a Home Assistant version.""" if not isinstance(value, str): - raise vol.Invalid("Version needs to be a string") + raise probatio.Invalid("Version needs to be a string") parts = value.split(".") if len(parts) != 3: - raise vol.Invalid("Version needs to be formatted as {major}.{minor}.{patch}") + raise probatio.Invalid( + "Version needs to be formatted as {major}.{minor}.{patch}" + ) try: [int(p) for p in parts] except ValueError: - raise vol.Invalid( + raise probatio.Invalid( "Major, minor and patch version needs to be an integer" ) from None @@ -55,11 +57,15 @@ def unique_input_validator(inputs: Any) -> Any: if value and CONF_INPUT in value: for key in value[CONF_INPUT]: if key in all_inputs: - raise vol.Invalid(f"Duplicate use of input key {key} in blueprint.") + raise probatio.Invalid( + f"Duplicate use of input key {key} in blueprint." + ) all_inputs.add(key) else: if key in all_inputs: - raise vol.Invalid(f"Duplicate use of input key {key} in blueprint.") + raise probatio.Invalid( + f"Duplicate use of input key {key} in blueprint." + ) all_inputs.add(key) return inputs @@ -77,23 +83,23 @@ def is_blueprint_instance_config(config: Any) -> bool: return isinstance(config, dict) and CONF_USE_BLUEPRINT in config -BLUEPRINT_INPUT_SCHEMA = vol.Schema( +BLUEPRINT_INPUT_SCHEMA = probatio.Schema( { - vol.Optional(CONF_NAME): str, - vol.Optional(CONF_DESCRIPTION): str, - vol.Optional(CONF_DEFAULT): cv.match_all, - vol.Optional(CONF_SELECTOR): selector.validate_selector, + probatio.Optional(CONF_NAME): str, + probatio.Optional(CONF_DESCRIPTION): str, + probatio.Optional(CONF_DEFAULT): cv.match_all, + probatio.Optional(CONF_SELECTOR): selector.validate_selector, } ) -BLUEPRINT_INPUT_SECTION_SCHEMA = vol.Schema( +BLUEPRINT_INPUT_SECTION_SCHEMA = probatio.Schema( { - vol.Optional(CONF_NAME): str, - vol.Optional(CONF_ICON): str, - vol.Optional(CONF_DESCRIPTION): str, - vol.Optional(CONF_COLLAPSED): bool, - vol.Required(CONF_INPUT, default=dict): { - str: vol.Any( + probatio.Optional(CONF_NAME): str, + probatio.Optional(CONF_ICON): str, + probatio.Optional(CONF_DESCRIPTION): str, + probatio.Optional(CONF_COLLAPSED): bool, + probatio.Required(CONF_INPUT, default=dict): { + str: probatio.Any( None, BLUEPRINT_INPUT_SCHEMA, ) @@ -101,21 +107,21 @@ def is_blueprint_instance_config(config: Any) -> bool: } ) -BLUEPRINT_SCHEMA = vol.Schema( +BLUEPRINT_SCHEMA = probatio.Schema( { - vol.Required(CONF_BLUEPRINT): vol.Schema( + probatio.Required(CONF_BLUEPRINT): probatio.Schema( { - vol.Required(CONF_NAME): str, - vol.Optional(CONF_DESCRIPTION): str, - vol.Required(CONF_DOMAIN): str, - vol.Optional(CONF_SOURCE_URL): cv.url, - vol.Optional(CONF_AUTHOR): str, - vol.Optional(CONF_HOMEASSISTANT): { - vol.Optional(CONF_MIN_VERSION): version_validator + probatio.Required(CONF_NAME): str, + probatio.Optional(CONF_DESCRIPTION): str, + probatio.Required(CONF_DOMAIN): str, + probatio.Optional(CONF_SOURCE_URL): cv.url, + probatio.Optional(CONF_AUTHOR): str, + probatio.Optional(CONF_HOMEASSISTANT): { + probatio.Optional(CONF_MIN_VERSION): version_validator }, - vol.Optional(CONF_INPUT, default=dict): vol.All( + probatio.Optional(CONF_INPUT, default=dict): probatio.All( { - str: vol.Any( + str: probatio.Any( None, BLUEPRINT_INPUT_SCHEMA, BLUEPRINT_INPUT_SECTION_SCHEMA, @@ -126,25 +132,27 @@ def is_blueprint_instance_config(config: Any) -> bool: } ), }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) def validate_yaml_suffix(value: str) -> str: """Validate value has a YAML suffix.""" if not value.endswith(".yaml"): - raise vol.Invalid("Path needs to end in .yaml") + raise probatio.Invalid("Path needs to end in .yaml") return value -BLUEPRINT_INSTANCE_FIELDS = vol.Schema( +BLUEPRINT_INSTANCE_FIELDS = probatio.Schema( { - vol.Required(CONF_USE_BLUEPRINT): vol.Schema( + probatio.Required(CONF_USE_BLUEPRINT): probatio.Schema( { - vol.Required(CONF_PATH): vol.All(cv.path, validate_yaml_suffix), - vol.Required(CONF_INPUT, default=dict): {str: cv.match_all}, + probatio.Required(CONF_PATH): probatio.All( + cv.path, validate_yaml_suffix + ), + probatio.Required(CONF_INPUT, default=dict): {str: cv.match_all}, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/blueprint/websocket_api.py b/homeassistant/components/blueprint/websocket_api.py index 054cdc3452c9f..e3eb1eb12ba4c 100644 --- a/homeassistant/components/blueprint/websocket_api.py +++ b/homeassistant/components/blueprint/websocket_api.py @@ -5,7 +5,7 @@ import functools from typing import Any, cast -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.core import HomeAssistant, callback @@ -65,8 +65,8 @@ async def with_domain_blueprints( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "blueprint/list", - vol.Required("domain"): cv.string, + probatio.Required("type"): "blueprint/list", + probatio.Required("domain"): cv.string, } ) @websocket_api.async_response @@ -99,8 +99,8 @@ async def ws_list_blueprints( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "blueprint/import", - vol.Required("url"): cv.url, + probatio.Required("type"): "blueprint/import", + probatio.Required("url"): cv.url, } ) @websocket_api.async_response @@ -153,12 +153,12 @@ async def ws_import_blueprint( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "blueprint/save", - vol.Required("domain"): cv.string, - vol.Required("path"): cv.path, - vol.Required("yaml"): cv.string, - vol.Optional("source_url"): cv.url, - vol.Optional("allow_override"): bool, + probatio.Required("type"): "blueprint/save", + probatio.Required("domain"): cv.string, + probatio.Required("path"): cv.path, + probatio.Required("yaml"): cv.string, + probatio.Optional("source_url"): cv.url, + probatio.Optional("allow_override"): bool, } ) @websocket_api.async_response @@ -210,9 +210,9 @@ async def ws_save_blueprint( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "blueprint/delete", - vol.Required("domain"): cv.string, - vol.Required("path"): cv.path, + probatio.Required("type"): "blueprint/delete", + probatio.Required("domain"): cv.string, + probatio.Required("path"): cv.path, } ) @websocket_api.async_response @@ -238,10 +238,10 @@ async def ws_delete_blueprint( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "blueprint/substitute", - vol.Required("domain"): cv.string, - vol.Required("path"): cv.path, - vol.Required("input"): dict, + probatio.Required("type"): "blueprint/substitute", + probatio.Required("domain"): cv.string, + probatio.Required("path"): cv.path, + probatio.Required("input"): dict, } ) @websocket_api.async_response diff --git a/homeassistant/components/bluesound/__init__.py b/homeassistant/components/bluesound/__init__.py index b2152811f2a28..a3dc5d4bf88cb 100644 --- a/homeassistant/components/bluesound/__init__.py +++ b/homeassistant/components/bluesound/__init__.py @@ -1,8 +1,8 @@ """The bluesound component.""" +import probatio from pyblu import Player from pyblu.errors import PlayerUnreachableError -import voluptuous as vol from homeassistant.components.media_player import DOMAIN as MEDIA_PLAYER_DOMAIN from homeassistant.config_entries import ConfigEntry @@ -35,7 +35,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: DOMAIN, SERVICE_JOIN, entity_domain=MEDIA_PLAYER_DOMAIN, - schema={vol.Required(ATTR_MASTER): cv.entity_id}, + schema={probatio.Required(ATTR_MASTER): cv.entity_id}, func="async_bluesound_join", ) service.async_register_platform_entity_service( diff --git a/homeassistant/components/bluesound/config_flow.py b/homeassistant/components/bluesound/config_flow.py index b0dc9519e1580..69c976626b681 100644 --- a/homeassistant/components/bluesound/config_flow.py +++ b/homeassistant/components/bluesound/config_flow.py @@ -3,9 +3,9 @@ import logging from typing import Any, override +import probatio from pyblu import Player, SyncStatus from pyblu.errors import PlayerUnreachableError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PORT @@ -64,10 +64,10 @@ async def async_step_user( return self.async_show_form( step_id="user", errors=errors, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Optional(CONF_PORT, default=11000): int, + probatio.Required(CONF_HOST): str, + probatio.Optional(CONF_PORT, default=11000): int, } ), ) diff --git a/homeassistant/components/bluetooth/config_flow.py b/homeassistant/components/bluetooth/config_flow.py index 64fa9f841c170..b0e01e3596fe8 100644 --- a/homeassistant/components/bluetooth/config_flow.py +++ b/homeassistant/components/bluetooth/config_flow.py @@ -13,7 +13,7 @@ get_adapters, ) from habluetooth import BluetoothScanningMode, get_manager -import voluptuous as vol +import probatio from homeassistant.components import onboarding from homeassistant.config_entries import ( @@ -62,10 +62,12 @@ ) -async def _options_schema(handler: SchemaCommonFlowHandler) -> vol.Schema: +async def _options_schema(handler: SchemaCommonFlowHandler) -> probatio.Schema: """Build the options schema with the saved mode as the default.""" current = resolve_scanning_mode(handler.options).value - return vol.Schema({vol.Required(CONF_MODE, default=current): _MODE_SELECTOR}) + return probatio.Schema( + {probatio.Required(CONF_MODE, default=current): _MODE_SELECTOR} + ) async def _validate_options( @@ -196,9 +198,9 @@ async def async_step_multiple_adapters( return self.async_show_form( step_id="multiple_adapters", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_ADAPTER): vol.In( + probatio.Required(CONF_ADAPTER): probatio.In( { adapter: adapter_display_info( adapter, self._adapters[adapter] diff --git a/homeassistant/components/bluetooth/websocket_api.py b/homeassistant/components/bluetooth/websocket_api.py index a406e238fcf2f..19500aef8a7c4 100644 --- a/homeassistant/components/bluetooth/websocket_api.py +++ b/homeassistant/components/bluetooth/websocket_api.py @@ -14,7 +14,7 @@ HaScannerRegistrationEvent, ) from home_assistant_bluetooth import BluetoothServiceInfoBleak -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.core import HomeAssistant, callback @@ -197,7 +197,7 @@ def _async_on_advertisement( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "bluetooth/subscribe_advertisements", + probatio.Required("type"): "bluetooth/subscribe_advertisements", } ) @websocket_api.async_response @@ -213,8 +213,8 @@ async def ws_subscribe_advertisements( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "bluetooth/subscribe_connection_allocations", - vol.Optional("config_entry_id"): str, + probatio.Required("type"): "bluetooth/subscribe_connection_allocations", + probatio.Optional("config_entry_id"): str, } ) @websocket_api.async_response @@ -249,8 +249,8 @@ def _async_allocations_changed(allocations: HaBluetoothSlotAllocations) -> None: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "bluetooth/subscribe_scanner_details", - vol.Optional("config_entry_id"): str, + probatio.Required("type"): "bluetooth/subscribe_scanner_details", + probatio.Optional("config_entry_id"): str, } ) @websocket_api.async_response @@ -296,8 +296,8 @@ def _async_registration_changed(registration: HaScannerRegistration) -> None: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "bluetooth/subscribe_scanner_state", - vol.Optional("config_entry_id"): str, + probatio.Required("type"): "bluetooth/subscribe_scanner_state", + probatio.Optional("config_entry_id"): str, } ) @websocket_api.async_response diff --git a/homeassistant/components/bluetooth_le_tracker/device_tracker.py b/homeassistant/components/bluetooth_le_tracker/device_tracker.py index af87f973b46bb..e20940b0fe821 100644 --- a/homeassistant/components/bluetooth_le_tracker/device_tracker.py +++ b/homeassistant/components/bluetooth_le_tracker/device_tracker.py @@ -5,7 +5,7 @@ from uuid import UUID from bleak import BleakClient, BleakError -import voluptuous as vol +import probatio from homeassistant.components import bluetooth from homeassistant.components.bluetooth.match import BluetoothCallbackMatcher @@ -42,8 +42,8 @@ PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_TRACK_BATTERY, default=False): cv.boolean, - vol.Optional( + probatio.Optional(CONF_TRACK_BATTERY, default=False): cv.boolean, + probatio.Optional( CONF_TRACK_BATTERY_INTERVAL, default=DEFAULT_TRACK_BATTERY_INTERVAL ): cv.time_period, } diff --git a/homeassistant/components/bond/config_flow.py b/homeassistant/components/bond/config_flow.py index bbc39a620284a..be434fe84bd98 100644 --- a/homeassistant/components/bond/config_flow.py +++ b/homeassistant/components/bond/config_flow.py @@ -7,7 +7,7 @@ from aiohttp import ClientConnectionError, ClientResponseError from bond_async import Bond, RequestorUUID -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigEntryState, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_ACCESS_TOKEN, CONF_HOST, CONF_NAME @@ -23,11 +23,11 @@ _LOGGER = logging.getLogger(__name__) -USER_SCHEMA = vol.Schema( - {vol.Required(CONF_HOST): str, vol.Required(CONF_ACCESS_TOKEN): str} +USER_SCHEMA = probatio.Schema( + {probatio.Required(CONF_HOST): str, probatio.Required(CONF_ACCESS_TOKEN): str} ) -DISCOVERY_SCHEMA = vol.Schema({vol.Required(CONF_ACCESS_TOKEN): str}) -TOKEN_SCHEMA = vol.Schema({}) +DISCOVERY_SCHEMA = probatio.Schema({probatio.Required(CONF_ACCESS_TOKEN): str}) +TOKEN_SCHEMA = probatio.Schema({}) async def async_get_token(hass: HomeAssistant, host: str) -> str | None: diff --git a/homeassistant/components/bond/services.py b/homeassistant/components/bond/services.py index cc76b947ea521..ef7709a9d1e99 100644 --- a/homeassistant/components/bond/services.py +++ b/homeassistant/components/bond/services.py @@ -1,6 +1,6 @@ """Support for Bond services.""" -import voluptuous as vol +import probatio from homeassistant.components.fan import DOMAIN as FAN_DOMAIN from homeassistant.components.light import ATTR_BRIGHTNESS, DOMAIN as LIGHT_DOMAIN @@ -36,7 +36,11 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, SERVICE_SET_FAN_SPEED_TRACKED_STATE, entity_domain=FAN_DOMAIN, - schema={vol.Required("speed"): vol.All(vol.Number(scale=0), vol.Range(0, 100))}, + schema={ + probatio.Required("speed"): probatio.All( + probatio.Number(scale=0), probatio.Range(0, 100) + ) + }, func="async_set_speed_belief", ) @@ -72,8 +76,8 @@ def async_setup_services(hass: HomeAssistant) -> None: SERVICE_SET_LIGHT_BRIGHTNESS_TRACKED_STATE, entity_domain=LIGHT_DOMAIN, schema={ - vol.Required(ATTR_BRIGHTNESS): vol.All( - vol.Number(scale=0), vol.Range(0, 255) + probatio.Required(ATTR_BRIGHTNESS): probatio.All( + probatio.Number(scale=0), probatio.Range(0, 255) ) }, func="async_set_brightness_belief", @@ -84,7 +88,7 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, SERVICE_SET_LIGHT_POWER_TRACKED_STATE, entity_domain=LIGHT_DOMAIN, - schema={vol.Required(ATTR_POWER_STATE): vol.All(cv.boolean)}, + schema={probatio.Required(ATTR_POWER_STATE): probatio.All(cv.boolean)}, func="async_set_power_belief", ) @@ -94,6 +98,6 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, SERVICE_SET_POWER_TRACKED_STATE, entity_domain=SWITCH_DOMAIN, - schema={vol.Required(ATTR_POWER_STATE): cv.boolean}, + schema={probatio.Required(ATTR_POWER_STATE): cv.boolean}, func="async_set_power_belief", ) diff --git a/homeassistant/components/bosch_alarm/config_flow.py b/homeassistant/components/bosch_alarm/config_flow.py index 7ada33bfa5add..9ea264acc28c5 100644 --- a/homeassistant/components/bosch_alarm/config_flow.py +++ b/homeassistant/components/bosch_alarm/config_flow.py @@ -7,7 +7,7 @@ from typing import Any, Self, override from bosch_alarm_mode2 import Panel -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_DHCP, @@ -33,33 +33,33 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=7700): cv.positive_int, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=7700): cv.positive_int, } ) -STEP_AUTH_DATA_SCHEMA_SOLUTION = vol.Schema( +STEP_AUTH_DATA_SCHEMA_SOLUTION = probatio.Schema( { - vol.Required(CONF_USER_CODE): str, + probatio.Required(CONF_USER_CODE): str, } ) -STEP_AUTH_DATA_SCHEMA_AMAX = vol.Schema( +STEP_AUTH_DATA_SCHEMA_AMAX = probatio.Schema( { - vol.Required(CONF_INSTALLER_CODE): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_INSTALLER_CODE): str, + probatio.Required(CONF_PASSWORD): str, } ) -STEP_AUTH_DATA_SCHEMA_BG = vol.Schema( +STEP_AUTH_DATA_SCHEMA_BG = probatio.Schema( { - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ) -STEP_INIT_DATA_SCHEMA = vol.Schema({vol.Optional(CONF_CODE): str}) +STEP_INIT_DATA_SCHEMA = probatio.Schema({probatio.Optional(CONF_CODE): str}) async def try_connect( diff --git a/homeassistant/components/bosch_alarm/services.py b/homeassistant/components/bosch_alarm/services.py index b0f917e98598d..98289742b6f45 100644 --- a/homeassistant/components/bosch_alarm/services.py +++ b/homeassistant/components/bosch_alarm/services.py @@ -4,7 +4,7 @@ import datetime as dt from typing import Any -import voluptuous as vol +import probatio from homeassistant.const import ATTR_CONFIG_ENTRY_ID from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -20,18 +20,18 @@ def validate_datetime(value: Any) -> dt.datetime: """Validate that a provided datetime is supported on a bosch alarm panel.""" date_val = cv.datetime(value) if date_val.year < 2010: - raise vol.RangeInvalid("datetime must be after 2009") + raise probatio.RangeInvalid("datetime must be after 2009") if date_val.year > 2037: - raise vol.RangeInvalid("datetime must be before 2038") + raise probatio.RangeInvalid("datetime must be before 2038") return date_val -SET_DATE_TIME_SCHEMA = vol.Schema( +SET_DATE_TIME_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): cv.string, - vol.Optional(ATTR_DATETIME): validate_datetime, + probatio.Required(ATTR_CONFIG_ENTRY_ID): cv.string, + probatio.Optional(ATTR_DATETIME): validate_datetime, } ) diff --git a/homeassistant/components/bosch_shc/config_flow.py b/homeassistant/components/bosch_shc/config_flow.py index 818b3b7b60a4c..b34bb8fe9c45e 100644 --- a/homeassistant/components/bosch_shc/config_flow.py +++ b/homeassistant/components/bosch_shc/config_flow.py @@ -12,7 +12,7 @@ SHCRegistrationError, SHCSessionError, ) -import voluptuous as vol +import probatio from homeassistant.components import zeroconf from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -31,9 +31,9 @@ _LOGGER = logging.getLogger(__name__) -HOST_SCHEMA = vol.Schema( +HOST_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, + probatio.Required(CONF_HOST): str, } ) @@ -204,9 +204,9 @@ async def async_step_credentials( else: user_input = {} - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required( + probatio.Required( CONF_PASSWORD, default=user_input.get(CONF_PASSWORD, "") ): str, } diff --git a/homeassistant/components/brands/__init__.py b/homeassistant/components/brands/__init__.py index 062bdaf4666e6..a1a6ab22e2bdc 100644 --- a/homeassistant/components/brands/__init__.py +++ b/homeassistant/components/brands/__init__.py @@ -9,7 +9,7 @@ from typing import Any, Final from aiohttp import ClientError, hdrs, web -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.components.http import KEY_AUTHENTICATED, HomeAssistantView @@ -61,7 +61,7 @@ def _rotate_token(_now: Any) -> None: @callback -@websocket_api.websocket_command({vol.Required("type"): "brands/access_token"}) +@websocket_api.websocket_command({probatio.Required("type"): "brands/access_token"}) def ws_access_token( hass: HomeAssistant, connection: websocket_api.ActiveConnection, diff --git a/homeassistant/components/braviatv/config_flow.py b/homeassistant/components/braviatv/config_flow.py index 058f6f3d6f927..9ca7748953c81 100644 --- a/homeassistant/components/braviatv/config_flow.py +++ b/homeassistant/components/braviatv/config_flow.py @@ -5,8 +5,8 @@ from urllib.parse import urlparse from aiohttp import CookieJar +import probatio from pybravia import BraviaAuthError, BraviaClient, BraviaError, BraviaNotSupported -import voluptuous as vol from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -122,7 +122,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_HOST): str}), + data_schema=probatio.Schema({probatio.Required(CONF_HOST): str}), errors=errors, ) @@ -140,10 +140,10 @@ async def async_step_authorize( return self.async_show_form( step_id="authorize", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_USE_PSK, default=False): bool, - vol.Required(CONF_USE_SSL, default=False): bool, + probatio.Required(CONF_USE_PSK, default=False): bool, + probatio.Required(CONF_USE_SSL, default=False): bool, } ), ) @@ -179,9 +179,9 @@ async def async_step_pin( return self.async_show_form( step_id="pin", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PIN): str, + probatio.Required(CONF_PIN): str, } ), errors=errors, @@ -208,9 +208,9 @@ async def async_step_psk( return self.async_show_form( step_id="psk", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PIN): str, + probatio.Required(CONF_PIN): str, } ), errors=errors, diff --git a/homeassistant/components/bring/config_flow.py b/homeassistant/components/bring/config_flow.py index be2fb5272bbdb..1d885615bc845 100644 --- a/homeassistant/components/bring/config_flow.py +++ b/homeassistant/components/bring/config_flow.py @@ -10,7 +10,7 @@ BringAuthResponse, BringRequestException, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_EMAIL, CONF_NAME, CONF_PASSWORD @@ -26,15 +26,15 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_EMAIL): TextSelector( + probatio.Required(CONF_EMAIL): TextSelector( TextSelectorConfig( type=TextSelectorType.EMAIL, autocomplete="email", ), ), - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", diff --git a/homeassistant/components/bring/services.py b/homeassistant/components/bring/services.py index 7b84835f4a838..4427d810eba98 100644 --- a/homeassistant/components/bring/services.py +++ b/homeassistant/components/bring/services.py @@ -7,7 +7,7 @@ BringRequestException, ReactionType, ) -import voluptuous as vol +import probatio from homeassistant.components.event import EventEntityStateAttribute from homeassistant.components.todo import DOMAIN as TODO_DOMAIN @@ -32,12 +32,12 @@ SERVICE_PUSH_NOTIFICATION = "send_message" SERVICE_ACTIVITY_STREAM_REACTION = "send_reaction" -SERVICE_ACTIVITY_STREAM_REACTION_SCHEMA = vol.Schema( +SERVICE_ACTIVITY_STREAM_REACTION_SCHEMA = probatio.Schema( { - vol.Required(ATTR_ENTITY_ID): cv.entity_id, - vol.Required(ATTR_REACTION): vol.All( - vol.Upper, - vol.Coerce(ReactionType), + probatio.Required(ATTR_ENTITY_ID): cv.entity_id, + probatio.Required(ATTR_REACTION): probatio.All( + probatio.Upper, + probatio.Coerce(ReactionType), ), } ) @@ -107,10 +107,10 @@ async def async_send_activity_stream_reaction(call: ServiceCall) -> None: SERVICE_PUSH_NOTIFICATION, entity_domain=TODO_DOMAIN, schema={ - vol.Required(ATTR_NOTIFICATION_TYPE): vol.All( - vol.Upper, vol.Coerce(BringNotificationType) + probatio.Required(ATTR_NOTIFICATION_TYPE): probatio.All( + probatio.Upper, probatio.Coerce(BringNotificationType) ), - vol.Optional(ATTR_ITEM_NAME): cv.string, + probatio.Optional(ATTR_ITEM_NAME): cv.string, }, func="async_send_message", ) diff --git a/homeassistant/components/broadlink/config_flow.py b/homeassistant/components/broadlink/config_flow.py index eb6f7a8b31ccd..0f7926b952aaa 100644 --- a/homeassistant/components/broadlink/config_flow.py +++ b/homeassistant/components/broadlink/config_flow.py @@ -13,7 +13,7 @@ BroadlinkException, NetworkTimeoutError, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_IMPORT, @@ -147,12 +147,12 @@ async def async_step_user( return self.async_abort(reason=errors["base"]) data_schema = { - vol.Required(CONF_HOST): str, - vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, + probatio.Required(CONF_HOST): str, + probatio.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, } return self.async_show_form( step_id="user", - data_schema=vol.Schema(data_schema), + data_schema=probatio.Schema(data_schema), errors=errors, ) @@ -280,11 +280,11 @@ async def async_step_unlock( else: return await self.async_step_finish() - data_schema = {vol.Required("unlock", default=False): bool} + data_schema = {probatio.Required("unlock", default=False): bool} return self.async_show_form( step_id="unlock", errors=errors, - data_schema=vol.Schema(data_schema), + data_schema=probatio.Schema(data_schema), description_placeholders={ "name": device.name, "model": device.model, @@ -317,9 +317,9 @@ async def async_step_finish( # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - data_schema = {vol.Required(CONF_NAME, default=device.name): str} + data_schema = {probatio.Required(CONF_NAME, default=device.name): str} return self.async_show_form( - step_id="finish", data_schema=vol.Schema(data_schema), errors=errors + step_id="finish", data_schema=probatio.Schema(data_schema), errors=errors ) async def async_step_import(self, import_data: dict[str, Any]) -> ConfigFlowResult: diff --git a/homeassistant/components/broadlink/remote.py b/homeassistant/components/broadlink/remote.py index 7f36c29755b80..f73e10bb207af 100644 --- a/homeassistant/components/broadlink/remote.py +++ b/homeassistant/components/broadlink/remote.py @@ -16,7 +16,7 @@ ReadError, StorageError, ) -import voluptuous as vol +import probatio from homeassistant.components import persistent_notification from homeassistant.components.remote import ( @@ -60,32 +60,38 @@ CODE_SAVE_DELAY = 15 FLAG_SAVE_DELAY = 15 -COMMAND_SCHEMA = vol.Schema( +COMMAND_SCHEMA = probatio.Schema( { - vol.Required(ATTR_COMMAND): vol.All( - cv.ensure_list, [vol.All(cv.string, vol.Length(min=1))], vol.Length(min=1) + probatio.Required(ATTR_COMMAND): probatio.All( + cv.ensure_list, + [probatio.All(cv.string, probatio.Length(min=1))], + probatio.Length(min=1), ), }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) SERVICE_SEND_SCHEMA = COMMAND_SCHEMA.extend( { - vol.Optional(ATTR_DEVICE): vol.All(cv.string, vol.Length(min=1)), - vol.Optional(ATTR_DELAY_SECS, default=DEFAULT_DELAY_SECS): vol.Coerce(float), + probatio.Optional(ATTR_DEVICE): probatio.All(cv.string, probatio.Length(min=1)), + probatio.Optional(ATTR_DELAY_SECS, default=DEFAULT_DELAY_SECS): probatio.Coerce( + float + ), } ) SERVICE_LEARN_SCHEMA = COMMAND_SCHEMA.extend( { - vol.Required(ATTR_DEVICE): vol.All(cv.string, vol.Length(min=1)), - vol.Optional(ATTR_COMMAND_TYPE, default=COMMAND_TYPE_IR): vol.In(COMMAND_TYPES), - vol.Optional(ATTR_ALTERNATIVE, default=False): cv.boolean, + probatio.Required(ATTR_DEVICE): probatio.All(cv.string, probatio.Length(min=1)), + probatio.Optional(ATTR_COMMAND_TYPE, default=COMMAND_TYPE_IR): probatio.In( + COMMAND_TYPES + ), + probatio.Optional(ATTR_ALTERNATIVE, default=False): cv.boolean, } ) SERVICE_DELETE_SCHEMA = COMMAND_SCHEMA.extend( - {vol.Required(ATTR_DEVICE): vol.All(cv.string, vol.Length(min=1))} + {probatio.Required(ATTR_DEVICE): probatio.All(cv.string, probatio.Length(min=1))} ) diff --git a/homeassistant/components/broadlink/switch.py b/homeassistant/components/broadlink/switch.py index 3b47ba73b87f9..08bec4c8d263d 100644 --- a/homeassistant/components/broadlink/switch.py +++ b/homeassistant/components/broadlink/switch.py @@ -6,7 +6,7 @@ from typing import Any, override from broadlink.exceptions import BroadlinkException -import voluptuous as vol +import probatio from homeassistant.components.switch import ( PLATFORM_SCHEMA as SWITCH_PLATFORM_SCHEMA, @@ -45,24 +45,24 @@ CONF_SLOTS = "slots" -SWITCH_SCHEMA = vol.Schema( +SWITCH_SCHEMA = probatio.Schema( { - vol.Required(CONF_NAME): cv.string, - vol.Optional(CONF_COMMAND_OFF): data_packet, - vol.Optional(CONF_COMMAND_ON): data_packet, + probatio.Required(CONF_NAME): cv.string, + probatio.Optional(CONF_COMMAND_OFF): data_packet, + probatio.Optional(CONF_COMMAND_ON): data_packet, } ) -PLATFORM_SCHEMA = vol.All( +PLATFORM_SCHEMA = probatio.All( cv.deprecated(CONF_HOST), cv.deprecated(CONF_SLOTS), cv.deprecated(CONF_TIMEOUT), cv.deprecated(CONF_TYPE), SWITCH_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_MAC): mac_address, - vol.Optional(CONF_HOST): cv.string, - vol.Optional(CONF_SWITCHES, default=[]): vol.All( + probatio.Required(CONF_MAC): mac_address, + probatio.Optional(CONF_HOST): cv.string, + probatio.Optional(CONF_SWITCHES, default=[]): probatio.All( cv.ensure_list, [SWITCH_SCHEMA], ), diff --git a/homeassistant/components/brother/config_flow.py b/homeassistant/components/brother/config_flow.py index 546dd669cd0a5..f84d5a64f3902 100644 --- a/homeassistant/components/brother/config_flow.py +++ b/homeassistant/components/brother/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from brother import Brother, SnmpError, UnsupportedModelError -import voluptuous as vol +import probatio from homeassistant.components.snmp import async_get_snmp_engine from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -25,53 +25,53 @@ SECTION_ADVANCED_SETTINGS, ) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_TYPE, default=PRINTER_TYPE_LASER): SelectSelector( + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_TYPE, default=PRINTER_TYPE_LASER): SelectSelector( SelectSelectorConfig( options=PRINTER_TYPES, translation_key="printer_type", ) ), - vol.Required(SECTION_ADVANCED_SETTINGS): section( - vol.Schema( + probatio.Required(SECTION_ADVANCED_SETTINGS): section( + probatio.Schema( { - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, - vol.Required(CONF_COMMUNITY, default=DEFAULT_COMMUNITY): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Required(CONF_COMMUNITY, default=DEFAULT_COMMUNITY): str, }, ), {"collapsed": True}, ), } ) -ZEROCONF_SCHEMA = vol.Schema( +ZEROCONF_SCHEMA = probatio.Schema( { - vol.Required(CONF_TYPE, default=PRINTER_TYPE_LASER): SelectSelector( + probatio.Required(CONF_TYPE, default=PRINTER_TYPE_LASER): SelectSelector( SelectSelectorConfig( options=PRINTER_TYPES, translation_key="printer_type", ) ), - vol.Required(SECTION_ADVANCED_SETTINGS): section( - vol.Schema( + probatio.Required(SECTION_ADVANCED_SETTINGS): section( + probatio.Schema( { - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, - vol.Required(CONF_COMMUNITY, default=DEFAULT_COMMUNITY): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Required(CONF_COMMUNITY, default=DEFAULT_COMMUNITY): str, }, ), {"collapsed": True}, ), } ) -RECONFIGURE_SCHEMA = vol.Schema( +RECONFIGURE_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(SECTION_ADVANCED_SETTINGS): section( - vol.Schema( + probatio.Required(CONF_HOST): str, + probatio.Required(SECTION_ADVANCED_SETTINGS): section( + probatio.Schema( { - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, - vol.Required(CONF_COMMUNITY, default=DEFAULT_COMMUNITY): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Required(CONF_COMMUNITY, default=DEFAULT_COMMUNITY): str, }, ), {"collapsed": True}, diff --git a/homeassistant/components/brottsplatskartan/config_flow.py b/homeassistant/components/brottsplatskartan/config_flow.py index eab2ad5eae321..e7f034ba8f29f 100644 --- a/homeassistant/components/brottsplatskartan/config_flow.py +++ b/homeassistant/components/brottsplatskartan/config_flow.py @@ -4,7 +4,7 @@ import uuid from brottsplatskartan import AREAS -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_LATITUDE, CONF_LOCATION, CONF_LONGITUDE @@ -12,12 +12,12 @@ from .const import CONF_APP_ID, CONF_AREA, DEFAULT_NAME, DOMAIN -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Optional(CONF_LOCATION): selector.LocationSelector( + probatio.Optional(CONF_LOCATION): selector.LocationSelector( selector.LocationSelectorConfig(radius=False, icon="") ), - vol.Optional(CONF_AREA): selector.SelectSelector( + probatio.Optional(CONF_AREA): selector.SelectSelector( selector.SelectSelectorConfig( options=AREAS, mode=selector.SelectSelectorMode.DROPDOWN, diff --git a/homeassistant/components/browser/__init__.py b/homeassistant/components/browser/__init__.py index 7f562cd3bed9a..b6b3bc84228a0 100644 --- a/homeassistant/components/browser/__init__.py +++ b/homeassistant/components/browser/__init__.py @@ -2,7 +2,7 @@ import webbrowser -import voluptuous as vol +import probatio from homeassistant.core import HomeAssistant, ServiceCall from homeassistant.helpers import config_validation as cv @@ -15,9 +15,9 @@ SERVICE_BROWSE_URL = "browse_url" -SERVICE_BROWSE_URL_SCHEMA = vol.Schema( +SERVICE_BROWSE_URL_SCHEMA = probatio.Schema( { - vol.Required(ATTR_URL, default=ATTR_URL_DEFAULT): vol.Url(), + probatio.Required(ATTR_URL, default=ATTR_URL_DEFAULT): probatio.Url(), } ) diff --git a/homeassistant/components/brunt/config_flow.py b/homeassistant/components/brunt/config_flow.py index d8ba548892095..c2c70a99be2f5 100644 --- a/homeassistant/components/brunt/config_flow.py +++ b/homeassistant/components/brunt/config_flow.py @@ -7,7 +7,7 @@ from aiohttp import ClientResponseError from aiohttp.client_exceptions import ServerDisconnectedError from brunt import BruntClientAsync -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_NAME, CONF_PASSWORD, CONF_USERNAME @@ -16,10 +16,10 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( - {vol.Required(CONF_USERNAME): str, vol.Required(CONF_PASSWORD): str} +DATA_SCHEMA = probatio.Schema( + {probatio.Required(CONF_USERNAME): str, probatio.Required(CONF_PASSWORD): str} ) -REAUTH_SCHEMA = vol.Schema({vol.Required(CONF_PASSWORD): str}) +REAUTH_SCHEMA = probatio.Schema({probatio.Required(CONF_PASSWORD): str}) async def validate_input(user_input: dict[str, Any]) -> dict[str, str] | None: diff --git a/homeassistant/components/bryant_evolution/config_flow.py b/homeassistant/components/bryant_evolution/config_flow.py index 62a547b33720b..593cdce2bd9e6 100644 --- a/homeassistant/components/bryant_evolution/config_flow.py +++ b/homeassistant/components/bryant_evolution/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from evolutionhttp import BryantEvolutionLocalClient -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_FILENAME @@ -13,9 +13,9 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_FILENAME, default="/dev/ttyUSB0"): str, + probatio.Required(CONF_FILENAME, default="/dev/ttyUSB0"): str, } ) diff --git a/homeassistant/components/bsblan/config_flow.py b/homeassistant/components/bsblan/config_flow.py index c5a6ac7caf0ca..cab0c22a8b010 100644 --- a/homeassistant/components/bsblan/config_flow.py +++ b/homeassistant/components/bsblan/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from bsblan import BSBLAN, BSBLANAuthError, BSBLANConfig, BSBLANError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_PORT, CONF_USERNAME @@ -116,15 +116,15 @@ async def async_step_discovery_confirm( ) -> ConfigFlowResult: """Handle getting credentials for discovered device.""" if user_input is None: - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Optional(CONF_PASSKEY): str, - vol.Optional(CONF_USERNAME): str, - vol.Optional(CONF_PASSWORD): str, + probatio.Optional(CONF_PASSKEY): str, + probatio.Optional(CONF_USERNAME): str, + probatio.Optional(CONF_PASSWORD): str, } ) if not self._auth_required: - data_schema = vol.Schema({}) + data_schema = probatio.Schema({}) return self.async_show_form( step_id="discovery_confirm", @@ -154,11 +154,11 @@ async def _validate_and_create( if is_discovery: return self.async_show_form( step_id="discovery_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional(CONF_PASSKEY): str, - vol.Optional(CONF_USERNAME): str, - vol.Optional(CONF_PASSWORD): str, + probatio.Optional(CONF_PASSKEY): str, + probatio.Optional(CONF_USERNAME): str, + probatio.Optional(CONF_PASSWORD): str, } ), errors={"base": "invalid_auth"}, @@ -169,11 +169,11 @@ async def _validate_and_create( if is_discovery: return self.async_show_form( step_id="discovery_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional(CONF_PASSKEY): str, - vol.Optional(CONF_USERNAME): str, - vol.Optional(CONF_PASSWORD): str, + probatio.Optional(CONF_PASSKEY): str, + probatio.Optional(CONF_USERNAME): str, + probatio.Optional(CONF_PASSWORD): str, } ), errors={"base": "cannot_connect"}, @@ -270,49 +270,49 @@ async def _async_validate_credentials(self, data: dict[str, Any]) -> dict[str, s return errors @callback - def _build_credentials_schema(self, defaults: Mapping[str, Any]) -> vol.Schema: + def _build_credentials_schema(self, defaults: Mapping[str, Any]) -> probatio.Schema: """Build schema for credentials-only forms (reauth).""" - return vol.Schema( + return probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_PASSKEY, - default=defaults.get(CONF_PASSKEY) or vol.UNDEFINED, + default=defaults.get(CONF_PASSKEY) or probatio.UNDEFINED, ): str, - vol.Optional( + probatio.Optional( CONF_USERNAME, - default=defaults.get(CONF_USERNAME) or vol.UNDEFINED, + default=defaults.get(CONF_USERNAME) or probatio.UNDEFINED, ): str, - vol.Optional( + probatio.Optional( CONF_PASSWORD, - default=vol.UNDEFINED, + default=probatio.UNDEFINED, ): str, } ) @callback - def _build_connection_schema(self, defaults: Mapping[str, Any]) -> vol.Schema: + def _build_connection_schema(self, defaults: Mapping[str, Any]) -> probatio.Schema: """Build schema for full connection forms (user and reconfigure).""" - return vol.Schema( + return probatio.Schema( { - vol.Required( + probatio.Required( CONF_HOST, - default=defaults.get(CONF_HOST, vol.UNDEFINED), + default=defaults.get(CONF_HOST, probatio.UNDEFINED), ): str, - vol.Optional( + probatio.Optional( CONF_PORT, default=defaults.get(CONF_PORT, DEFAULT_PORT), ): int, - vol.Optional( + probatio.Optional( CONF_PASSKEY, - default=defaults.get(CONF_PASSKEY) or vol.UNDEFINED, + default=defaults.get(CONF_PASSKEY) or probatio.UNDEFINED, ): str, - vol.Optional( + probatio.Optional( CONF_USERNAME, - default=defaults.get(CONF_USERNAME) or vol.UNDEFINED, + default=defaults.get(CONF_USERNAME) or probatio.UNDEFINED, ): str, - vol.Optional( + probatio.Optional( CONF_PASSWORD, - default=vol.UNDEFINED, + default=probatio.UNDEFINED, ): str, } ) diff --git a/homeassistant/components/bsblan/services.py b/homeassistant/components/bsblan/services.py index 2685cad5d6073..fe3f0ca797674 100644 --- a/homeassistant/components/bsblan/services.py +++ b/homeassistant/components/bsblan/services.py @@ -5,7 +5,7 @@ from typing import TYPE_CHECKING, Any, Final from bsblan import BSBLANError, DaySchedule, DHWSchedule, TimeSlot -import voluptuous as vol +import probatio from homeassistant.const import ATTR_DEVICE_ID from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -44,23 +44,23 @@ # Schema for a single time slot -_SLOT_SCHEMA = vol.Schema( +_SLOT_SCHEMA = probatio.Schema( { - vol.Required("start_time"): cv.time, - vol.Required("end_time"): cv.time, + probatio.Required("start_time"): cv.time, + probatio.Required("end_time"): cv.time, } ) -_WEEKLY_SCHEDULE_FIELDS: Final[dict[vol.Marker, Any]] = { - vol.Optional(slot_attr): vol.All(cv.ensure_list, [_SLOT_SCHEMA]) +_WEEKLY_SCHEDULE_FIELDS: Final[dict[probatio.Marker, Any]] = { + probatio.Optional(slot_attr): probatio.All(cv.ensure_list, [_SLOT_SCHEMA]) for _, slot_attr in _DAY_NAME_SLOT_ATTR_PAIRS } -SERVICE_SET_HOT_WATER_SCHEDULE_SCHEMA = vol.Schema( +SERVICE_SET_HOT_WATER_SCHEDULE_SCHEMA = probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): cv.string, + probatio.Required(ATTR_DEVICE_ID): cv.string, **_WEEKLY_SCHEDULE_FIELDS, } ) @@ -186,9 +186,9 @@ async def async_sync_time(service_call: ServiceCall) -> None: ) -SYNC_TIME_SCHEMA = vol.Schema( +SYNC_TIME_SCHEMA = probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): cv.string, + probatio.Required(ATTR_DEVICE_ID): cv.string, } ) diff --git a/homeassistant/components/bt_home_hub_5/device_tracker.py b/homeassistant/components/bt_home_hub_5/device_tracker.py index b1cf9d852a193..d51f89498886b 100644 --- a/homeassistant/components/bt_home_hub_5/device_tracker.py +++ b/homeassistant/components/bt_home_hub_5/device_tracker.py @@ -4,7 +4,7 @@ from typing import override import bthomehub5_devicelist -import voluptuous as vol +import probatio from homeassistant.components.device_tracker import ( DOMAIN as DEVICE_TRACKER_DOMAIN, @@ -21,7 +21,7 @@ CONF_DEFAULT_IP = "192.168.1.254" PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( - {vol.Optional(CONF_HOST, default=CONF_DEFAULT_IP): cv.string} + {probatio.Optional(CONF_HOST, default=CONF_DEFAULT_IP): cv.string} ) diff --git a/homeassistant/components/bt_smarthub/device_tracker.py b/homeassistant/components/bt_smarthub/device_tracker.py index 20d4fa743f141..55f7c8f4eaf0b 100644 --- a/homeassistant/components/bt_smarthub/device_tracker.py +++ b/homeassistant/components/bt_smarthub/device_tracker.py @@ -5,7 +5,7 @@ from typing import override from btsmarthub_devicelist import BTSmartHub -import voluptuous as vol +import probatio from homeassistant.components.device_tracker import ( DOMAIN as DEVICE_TRACKER_DOMAIN, @@ -24,8 +24,8 @@ PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_HOST, default=CONF_DEFAULT_IP): cv.string, - vol.Optional(CONF_SMARTHUB_MODEL): vol.In([1, 2]), + probatio.Optional(CONF_HOST, default=CONF_DEFAULT_IP): cv.string, + probatio.Optional(CONF_SMARTHUB_MODEL): probatio.In([1, 2]), } ) diff --git a/homeassistant/components/bthome/config_flow.py b/homeassistant/components/bthome/config_flow.py index e6e725982be9a..59258a114bfe9 100644 --- a/homeassistant/components/bthome/config_flow.py +++ b/homeassistant/components/bthome/config_flow.py @@ -6,7 +6,7 @@ from bthome_ble import BTHomeBluetoothDeviceData as DeviceData from bthome_ble.parser import EncryptionScheme -import voluptuous as vol +import probatio from homeassistant.components import onboarding from homeassistant.components.bluetooth import ( @@ -94,7 +94,9 @@ async def async_step_get_encryption_key( return self.async_show_form( step_id="get_encryption_key", description_placeholders=self.context["title_placeholders"], - data_schema=vol.Schema({vol.Required("bindkey"): vol.All(str, vol.Strip)}), + data_schema=probatio.Schema( + {probatio.Required("bindkey"): probatio.All(str, probatio.Strip)} + ), errors=errors, ) @@ -154,7 +156,9 @@ async def async_step_user( } return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_ADDRESS): vol.In(titles)}), + data_schema=probatio.Schema( + {probatio.Required(CONF_ADDRESS): probatio.In(titles)} + ), ) async def async_step_reauth( diff --git a/homeassistant/components/bthome/device_trigger.py b/homeassistant/components/bthome/device_trigger.py index a717cde4087fa..b1b406b998099 100644 --- a/homeassistant/components/bthome/device_trigger.py +++ b/homeassistant/components/bthome/device_trigger.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING, Any -import voluptuous as vol +import probatio from homeassistant.components.device_automation import ( DEVICE_TRIGGER_BASE_SCHEMA, @@ -48,7 +48,7 @@ } TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( - {vol.Required(CONF_TYPE): str, vol.Required(CONF_SUBTYPE): str} + {probatio.Required(CONF_TYPE): str, probatio.Required(CONF_SUBTYPE): str} ) diff --git a/homeassistant/components/buienradar/camera.py b/homeassistant/components/buienradar/camera.py index 2b1994ca94e05..f8aaad00fd1c7 100644 --- a/homeassistant/components/buienradar/camera.py +++ b/homeassistant/components/buienradar/camera.py @@ -6,7 +6,7 @@ from typing import override import aiohttp -import voluptuous as vol +import probatio from homeassistant.components.camera import Camera from homeassistant.const import CONF_COUNTRY_CODE, CONF_LATITUDE, CONF_LONGITUDE @@ -21,7 +21,7 @@ _LOGGER = logging.getLogger(__name__) # Maximum range according to docs -DIM_RANGE = vol.All(vol.Coerce(int), vol.Range(min=120, max=700)) +DIM_RANGE = probatio.All(probatio.Coerce(int), probatio.Range(min=120, max=700)) # Multiple choice for available Radar Map URL SUPPORTED_COUNTRY_CODES = ["NL", "BE"] diff --git a/homeassistant/components/buienradar/config_flow.py b/homeassistant/components/buienradar/config_flow.py index 4adc6a089c20c..5b321e3a9c1a9 100644 --- a/homeassistant/components/buienradar/config_flow.py +++ b/homeassistant/components/buienradar/config_flow.py @@ -3,7 +3,7 @@ import copy from typing import Any, cast, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigEntry, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_COUNTRY_CODE, CONF_LATITUDE, CONF_LONGITUDE @@ -25,14 +25,14 @@ SUPPORTED_COUNTRY_CODES, ) -OPTIONS_SCHEMA = vol.Schema( +OPTIONS_SCHEMA = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_COUNTRY_CODE, default=DEFAULT_COUNTRY ): selector.CountrySelector( selector.CountrySelectorConfig(countries=SUPPORTED_COUNTRY_CODES) ), - vol.Optional(CONF_DELTA, default=DEFAULT_DELTA): selector.NumberSelector( + probatio.Optional(CONF_DELTA, default=DEFAULT_DELTA): selector.NumberSelector( selector.NumberSelectorConfig( min=0, step=1, @@ -40,7 +40,7 @@ unit_of_measurement="seconds", ), ), - vol.Optional( + probatio.Optional( CONF_TIMEFRAME, default=DEFAULT_TIMEFRAME ): selector.NumberSelector( selector.NumberSelectorConfig( @@ -97,12 +97,12 @@ async def async_step_user( return self.async_create_entry(title=f"{lat},{lon}", data=user_input) - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required( + probatio.Required( CONF_LATITUDE, default=self.hass.config.latitude ): cv.latitude, - vol.Required( + probatio.Required( CONF_LONGITUDE, default=self.hass.config.longitude ): cv.longitude, } diff --git a/homeassistant/components/button/__init__.py b/homeassistant/components/button/__init__.py index 46ebe0a8f3710..64da00f308f44 100644 --- a/homeassistant/components/button/__init__.py +++ b/homeassistant/components/button/__init__.py @@ -5,8 +5,8 @@ import logging from typing import final, override +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.config_entries import ConfigEntry from homeassistant.const import STATE_UNAVAILABLE @@ -40,7 +40,7 @@ class ButtonDeviceClass(StrEnum): UPDATE = "update" -DEVICE_CLASSES_SCHEMA = vol.All(vol.Lower, vol.Coerce(ButtonDeviceClass)) +DEVICE_CLASSES_SCHEMA = probatio.All(probatio.Lower, probatio.Coerce(ButtonDeviceClass)) # mypy: disallow-any-generics diff --git a/homeassistant/components/button/device_action.py b/homeassistant/components/button/device_action.py index 26ce58443d428..a55725a8c1970 100644 --- a/homeassistant/components/button/device_action.py +++ b/homeassistant/components/button/device_action.py @@ -1,6 +1,6 @@ """Provides device actions for Button.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import async_validate_entity_schema from homeassistant.const import ( @@ -20,8 +20,8 @@ _ACTION_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): vol.In(ACTION_TYPES), - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In(ACTION_TYPES), + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, } ) diff --git a/homeassistant/components/button/device_trigger.py b/homeassistant/components/button/device_trigger.py index 975a98136db7c..b2ad09e16bcba 100644 --- a/homeassistant/components/button/device_trigger.py +++ b/homeassistant/components/button/device_trigger.py @@ -1,6 +1,6 @@ """Provides device triggers for Button.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import DEVICE_TRIGGER_BASE_SCHEMA from homeassistant.components.homeassistant.triggers.state import ( @@ -25,8 +25,8 @@ TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In(TRIGGER_TYPES), + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In(TRIGGER_TYPES), } ) diff --git a/homeassistant/components/caldav/calendar.py b/homeassistant/components/caldav/calendar.py index 78ed4401782ec..daadff2ea1cb7 100644 --- a/homeassistant/components/caldav/calendar.py +++ b/homeassistant/components/caldav/calendar.py @@ -8,7 +8,7 @@ from caldav.davclient import DAVClient from caldav.lib.error import DAVError from caldav.lib.http_sync import requests as caldav_requests -import voluptuous as vol +import probatio from homeassistant.components.calendar import ( ENTITY_ID_FORMAT, @@ -57,24 +57,26 @@ PLATFORM_SCHEMA = CALENDAR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_URL): vol.Url(), - vol.Optional(CONF_CALENDARS, default=[]): vol.All(cv.ensure_list, [cv.string]), - vol.Inclusive(CONF_USERNAME, "authentication"): cv.string, - vol.Inclusive(CONF_PASSWORD, "authentication"): cv.string, - vol.Optional(CONF_CUSTOM_CALENDARS, default=[]): vol.All( + probatio.Required(CONF_URL): probatio.Url(), + probatio.Optional(CONF_CALENDARS, default=[]): probatio.All( + cv.ensure_list, [cv.string] + ), + probatio.Inclusive(CONF_USERNAME, "authentication"): cv.string, + probatio.Inclusive(CONF_PASSWORD, "authentication"): cv.string, + probatio.Optional(CONF_CUSTOM_CALENDARS, default=[]): probatio.All( cv.ensure_list, [ - vol.Schema( + probatio.Schema( { - vol.Required(CONF_CALENDAR): cv.string, - vol.Required(CONF_NAME): cv.string, - vol.Required(CONF_SEARCH): cv.string, + probatio.Required(CONF_CALENDAR): cv.string, + probatio.Required(CONF_NAME): cv.string, + probatio.Required(CONF_SEARCH): cv.string, } ) ], ), - vol.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, - vol.Optional(CONF_DAYS, default=1): cv.positive_int, + probatio.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, + probatio.Optional(CONF_DAYS, default=1): cv.positive_int, } ) diff --git a/homeassistant/components/caldav/config_flow.py b/homeassistant/components/caldav/config_flow.py index 5df6cc08e4faf..935206bfec415 100644 --- a/homeassistant/components/caldav/config_flow.py +++ b/homeassistant/components/caldav/config_flow.py @@ -8,7 +8,7 @@ from caldav.davclient import DAVClient from caldav.lib.error import AuthorizationError, DAVError from caldav.lib.http_sync import requests as caldav_requests -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_URL, CONF_USERNAME, CONF_VERIFY_SSL @@ -19,12 +19,12 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_URL): str, - vol.Required(CONF_USERNAME): cv.string, - vol.Optional(CONF_PASSWORD, default=""): cv.string, - vol.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, + probatio.Required(CONF_URL): str, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Optional(CONF_PASSWORD, default=""): cv.string, + probatio.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, } ) @@ -120,9 +120,9 @@ async def async_step_reauth_confirm( CONF_USERNAME: reauth_entry.data[CONF_USERNAME], }, step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, diff --git a/homeassistant/components/calendar/__init__.py b/homeassistant/components/calendar/__init__.py index f609d02e25cea..0fabb010dc50c 100644 --- a/homeassistant/components/calendar/__init__.py +++ b/homeassistant/components/calendar/__init__.py @@ -11,7 +11,7 @@ from aiohttp import web from dateutil.rrule import rrulestr -import voluptuous as vol +import probatio from homeassistant.auth.models import User from homeassistant.auth.permissions.const import POLICY_CONTROL, POLICY_READ @@ -104,7 +104,7 @@ def validate(obj: dict[str, Any]) -> dict[str, Any]: and isinstance(value, datetime.datetime) and value.tzinfo is None ): - raise vol.Invalid("Expected all values to have a timezone") + raise probatio.Invalid("Expected all values to have a timezone") return obj return validate @@ -122,7 +122,7 @@ def validate(obj: dict[str, Any]) -> dict[str, Any]: tzinfos.append(value.tzinfo) uniq_values = groupby(tzinfos) if len(list(uniq_values)) > 1: - raise vol.Invalid("Expected all values to have the same timezone") + raise probatio.Invalid("Expected all values to have the same timezone") return obj return validate @@ -150,7 +150,7 @@ def validate(obj: dict[str, Any]) -> dict[str, Any]: if (start := obj.get(start_key)) and (end := obj.get(end_key)): duration = end - start if duration < min_duration: - raise vol.Invalid( + raise probatio.Invalid( "Expected minimum event duration" f" of {min_duration} ({start}, {end})" ) @@ -167,12 +167,12 @@ def _has_positive_interval( def validate(obj: dict[str, Any]) -> dict[str, Any]: if (duration := obj.get(duration_key)) is not None: if duration <= datetime.timedelta(seconds=0): - raise vol.Invalid(f"Expected positive duration ({duration})") + raise probatio.Invalid(f"Expected positive duration ({duration})") return obj if (start := obj.get(start_key)) and (end := obj.get(end_key)): if start >= end: - raise vol.Invalid( + raise probatio.Invalid( f"Expected end time to be after start time ({start}, {end})" ) return obj @@ -187,7 +187,7 @@ def validate(obj: dict[str, Any]) -> dict[str, Any]: """Test that all keys in the dict have values of the same type.""" uniq_values = groupby(type(obj[k]) for k in keys) if len(list(uniq_values)) > 1: - raise vol.Invalid(f"Expected all values to be the same type: {keys}") + raise probatio.Invalid(f"Expected all values to be the same type: {keys}") return obj return validate @@ -196,23 +196,23 @@ def validate(obj: dict[str, Any]) -> dict[str, Any]: def _validate_rrule(value: Any) -> str: """Validate a recurrence rule string.""" if value is None: - raise vol.Invalid("rrule value is None") + raise probatio.Invalid("rrule value is None") if not isinstance(value, str): - raise vol.Invalid("rrule value expected a string") + raise probatio.Invalid("rrule value expected a string") try: rrulestr(value) except ValueError as err: - raise vol.Invalid(f"Invalid rrule '{value}': {err}") from err + raise probatio.Invalid(f"Invalid rrule '{value}': {err}") from err # Example format: FREQ=DAILY;UNTIL=... rule_parts = dict(s.split("=", 1) for s in value.split(";")) if not (freq := rule_parts.get("FREQ")): - raise vol.Invalid("rrule did not contain FREQ") + raise probatio.Invalid("rrule did not contain FREQ") if freq not in VALID_FREQS: - raise vol.Invalid(f"Invalid frequency for rule: {value}") + raise probatio.Invalid(f"Invalid frequency for rule: {value}") return str(value) @@ -223,34 +223,34 @@ def _empty_as_none(value: str | None) -> str | None: CREATE_EVENT_SERVICE = "create_event" -CREATE_EVENT_SCHEMA = vol.All( +CREATE_EVENT_SCHEMA = probatio.All( cv.has_at_least_one_key(EVENT_START_DATE, EVENT_START_DATETIME, EVENT_IN), cv.has_at_most_one_key(EVENT_START_DATE, EVENT_START_DATETIME, EVENT_IN), cv.make_entity_service_schema( { - vol.Required(EVENT_SUMMARY): cv.string, - vol.Optional(EVENT_DESCRIPTION, default=""): cv.string, - vol.Optional(EVENT_LOCATION): cv.string, - vol.Inclusive( + probatio.Required(EVENT_SUMMARY): cv.string, + probatio.Optional(EVENT_DESCRIPTION, default=""): cv.string, + probatio.Optional(EVENT_LOCATION): cv.string, + probatio.Inclusive( EVENT_START_DATE, "dates", "Start and end dates must both be specified" ): cv.date, - vol.Inclusive( + probatio.Inclusive( EVENT_END_DATE, "dates", "Start and end dates must both be specified" ): cv.date, - vol.Inclusive( + probatio.Inclusive( EVENT_START_DATETIME, "datetimes", "Start and end datetimes must both be specified", ): cv.datetime, - vol.Inclusive( + probatio.Inclusive( EVENT_END_DATETIME, "datetimes", "Start and end datetimes must both be specified", ): cv.datetime, - vol.Optional(EVENT_IN): vol.Schema( + probatio.Optional(EVENT_IN): probatio.Schema( { - vol.Exclusive(EVENT_IN_DAYS, EVENT_TYPES): cv.positive_int, - vol.Exclusive(EVENT_IN_WEEKS, EVENT_TYPES): cv.positive_int, + probatio.Exclusive(EVENT_IN_DAYS, EVENT_TYPES): cv.positive_int, + probatio.Exclusive(EVENT_IN_WEEKS, EVENT_TYPES): cv.positive_int, } ), }, @@ -261,15 +261,15 @@ def _empty_as_none(value: str | None) -> str | None: _has_min_duration(EVENT_START_DATETIME, EVENT_END_DATETIME, MIN_NEW_EVENT_DURATION), ) -WEBSOCKET_EVENT_SCHEMA = vol.Schema( - vol.All( +WEBSOCKET_EVENT_SCHEMA = probatio.Schema( + probatio.All( { - vol.Required(EVENT_START): vol.Any(cv.date, cv.datetime), - vol.Required(EVENT_END): vol.Any(cv.date, cv.datetime), - vol.Required(EVENT_SUMMARY): cv.string, - vol.Optional(EVENT_DESCRIPTION): cv.string, - vol.Optional(EVENT_LOCATION): cv.string, - vol.Optional(EVENT_RRULE): _validate_rrule, + probatio.Required(EVENT_START): probatio.Any(cv.date, cv.datetime), + probatio.Required(EVENT_END): probatio.Any(cv.date, cv.datetime), + probatio.Required(EVENT_SUMMARY): cv.string, + probatio.Optional(EVENT_DESCRIPTION): cv.string, + probatio.Optional(EVENT_LOCATION): cv.string, + probatio.Optional(EVENT_RRULE): _validate_rrule, }, _has_same_type(EVENT_START, EVENT_END), _has_consistent_timezone(EVENT_START, EVENT_END), @@ -279,31 +279,31 @@ def _empty_as_none(value: str | None) -> str | None: ) # Validation for the CalendarEvent dataclass -CALENDAR_EVENT_SCHEMA = vol.Schema( - vol.All( +CALENDAR_EVENT_SCHEMA = probatio.Schema( + probatio.All( { - vol.Required("start"): vol.Any(cv.date, cv.datetime), - vol.Required("end"): vol.Any(cv.date, cv.datetime), - vol.Required(EVENT_SUMMARY): cv.string, - vol.Optional(EVENT_RRULE): _validate_rrule, + probatio.Required("start"): probatio.Any(cv.date, cv.datetime), + probatio.Required("end"): probatio.Any(cv.date, cv.datetime), + probatio.Required(EVENT_SUMMARY): cv.string, + probatio.Optional(EVENT_RRULE): _validate_rrule, }, _has_same_type("start", "end"), _has_timezone("start", "end"), _as_local_timezone("start", "end"), _has_min_duration("start", "end", MIN_EVENT_DURATION), ), - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) SERVICE_GET_EVENTS: Final = "get_events" -SERVICE_GET_EVENTS_SCHEMA: Final = vol.All( +SERVICE_GET_EVENTS_SCHEMA: Final = probatio.All( cv.has_at_least_one_key(EVENT_END_DATETIME, EVENT_DURATION), cv.has_at_most_one_key(EVENT_END_DATETIME, EVENT_DURATION), cv.make_entity_service_schema( { - vol.Optional(EVENT_START_DATETIME): cv.datetime, - vol.Optional(EVENT_END_DATETIME): cv.datetime, - vol.Optional(EVENT_DURATION): vol.All( + probatio.Optional(EVENT_START_DATETIME): cv.datetime, + probatio.Optional(EVENT_END_DATETIME): cv.datetime, + probatio.Optional(EVENT_DURATION): probatio.All( cv.time_period, cv.positive_timedelta ), } @@ -412,7 +412,7 @@ def skip_none(obj: Iterable[tuple[str, Any]]) -> dict[str, str]: try: CALENDAR_EVENT_SCHEMA(dataclasses.asdict(self, dict_factory=skip_none)) - except vol.Invalid as err: + except probatio.Invalid as err: raise HomeAssistantError( f"Failed to validate CalendarEvent: {err}" ) from err @@ -559,7 +559,7 @@ def get_initial_entity_options(self) -> er.EntityOptionsType | None: # Validate that it's a valid hex color string with # prefix try: validated_color = cv.color_hex(self.initial_color) - except vol.Invalid: + except probatio.Invalid: return None return {DOMAIN: {"color": validated_color}} @@ -873,8 +873,8 @@ async def get(self, request: web.Request) -> web.Response: @websocket_api.websocket_command( { - vol.Required("type"): "calendar/event/create", - vol.Required("entity_id"): cv.entity_id, + probatio.Required("type"): "calendar/event/create", + probatio.Required("entity_id"): cv.entity_id, CONF_EVENT: WEBSOCKET_EVENT_SCHEMA, } ) @@ -911,13 +911,13 @@ async def handle_calendar_event_create( @websocket_api.websocket_command( { - vol.Required("type"): "calendar/event/delete", - vol.Required("entity_id"): cv.entity_id, - vol.Required(EVENT_UID): cv.string, - vol.Optional(EVENT_RECURRENCE_ID): vol.Any( - vol.All(cv.string, _empty_as_none), None + probatio.Required("type"): "calendar/event/delete", + probatio.Required("entity_id"): cv.entity_id, + probatio.Required(EVENT_UID): cv.string, + probatio.Optional(EVENT_RECURRENCE_ID): probatio.Any( + probatio.All(cv.string, _empty_as_none), None ), - vol.Optional(EVENT_RECURRENCE_RANGE): cv.string, + probatio.Optional(EVENT_RECURRENCE_RANGE): cv.string, } ) @websocket_api.async_response @@ -958,14 +958,14 @@ async def handle_calendar_event_delete( @websocket_api.websocket_command( { - vol.Required("type"): "calendar/event/update", - vol.Required("entity_id"): cv.entity_id, - vol.Required(EVENT_UID): cv.string, - vol.Optional(EVENT_RECURRENCE_ID): vol.Any( - vol.All(cv.string, _empty_as_none), None + probatio.Required("type"): "calendar/event/update", + probatio.Required("entity_id"): cv.entity_id, + probatio.Required(EVENT_UID): cv.string, + probatio.Optional(EVENT_RECURRENCE_ID): probatio.Any( + probatio.All(cv.string, _empty_as_none), None ), - vol.Optional(EVENT_RECURRENCE_RANGE): cv.string, - vol.Required(CONF_EVENT): WEBSOCKET_EVENT_SCHEMA, + probatio.Optional(EVENT_RECURRENCE_RANGE): cv.string, + probatio.Required(CONF_EVENT): WEBSOCKET_EVENT_SCHEMA, } ) @websocket_api.async_response @@ -1007,10 +1007,10 @@ async def handle_calendar_event_update( @websocket_api.websocket_command( { - vol.Required("type"): "calendar/event/subscribe", - vol.Required("entity_id"): cv.entity_domain(DOMAIN), - vol.Required("start"): cv.datetime, - vol.Required("end"): cv.datetime, + probatio.Required("type"): "calendar/event/subscribe", + probatio.Required("entity_id"): cv.entity_domain(DOMAIN), + probatio.Required("start"): cv.datetime, + probatio.Required("end"): cv.datetime, } ) @websocket_api.async_response diff --git a/homeassistant/components/calendar/llm.py b/homeassistant/components/calendar/llm.py index 3c2c47c4f4979..8000eaad1a2a1 100644 --- a/homeassistant/components/calendar/llm.py +++ b/homeassistant/components/calendar/llm.py @@ -4,7 +4,7 @@ from operator import attrgetter from typing import cast, override -import voluptuous as vol +import probatio from homeassistant.components.homeassistant import async_should_expose from homeassistant.components.llm import LLMTools @@ -30,10 +30,10 @@ class CalendarGetEventsTool(Tool): def __init__(self, calendars: list[str]) -> None: """Init the get events tool.""" - self.parameters = vol.Schema( + self.parameters = probatio.Schema( { - vol.Required("calendar"): vol.In(calendars), - vol.Required("range"): vol.In(["today", "week"]), + probatio.Required("calendar"): probatio.In(calendars), + probatio.Required("range"): probatio.In(["today", "week"]), } ) diff --git a/homeassistant/components/calendar/trigger.py b/homeassistant/components/calendar/trigger.py index 9da1fee63a089..693f447dfc2de 100644 --- a/homeassistant/components/calendar/trigger.py +++ b/homeassistant/components/calendar/trigger.py @@ -7,7 +7,7 @@ import logging from typing import TYPE_CHECKING, Any, cast, override -import voluptuous as vol +import probatio from homeassistant.const import ( ATTR_ENTITY_ID, @@ -51,26 +51,30 @@ _SINGLE_ENTITY_EVENT_OPTIONS_SCHEMA = { - vol.Required(CONF_ENTITY_ID): cv.entity_id, - vol.Optional(CONF_EVENT, default=EVENT_START): vol.In({EVENT_START, EVENT_END}), - vol.Optional(CONF_OFFSET, default=datetime.timedelta(0)): cv.time_period, + probatio.Required(CONF_ENTITY_ID): cv.entity_id, + probatio.Optional(CONF_EVENT, default=EVENT_START): probatio.In( + {EVENT_START, EVENT_END} + ), + probatio.Optional(CONF_OFFSET, default=datetime.timedelta(0)): cv.time_period, } -_SINGLE_ENTITY_EVENT_TRIGGER_SCHEMA = vol.Schema( +_SINGLE_ENTITY_EVENT_TRIGGER_SCHEMA = probatio.Schema( { - vol.Required(CONF_OPTIONS): _SINGLE_ENTITY_EVENT_OPTIONS_SCHEMA, + probatio.Required(CONF_OPTIONS): _SINGLE_ENTITY_EVENT_OPTIONS_SCHEMA, }, ) -_EVENT_TRIGGER_SCHEMA = vol.Schema( +_EVENT_TRIGGER_SCHEMA = probatio.Schema( { - vol.Required(CONF_OPTIONS, default={}): { - vol.Required(CONF_OFFSET, default=datetime.timedelta(0)): cv.time_period, - vol.Required(CONF_OFFSET_TYPE, default=OFFSET_TYPE_BEFORE): vol.In( - {OFFSET_TYPE_BEFORE, OFFSET_TYPE_AFTER} - ), + probatio.Required(CONF_OPTIONS, default={}): { + probatio.Required( + CONF_OFFSET, default=datetime.timedelta(0) + ): cv.time_period, + probatio.Required( + CONF_OFFSET_TYPE, default=OFFSET_TYPE_BEFORE + ): probatio.In({OFFSET_TYPE_BEFORE, OFFSET_TYPE_AFTER}), }, - vol.Required(CONF_TARGET): cv.TARGET_FIELDS, + probatio.Required(CONF_TARGET): cv.TARGET_FIELDS, } ) diff --git a/homeassistant/components/cambridge_audio/config_flow.py b/homeassistant/components/cambridge_audio/config_flow.py index a2aef95803e6d..9cf891e557845 100644 --- a/homeassistant/components/cambridge_audio/config_flow.py +++ b/homeassistant/components/cambridge_audio/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from aiostreammagic import StreamMagicClient -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_RECONFIGURE, @@ -17,7 +17,7 @@ from .const import CONNECT_TIMEOUT, DOMAIN, STREAM_MAGIC_EXCEPTIONS -DATA_SCHEMA = vol.Schema({vol.Required(CONF_HOST): str}) +DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_HOST): str}) class CambridgeAudioConfigFlow(ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/components/camera/__init__.py b/homeassistant/components/camera/__init__.py index 557ed76408d3b..dc48881004aa5 100644 --- a/homeassistant/components/camera/__init__.py +++ b/homeassistant/components/camera/__init__.py @@ -16,8 +16,8 @@ from aiohttp import hdrs, web import attr +import probatio from propcache.api import cached_property, under_cached_property -import voluptuous as vol from webrtc_models import RTCIceCandidateInit from homeassistant.components import websocket_api @@ -129,17 +129,17 @@ class CameraEntityFeature(IntFlag): MIN_STREAM_INTERVAL: Final = 0.5 # seconds -CAMERA_SERVICE_SNAPSHOT: VolDictType = {vol.Required(ATTR_FILENAME): cv.template} +CAMERA_SERVICE_SNAPSHOT: VolDictType = {probatio.Required(ATTR_FILENAME): cv.template} CAMERA_SERVICE_PLAY_STREAM: VolDictType = { - vol.Required(ATTR_MEDIA_PLAYER): cv.entities_domain(MP_DOMAIN), - vol.Optional(ATTR_FORMAT, default="hls"): vol.In(OUTPUT_FORMATS), + probatio.Required(ATTR_MEDIA_PLAYER): cv.entities_domain(MP_DOMAIN), + probatio.Optional(ATTR_FORMAT, default="hls"): probatio.In(OUTPUT_FORMATS), } CAMERA_SERVICE_RECORD: VolDictType = { - vol.Required(CONF_FILENAME): cv.template, - vol.Optional(CONF_DURATION, default=30): vol.Coerce(int), - vol.Optional(CONF_LOOKBACK, default=0): vol.Coerce(int), + probatio.Required(CONF_FILENAME): cv.template, + probatio.Optional(CONF_DURATION, default=30): probatio.Coerce(int), + probatio.Optional(CONF_LOOKBACK, default=0): probatio.Coerce(int), } @@ -934,8 +934,8 @@ async def handle(self, request: web.Request, camera: Camera) -> web.StreamRespon @websocket_api.websocket_command( { - vol.Required("type"): "camera/capabilities", - vol.Required("entity_id"): cv.entity_id, + probatio.Required("type"): "camera/capabilities", + probatio.Required("entity_id"): cv.entity_id, } ) @websocket_api.async_response @@ -952,9 +952,9 @@ async def ws_camera_capabilities( @websocket_api.websocket_command( { - vol.Required("type"): "camera/stream", - vol.Required("entity_id"): cv.entity_id, - vol.Optional("format", default="hls"): vol.In(OUTPUT_FORMATS), + probatio.Required("type"): "camera/stream", + probatio.Required("entity_id"): cv.entity_id, + probatio.Optional("format", default="hls"): probatio.In(OUTPUT_FORMATS), } ) @websocket_api.async_response @@ -981,7 +981,10 @@ async def ws_camera_stream( @websocket_api.websocket_command( - {vol.Required("type"): "camera/get_prefs", vol.Required("entity_id"): cv.entity_id} + { + probatio.Required("type"): "camera/get_prefs", + probatio.Required("entity_id"): cv.entity_id, + } ) @websocket_api.async_response async def websocket_get_prefs( @@ -994,10 +997,10 @@ async def websocket_get_prefs( @websocket_api.websocket_command( { - vol.Required("type"): "camera/update_prefs", - vol.Required("entity_id"): cv.entity_id, - vol.Optional(PREF_PRELOAD_STREAM): bool, - vol.Optional(PREF_ORIENTATION): vol.Coerce(Orientation), + probatio.Required("type"): "camera/update_prefs", + probatio.Required("entity_id"): cv.entity_id, + probatio.Optional(PREF_PRELOAD_STREAM): bool, + probatio.Optional(PREF_ORIENTATION): probatio.Coerce(Orientation), } ) @websocket_api.require_admin diff --git a/homeassistant/components/camera/webrtc.py b/homeassistant/components/camera/webrtc.py index 64cf62119b20f..f0b340fecf478 100644 --- a/homeassistant/components/camera/webrtc.py +++ b/homeassistant/components/camera/webrtc.py @@ -9,7 +9,7 @@ from typing import TYPE_CHECKING, Any, override from mashumaro import MissingField -import voluptuous as vol +import probatio from webrtc_models import RTCConfiguration, RTCIceCandidate, RTCIceCandidateInit from homeassistant.components import websocket_api @@ -251,9 +251,9 @@ async def validate( @websocket_api.websocket_command( { - vol.Required("type"): "camera/webrtc/offer", - vol.Required("entity_id"): cv.entity_id, - vol.Required("offer"): str, + probatio.Required("type"): "camera/webrtc/offer", + probatio.Required("entity_id"): cv.entity_id, + probatio.Required("offer"): str, } ) @websocket_api.async_response @@ -305,8 +305,8 @@ def send_message(message: WebRTCMessage) -> None: @websocket_api.websocket_command( { - vol.Required("type"): "camera/webrtc/get_client_config", - vol.Required("entity_id"): cv.entity_id, + probatio.Required("type"): "camera/webrtc/get_client_config", + probatio.Required("entity_id"): cv.entity_id, } ) @websocket_api.async_response @@ -327,15 +327,15 @@ def _parse_webrtc_candidate_init(value: Any) -> RTCIceCandidateInit: try: return RTCIceCandidateInit.from_dict(value) except (MissingField, ValueError) as ex: - raise vol.Invalid(str(ex)) from ex + raise probatio.Invalid(str(ex)) from ex @websocket_api.websocket_command( { - vol.Required("type"): "camera/webrtc/candidate", - vol.Required("entity_id"): cv.entity_id, - vol.Required("session_id"): str, - vol.Required("candidate"): _parse_webrtc_candidate_init, + probatio.Required("type"): "camera/webrtc/candidate", + probatio.Required("entity_id"): cv.entity_id, + probatio.Required("session_id"): str, + probatio.Required("candidate"): _parse_webrtc_candidate_init, } ) @websocket_api.async_response diff --git a/homeassistant/components/canary/camera.py b/homeassistant/components/canary/camera.py index c092ae1854a65..bba58cd46105f 100644 --- a/homeassistant/components/canary/camera.py +++ b/homeassistant/components/canary/camera.py @@ -8,7 +8,7 @@ from canary.live_stream_api import LiveStreamSession from canary.model import Device, Location from haffmpeg.camera import CameraMjpeg -import voluptuous as vol +import probatio from homeassistant.components import ffmpeg from homeassistant.components.camera import ( @@ -29,11 +29,11 @@ FORCE_CAMERA_REFRESH_INTERVAL: Final = timedelta(minutes=15) -PLATFORM_SCHEMA: Final = vol.All( +PLATFORM_SCHEMA: Final = probatio.All( cv.deprecated(CONF_FFMPEG_ARGUMENTS), CAMERA_PLATFORM_SCHEMA.extend( { - vol.Optional( + probatio.Optional( CONF_FFMPEG_ARGUMENTS, default=DEFAULT_FFMPEG_ARGUMENTS ): cv.string } diff --git a/homeassistant/components/canary/config_flow.py b/homeassistant/components/canary/config_flow.py index 13018a057378e..654fa2bb4ff4a 100644 --- a/homeassistant/components/canary/config_flow.py +++ b/homeassistant/components/canary/config_flow.py @@ -4,8 +4,8 @@ from typing import Any, Final, override from canary.api import Api +import probatio from requests.exceptions import ConnectTimeout, HTTPError -import voluptuous as vol from homeassistant.config_entries import ( ConfigEntry, @@ -83,13 +83,13 @@ async def async_step_user( ) data_schema = { - vol.Required(CONF_USERNAME, default=default_username): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME, default=default_username): str, + probatio.Required(CONF_PASSWORD): str, } return self.async_show_form( step_id="user", - data_schema=vol.Schema(data_schema), + data_schema=probatio.Schema(data_schema), errors=errors or {}, ) @@ -105,16 +105,18 @@ async def async_step_init( return self.async_create_entry(title="", data=user_input) options = { - vol.Optional( + probatio.Optional( CONF_FFMPEG_ARGUMENTS, default=self.config_entry.options.get( CONF_FFMPEG_ARGUMENTS, DEFAULT_FFMPEG_ARGUMENTS ), ): str, - vol.Optional( + probatio.Optional( CONF_TIMEOUT, default=self.config_entry.options.get(CONF_TIMEOUT, DEFAULT_TIMEOUT), ): int, } - return self.async_show_form(step_id="init", data_schema=vol.Schema(options)) + return self.async_show_form( + step_id="init", data_schema=probatio.Schema(options) + ) diff --git a/homeassistant/components/casper_glow/config_flow.py b/homeassistant/components/casper_glow/config_flow.py index 89c8e9e16a762..b717e16e95019 100644 --- a/homeassistant/components/casper_glow/config_flow.py +++ b/homeassistant/components/casper_glow/config_flow.py @@ -4,8 +4,8 @@ from typing import Any, override from bluetooth_data_tools import human_readable_name +import probatio from pycasperglow import CasperGlow, CasperGlowError -import voluptuous as vol from homeassistant.components.bluetooth import ( BluetoothServiceInfoBleak, @@ -139,9 +139,9 @@ async def async_step_user( if not self._discovered_devices: return self.async_abort(reason="no_devices_found") - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_ADDRESS): vol.In( + probatio.Required(CONF_ADDRESS): probatio.In( { service_info.address: human_readable_name( None, service_info.name, service_info.address diff --git a/homeassistant/components/cast/config_flow.py b/homeassistant/components/cast/config_flow.py index c345acd3a3933..c0d2d7a2fd206 100644 --- a/homeassistant/components/cast/config_flow.py +++ b/homeassistant/components/cast/config_flow.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING, Any, override -import voluptuous as vol +import probatio from homeassistant.components import onboarding from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, OptionsFlow @@ -18,9 +18,9 @@ from . import CastConfigEntry CONF_MORE_OPTIONS = "more_options" -KNOWN_HOSTS_SCHEMA = vol.Schema( +KNOWN_HOSTS_SCHEMA = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_KNOWN_HOSTS, ): SelectSelector( SelectSelectorConfig(custom_value=True, options=[], multiple=True), @@ -29,15 +29,15 @@ ) OPTIONS_SCHEMA = KNOWN_HOSTS_SCHEMA.extend( { - vol.Required(CONF_MORE_OPTIONS): section( - vol.Schema( + probatio.Required(CONF_MORE_OPTIONS): section( + probatio.Schema( { - vol.Optional(CONF_UUID): SelectSelector( + probatio.Optional(CONF_UUID): SelectSelector( SelectSelectorConfig( custom_value=True, options=[], multiple=True ), ), - vol.Optional(CONF_IGNORE_CEC): SelectSelector( + probatio.Optional(CONF_IGNORE_CEC): SelectSelector( SelectSelectorConfig( custom_value=True, options=[], multiple=True ), diff --git a/homeassistant/components/cast/home_assistant_cast.py b/homeassistant/components/cast/home_assistant_cast.py index fb39e1a8d6875..0f099ed324395 100644 --- a/homeassistant/components/cast/home_assistant_cast.py +++ b/homeassistant/components/cast/home_assistant_cast.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING -import voluptuous as vol +import probatio from homeassistant import auth, core from homeassistant.const import ATTR_ENTITY_ID @@ -80,11 +80,11 @@ async def handle_show_view(call: core.ServiceCall) -> None: DOMAIN, SERVICE_SHOW_VIEW, handle_show_view, - vol.Schema( + probatio.Schema( { ATTR_ENTITY_ID: cv.entity_id, ATTR_VIEW_PATH: str, - vol.Optional(ATTR_URL_PATH): str, + probatio.Optional(ATTR_URL_PATH): str, } ), ) diff --git a/homeassistant/components/ccm15/config_flow.py b/homeassistant/components/ccm15/config_flow.py index 8b5c5c7c6fe4c..f0c5bc868d3b9 100644 --- a/homeassistant/components/ccm15/config_flow.py +++ b/homeassistant/components/ccm15/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from ccm15 import CCM15Device -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PORT @@ -15,10 +15,10 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Optional(CONF_PORT, default=80): cv.port, + probatio.Required(CONF_HOST): str, + probatio.Optional(CONF_PORT, default=80): cv.port, } ) diff --git a/homeassistant/components/cert_expiry/config_flow.py b/homeassistant/components/cert_expiry/config_flow.py index 00c89834806a0..d4389b895a5f4 100644 --- a/homeassistant/components/cert_expiry/config_flow.py +++ b/homeassistant/components/cert_expiry/config_flow.py @@ -3,7 +3,7 @@ from collections.abc import Mapping from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PORT @@ -80,10 +80,10 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST, default=user_input[CONF_HOST]): str, - vol.Required( + probatio.Required(CONF_HOST, default=user_input[CONF_HOST]): str, + probatio.Required( CONF_PORT, default=user_input.get(CONF_PORT, DEFAULT_PORT) ): int, } @@ -119,10 +119,10 @@ async def async_step_reconfigure( return self.async_show_form( step_id="reconfigure", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, } ), user_input or reconfigure_entry.data, diff --git a/homeassistant/components/chacon_dio/config_flow.py b/homeassistant/components/chacon_dio/config_flow.py index 665f31a0b4c7e..41fef492800f2 100644 --- a/homeassistant/components/chacon_dio/config_flow.py +++ b/homeassistant/components/chacon_dio/config_flow.py @@ -5,7 +5,7 @@ from dio_chacon_wifi_api import DIOChaconAPIClient from dio_chacon_wifi_api.exceptions import DIOChaconAPIError, DIOChaconInvalidAuthError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -14,10 +14,10 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/channels/media_player.py b/homeassistant/components/channels/media_player.py index 64d6ae7661f0a..c56ccc7e70052 100644 --- a/homeassistant/components/channels/media_player.py +++ b/homeassistant/components/channels/media_player.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from pychannels import Channels -import voluptuous as vol from homeassistant.components.media_player import ( PLATFORM_SCHEMA as MEDIA_PLAYER_PLATFORM_SCHEMA, @@ -26,9 +26,9 @@ PLATFORM_SCHEMA = MEDIA_PLAYER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, } ) @@ -57,7 +57,7 @@ async def async_setup_platform( ) platform.async_register_entity_service( SERVICE_SEEK_BY, - {vol.Required(ATTR_SECONDS): vol.Coerce(int)}, + {probatio.Required(ATTR_SECONDS): probatio.Coerce(int)}, "seek_by", ) diff --git a/homeassistant/components/chef_iq/config_flow.py b/homeassistant/components/chef_iq/config_flow.py index 198992a47dbb4..84ab798cfcb1d 100644 --- a/homeassistant/components/chef_iq/config_flow.py +++ b/homeassistant/components/chef_iq/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from chefiq_ble import ChefIqBluetoothDeviceData as DeviceData -import voluptuous as vol +import probatio from homeassistant.components.bluetooth import ( BluetoothServiceInfoBleak, @@ -88,7 +88,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_ADDRESS): vol.In(self._discovered_devices)} + data_schema=probatio.Schema( + {probatio.Required(CONF_ADDRESS): probatio.In(self._discovered_devices)} ), ) diff --git a/homeassistant/components/chess_com/config_flow.py b/homeassistant/components/chess_com/config_flow.py index d899d2573c422..0584deac160fa 100644 --- a/homeassistant/components/chess_com/config_flow.py +++ b/homeassistant/components/chess_com/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from chess_com_api import ChessComClient, NotFoundError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_USERNAME @@ -44,6 +44,6 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_USERNAME): str}), + data_schema=probatio.Schema({probatio.Required(CONF_USERNAME): str}), errors=errors, ) diff --git a/homeassistant/components/cielo_home/config_flow.py b/homeassistant/components/cielo_home/config_flow.py index c3120f52a69c7..432dc02c211f0 100644 --- a/homeassistant/components/cielo_home/config_flow.py +++ b/homeassistant/components/cielo_home/config_flow.py @@ -5,7 +5,7 @@ from aiohttp import ClientError from cieloconnectapi import CieloClient from cieloconnectapi.exceptions import AuthenticationError, CieloError -import voluptuous as vol +import probatio from homeassistant import config_entries from homeassistant.config_entries import ConfigFlowResult @@ -19,9 +19,9 @@ from .const import DEFAULT_NAME, DOMAIN, LOGGER, TIMEOUT -DATA_SCHEMA: Final = vol.Schema( +DATA_SCHEMA: Final = probatio.Schema( { - vol.Required(CONF_API_KEY): TextSelector( + probatio.Required(CONF_API_KEY): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } diff --git a/homeassistant/components/cisco_ios/device_tracker.py b/homeassistant/components/cisco_ios/device_tracker.py index 1d12383f686bc..cd4b52dd06746 100644 --- a/homeassistant/components/cisco_ios/device_tracker.py +++ b/homeassistant/components/cisco_ios/device_tracker.py @@ -4,7 +4,7 @@ from typing import override from pexpect import pxssh -import voluptuous as vol +import probatio from homeassistant.components.device_tracker import ( DOMAIN as DEVICE_TRACKER_DOMAIN, @@ -18,13 +18,13 @@ _LOGGER = logging.getLogger(__name__) -PLATFORM_SCHEMA = vol.All( +PLATFORM_SCHEMA = probatio.All( DEVICE_TRACKER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_USERNAME): cv.string, - vol.Optional(CONF_PASSWORD, default=""): cv.string, - vol.Optional(CONF_PORT): cv.port, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Optional(CONF_PASSWORD, default=""): cv.string, + probatio.Optional(CONF_PORT): cv.port, } ) ) diff --git a/homeassistant/components/cisco_mobility_express/device_tracker.py b/homeassistant/components/cisco_mobility_express/device_tracker.py index f07e81f0fa8af..b990bd2500ff3 100644 --- a/homeassistant/components/cisco_mobility_express/device_tracker.py +++ b/homeassistant/components/cisco_mobility_express/device_tracker.py @@ -4,7 +4,7 @@ from typing import override from ciscomobilityexpress.ciscome import CiscoMobilityExpress -import voluptuous as vol +import probatio from homeassistant.components.device_tracker import ( DOMAIN as DEVICE_TRACKER_DOMAIN, @@ -29,11 +29,11 @@ PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, - vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, + probatio.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, } ) diff --git a/homeassistant/components/cisco_webex_teams/notify.py b/homeassistant/components/cisco_webex_teams/notify.py index 7de4d5f4610f1..6e06b9e7ed1c5 100644 --- a/homeassistant/components/cisco_webex_teams/notify.py +++ b/homeassistant/components/cisco_webex_teams/notify.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from webexpythonsdk import ApiError, WebexAPI, exceptions from homeassistant.components.notify import ( @@ -21,7 +21,10 @@ CONF_ROOM_ID = "room_id" PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_TOKEN): cv.string, vol.Required(CONF_ROOM_ID): cv.string} + { + probatio.Required(CONF_TOKEN): cv.string, + probatio.Required(CONF_ROOM_ID): cv.string, + } ) diff --git a/homeassistant/components/citybikes/sensor.py b/homeassistant/components/citybikes/sensor.py index 81d859b2a9780..203385abe172a 100644 --- a/homeassistant/components/citybikes/sensor.py +++ b/homeassistant/components/citybikes/sensor.py @@ -8,7 +8,7 @@ import aiohttp from citybikes import __version__ as CITYBIKES_CLIENT_VERSION from citybikes.asyncio import Client as CitybikesClient -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( ENTITY_ID_FORMAT, @@ -72,17 +72,17 @@ CITYBIKES_NETWORKS = "citybikes_networks" -PLATFORM_SCHEMA = vol.All( +PLATFORM_SCHEMA = probatio.All( cv.has_at_least_one_key(CONF_RADIUS, CONF_STATIONS_LIST), SENSOR_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_NAME, default=""): cv.string, - vol.Optional(CONF_NETWORK): cv.string, - vol.Inclusive(CONF_LATITUDE, "coordinates"): cv.latitude, - vol.Inclusive(CONF_LONGITUDE, "coordinates"): cv.longitude, - vol.Optional(CONF_RADIUS, "station_filter"): cv.positive_int, - vol.Optional(CONF_STATIONS_LIST, "station_filter"): vol.All( - cv.ensure_list, vol.Length(min=1), [cv.string] + probatio.Optional(CONF_NAME, default=""): cv.string, + probatio.Optional(CONF_NETWORK): cv.string, + probatio.Inclusive(CONF_LATITUDE, "coordinates"): cv.latitude, + probatio.Inclusive(CONF_LONGITUDE, "coordinates"): cv.longitude, + probatio.Optional(CONF_RADIUS, "station_filter"): cv.positive_int, + probatio.Optional(CONF_STATIONS_LIST, "station_filter"): probatio.All( + cv.ensure_list, probatio.Length(min=1), [cv.string] ), } ), diff --git a/homeassistant/components/clickatell/notify.py b/homeassistant/components/clickatell/notify.py index 6285b67580816..77a84ef21b25f 100644 --- a/homeassistant/components/clickatell/notify.py +++ b/homeassistant/components/clickatell/notify.py @@ -4,8 +4,8 @@ import logging from typing import Any, override +import probatio import requests -import voluptuous as vol from homeassistant.components.notify import ( PLATFORM_SCHEMA as NOTIFY_PLATFORM_SCHEMA, @@ -23,7 +23,10 @@ BASE_API_URL = "https://platform.clickatell.com/messages/http/send" PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_API_KEY): cv.string, vol.Required(CONF_RECIPIENT): cv.string} + { + probatio.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_RECIPIENT): cv.string, + } ) diff --git a/homeassistant/components/clicksend/notify.py b/homeassistant/components/clicksend/notify.py index e8a42366b9b7c..cb8c5daaaa492 100644 --- a/homeassistant/components/clicksend/notify.py +++ b/homeassistant/components/clicksend/notify.py @@ -5,8 +5,8 @@ import logging from typing import Any, override +import probatio import requests -import voluptuous as vol from homeassistant.components.notify import ( PLATFORM_SCHEMA as NOTIFY_PLATFORM_SCHEMA, @@ -34,10 +34,12 @@ PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_API_KEY): cv.string, - vol.Required(CONF_RECIPIENT, default=[]): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(CONF_SENDER, default=DEFAULT_SENDER): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_RECIPIENT, default=[]): probatio.All( + cv.ensure_list, [cv.string] + ), + probatio.Optional(CONF_SENDER, default=DEFAULT_SENDER): cv.string, } ) diff --git a/homeassistant/components/clicksend_tts/notify.py b/homeassistant/components/clicksend_tts/notify.py index 4f0e256521752..61d7d6d7f3d00 100644 --- a/homeassistant/components/clicksend_tts/notify.py +++ b/homeassistant/components/clicksend_tts/notify.py @@ -5,8 +5,8 @@ import logging from typing import Any, override +import probatio import requests -import voluptuous as vol from homeassistant.components.notify import ( PLATFORM_SCHEMA as NOTIFY_PLATFORM_SCHEMA, @@ -42,14 +42,14 @@ PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_API_KEY): cv.string, - vol.Required(CONF_RECIPIENT): vol.All( - cv.string, vol.Match(r"^\+?[1-9]\d{1,14}$") + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_RECIPIENT): probatio.All( + cv.string, probatio.Match(r"^\+?[1-9]\d{1,14}$") ), - vol.Optional(CONF_LANGUAGE, default=DEFAULT_LANGUAGE): cv.string, - vol.Optional(CONF_VOICE, default=DEFAULT_VOICE): vol.In( + probatio.Optional(CONF_LANGUAGE, default=DEFAULT_LANGUAGE): cv.string, + probatio.Optional(CONF_VOICE, default=DEFAULT_VOICE): probatio.In( [MALE_VOICE, FEMALE_VOICE] ), } diff --git a/homeassistant/components/climate/__init__.py b/homeassistant/components/climate/__init__.py index 68e4f16182e95..39ed1bc4d9f82 100644 --- a/homeassistant/components/climate/__init__.py +++ b/homeassistant/components/climate/__init__.py @@ -5,8 +5,8 @@ import logging from typing import Any, Literal, final, override +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( @@ -107,16 +107,20 @@ CONVERTIBLE_ATTRIBUTE = [ATTR_TEMPERATURE, ATTR_TARGET_TEMP_LOW, ATTR_TARGET_TEMP_HIGH] -SET_TEMPERATURE_SCHEMA = vol.All( +SET_TEMPERATURE_SCHEMA = probatio.All( cv.has_at_least_one_key( ATTR_TEMPERATURE, ATTR_TARGET_TEMP_HIGH, ATTR_TARGET_TEMP_LOW ), cv.make_entity_service_schema( { - vol.Exclusive(ATTR_TEMPERATURE, "temperature"): vol.Coerce(float), - vol.Inclusive(ATTR_TARGET_TEMP_HIGH, "temperature"): vol.Coerce(float), - vol.Inclusive(ATTR_TARGET_TEMP_LOW, "temperature"): vol.Coerce(float), - vol.Optional(ATTR_HVAC_MODE): vol.Coerce(HVACMode), + probatio.Exclusive(ATTR_TEMPERATURE, "temperature"): probatio.Coerce(float), + probatio.Inclusive(ATTR_TARGET_TEMP_HIGH, "temperature"): probatio.Coerce( + float + ), + probatio.Inclusive(ATTR_TARGET_TEMP_LOW, "temperature"): probatio.Coerce( + float + ), + probatio.Optional(ATTR_HVAC_MODE): probatio.Coerce(HVACMode), } ), ) @@ -151,12 +155,12 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: ) component.async_register_entity_service( SERVICE_SET_HVAC_MODE, - {vol.Required(ATTR_HVAC_MODE): vol.Coerce(HVACMode)}, + {probatio.Required(ATTR_HVAC_MODE): probatio.Coerce(HVACMode)}, "async_handle_set_hvac_mode_service", ) component.async_register_entity_service( SERVICE_SET_PRESET_MODE, - {vol.Required(ATTR_PRESET_MODE): cv.string}, + {probatio.Required(ATTR_PRESET_MODE): cv.string}, "async_handle_set_preset_mode_service", [ClimateEntityFeature.PRESET_MODE], ) @@ -171,25 +175,25 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: ) component.async_register_entity_service( SERVICE_SET_HUMIDITY, - {vol.Required(ATTR_HUMIDITY): vol.Coerce(int)}, + {probatio.Required(ATTR_HUMIDITY): probatio.Coerce(int)}, async_service_humidity_set, [ClimateEntityFeature.TARGET_HUMIDITY], ) component.async_register_entity_service( SERVICE_SET_FAN_MODE, - {vol.Required(ATTR_FAN_MODE): cv.string}, + {probatio.Required(ATTR_FAN_MODE): cv.string}, "async_handle_set_fan_mode_service", [ClimateEntityFeature.FAN_MODE], ) component.async_register_entity_service( SERVICE_SET_SWING_MODE, - {vol.Required(ATTR_SWING_MODE): cv.string}, + {probatio.Required(ATTR_SWING_MODE): cv.string}, "async_handle_set_swing_mode_service", [ClimateEntityFeature.SWING_MODE], ) component.async_register_entity_service( SERVICE_SET_SWING_HORIZONTAL_MODE, - {vol.Required(ATTR_SWING_HORIZONTAL_MODE): cv.string}, + {probatio.Required(ATTR_SWING_HORIZONTAL_MODE): cv.string}, "async_handle_set_swing_horizontal_mode_service", [ClimateEntityFeature.SWING_HORIZONTAL_MODE], ) diff --git a/homeassistant/components/climate/condition.py b/homeassistant/components/climate/condition.py index a5303bd6423f4..db2b30fca3b7d 100644 --- a/homeassistant/components/climate/condition.py +++ b/homeassistant/components/climate/condition.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING, override -import voluptuous as vol +import probatio from homeassistant.const import CONF_OPTIONS, UnitOfTemperature from homeassistant.core import HomeAssistant, State @@ -25,9 +25,9 @@ _HVAC_MODE_CONDITION_SCHEMA = ENTITY_STATE_CONDITION_SCHEMA_ANY_ALL.extend( { - vol.Required(CONF_OPTIONS): { - vol.Required(CONF_HVAC_MODE): vol.All( - cv.ensure_list, vol.Length(min=1), [vol.Coerce(HVACMode)] + probatio.Required(CONF_OPTIONS): { + probatio.Required(CONF_HVAC_MODE): probatio.All( + cv.ensure_list, probatio.Length(min=1), [probatio.Coerce(HVACMode)] ), }, } diff --git a/homeassistant/components/climate/device_action.py b/homeassistant/components/climate/device_action.py index a5eed75138d2f..00eac9ace8a73 100644 --- a/homeassistant/components/climate/device_action.py +++ b/homeassistant/components/climate/device_action.py @@ -1,6 +1,6 @@ """Provides device automations for Climate.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import ( async_get_entity_registry_entry_or_raise, @@ -25,21 +25,21 @@ SET_HVAC_MODE_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): "set_hvac_mode", - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(const.ATTR_HVAC_MODE): vol.In(const.HVAC_MODES), + probatio.Required(CONF_TYPE): "set_hvac_mode", + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(const.ATTR_HVAC_MODE): probatio.In(const.HVAC_MODES), } ) SET_PRESET_MODE_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): "set_preset_mode", - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(const.ATTR_PRESET_MODE): str, + probatio.Required(CONF_TYPE): "set_preset_mode", + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(const.ATTR_PRESET_MODE): str, } ) -_ACTION_SCHEMA = vol.Any(SET_HVAC_MODE_SCHEMA, SET_PRESET_MODE_SCHEMA) +_ACTION_SCHEMA = probatio.Any(SET_HVAC_MODE_SCHEMA, SET_PRESET_MODE_SCHEMA) async def async_validate_action_config( @@ -99,7 +99,7 @@ async def async_call_action_from_config( async def async_get_action_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List action capabilities.""" action_type = config[CONF_TYPE] entity_id_or_uuid = config[CONF_ENTITY_ID] @@ -119,7 +119,7 @@ async def async_get_action_capabilities( ) except HomeAssistantError: hvac_modes = [] - fields[vol.Required(const.ATTR_HVAC_MODE)] = vol.In(hvac_modes) + fields[probatio.Required(const.ATTR_HVAC_MODE)] = probatio.In(hvac_modes) elif action_type == "set_preset_mode": try: entry = async_get_entity_registry_entry_or_raise(hass, entity_id_or_uuid) @@ -133,6 +133,6 @@ async def async_get_action_capabilities( ) except HomeAssistantError: preset_modes = [] - fields[vol.Required(const.ATTR_PRESET_MODE)] = vol.In(preset_modes) + fields[probatio.Required(const.ATTR_PRESET_MODE)] = probatio.In(preset_modes) - return {"extra_fields": vol.Schema(fields)} + return {"extra_fields": probatio.Schema(fields)} diff --git a/homeassistant/components/climate/device_condition.py b/homeassistant/components/climate/device_condition.py index 1ff5ee7c955f9..6ddb545eacb3d 100644 --- a/homeassistant/components/climate/device_condition.py +++ b/homeassistant/components/climate/device_condition.py @@ -1,6 +1,6 @@ """Provide the device automations for Climate.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import ( async_get_entity_registry_entry_or_raise, @@ -30,21 +30,21 @@ HVAC_MODE_CONDITION = DEVICE_CONDITION_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): "is_hvac_mode", - vol.Required(const.ATTR_HVAC_MODE): vol.In(const.HVAC_MODES), + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): "is_hvac_mode", + probatio.Required(const.ATTR_HVAC_MODE): probatio.In(const.HVAC_MODES), } ) PRESET_MODE_CONDITION = DEVICE_CONDITION_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): "is_preset_mode", - vol.Required(const.ATTR_PRESET_MODE): str, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): "is_preset_mode", + probatio.Required(const.ATTR_PRESET_MODE): str, } ) -CONDITION_SCHEMA = vol.Any(HVAC_MODE_CONDITION, PRESET_MODE_CONDITION) +CONDITION_SCHEMA = probatio.Any(HVAC_MODE_CONDITION, PRESET_MODE_CONDITION) async def async_get_conditions( @@ -103,7 +103,7 @@ def test_is_state(hass: HomeAssistant, variables: TemplateVarsType) -> bool: async def async_get_condition_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List condition capabilities.""" condition_type = config[CONF_TYPE] @@ -124,7 +124,7 @@ async def async_get_condition_capabilities( ) except HomeAssistantError: hvac_modes = [] - fields[vol.Required(const.ATTR_HVAC_MODE)] = vol.In(hvac_modes) + fields[probatio.Required(const.ATTR_HVAC_MODE)] = probatio.In(hvac_modes) elif condition_type == "is_preset_mode": try: @@ -141,6 +141,6 @@ async def async_get_condition_capabilities( ) except HomeAssistantError: preset_modes = [] - fields[vol.Required(const.ATTR_PRESET_MODE)] = vol.In(preset_modes) + fields[probatio.Required(const.ATTR_PRESET_MODE)] = probatio.In(preset_modes) - return {"extra_fields": vol.Schema(fields)} + return {"extra_fields": probatio.Schema(fields)} diff --git a/homeassistant/components/climate/device_trigger.py b/homeassistant/components/climate/device_trigger.py index 275a429fdc895..730b1c61dad54 100644 --- a/homeassistant/components/climate/device_trigger.py +++ b/homeassistant/components/climate/device_trigger.py @@ -1,6 +1,6 @@ """Provides device automations for Climate.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import DEVICE_TRIGGER_BASE_SCHEMA from homeassistant.components.homeassistant.triggers import ( @@ -33,29 +33,29 @@ HVAC_MODE_TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): "hvac_mode_changed", - vol.Required(state_trigger.CONF_TO): vol.In(const.HVAC_MODES), - vol.Optional(CONF_FOR): cv.positive_time_period_dict, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): "hvac_mode_changed", + probatio.Required(state_trigger.CONF_TO): probatio.In(const.HVAC_MODES), + probatio.Optional(CONF_FOR): cv.positive_time_period_dict, } ) -CURRENT_TRIGGER_SCHEMA = vol.All( +CURRENT_TRIGGER_SCHEMA = probatio.All( DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In( + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In( ["current_temperature_changed", "current_humidity_changed"] ), - vol.Optional(CONF_BELOW): vol.Any(vol.Coerce(float)), - vol.Optional(CONF_ABOVE): vol.Any(vol.Coerce(float)), - vol.Optional(CONF_FOR): cv.positive_time_period_dict, + probatio.Optional(CONF_BELOW): probatio.Any(probatio.Coerce(float)), + probatio.Optional(CONF_ABOVE): probatio.Any(probatio.Coerce(float)), + probatio.Optional(CONF_FOR): cv.positive_time_period_dict, } ), cv.has_at_least_one_key(CONF_BELOW, CONF_ABOVE), ) -TRIGGER_SCHEMA = vol.Any(HVAC_MODE_TRIGGER_SCHEMA, CURRENT_TRIGGER_SCHEMA) +TRIGGER_SCHEMA = probatio.Any(HVAC_MODE_TRIGGER_SCHEMA, CURRENT_TRIGGER_SCHEMA) async def async_get_triggers( @@ -171,7 +171,7 @@ async def async_attach_trigger( async def async_get_trigger_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List trigger capabilities.""" trigger_type = config[CONF_TYPE] @@ -180,10 +180,12 @@ async def async_get_trigger_capabilities( if trigger_type == "hvac_mode_changed": return { - "extra_fields": vol.Schema( + "extra_fields": probatio.Schema( { - vol.Required(state_trigger.CONF_TO): vol.In(const.HVAC_MODES), - vol.Optional(CONF_FOR): cv.positive_time_period_dict, + probatio.Required(state_trigger.CONF_TO): probatio.In( + const.HVAC_MODES + ), + probatio.Optional(CONF_FOR): cv.positive_time_period_dict, } ) } @@ -194,15 +196,15 @@ async def async_get_trigger_capabilities( unit_of_measurement = PERCENTAGE return { - "extra_fields": vol.Schema( + "extra_fields": probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_ABOVE, description={"suffix": unit_of_measurement} - ): vol.Coerce(float), - vol.Optional( + ): probatio.Coerce(float), + probatio.Optional( CONF_BELOW, description={"suffix": unit_of_measurement} - ): vol.Coerce(float), - vol.Optional(CONF_FOR): cv.positive_time_period_dict, + ): probatio.Coerce(float), + probatio.Optional(CONF_FOR): cv.positive_time_period_dict, } ) } diff --git a/homeassistant/components/climate/intent.py b/homeassistant/components/climate/intent.py index 81d5957e2db63..e20d2aace5415 100644 --- a/homeassistant/components/climate/intent.py +++ b/homeassistant/components/climate/intent.py @@ -2,7 +2,7 @@ from typing import override -import voluptuous as vol +import probatio from homeassistant.const import ATTR_ENTITY_ID from homeassistant.core import HomeAssistant, State @@ -37,12 +37,12 @@ class SetTemperatureIntent(intent.IntentHandler): intent_type = INTENT_SET_TEMPERATURE description = "Sets the target temperature of a climate device or entity" slot_schema = { - vol.Required("temperature"): vol.Coerce(float), - vol.Optional("area"): intent.non_empty_string, - vol.Optional("name"): intent.non_empty_string, - vol.Optional("floor"): intent.non_empty_string, - vol.Optional("preferred_area_id"): cv.string, - vol.Optional("preferred_floor_id"): cv.string, + probatio.Required("temperature"): probatio.Coerce(float), + probatio.Optional("area"): intent.non_empty_string, + probatio.Optional("name"): intent.non_empty_string, + probatio.Optional("floor"): intent.non_empty_string, + probatio.Optional("preferred_area_id"): cv.string, + probatio.Optional("preferred_floor_id"): cv.string, } platforms = {DOMAIN} @@ -118,12 +118,12 @@ class SetFanModeIntent(intent.IntentHandler): intent_type = INTENT_SET_FAN_MODE description = "Sets the fan mode of a climate device or entity" slot_schema = { - vol.Required("fan_mode"): intent.non_empty_string, - vol.Optional("area"): intent.non_empty_string, - vol.Optional("name"): intent.non_empty_string, - vol.Optional("floor"): intent.non_empty_string, - vol.Optional("preferred_area_id"): cv.string, - vol.Optional("preferred_floor_id"): cv.string, + probatio.Required("fan_mode"): intent.non_empty_string, + probatio.Optional("area"): intent.non_empty_string, + probatio.Optional("name"): intent.non_empty_string, + probatio.Optional("floor"): intent.non_empty_string, + probatio.Optional("preferred_area_id"): cv.string, + probatio.Optional("preferred_floor_id"): cv.string, } platforms = {DOMAIN} diff --git a/homeassistant/components/climate/trigger.py b/homeassistant/components/climate/trigger.py index e96684c1cc885..ba9f02e987838 100644 --- a/homeassistant/components/climate/trigger.py +++ b/homeassistant/components/climate/trigger.py @@ -2,7 +2,7 @@ from typing import override -import voluptuous as vol +import probatio from homeassistant.const import CONF_OPTIONS, UnitOfTemperature from homeassistant.core import HomeAssistant, State @@ -30,9 +30,9 @@ HVAC_MODE_CHANGED_TRIGGER_SCHEMA = ENTITY_STATE_TRIGGER_SCHEMA_WITH_BEHAVIOR.extend( { - vol.Required(CONF_OPTIONS): { - vol.Required(CONF_HVAC_MODE): vol.All( - cv.ensure_list, vol.Length(min=1), [vol.Coerce(HVACMode)] + probatio.Required(CONF_OPTIONS): { + probatio.Required(CONF_HVAC_MODE): probatio.All( + cv.ensure_list, probatio.Length(min=1), [probatio.Coerce(HVACMode)] ), }, } diff --git a/homeassistant/components/cloud/__init__.py b/homeassistant/components/cloud/__init__.py index de236c40b9e8c..0b990c7fbf733 100644 --- a/homeassistant/components/cloud/__init__.py +++ b/homeassistant/components/cloud/__init__.py @@ -16,7 +16,7 @@ NabuCasaBaseError, RemoteNotConnected, ) -import voluptuous as vol +import probatio from homeassistant.components import alexa, google_assistant from homeassistant.config_entries import SOURCE_SYSTEM, ConfigEntry @@ -110,68 +110,70 @@ STARTUP_REPAIR_DELAY = 1 # 1 hour -ALEXA_ENTITY_SCHEMA = vol.Schema( +ALEXA_ENTITY_SCHEMA = probatio.Schema( { - vol.Optional(CONF_DESCRIPTION): cv.string, - vol.Optional(alexa.CONF_DISPLAY_CATEGORIES): cv.string, - vol.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_DESCRIPTION): cv.string, + probatio.Optional(alexa.CONF_DISPLAY_CATEGORIES): cv.string, + probatio.Optional(CONF_NAME): cv.string, } ) -GOOGLE_ENTITY_SCHEMA = vol.Schema( +GOOGLE_ENTITY_SCHEMA = probatio.Schema( { - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_ALIASES): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(google_assistant.CONF_ROOM_HINT): cv.string, + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_ALIASES): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(google_assistant.CONF_ROOM_HINT): cv.string, } ) -ASSISTANT_SCHEMA = vol.Schema( - {vol.Optional(CONF_FILTER, default=dict): entityfilter.FILTER_SCHEMA} +ASSISTANT_SCHEMA = probatio.Schema( + {probatio.Optional(CONF_FILTER, default=dict): entityfilter.FILTER_SCHEMA} ) ALEXA_SCHEMA = ASSISTANT_SCHEMA.extend( - {vol.Optional(CONF_ENTITY_CONFIG): {cv.entity_id: ALEXA_ENTITY_SCHEMA}} + {probatio.Optional(CONF_ENTITY_CONFIG): {cv.entity_id: ALEXA_ENTITY_SCHEMA}} ) GACTIONS_SCHEMA = ASSISTANT_SCHEMA.extend( - {vol.Optional(CONF_ENTITY_CONFIG): {cv.entity_id: GOOGLE_ENTITY_SCHEMA}} + {probatio.Optional(CONF_ENTITY_CONFIG): {cv.entity_id: GOOGLE_ENTITY_SCHEMA}} ) -_BASE_CONFIG_SCHEMA = vol.Schema( +_BASE_CONFIG_SCHEMA = probatio.Schema( { - vol.Optional(CONF_COGNITO_CLIENT_ID): str, - vol.Optional(CONF_USER_POOL_ID): str, - vol.Optional(CONF_REGION): str, - vol.Optional(CONF_ALEXA): ALEXA_SCHEMA, - vol.Optional(CONF_GOOGLE_ACTIONS): GACTIONS_SCHEMA, - vol.Optional(CONF_ACCOUNT_LINK_SERVER): str, - vol.Optional(CONF_ACME_SERVER): str, - vol.Optional(CONF_API_SERVER): str, - vol.Optional(CONF_RELAYER_SERVER): str, - vol.Optional(CONF_REMOTESTATE_SERVER): str, - vol.Optional(CONF_SERVICEHANDLERS_SERVER): str, + probatio.Optional(CONF_COGNITO_CLIENT_ID): str, + probatio.Optional(CONF_USER_POOL_ID): str, + probatio.Optional(CONF_REGION): str, + probatio.Optional(CONF_ALEXA): ALEXA_SCHEMA, + probatio.Optional(CONF_GOOGLE_ACTIONS): GACTIONS_SCHEMA, + probatio.Optional(CONF_ACCOUNT_LINK_SERVER): str, + probatio.Optional(CONF_ACME_SERVER): str, + probatio.Optional(CONF_API_SERVER): str, + probatio.Optional(CONF_RELAYER_SERVER): str, + probatio.Optional(CONF_REMOTESTATE_SERVER): str, + probatio.Optional(CONF_SERVICEHANDLERS_SERVER): str, } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Any( + DOMAIN: probatio.Any( _BASE_CONFIG_SCHEMA.extend( { - vol.Required(CONF_MODE): vol.In([MODE_DEV]), - vol.Required(CONF_API_SERVER): str, - vol.Optional(CONF_DISCOVERY_SERVICE_ACTIONS): {str: cv.url}, + probatio.Required(CONF_MODE): probatio.In([MODE_DEV]), + probatio.Required(CONF_API_SERVER): str, + probatio.Optional(CONF_DISCOVERY_SERVICE_ACTIONS): {str: cv.url}, } ), _BASE_CONFIG_SCHEMA.extend( { - vol.Optional(CONF_MODE, default=DEFAULT_MODE): vol.In([MODE_PROD]), + probatio.Optional(CONF_MODE, default=DEFAULT_MODE): probatio.In( + [MODE_PROD] + ), } ), ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/cloud/entity.py b/homeassistant/components/cloud/entity.py index e3a659b5aaabb..2c7fcf2fe2441 100644 --- a/homeassistant/components/cloud/entity.py +++ b/homeassistant/components/cloud/entity.py @@ -42,8 +42,7 @@ ImageGenerationCall as ImageGenerationCallParam, ) from openai.types.responses.response_output_item import ImageGenerationCall -from probatio import to_openapi -import voluptuous as vol +import probatio from homeassistant.components import conversation from homeassistant.config_entries import ConfigEntry @@ -168,7 +167,9 @@ def _format_tool( custom_serializer: Callable[[Any], Any] | None, ) -> ToolParam: """Format a Home Assistant tool for the OpenAI Responses API.""" - parameters = to_openapi(tool.parameters, custom_serializer=custom_serializer) + parameters = probatio.to_openapi( + tool.parameters, custom_serializer=custom_serializer + ) spec: FunctionToolParam = { "type": "function", @@ -207,10 +208,10 @@ def _adjust_schema(schema: dict[str, Any]) -> None: def _format_structured_output( - schema: vol.Schema, llm_api: llm.APIInstance | None + schema: probatio.Schema, llm_api: llm.APIInstance | None ) -> dict[str, Any]: """Format the schema to be compatible with OpenAI API.""" - result: dict[str, Any] = to_openapi( + result: dict[str, Any] = probatio.to_openapi( schema, custom_serializer=( llm_api.custom_serializer if llm_api else llm.selector_serializer @@ -556,7 +557,7 @@ async def _async_handle_chat_log( type: Literal["ai_task", "conversation"], chat_log: conversation.ChatLog, structure_name: str | None = None, - structure: vol.Schema | None = None, + structure: probatio.Schema | None = None, ) -> None: """Generate a response for the chat log.""" diff --git a/homeassistant/components/cloud/http_api.py b/homeassistant/components/cloud/http_api.py index d95a49c363850..a5950373eec52 100644 --- a/homeassistant/components/cloud/http_api.py +++ b/homeassistant/components/cloud/http_api.py @@ -18,7 +18,7 @@ from hass_nabucasa import AlreadyConnectedError, AutoLoginController, Cloud, auth from hass_nabucasa.const import STATE_DISCONNECTED from hass_nabucasa.voice_data import TTS_VOICES -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.components.alexa import ( @@ -279,13 +279,13 @@ async def post(self, request: web.Request) -> web.Response: @_handle_cloud_errors @RequestDataValidator( - vol.Schema( - vol.All( + probatio.Schema( + probatio.All( { - vol.Required("email"): str, - vol.Optional("check_connection", default=False): bool, - vol.Exclusive("password", "login"): str, - vol.Exclusive("code", "login"): str, + probatio.Required("email"): str, + probatio.Optional("check_connection", default=False): bool, + probatio.Exclusive("password", "login"): str, + probatio.Exclusive("code", "login"): str, }, cv.has_at_least_one_key("password", "code"), ) @@ -315,7 +315,7 @@ async def _post(self, request: web.Request, data: dict[str, Any]) -> web.Respons ): raise MFAExpiredOrNotStarted - # Voluptuous should ensure that code is not None because password is + # Probatio should ensure that code is not None because password is assert code is not None await cloud.login_verify_totp( @@ -377,10 +377,10 @@ async def _async_location_client_metadata( return client_metadata -_REGISTER_SCHEMA = vol.Schema( +_REGISTER_SCHEMA = probatio.Schema( { - vol.Required("email"): str, - vol.Required("password"): vol.All(str, vol.Length(min=6)), + probatio.Required("email"): str, + probatio.Required("password"): probatio.All(str, probatio.Length(min=6)), } ) @@ -445,7 +445,7 @@ class CloudResendConfirmView(HomeAssistantView): @require_admin @_handle_cloud_errors - @RequestDataValidator(vol.Schema({vol.Required("email"): str})) + @RequestDataValidator(probatio.Schema({probatio.Required("email"): str})) async def post(self, request: web.Request, data: dict[str, Any]) -> web.Response: """Handle resending confirm email code request.""" hass = request.app[KEY_HASS] @@ -469,7 +469,7 @@ async def post(self, request: web.Request) -> web.Response: return await self._post(request) @_handle_cloud_errors - @RequestDataValidator(vol.Schema({vol.Required("email"): str})) + @RequestDataValidator(probatio.Schema({probatio.Required("email"): str})) async def _post(self, request: web.Request, data: dict[str, Any]) -> web.Response: """Handle forgot password request.""" hass = request.app[KEY_HASS] @@ -736,7 +736,7 @@ def _async_clear_pending_auto_login(hass: HomeAssistant) -> None: @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required("type"): "cloud/remove_data"}) +@websocket_api.websocket_command({probatio.Required("type"): "cloud/remove_data"}) @websocket_api.async_response async def websocket_cloud_remove_data( hass: HomeAssistant, @@ -765,7 +765,7 @@ async def websocket_cloud_remove_data( connection.send_message(websocket_api.result_message(msg["id"])) -@websocket_api.websocket_command({vol.Required("type"): "cloud/status"}) +@websocket_api.websocket_command({probatio.Required("type"): "cloud/status"}) @websocket_api.async_response async def websocket_cloud_status( hass: HomeAssistant, @@ -794,7 +794,7 @@ async def websocket_cloud_status( @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required("type"): "cloud/subscribe_events"}) +@websocket_api.websocket_command({probatio.Required("type"): "cloud/subscribe_events"}) @callback def websocket_subscribe_cloud_events( hass: HomeAssistant, @@ -814,7 +814,9 @@ def on_event(event: Mapping[str, Any]) -> None: @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required("type"): "cloud/attempt_auto_login_now"}) +@websocket_api.websocket_command( + {probatio.Required("type"): "cloud/attempt_auto_login_now"} +) @callback def websocket_attempt_auto_login_now( hass: HomeAssistant, @@ -838,7 +840,7 @@ def websocket_attempt_auto_login_now( @websocket_api.require_admin @websocket_api.websocket_command( - {vol.Required("type"): "cloud/resend_auto_login_confirm"} + {probatio.Required("type"): "cloud/resend_auto_login_confirm"} ) @websocket_api.async_response @_ws_handle_cloud_errors @@ -865,7 +867,7 @@ async def websocket_resend_auto_login_confirm( @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required("type"): "cloud/cancel_auto_login"}) +@websocket_api.websocket_command({probatio.Required("type"): "cloud/cancel_auto_login"}) @callback def websocket_cancel_auto_login( hass: HomeAssistant, @@ -921,7 +923,7 @@ def with_cloud_auth( @websocket_api.require_admin @_require_cloud_login -@websocket_api.websocket_command({vol.Required("type"): "cloud/subscription"}) +@websocket_api.websocket_command({probatio.Required("type"): "cloud/subscription"}) @websocket_api.async_response async def websocket_subscription( hass: HomeAssistant, @@ -948,14 +950,14 @@ def validate_language_voice(value: tuple[str, str]) -> tuple[str, str]: if not style: style = None if language not in TTS_VOICES: - raise vol.Invalid(f"Invalid language {language}") + raise probatio.Invalid(f"Invalid language {language}") if voice not in (language_info := TTS_VOICES[language]): - raise vol.Invalid(f"Invalid voice {voice} for language {language}") + raise probatio.Invalid(f"Invalid voice {voice} for language {language}") voice_info = language_info[voice] if style and ( isinstance(voice_info, str) or style not in voice_info.get("variants", []) ): - raise vol.Invalid( + raise probatio.Invalid( f"Invalid style {style} for voice {voice} in language {language}" ) return value @@ -965,16 +967,16 @@ def validate_language_voice(value: tuple[str, str]) -> tuple[str, str]: @_require_cloud_login @websocket_api.websocket_command( { - vol.Required("type"): "cloud/update_prefs", - vol.Optional(PREF_ALEXA_REPORT_STATE): bool, - vol.Optional(PREF_ENABLE_ALEXA): bool, - vol.Optional(PREF_ENABLE_CLOUD_ICE_SERVERS): bool, - vol.Optional(PREF_ENABLE_GOOGLE): bool, - vol.Optional(PREF_GOOGLE_REPORT_STATE): bool, - vol.Optional(PREF_GOOGLE_SECURE_DEVICES_PIN): vol.Any(None, str), - vol.Optional(PREF_REMOTE_ALLOW_REMOTE_ENABLE): bool, - vol.Optional(PREF_TTS_DEFAULT_VOICE): vol.All( - vol.Coerce(tuple), validate_language_voice + probatio.Required("type"): "cloud/update_prefs", + probatio.Optional(PREF_ALEXA_REPORT_STATE): bool, + probatio.Optional(PREF_ENABLE_ALEXA): bool, + probatio.Optional(PREF_ENABLE_CLOUD_ICE_SERVERS): bool, + probatio.Optional(PREF_ENABLE_GOOGLE): bool, + probatio.Optional(PREF_GOOGLE_REPORT_STATE): bool, + probatio.Optional(PREF_GOOGLE_SECURE_DEVICES_PIN): probatio.Any(None, str), + probatio.Optional(PREF_REMOTE_ALLOW_REMOTE_ENABLE): bool, + probatio.Optional(PREF_TTS_DEFAULT_VOICE): probatio.All( + probatio.Coerce(tuple), validate_language_voice ), } ) @@ -1023,7 +1025,9 @@ async def websocket_update_prefs( @websocket_api.require_admin @_require_cloud_login -@websocket_api.websocket_command({vol.Required("type"): "cloud/onboarding/postpone"}) +@websocket_api.websocket_command( + {probatio.Required("type"): "cloud/onboarding/postpone"} +) @websocket_api.async_response @_ws_handle_cloud_errors async def websocket_cloud_onboarding_postpone( @@ -1042,8 +1046,8 @@ async def websocket_cloud_onboarding_postpone( @_require_cloud_login @websocket_api.websocket_command( { - vol.Required("type"): "cloud/onboarding/complete", - vol.Required("items"): [vol.In(ONBOARDING_ITEMS)], + probatio.Required("type"): "cloud/onboarding/complete", + probatio.Required("items"): [probatio.In(ONBOARDING_ITEMS)], } ) @websocket_api.async_response @@ -1067,8 +1071,8 @@ async def websocket_cloud_onboarding_complete( @_require_cloud_login @websocket_api.websocket_command( { - vol.Required("type"): "cloud/cloudhook/create", - vol.Required("webhook_id"): str, + probatio.Required("type"): "cloud/cloudhook/create", + probatio.Required("webhook_id"): str, } ) @websocket_api.async_response @@ -1088,8 +1092,8 @@ async def websocket_hook_create( @_require_cloud_login @websocket_api.websocket_command( { - vol.Required("type"): "cloud/cloudhook/delete", - vol.Required("webhook_id"): str, + probatio.Required("type"): "cloud/cloudhook/delete", + probatio.Required("webhook_id"): str, } ) @websocket_api.async_response @@ -1280,7 +1284,7 @@ async def google_assistant_list( { "type": "cloud/google_assistant/entities/update", "entity_id": str, - vol.Optional(PREF_DISABLE_2FA): bool, + probatio.Optional(PREF_DISABLE_2FA): bool, } ) @websocket_api.async_response @@ -1429,7 +1433,7 @@ def tts_info( @websocket_api.websocket_command( { - vol.Required("type"): "cloud/webrtc/ice_servers", + probatio.Required("type"): "cloud/webrtc/ice_servers", } ) @_require_cloud_login diff --git a/homeassistant/components/cloud/repairs.py b/homeassistant/components/cloud/repairs.py index 5af9bc5d1ea7b..0d8db3f2c2720 100644 --- a/homeassistant/components/cloud/repairs.py +++ b/homeassistant/components/cloud/repairs.py @@ -3,7 +3,7 @@ import asyncio from hass_nabucasa.payments_api import SubscriptionInfo -import voluptuous as vol +import probatio from homeassistant.components.repairs import ( ConfirmRepairFlow, @@ -63,7 +63,7 @@ async def async_step_confirm_change_plan( return await self.async_step_change_plan() return self.async_show_form( - step_id="confirm_change_plan", data_schema=vol.Schema({}) + step_id="confirm_change_plan", data_schema=probatio.Schema({}) ) async def async_step_change_plan(self, _: None = None) -> RepairsFlowResult: diff --git a/homeassistant/components/cloud/tts.py b/homeassistant/components/cloud/tts.py index fe7a8b57357a8..5e5452b197b20 100644 --- a/homeassistant/components/cloud/tts.py +++ b/homeassistant/components/cloud/tts.py @@ -6,7 +6,7 @@ from hass_nabucasa import Cloud from hass_nabucasa.voice import MAP_VOICE, AudioOutput, Gender, VoiceError from hass_nabucasa.voice_data import TTS_VOICES -import voluptuous as vol +import probatio from homeassistant.components.tts import ( ATTR_AUDIO_OUTPUT, @@ -266,17 +266,19 @@ def validate_lang(value: dict[str, Any]) -> dict[str, Any]: ) if (lang, gender) not in MAP_VOICE: - raise vol.Invalid("Unsupported language and gender specified.") + raise probatio.Invalid("Unsupported language and gender specified.") return value -PLATFORM_SCHEMA = vol.All( +PLATFORM_SCHEMA = probatio.All( TTS_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_PLATFORM): vol.All(cv.string, _deprecated_platform), - vol.Optional(CONF_LANG): str, - vol.Optional(ATTR_GENDER): str, + probatio.Required(CONF_PLATFORM): probatio.All( + cv.string, _deprecated_platform + ), + probatio.Optional(CONF_LANG): str, + probatio.Optional(ATTR_GENDER): str, } ), validate_lang, diff --git a/homeassistant/components/cloudflare/config_flow.py b/homeassistant/components/cloudflare/config_flow.py index 0043c61ecb610..962e58e32ccd1 100644 --- a/homeassistant/components/cloudflare/config_flow.py +++ b/homeassistant/components/cloudflare/config_flow.py @@ -4,8 +4,8 @@ import logging from typing import Any, override +import probatio import pycfdns -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_TOKEN, CONF_ZONE @@ -19,31 +19,35 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_TOKEN): str, + probatio.Required(CONF_API_TOKEN): str, } ) -def _zone_schema(zones: list[pycfdns.ZoneModel] | None = None) -> vol.Schema: +def _zone_schema(zones: list[pycfdns.ZoneModel] | None = None) -> probatio.Schema: """Zone selection schema.""" zones_list = [] if zones is not None: zones_list = [zones["name"] for zones in zones] - return vol.Schema({vol.Required(CONF_ZONE): vol.In(zones_list)}) + return probatio.Schema({probatio.Required(CONF_ZONE): probatio.In(zones_list)}) -def _records_schema(records: list[pycfdns.RecordModel] | None = None) -> vol.Schema: +def _records_schema( + records: list[pycfdns.RecordModel] | None = None, +) -> probatio.Schema: """Zone records selection schema.""" records_dict = {} if records: records_dict = {name["name"]: name["name"] for name in records} - return vol.Schema({vol.Required(CONF_RECORDS): cv.multi_select(records_dict)}) + return probatio.Schema( + {probatio.Required(CONF_RECORDS): cv.multi_select(records_dict)} + ) async def _validate_input( diff --git a/homeassistant/components/cloudflare_r2/config_flow.py b/homeassistant/components/cloudflare_r2/config_flow.py index 47b34cc5a8df6..339fe9273deff 100644 --- a/homeassistant/components/cloudflare_r2/config_flow.py +++ b/homeassistant/components/cloudflare_r2/config_flow.py @@ -11,7 +11,7 @@ EndpointConnectionError, ParamValidationError, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PREFIX @@ -33,17 +33,17 @@ DOMAIN, ) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_ACCESS_KEY_ID): cv.string, - vol.Required(CONF_SECRET_ACCESS_KEY): TextSelector( + probatio.Required(CONF_ACCESS_KEY_ID): cv.string, + probatio.Required(CONF_SECRET_ACCESS_KEY): TextSelector( config=TextSelectorConfig(type=TextSelectorType.PASSWORD) ), - vol.Required(CONF_BUCKET): cv.string, - vol.Required(CONF_ENDPOINT_URL, default=DEFAULT_ENDPOINT_URL): TextSelector( - config=TextSelectorConfig(type=TextSelectorType.URL) - ), - vol.Optional(CONF_PREFIX, default=""): cv.string, + probatio.Required(CONF_BUCKET): cv.string, + probatio.Required( + CONF_ENDPOINT_URL, default=DEFAULT_ENDPOINT_URL + ): TextSelector(config=TextSelectorConfig(type=TextSelectorType.URL)), + probatio.Optional(CONF_PREFIX, default=""): cv.string, } ) diff --git a/homeassistant/components/cmus/media_player.py b/homeassistant/components/cmus/media_player.py index 65b626488fafb..86726567a2843 100644 --- a/homeassistant/components/cmus/media_player.py +++ b/homeassistant/components/cmus/media_player.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from pycmus import exceptions, remote -import voluptuous as vol from homeassistant.components.media_player import ( PLATFORM_SCHEMA as MEDIA_PLAYER_PLATFORM_SCHEMA, @@ -26,10 +26,10 @@ PLATFORM_SCHEMA = MEDIA_PLAYER_PLATFORM_SCHEMA.extend( { - vol.Inclusive(CONF_HOST, "remote"): cv.string, - vol.Inclusive(CONF_PASSWORD, "remote"): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Inclusive(CONF_HOST, "remote"): cv.string, + probatio.Inclusive(CONF_PASSWORD, "remote"): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/co2signal/config_flow.py b/homeassistant/components/co2signal/config_flow.py index 824cab95c5cc7..5ea45379a15e0 100644 --- a/homeassistant/components/co2signal/config_flow.py +++ b/homeassistant/components/co2signal/config_flow.py @@ -9,7 +9,7 @@ ElectricityMapsInvalidTokenError, ElectricityMapsNoDataError, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -52,9 +52,9 @@ async def async_step_user( self, user_input: dict[str, Any] | None = None ) -> ConfigFlowResult: """Handle the initial step.""" - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required("location"): SelectSelector( + probatio.Required("location"): SelectSelector( SelectSelectorConfig( translation_key="location", mode=SelectSelectorMode.LIST, @@ -65,7 +65,7 @@ async def async_step_user( ], ) ), - vol.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_API_KEY): cv.string, } ) @@ -92,12 +92,12 @@ async def async_step_coordinates( self, user_input: dict[str, Any] | None = None ) -> ConfigFlowResult: """Validate coordinates.""" - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required( + probatio.Required( CONF_LATITUDE, ): cv.latitude, - vol.Required( + probatio.Required( CONF_LONGITUDE, ): cv.longitude, } @@ -115,9 +115,9 @@ async def async_step_country( self, user_input: dict[str, Any] | None = None ) -> ConfigFlowResult: """Validate country.""" - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_COUNTRY_CODE): cv.string, + probatio.Required(CONF_COUNTRY_CODE): cv.string, } ) if user_input is None: @@ -139,9 +139,9 @@ async def async_step_reauth_confirm( self, user_input: dict[str, Any] | None = None ) -> ConfigFlowResult: """Handle the reauth step.""" - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_API_KEY): cv.string, } ) return await self._validate_and_create( @@ -149,7 +149,7 @@ async def async_step_reauth_confirm( ) async def _validate_and_create( - self, step_id: str, data_schema: vol.Schema, data: Mapping[str, Any] | None + self, step_id: str, data_schema: probatio.Schema, data: Mapping[str, Any] | None ) -> ConfigFlowResult: """Validate data and show form if it is invalid.""" errors: dict[str, str] = {} diff --git a/homeassistant/components/coinbase/config_flow.py b/homeassistant/components/coinbase/config_flow.py index 5335694b4f977..3ea3f1336efbe 100644 --- a/homeassistant/components/coinbase/config_flow.py +++ b/homeassistant/components/coinbase/config_flow.py @@ -6,7 +6,7 @@ from coinbase.rest import RESTClient from coinbase.rest.rest_base import HTTPError -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigFlow, @@ -36,10 +36,10 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_KEY): str, - vol.Required(CONF_API_TOKEN): str, + probatio.Required(CONF_API_KEY): str, + probatio.Required(CONF_API_TOKEN): str, } ) @@ -254,21 +254,21 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_CURRENCIES, default=default_currencies, ): cv.multi_select(WALLETS), - vol.Optional( + probatio.Optional( CONF_EXCHANGE_RATES, default=default_exchange_rates, ): cv.multi_select(RATES), - vol.Optional( + probatio.Optional( CONF_EXCHANGE_BASE, default=default_exchange_base, - ): vol.In(WALLETS), - vol.Optional( + ): probatio.In(WALLETS), + probatio.Optional( CONF_EXCHANGE_PRECISION, default=default_exchange_precision ): int, } diff --git a/homeassistant/components/collection_image/config_flow.py b/homeassistant/components/collection_image/config_flow.py index 35f29d58f8810..e0f66c65248cb 100644 --- a/homeassistant/components/collection_image/config_flow.py +++ b/homeassistant/components/collection_image/config_flow.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.image import DOMAIN as IMAGE_DOMAIN from homeassistant.components.media_player import BrowseError, MediaClass @@ -14,9 +14,9 @@ IMAGE_MEDIA_URI = f"{URI_SCHEME}{IMAGE_DOMAIN}" -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_MEDIA): MediaSelector( + probatio.Required(CONF_MEDIA): MediaSelector( {"accept": ["directory"], "multiple": True} ), } diff --git a/homeassistant/components/collection_image/services.py b/homeassistant/components/collection_image/services.py index 0872a42c3e7db..cea60a11da7d5 100644 --- a/homeassistant/components/collection_image/services.py +++ b/homeassistant/components/collection_image/services.py @@ -2,7 +2,7 @@ from enum import StrEnum -import voluptuous as vol +import probatio from homeassistant.components.image import DOMAIN as IMAGE_DOMAIN from homeassistant.core import HomeAssistant, callback @@ -61,7 +61,7 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, CollectionImageService.SELECT_NEXT, entity_domain=IMAGE_DOMAIN, - schema={vol.Optional(CollectionImageServiceArgument.WRAP): cv.boolean}, + schema={probatio.Optional(CollectionImageServiceArgument.WRAP): cv.boolean}, func="get_next_image", ) service.async_register_platform_entity_service( @@ -69,6 +69,6 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, CollectionImageService.SELECT_PREVIOUS, entity_domain=IMAGE_DOMAIN, - schema={vol.Optional(CollectionImageServiceArgument.WRAP): cv.boolean}, + schema={probatio.Optional(CollectionImageServiceArgument.WRAP): cv.boolean}, func="get_previous_image", ) diff --git a/homeassistant/components/color_extractor/services.py b/homeassistant/components/color_extractor/services.py index 1ca6543366809..dbf1767d3d37b 100644 --- a/homeassistant/components/color_extractor/services.py +++ b/homeassistant/components/color_extractor/services.py @@ -9,7 +9,7 @@ import aiohttp from colorthief import ColorThief from PIL import UnidentifiedImageError -import voluptuous as vol +import probatio from homeassistant.components.light import ( ATTR_RGB_COLOR, @@ -26,22 +26,22 @@ _LOGGER = logging.getLogger(__name__) # Extend the existing light.turn_on service schema -TURN_ON_SERVICE_SCHEMA = vol.All( +TURN_ON_SERVICE_SCHEMA = probatio.All( cv.has_at_least_one_key(ATTR_URL, ATTR_PATH), cv.make_entity_service_schema( { **LIGHT_TURN_ON_SCHEMA, - vol.Exclusive(ATTR_PATH, "color_extractor"): cv.isfile, - vol.Exclusive(ATTR_URL, "color_extractor"): cv.url, + probatio.Exclusive(ATTR_PATH, "color_extractor"): cv.isfile, + probatio.Exclusive(ATTR_URL, "color_extractor"): cv.url, } ), ) -GET_COLOR_SERVICE_SCHEMA = vol.All( +GET_COLOR_SERVICE_SCHEMA = probatio.All( cv.has_at_least_one_key(ATTR_URL, ATTR_PATH), { - vol.Exclusive(ATTR_PATH, "color_extractor"): cv.isfile, - vol.Exclusive(ATTR_URL, "color_extractor"): cv.url, + probatio.Exclusive(ATTR_PATH, "color_extractor"): cv.isfile, + probatio.Exclusive(ATTR_URL, "color_extractor"): cv.url, }, ) diff --git a/homeassistant/components/comed_hourly_pricing/sensor.py b/homeassistant/components/comed_hourly_pricing/sensor.py index fd744a36735bd..d631603908bcb 100644 --- a/homeassistant/components/comed_hourly_pricing/sensor.py +++ b/homeassistant/components/comed_hourly_pricing/sensor.py @@ -6,7 +6,7 @@ import logging import aiohttp -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -45,18 +45,18 @@ SENSOR_KEYS: list[str] = [desc.key for desc in SENSOR_TYPES] -TYPES_SCHEMA = vol.In(SENSOR_KEYS) +TYPES_SCHEMA = probatio.In(SENSOR_KEYS) -SENSORS_SCHEMA = vol.Schema( +SENSORS_SCHEMA = probatio.Schema( { - vol.Required(CONF_SENSOR_TYPE): TYPES_SCHEMA, - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_OFFSET, default=0.0): vol.Coerce(float), + probatio.Required(CONF_SENSOR_TYPE): TYPES_SCHEMA, + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_OFFSET, default=0.0): probatio.Coerce(float), } ) PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_MONITORED_FEEDS): [SENSORS_SCHEMA]} + {probatio.Required(CONF_MONITORED_FEEDS): [SENSORS_SCHEMA]} ) diff --git a/homeassistant/components/comelit/config_flow.py b/homeassistant/components/comelit/config_flow.py index 657c54795f9ee..62b11e2b6e979 100644 --- a/homeassistant/components/comelit/config_flow.py +++ b/homeassistant/components/comelit/config_flow.py @@ -12,7 +12,7 @@ ) from aiocomelit.api import ComelitCommonApi from aiocomelit.const import BRIDGE -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PIN, CONF_PORT, CONF_TYPE @@ -26,17 +26,20 @@ DEFAULT_HOST = "192.168.1.252" DEFAULT_PIN = "111111" -USER_SCHEMA = vol.Schema( +USER_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST, default=DEFAULT_HOST): cv.string, - vol.Required(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_PIN, default=DEFAULT_PIN): cv.string, - vol.Required(CONF_TYPE, default=BRIDGE): vol.In(DEVICE_TYPE_LIST), - vol.Optional(CONF_VEDO_PIN): cv.string, + probatio.Required(CONF_HOST, default=DEFAULT_HOST): cv.string, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_PIN, default=DEFAULT_PIN): cv.string, + probatio.Required(CONF_TYPE, default=BRIDGE): probatio.In(DEVICE_TYPE_LIST), + probatio.Optional(CONF_VEDO_PIN): cv.string, } ) -STEP_REAUTH_DATA_SCHEMA = vol.Schema( - {vol.Required(CONF_PIN): cv.string, vol.Optional(CONF_VEDO_PIN): cv.string} +STEP_REAUTH_DATA_SCHEMA = probatio.Schema( + { + probatio.Required(CONF_PIN): cv.string, + probatio.Optional(CONF_VEDO_PIN): cv.string, + } ) @@ -228,16 +231,16 @@ async def async_step_reconfigure( reconfigure_entry, data_updates=data_updates ) - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required( + probatio.Required( CONF_HOST, default=reconfigure_entry.data[CONF_HOST] ): cv.string, - vol.Required( + probatio.Required( CONF_PORT, default=reconfigure_entry.data[CONF_PORT] ): cv.port, - vol.Optional(CONF_PIN): cv.string, - vol.Optional(CONF_VEDO_PIN): cv.string, + probatio.Optional(CONF_PIN): cv.string, + probatio.Optional(CONF_VEDO_PIN): cv.string, } ) diff --git a/homeassistant/components/comfoconnect/__init__.py b/homeassistant/components/comfoconnect/__init__.py index b28f7a748e1c9..5d9be30787fca 100644 --- a/homeassistant/components/comfoconnect/__init__.py +++ b/homeassistant/components/comfoconnect/__init__.py @@ -2,8 +2,8 @@ import logging +import probatio from pycomfoconnect import Bridge, ComfoConnect -import voluptuous as vol from homeassistant.const import ( CONF_HOST, @@ -31,21 +31,23 @@ DEFAULT_TOKEN = "00000000000000000000000000000001" DEFAULT_USER_AGENT = "Home Assistant" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_TOKEN, default=DEFAULT_TOKEN): vol.Length( + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_TOKEN, default=DEFAULT_TOKEN): probatio.Length( min=32, max=32, msg="invalid token" ), - vol.Optional(CONF_USER_AGENT, default=DEFAULT_USER_AGENT): cv.string, - vol.Optional(CONF_PIN, default=DEFAULT_PIN): cv.positive_int, + probatio.Optional( + CONF_USER_AGENT, default=DEFAULT_USER_AGENT + ): cv.string, + probatio.Optional(CONF_PIN, default=DEFAULT_PIN): cv.positive_int, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/comfoconnect/sensor.py b/homeassistant/components/comfoconnect/sensor.py index 8f5f923062190..6a4e59ca7828d 100644 --- a/homeassistant/components/comfoconnect/sensor.py +++ b/homeassistant/components/comfoconnect/sensor.py @@ -4,6 +4,7 @@ import logging from typing import override +import probatio from pycomfoconnect import ( SENSOR_BYPASS_STATE, SENSOR_CURRENT_RMOT, @@ -27,7 +28,6 @@ SENSOR_TEMPERATURE_OUTDOOR, SENSOR_TEMPERATURE_SUPPLY, ) -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -264,8 +264,8 @@ class ComfoconnectSensorEntityDescription(SensorEntityDescription): PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_RESOURCES, default=[]): vol.All( - cv.ensure_list, [vol.In([desc.key for desc in SENSOR_TYPES])] + probatio.Optional(CONF_RESOURCES, default=[]): probatio.All( + cv.ensure_list, [probatio.In([desc.key for desc in SENSOR_TYPES])] ) } ) diff --git a/homeassistant/components/command_line/__init__.py b/homeassistant/components/command_line/__init__.py index 55902a317eee7..c4e43121da2d0 100644 --- a/homeassistant/components/command_line/__init__.py +++ b/homeassistant/components/command_line/__init__.py @@ -5,7 +5,7 @@ import logging from typing import Any -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import ( DEVICE_CLASSES_SCHEMA as BINARY_SENSOR_DEVICE_CLASSES_SCHEMA, @@ -84,108 +84,118 @@ _LOGGER = logging.getLogger(__name__) -BINARY_SENSOR_SCHEMA = vol.Schema( +BINARY_SENSOR_SCHEMA = probatio.Schema( { - vol.Required(CONF_COMMAND): cv.string, - vol.Optional(CONF_NAME, default=BINARY_SENSOR_DEFAULT_NAME): cv.string, - vol.Optional(CONF_ICON): cv.template, - vol.Optional(CONF_PAYLOAD_OFF, default=DEFAULT_PAYLOAD_OFF): cv.string, - vol.Optional(CONF_PAYLOAD_ON, default=DEFAULT_PAYLOAD_ON): cv.string, - vol.Optional(CONF_DEVICE_CLASS): BINARY_SENSOR_DEVICE_CLASSES_SCHEMA, - vol.Optional(CONF_VALUE_TEMPLATE): vol.All( + probatio.Required(CONF_COMMAND): cv.string, + probatio.Optional(CONF_NAME, default=BINARY_SENSOR_DEFAULT_NAME): cv.string, + probatio.Optional(CONF_ICON): cv.template, + probatio.Optional(CONF_PAYLOAD_OFF, default=DEFAULT_PAYLOAD_OFF): cv.string, + probatio.Optional(CONF_PAYLOAD_ON, default=DEFAULT_PAYLOAD_ON): cv.string, + probatio.Optional(CONF_DEVICE_CLASS): BINARY_SENSOR_DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_VALUE_TEMPLATE): probatio.All( cv.template, ValueTemplate.from_template ), - vol.Optional(CONF_COMMAND_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, - vol.Optional(CONF_UNIQUE_ID): cv.string, - vol.Optional( + probatio.Optional( + CONF_COMMAND_TIMEOUT, default=DEFAULT_TIMEOUT + ): cv.positive_int, + probatio.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Optional( CONF_SCAN_INTERVAL, default=BINARY_SENSOR_DEFAULT_SCAN_INTERVAL - ): vol.All(cv.time_period, cv.positive_timedelta), - vol.Optional(CONF_AVAILABILITY): cv.template, + ): probatio.All(cv.time_period, cv.positive_timedelta), + probatio.Optional(CONF_AVAILABILITY): cv.template, } ) -COVER_SCHEMA = vol.Schema( +COVER_SCHEMA = probatio.Schema( { - vol.Optional(CONF_COMMAND_CLOSE, default="true"): cv.string, - vol.Optional(CONF_COMMAND_OPEN, default="true"): cv.string, - vol.Optional(CONF_COMMAND_STATE): cv.string, - vol.Optional(CONF_COMMAND_STOP, default="true"): cv.string, - vol.Required(CONF_NAME): cv.string, - vol.Optional(CONF_ICON): cv.template, - vol.Optional(CONF_VALUE_TEMPLATE): vol.All( + probatio.Optional(CONF_COMMAND_CLOSE, default="true"): cv.string, + probatio.Optional(CONF_COMMAND_OPEN, default="true"): cv.string, + probatio.Optional(CONF_COMMAND_STATE): cv.string, + probatio.Optional(CONF_COMMAND_STOP, default="true"): cv.string, + probatio.Required(CONF_NAME): cv.string, + probatio.Optional(CONF_ICON): cv.template, + probatio.Optional(CONF_VALUE_TEMPLATE): probatio.All( cv.template, ValueTemplate.from_template ), - vol.Optional(CONF_COMMAND_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, - vol.Optional(CONF_DEVICE_CLASS): COVER_DEVICE_CLASSES_SCHEMA, - vol.Optional(CONF_UNIQUE_ID): cv.string, - vol.Optional(CONF_SCAN_INTERVAL, default=COVER_DEFAULT_SCAN_INTERVAL): vol.All( - cv.time_period, cv.positive_timedelta - ), - vol.Optional(CONF_AVAILABILITY): cv.template, + probatio.Optional( + CONF_COMMAND_TIMEOUT, default=DEFAULT_TIMEOUT + ): cv.positive_int, + probatio.Optional(CONF_DEVICE_CLASS): COVER_DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Optional( + CONF_SCAN_INTERVAL, default=COVER_DEFAULT_SCAN_INTERVAL + ): probatio.All(cv.time_period, cv.positive_timedelta), + probatio.Optional(CONF_AVAILABILITY): cv.template, } ) -NOTIFY_SCHEMA = vol.Schema( +NOTIFY_SCHEMA = probatio.Schema( { - vol.Required(CONF_COMMAND): cv.string, - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_COMMAND_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, + probatio.Required(CONF_COMMAND): cv.string, + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional( + CONF_COMMAND_TIMEOUT, default=DEFAULT_TIMEOUT + ): cv.positive_int, } ) -SENSOR_SCHEMA = vol.Schema( +SENSOR_SCHEMA = probatio.Schema( { - vol.Required(CONF_COMMAND): cv.string, - vol.Optional(CONF_COMMAND_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, - vol.Optional(CONF_JSON_ATTRIBUTES): cv.ensure_list_csv, - vol.Optional(CONF_JSON_ATTRIBUTES_PATH): cv.string, - vol.Optional(CONF_NAME, default=SENSOR_DEFAULT_NAME): cv.string, - vol.Optional(CONF_ICON): cv.template, - vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, - vol.Optional(CONF_VALUE_TEMPLATE): vol.All( + probatio.Required(CONF_COMMAND): cv.string, + probatio.Optional( + CONF_COMMAND_TIMEOUT, default=DEFAULT_TIMEOUT + ): cv.positive_int, + probatio.Optional(CONF_JSON_ATTRIBUTES): cv.ensure_list_csv, + probatio.Optional(CONF_JSON_ATTRIBUTES_PATH): cv.string, + probatio.Optional(CONF_NAME, default=SENSOR_DEFAULT_NAME): cv.string, + probatio.Optional(CONF_ICON): cv.template, + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, + probatio.Optional(CONF_VALUE_TEMPLATE): probatio.All( cv.template, ValueTemplate.from_template ), - vol.Optional(CONF_UNIQUE_ID): cv.string, - vol.Optional(CONF_DEVICE_CLASS): SENSOR_DEVICE_CLASSES_SCHEMA, - vol.Optional(CONF_STATE_CLASS): SENSOR_STATE_CLASSES_SCHEMA, - vol.Optional(CONF_SCAN_INTERVAL, default=SENSOR_DEFAULT_SCAN_INTERVAL): vol.All( - cv.time_period, cv.positive_timedelta - ), - vol.Optional(CONF_AVAILABILITY): cv.template, + probatio.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Optional(CONF_DEVICE_CLASS): SENSOR_DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_STATE_CLASS): SENSOR_STATE_CLASSES_SCHEMA, + probatio.Optional( + CONF_SCAN_INTERVAL, default=SENSOR_DEFAULT_SCAN_INTERVAL + ): probatio.All(cv.time_period, cv.positive_timedelta), + probatio.Optional(CONF_AVAILABILITY): cv.template, } ) -SWITCH_SCHEMA = vol.Schema( +SWITCH_SCHEMA = probatio.Schema( { - vol.Optional(CONF_COMMAND_OFF, default="true"): cv.string, - vol.Optional(CONF_COMMAND_ON, default="true"): cv.string, - vol.Optional(CONF_COMMAND_STATE): cv.string, - vol.Required(CONF_NAME): cv.string, - vol.Optional(CONF_VALUE_TEMPLATE): vol.All( + probatio.Optional(CONF_COMMAND_OFF, default="true"): cv.string, + probatio.Optional(CONF_COMMAND_ON, default="true"): cv.string, + probatio.Optional(CONF_COMMAND_STATE): cv.string, + probatio.Required(CONF_NAME): cv.string, + probatio.Optional(CONF_VALUE_TEMPLATE): probatio.All( cv.template, ValueTemplate.from_template ), - vol.Optional(CONF_ICON): cv.template, - vol.Optional(CONF_COMMAND_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, - vol.Optional(CONF_UNIQUE_ID): cv.string, - vol.Optional(CONF_SCAN_INTERVAL, default=SWITCH_DEFAULT_SCAN_INTERVAL): vol.All( - cv.time_period, cv.positive_timedelta - ), - vol.Optional(CONF_AVAILABILITY): cv.template, + probatio.Optional(CONF_ICON): cv.template, + probatio.Optional( + CONF_COMMAND_TIMEOUT, default=DEFAULT_TIMEOUT + ): cv.positive_int, + probatio.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Optional( + CONF_SCAN_INTERVAL, default=SWITCH_DEFAULT_SCAN_INTERVAL + ): probatio.All(cv.time_period, cv.positive_timedelta), + probatio.Optional(CONF_AVAILABILITY): cv.template, } ) -COMBINED_SCHEMA = vol.Schema( +COMBINED_SCHEMA = probatio.Schema( { - vol.Optional(BINARY_SENSOR_DOMAIN): BINARY_SENSOR_SCHEMA, - vol.Optional(COVER_DOMAIN): COVER_SCHEMA, - vol.Optional(NOTIFY_DOMAIN): NOTIFY_SCHEMA, - vol.Optional(SENSOR_DOMAIN): SENSOR_SCHEMA, - vol.Optional(SWITCH_DOMAIN): SWITCH_SCHEMA, + probatio.Optional(BINARY_SENSOR_DOMAIN): BINARY_SENSOR_SCHEMA, + probatio.Optional(COVER_DOMAIN): COVER_SCHEMA, + probatio.Optional(NOTIFY_DOMAIN): NOTIFY_SCHEMA, + probatio.Optional(SENSOR_DOMAIN): SENSOR_SCHEMA, + probatio.Optional(SWITCH_DOMAIN): SWITCH_SCHEMA, } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Optional(DOMAIN): vol.All( + probatio.Optional(DOMAIN): probatio.All( cv.ensure_list, [COMBINED_SCHEMA], ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/compensation/__init__.py b/homeassistant/components/compensation/__init__.py index 5d7a99cf40880..509515e4cd893 100644 --- a/homeassistant/components/compensation/__init__.py +++ b/homeassistant/components/compensation/__init__.py @@ -4,7 +4,7 @@ from operator import itemgetter import numpy as np -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( CONF_STATE_CLASS, @@ -47,7 +47,7 @@ def datapoints_greater_than_degree(value: dict) -> dict: """Validate data point list is greater than polynomial degrees.""" if len(value[CONF_DATAPOINTS]) <= value[CONF_DEGREE]: - raise vol.Invalid( + raise probatio.Invalid( f"{CONF_DATAPOINTS} must have at least" f" {value[CONF_DEGREE] + 1} {CONF_DATAPOINTS}" ) @@ -55,35 +55,35 @@ def datapoints_greater_than_degree(value: dict) -> dict: return value -COMPENSATION_SCHEMA = vol.Schema( +COMPENSATION_SCHEMA = probatio.Schema( { - vol.Optional(CONF_ATTRIBUTE): cv.string, - vol.Required(CONF_DATAPOINTS): [ - vol.ExactSequence([vol.Coerce(float), vol.Coerce(float)]) + probatio.Optional(CONF_ATTRIBUTE): cv.string, + probatio.Required(CONF_DATAPOINTS): [ + probatio.ExactSequence([probatio.Coerce(float), probatio.Coerce(float)]) ], - vol.Optional(CONF_DEGREE, default=DEFAULT_DEGREE): vol.All( - vol.Coerce(int), - vol.Range(min=1, max=7), + probatio.Optional(CONF_DEGREE, default=DEFAULT_DEGREE): probatio.All( + probatio.Coerce(int), + probatio.Range(min=1, max=7), ), - vol.Optional(CONF_DEVICE_CLASS): SENSOR_DEVICE_CLASSES_SCHEMA, - vol.Optional(CONF_LOWER_LIMIT, default=False): cv.boolean, - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_PRECISION, default=DEFAULT_PRECISION): cv.positive_int, - vol.Required(CONF_SOURCE): cv.entity_id, - vol.Optional(CONF_STATE_CLASS): SENSOR_STATE_CLASSES_SCHEMA, - vol.Optional(CONF_UNIQUE_ID): cv.string, - vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, - vol.Optional(CONF_UPPER_LIMIT, default=False): cv.boolean, + probatio.Optional(CONF_DEVICE_CLASS): SENSOR_DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_LOWER_LIMIT, default=False): cv.boolean, + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_PRECISION, default=DEFAULT_PRECISION): cv.positive_int, + probatio.Required(CONF_SOURCE): cv.entity_id, + probatio.Optional(CONF_STATE_CLASS): SENSOR_STATE_CLASSES_SCHEMA, + probatio.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, + probatio.Optional(CONF_UPPER_LIMIT, default=False): cv.boolean, } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( - {cv.slug: vol.All(COMPENSATION_SCHEMA, datapoints_greater_than_degree)} + DOMAIN: probatio.Schema( + {cv.slug: probatio.All(COMPENSATION_SCHEMA, datapoints_greater_than_degree)} ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/compit/config_flow.py b/homeassistant/components/compit/config_flow.py index f9fb41303c0c0..553f6fcd77bbc 100644 --- a/homeassistant/components/compit/config_flow.py +++ b/homeassistant/components/compit/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from compit_inext_api import CannotConnect, CompitApiConnector, InvalidAuth -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_EMAIL, CONF_PASSWORD @@ -15,16 +15,16 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_EMAIL): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_EMAIL): str, + probatio.Required(CONF_PASSWORD): str, } ) -STEP_REAUTH_SCHEMA = vol.Schema( +STEP_REAUTH_SCHEMA = probatio.Schema( { - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/concord232/alarm_control_panel.py b/homeassistant/components/concord232/alarm_control_panel.py index 550f2cc316664..3bf95a00be0e9 100644 --- a/homeassistant/components/concord232/alarm_control_panel.py +++ b/homeassistant/components/concord232/alarm_control_panel.py @@ -5,8 +5,8 @@ from typing import override from concord232 import client as concord232_client +import probatio import requests -import voluptuous as vol from homeassistant.components.alarm_control_panel import ( PLATFORM_SCHEMA as ALARM_CONTROL_PANEL_PLATFORM_SCHEMA, @@ -32,11 +32,11 @@ PLATFORM_SCHEMA = ALARM_CONTROL_PANEL_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_CODE): cv.string, - vol.Optional(CONF_MODE, default=DEFAULT_MODE): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_CODE): cv.string, + probatio.Optional(CONF_MODE, default=DEFAULT_MODE): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, } ) diff --git a/homeassistant/components/concord232/binary_sensor.py b/homeassistant/components/concord232/binary_sensor.py index 4241685b26d47..5c60879435063 100644 --- a/homeassistant/components/concord232/binary_sensor.py +++ b/homeassistant/components/concord232/binary_sensor.py @@ -5,8 +5,8 @@ from typing import Any, override from concord232 import client as concord232_client +import probatio import requests -import voluptuous as vol from homeassistant.components.binary_sensor import ( DEVICE_CLASSES_SCHEMA as BINARY_SENSOR_DEVICE_CLASSES_SCHEMA, @@ -32,16 +32,18 @@ SCAN_INTERVAL = datetime.timedelta(seconds=10) -ZONE_TYPES_SCHEMA = vol.Schema({cv.positive_int: BINARY_SENSOR_DEVICE_CLASSES_SCHEMA}) +ZONE_TYPES_SCHEMA = probatio.Schema( + {cv.positive_int: BINARY_SENSOR_DEVICE_CLASSES_SCHEMA} +) PLATFORM_SCHEMA = BINARY_SENSOR_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_EXCLUDE_ZONES, default=[]): vol.All( + probatio.Optional(CONF_EXCLUDE_ZONES, default=[]): probatio.All( cv.ensure_list, [cv.positive_int] ), - vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_ZONE_TYPES, default={}): ZONE_TYPES_SCHEMA, + probatio.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_ZONE_TYPES, default={}): ZONE_TYPES_SCHEMA, } ) diff --git a/homeassistant/components/config/area_registry.py b/homeassistant/components/config/area_registry.py index 15572bf0d535e..f92279d132aae 100644 --- a/homeassistant/components/config/area_registry.py +++ b/homeassistant/components/config/area_registry.py @@ -2,7 +2,7 @@ from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.core import HomeAssistant, callback @@ -20,7 +20,9 @@ def async_setup(hass: HomeAssistant) -> bool: return True -@websocket_api.websocket_command({vol.Required("type"): "config/area_registry/list"}) +@websocket_api.websocket_command( + {probatio.Required("type"): "config/area_registry/list"} +) @callback def websocket_list_areas( hass: HomeAssistant, @@ -37,15 +39,15 @@ def websocket_list_areas( @websocket_api.websocket_command( { - vol.Required("type"): "config/area_registry/create", - vol.Optional("aliases"): list, - vol.Optional("floor_id"): str, - vol.Optional("humidity_entity_id"): vol.Any(str, None), - vol.Optional("icon"): str, - vol.Optional("labels"): [str], - vol.Required("name"): str, - vol.Optional("picture"): vol.Any(str, None), - vol.Optional("temperature_entity_id"): vol.Any(str, None), + probatio.Required("type"): "config/area_registry/create", + probatio.Optional("aliases"): list, + probatio.Optional("floor_id"): str, + probatio.Optional("humidity_entity_id"): probatio.Any(str, None), + probatio.Optional("icon"): str, + probatio.Optional("labels"): [str], + probatio.Required("name"): str, + probatio.Optional("picture"): probatio.Any(str, None), + probatio.Optional("temperature_entity_id"): probatio.Any(str, None), } ) @websocket_api.require_admin @@ -82,8 +84,8 @@ def websocket_create_area( @websocket_api.websocket_command( { - vol.Required("type"): "config/area_registry/delete", - vol.Required("area_id"): str, + probatio.Required("type"): "config/area_registry/delete", + probatio.Required("area_id"): str, } ) @websocket_api.require_admin @@ -106,16 +108,16 @@ def websocket_delete_area( @websocket_api.websocket_command( { - vol.Required("type"): "config/area_registry/update", - vol.Optional("aliases"): list, - vol.Required("area_id"): str, - vol.Optional("floor_id"): vol.Any(str, None), - vol.Optional("humidity_entity_id"): vol.Any(str, None), - vol.Optional("icon"): vol.Any(str, None), - vol.Optional("labels"): [str], - vol.Optional("name"): str, - vol.Optional("picture"): vol.Any(str, None), - vol.Optional("temperature_entity_id"): vol.Any(str, None), + probatio.Required("type"): "config/area_registry/update", + probatio.Optional("aliases"): list, + probatio.Required("area_id"): str, + probatio.Optional("floor_id"): probatio.Any(str, None), + probatio.Optional("humidity_entity_id"): probatio.Any(str, None), + probatio.Optional("icon"): probatio.Any(str, None), + probatio.Optional("labels"): [str], + probatio.Optional("name"): str, + probatio.Optional("picture"): probatio.Any(str, None), + probatio.Optional("temperature_entity_id"): probatio.Any(str, None), } ) @websocket_api.require_admin @@ -152,8 +154,8 @@ def websocket_update_area( @websocket_api.websocket_command( { - vol.Required("type"): "config/area_registry/reorder", - vol.Required("area_ids"): [str], + probatio.Required("type"): "config/area_registry/reorder", + probatio.Required("area_ids"): [str], } ) @websocket_api.require_admin diff --git a/homeassistant/components/config/auth.py b/homeassistant/components/config/auth.py index 2479fe652c372..8b6552fe3f983 100644 --- a/homeassistant/components/config/auth.py +++ b/homeassistant/components/config/auth.py @@ -2,7 +2,7 @@ from typing import Any -import voluptuous as vol +import probatio from homeassistant.auth.models import User from homeassistant.components import websocket_api @@ -20,7 +20,7 @@ def async_setup(hass: HomeAssistant) -> bool: @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required("type"): "config/auth/list"}) +@websocket_api.websocket_command({probatio.Required("type"): "config/auth/list"}) @websocket_api.async_response async def websocket_list( hass: HomeAssistant, @@ -35,7 +35,7 @@ async def websocket_list( @websocket_api.require_admin @websocket_api.websocket_command( - {vol.Required("type"): "config/auth/delete", vol.Required("user_id"): str} + {probatio.Required("type"): "config/auth/delete", probatio.Required("user_id"): str} ) @websocket_api.async_response async def websocket_delete( @@ -66,10 +66,10 @@ async def websocket_delete( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "config/auth/create", - vol.Required("name"): str, - vol.Optional("group_ids"): [str], - vol.Optional("local_only"): bool, + probatio.Required("type"): "config/auth/create", + probatio.Required("name"): str, + probatio.Optional("group_ids"): [str], + probatio.Optional("local_only"): bool, } ) @websocket_api.async_response @@ -91,12 +91,12 @@ async def websocket_create( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "config/auth/update", - vol.Required("user_id"): str, - vol.Optional("name"): str, - vol.Optional("is_active"): bool, - vol.Optional("group_ids"): [str], - vol.Optional("local_only"): bool, + probatio.Required("type"): "config/auth/update", + probatio.Required("user_id"): str, + probatio.Optional("name"): str, + probatio.Optional("is_active"): bool, + probatio.Optional("group_ids"): [str], + probatio.Optional("local_only"): bool, } ) @websocket_api.async_response diff --git a/homeassistant/components/config/auth_provider_homeassistant.py b/homeassistant/components/config/auth_provider_homeassistant.py index ab7b2a84e9e7a..9fa1b952978b3 100644 --- a/homeassistant/components/config/auth_provider_homeassistant.py +++ b/homeassistant/components/config/auth_provider_homeassistant.py @@ -2,7 +2,7 @@ from typing import Any -import voluptuous as vol +import probatio from homeassistant.auth.providers import homeassistant as auth_ha from homeassistant.components import websocket_api @@ -23,10 +23,10 @@ def async_setup(hass: HomeAssistant) -> bool: @websocket_api.websocket_command( { - vol.Required("type"): "config/auth_provider/homeassistant/create", - vol.Required("user_id"): str, - vol.Required("username"): str, - vol.Required("password"): str, + probatio.Required("type"): "config/auth_provider/homeassistant/create", + probatio.Required("user_id"): str, + probatio.Required("username"): str, + probatio.Required("password"): str, } ) @websocket_api.require_admin @@ -63,8 +63,8 @@ async def websocket_create( @websocket_api.websocket_command( { - vol.Required("type"): "config/auth_provider/homeassistant/delete", - vol.Required("username"): str, + probatio.Required("type"): "config/auth_provider/homeassistant/delete", + probatio.Required("username"): str, } ) @websocket_api.require_admin @@ -95,9 +95,9 @@ async def websocket_delete( @websocket_api.websocket_command( { - vol.Required("type"): "config/auth_provider/homeassistant/change_password", - vol.Required("current_password"): str, - vol.Required("new_password"): str, + probatio.Required("type"): "config/auth_provider/homeassistant/change_password", + probatio.Required("current_password"): str, + probatio.Required("new_password"): str, } ) @websocket_api.async_response @@ -139,11 +139,11 @@ async def websocket_change_password( @websocket_api.websocket_command( { - vol.Required( + probatio.Required( "type" ): "config/auth_provider/homeassistant/admin_change_password", - vol.Required("user_id"): str, - vol.Required("password"): str, + probatio.Required("user_id"): str, + probatio.Required("password"): str, } ) @websocket_api.require_admin @@ -181,11 +181,11 @@ async def websocket_admin_change_password( @websocket_api.websocket_command( { - vol.Required( + probatio.Required( "type" ): "config/auth_provider/homeassistant/admin_change_username", - vol.Required("user_id"): str, - vol.Required("username"): str, + probatio.Required("user_id"): str, + probatio.Required("username"): str, } ) @websocket_api.require_admin diff --git a/homeassistant/components/config/category_registry.py b/homeassistant/components/config/category_registry.py index 2726892882383..a55bff279cf4c 100644 --- a/homeassistant/components/config/category_registry.py +++ b/homeassistant/components/config/category_registry.py @@ -2,7 +2,7 @@ from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.components.websocket_api import ActiveConnection @@ -22,8 +22,8 @@ def async_setup(hass: HomeAssistant) -> bool: @websocket_api.websocket_command( { - vol.Required("type"): "config/category_registry/list", - vol.Required("scope"): str, + probatio.Required("type"): "config/category_registry/list", + probatio.Required("scope"): str, } ) @callback @@ -43,10 +43,10 @@ def websocket_list_categories( @websocket_api.websocket_command( { - vol.Required("type"): "config/category_registry/create", - vol.Required("scope"): str, - vol.Required("name"): str, - vol.Optional("icon"): vol.Any(cv.icon, None), + probatio.Required("type"): "config/category_registry/create", + probatio.Required("scope"): str, + probatio.Required("name"): str, + probatio.Optional("icon"): probatio.Any(cv.icon, None), } ) @websocket_api.require_admin @@ -71,9 +71,9 @@ def websocket_create_category( @websocket_api.websocket_command( { - vol.Required("type"): "config/category_registry/delete", - vol.Required("scope"): str, - vol.Required("category_id"): str, + probatio.Required("type"): "config/category_registry/delete", + probatio.Required("scope"): str, + probatio.Required("category_id"): str, } ) @websocket_api.require_admin @@ -96,11 +96,11 @@ def websocket_delete_category( @websocket_api.websocket_command( { - vol.Required("type"): "config/category_registry/update", - vol.Required("scope"): str, - vol.Required("category_id"): str, - vol.Optional("name"): str, - vol.Optional("icon"): vol.Any(cv.icon, None), + probatio.Required("type"): "config/category_registry/update", + probatio.Required("scope"): str, + probatio.Required("category_id"): str, + probatio.Optional("name"): str, + probatio.Optional("icon"): probatio.Any(cv.icon, None), } ) @websocket_api.require_admin diff --git a/homeassistant/components/config/config_entries.py b/homeassistant/components/config/config_entries.py index 10eaa42e175d0..66795b09c40a7 100644 --- a/homeassistant/components/config/config_entries.py +++ b/homeassistant/components/config/config_entries.py @@ -8,7 +8,7 @@ from aiohttp import web import aiohttp.web_exceptions -import voluptuous as vol +import probatio from homeassistant import config_entries, data_entry_flow from homeassistant.auth.permissions.const import CAT_CONFIG_ENTRIES, POLICY_EDIT @@ -185,12 +185,12 @@ async def get(self, request: web.Request) -> NoReturn: @require_admin(perm_category=CAT_CONFIG_ENTRIES, permission="add") @RequestDataValidator( - vol.Schema( + probatio.Schema( { - vol.Required("handler"): vol.Any(str, list), - vol.Optional("entry_id"): cv.string, + probatio.Required("handler"): probatio.Any(str, list), + probatio.Optional("entry_id"): cv.string, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) ) @override @@ -329,11 +329,13 @@ class SubentryManagerFlowIndexView( @require_admin(perm_category=CAT_CONFIG_ENTRIES, permission=POLICY_EDIT) @RequestDataValidator( - vol.Schema( + probatio.Schema( { - vol.Required("handler"): vol.All(vol.Coerce(tuple), (str, str)), + probatio.Required("handler"): probatio.All( + probatio.Coerce(tuple), (str, str) + ), }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) ) @override @@ -529,9 +531,9 @@ async def config_entry_get_single( { "type": "config_entries/update", "entry_id": str, - vol.Optional("title"): str, - vol.Optional("pref_disable_new_entities"): bool, - vol.Optional("pref_disable_polling"): bool, + probatio.Optional("title"): str, + probatio.Optional("pref_disable_new_entities"): bool, + probatio.Optional("pref_disable_polling"): bool, } ) @websocket_api.async_response @@ -578,8 +580,10 @@ async def config_entry_update( "type": "config_entries/disable", "entry_id": str, # We only allow setting disabled_by user via API. - # No Enum support like this in voluptuous, use .value - "disabled_by": vol.Any(config_entries.ConfigEntryDisabler.USER.value, None), + # No Enum support like this in probatio, use .value + "disabled_by": probatio.Any( + config_entries.ConfigEntryDisabler.USER.value, None + ), } ) @websocket_api.async_response @@ -652,9 +656,9 @@ async def ignore_config_flow( @websocket_api.websocket_command( { - vol.Required("type"): "config_entries/get", - vol.Optional("type_filter"): vol.All(cv.ensure_list, [str]), - vol.Optional("domain"): str, + probatio.Required("type"): "config_entries/get", + probatio.Optional("type_filter"): probatio.All(cv.ensure_list, [str]), + probatio.Optional("domain"): str, } ) @websocket_api.async_response @@ -672,8 +676,8 @@ async def config_entries_get( @websocket_api.websocket_command( { - vol.Required("type"): "config_entries/subscribe", - vol.Optional("type_filter"): vol.All(cv.ensure_list, [str]), + probatio.Required("type"): "config_entries/subscribe", + probatio.Optional("type_filter"): probatio.All(cv.ensure_list, [str]), } ) @websocket_api.async_response @@ -802,7 +806,7 @@ async def config_subentry_list( "type": "config_entries/subentries/update", "entry_id": str, "subentry_id": str, - vol.Optional("title"): str, + probatio.Optional("title"): str, } ) @websocket_api.async_response diff --git a/homeassistant/components/config/core.py b/homeassistant/components/config/core.py index 94accda30fbdb..5c61815b3eb7b 100644 --- a/homeassistant/components/config/core.py +++ b/homeassistant/components/config/core.py @@ -3,7 +3,7 @@ from typing import Any from aiohttp import web -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.components.http import KEY_HASS, HomeAssistantView, require_admin @@ -50,21 +50,21 @@ async def post(self, request: web.Request) -> web.Response: @websocket_api.websocket_command( { "type": "config/core/update", - vol.Optional("country"): cv.country, - vol.Optional("currency"): cv.currency, - vol.Optional("elevation"): vol.Coerce(int), - vol.Optional("external_url"): vol.Any(cv.url_no_path, None), - vol.Optional("internal_url"): vol.Any(cv.url_no_path, None), - vol.Optional("language"): cv.language, - vol.Optional("latitude"): cv.latitude, - vol.Optional("location_name"): str, - vol.Optional("longitude"): cv.longitude, - vol.Optional("radius"): cv.positive_int, + probatio.Optional("country"): cv.country, + probatio.Optional("currency"): cv.currency, + probatio.Optional("elevation"): probatio.Coerce(int), + probatio.Optional("external_url"): probatio.Any(cv.url_no_path, None), + probatio.Optional("internal_url"): probatio.Any(cv.url_no_path, None), + probatio.Optional("language"): cv.language, + probatio.Optional("latitude"): cv.latitude, + probatio.Optional("location_name"): str, + probatio.Optional("longitude"): cv.longitude, + probatio.Optional("radius"): cv.positive_int, # Validated by async_set_time_zone in the executor to avoid # blocking I/O loading zoneinfo data on the event loop. - vol.Optional("time_zone"): str, - vol.Optional("update_units"): bool, - vol.Optional("unit_system"): unit_system.validate_unit_system, + probatio.Optional("time_zone"): str, + probatio.Optional("update_units"): bool, + probatio.Optional("unit_system"): unit_system.validate_unit_system, } ) @websocket_api.async_response diff --git a/homeassistant/components/config/device_registry.py b/homeassistant/components/config/device_registry.py index d5f7c843abd52..5f79bd3cdcf97 100644 --- a/homeassistant/components/config/device_registry.py +++ b/homeassistant/components/config/device_registry.py @@ -4,7 +4,7 @@ import logging from typing import Any -import voluptuous as vol +import probatio from homeassistant import loader from homeassistant.components import websocket_api @@ -35,7 +35,7 @@ def async_setup(hass: HomeAssistant) -> bool: @callback @websocket_api.websocket_command( { - vol.Required("type"): "config/device_registry/list_composite_splits", + probatio.Required("type"): "config/device_registry/list_composite_splits", } ) def websocket_list_composite_splits( @@ -74,7 +74,7 @@ def websocket_list_composite_splits( @callback @websocket_api.websocket_command( { - vol.Required("type"): "config/device_registry/list", + probatio.Required("type"): "config/device_registry/list", } ) def websocket_list_devices( @@ -104,8 +104,8 @@ def websocket_list_devices( @callback @websocket_api.websocket_command( { - vol.Required("type"): "config/device_registry/list_linked_devices", - vol.Required("device_id"): str, + probatio.Required("type"): "config/device_registry/list_linked_devices", + probatio.Required("device_id"): str, } ) def websocket_list_linked_devices( @@ -150,14 +150,16 @@ def websocket_list_linked_devices( @require_admin @websocket_api.websocket_command( { - vol.Required("type"): "config/device_registry/update", - vol.Optional("area_id"): vol.Any(str, None), - vol.Required("device_id"): str, + probatio.Required("type"): "config/device_registry/update", + probatio.Optional("area_id"): probatio.Any(str, None), + probatio.Required("device_id"): str, # We only allow setting disabled_by user via API. - # No Enum support like this in voluptuous, use .value - vol.Optional("disabled_by"): vol.Any(DeviceEntryDisabler.USER.value, None), - vol.Optional("labels"): [str], - vol.Optional("name_by_user"): vol.Any(str, None), + # No Enum support like this in probatio, use .value + probatio.Optional("disabled_by"): probatio.Any( + DeviceEntryDisabler.USER.value, None + ), + probatio.Optional("labels"): [str], + probatio.Optional("name_by_user"): probatio.Any(str, None), } ) @callback diff --git a/homeassistant/components/config/entity_registry.py b/homeassistant/components/config/entity_registry.py index 9709337994197..2b23cd2b2ef9b 100644 --- a/homeassistant/components/config/entity_registry.py +++ b/homeassistant/components/config/entity_registry.py @@ -3,7 +3,7 @@ import logging from typing import Any -import voluptuous as vol +import probatio from homeassistant import config_entries from homeassistant.components import websocket_api @@ -36,7 +36,9 @@ def async_setup(hass: HomeAssistant) -> bool: return True -@websocket_api.websocket_command({vol.Required("type"): "config/entity_registry/list"}) +@websocket_api.websocket_command( + {probatio.Required("type"): "config/entity_registry/list"} +) @callback def websocket_list_entities( hass: HomeAssistant, @@ -66,7 +68,7 @@ def websocket_list_entities( @websocket_api.websocket_command( - {vol.Required("type"): "config/entity_registry/list_for_display"} + {probatio.Required("type"): "config/entity_registry/list_for_display"} ) @callback def websocket_list_entities_for_display( @@ -95,8 +97,8 @@ def websocket_list_entities_for_display( @websocket_api.websocket_command( { - vol.Required("type"): "config/entity_registry/get", - vol.Required("entity_id"): cv.entity_id, + probatio.Required("type"): "config/entity_registry/get", + probatio.Required("entity_id"): cv.entity_id, } ) @callback @@ -124,8 +126,8 @@ def websocket_get_entity( @websocket_api.websocket_command( { - vol.Required("type"): "config/entity_registry/get_entries", - vol.Required("entity_ids"): cv.entity_ids, + probatio.Required("type"): "config/entity_registry/get_entries", + probatio.Required("entity_ids"): cv.entity_ids, } ) @callback @@ -152,11 +154,11 @@ def websocket_get_entities( @require_admin @websocket_api.websocket_command( { - vol.Required("type"): "config/entity_registry/update", - vol.Required("entity_id"): cv.entity_id, - vol.Optional("aliases"): [vol.Any(str, None)], + probatio.Required("type"): "config/entity_registry/update", + probatio.Required("entity_id"): cv.entity_id, + probatio.Optional("aliases"): [probatio.Any(str, None)], # If passed in, we update value. Passing None will remove old value. - vol.Optional("area_id"): vol.Any(str, None), + probatio.Optional("area_id"): probatio.Any(str, None), # Categories is a mapping of key/value (scope/category_id) pairs. # If passed in, we update/adjust only the provided scope(s). # Other category scopes in the entity, are left as is. @@ -166,30 +168,32 @@ def websocket_get_entities( # Therefore, passing in a category ID will either add or move # the entity to that specific category. Passing in None will # remove the entity from the category. - vol.Optional("categories"): cv.schema_with_slug_keys(vol.Any(str, None)), - vol.Optional("device_class"): vol.Any(str, None), - vol.Optional("icon"): vol.Any(str, None), - vol.Optional("labels"): [str], - vol.Optional("name"): vol.Any(str, None), - vol.Optional("new_entity_id"): str, + probatio.Optional("categories"): cv.schema_with_slug_keys( + probatio.Any(str, None) + ), + probatio.Optional("device_class"): probatio.Any(str, None), + probatio.Optional("icon"): probatio.Any(str, None), + probatio.Optional("labels"): [str], + probatio.Optional("name"): probatio.Any(str, None), + probatio.Optional("new_entity_id"): str, # We only allow setting disabled_by user via API. - vol.Optional("disabled_by"): vol.Any( + probatio.Optional("disabled_by"): probatio.Any( None, - vol.All( - vol.Coerce(er.RegistryEntryDisabler), + probatio.All( + probatio.Coerce(er.RegistryEntryDisabler), er.RegistryEntryDisabler.USER.value, ), ), # We only allow setting hidden_by user via API. - vol.Optional("hidden_by"): vol.Any( + probatio.Optional("hidden_by"): probatio.Any( None, - vol.All( - vol.Coerce(er.RegistryEntryHider), + probatio.All( + probatio.Coerce(er.RegistryEntryHider), er.RegistryEntryHider.USER.value, ), ), - vol.Inclusive("options_domain", "entity_option"): str, - vol.Inclusive("options", "entity_option"): vol.Any(None, dict), + probatio.Inclusive("options_domain", "entity_option"): str, + probatio.Inclusive("options", "entity_option"): probatio.Any(None, dict), } ) @callback @@ -304,8 +308,8 @@ def websocket_update_entity( @require_admin @websocket_api.websocket_command( { - vol.Required("type"): "config/entity_registry/remove", - vol.Required("entity_id"): cv.entity_id, + probatio.Required("type"): "config/entity_registry/remove", + probatio.Required("entity_id"): cv.entity_id, } ) @callback @@ -332,8 +336,8 @@ def websocket_remove_entity( @websocket_api.websocket_command( { - vol.Required("type"): "config/entity_registry/get_automatic_entity_ids", - vol.Required("entity_ids"): cv.entity_ids, + probatio.Required("type"): "config/entity_registry/get_automatic_entity_ids", + probatio.Required("entity_ids"): cv.entity_ids, } ) @callback @@ -368,7 +372,7 @@ def websocket_get_automatic_entity_ids( @websocket_api.websocket_command( - {vol.Required("type"): "config/entity_registry/settings/get"} + {probatio.Required("type"): "config/entity_registry/settings/get"} ) @callback def websocket_get_settings( @@ -386,14 +390,14 @@ def websocket_get_settings( @require_admin @websocket_api.websocket_command( { - vol.Required("type"): "config/entity_registry/settings/update", - vol.Optional("entity_id_parts"): vol.Any( + probatio.Required("type"): "config/entity_registry/settings/update", + probatio.Optional("entity_id_parts"): probatio.Any( None, - vol.All( - [vol.Coerce(er.EntityNamePart)], - vol.Unique(), - vol.Contains(er.EntityNamePart.ENTITY), - vol.Contains(er.EntityNamePart.DEVICE), + probatio.All( + [probatio.Coerce(er.EntityNamePart)], + probatio.Unique(), + probatio.Contains(er.EntityNamePart.ENTITY), + probatio.Contains(er.EntityNamePart.DEVICE), ), ), } diff --git a/homeassistant/components/config/floor_registry.py b/homeassistant/components/config/floor_registry.py index a4545193979f8..bfa91dd47678f 100644 --- a/homeassistant/components/config/floor_registry.py +++ b/homeassistant/components/config/floor_registry.py @@ -2,7 +2,7 @@ from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.components.websocket_api import ActiveConnection @@ -24,7 +24,7 @@ def async_setup(hass: HomeAssistant) -> bool: @websocket_api.websocket_command( { - vol.Required("type"): "config/floor_registry/list", + probatio.Required("type"): "config/floor_registry/list", } ) @callback @@ -41,11 +41,11 @@ def websocket_list_floors( @websocket_api.websocket_command( { - vol.Required("type"): "config/floor_registry/create", - vol.Required("name"): str, - vol.Optional("aliases"): list, - vol.Optional("icon"): vol.Any(str, None), - vol.Optional("level"): vol.Any(int, None), + probatio.Required("type"): "config/floor_registry/create", + probatio.Required("name"): str, + probatio.Optional("aliases"): list, + probatio.Optional("icon"): probatio.Any(str, None), + probatio.Optional("level"): probatio.Any(int, None), } ) @websocket_api.require_admin @@ -76,8 +76,8 @@ def websocket_create_floor( @websocket_api.websocket_command( { - vol.Required("type"): "config/floor_registry/delete", - vol.Required("floor_id"): str, + probatio.Required("type"): "config/floor_registry/delete", + probatio.Required("floor_id"): str, } ) @websocket_api.require_admin @@ -98,12 +98,12 @@ def websocket_delete_floor( @websocket_api.websocket_command( { - vol.Required("type"): "config/floor_registry/update", - vol.Required("floor_id"): str, - vol.Optional("aliases"): list, - vol.Optional("icon"): vol.Any(str, None), - vol.Optional("level"): vol.Any(int, None), - vol.Optional("name"): str, + probatio.Required("type"): "config/floor_registry/update", + probatio.Required("floor_id"): str, + probatio.Optional("aliases"): list, + probatio.Optional("icon"): probatio.Any(str, None), + probatio.Optional("level"): probatio.Any(int, None), + probatio.Optional("name"): str, } ) @websocket_api.require_admin @@ -134,8 +134,8 @@ def websocket_update_floor( @websocket_api.websocket_command( { - vol.Required("type"): "config/floor_registry/reorder", - vol.Required("floor_ids"): [str], + probatio.Required("type"): "config/floor_registry/reorder", + probatio.Required("floor_ids"): [str], } ) @websocket_api.require_admin diff --git a/homeassistant/components/config/label_registry.py b/homeassistant/components/config/label_registry.py index f60a3fca24536..c7e4f87b74147 100644 --- a/homeassistant/components/config/label_registry.py +++ b/homeassistant/components/config/label_registry.py @@ -2,7 +2,7 @@ from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.components.websocket_api import ActiveConnection @@ -52,7 +52,7 @@ def async_setup(hass: HomeAssistant) -> bool: @websocket_api.websocket_command( { - vol.Required("type"): "config/label_registry/list", + probatio.Required("type"): "config/label_registry/list", } ) @callback @@ -69,13 +69,13 @@ def websocket_list_labels( @websocket_api.websocket_command( { - vol.Required("type"): "config/label_registry/create", - vol.Required("name"): str, - vol.Optional("color"): vol.Any( - cv.color_hex, vol.In(SUPPORTED_LABEL_THEME_COLORS), None + probatio.Required("type"): "config/label_registry/create", + probatio.Required("name"): str, + probatio.Optional("color"): probatio.Any( + cv.color_hex, probatio.In(SUPPORTED_LABEL_THEME_COLORS), None ), - vol.Optional("description"): vol.Any(str, None), - vol.Optional("icon"): vol.Any(cv.icon, None), + probatio.Optional("description"): probatio.Any(str, None), + probatio.Optional("icon"): probatio.Any(cv.icon, None), } ) @websocket_api.require_admin @@ -100,8 +100,8 @@ def websocket_create_label( @websocket_api.websocket_command( { - vol.Required("type"): "config/label_registry/delete", - vol.Required("label_id"): str, + probatio.Required("type"): "config/label_registry/delete", + probatio.Required("label_id"): str, } ) @websocket_api.require_admin @@ -122,14 +122,14 @@ def websocket_delete_label( @websocket_api.websocket_command( { - vol.Required("type"): "config/label_registry/update", - vol.Required("label_id"): str, - vol.Optional("color"): vol.Any( - cv.color_hex, vol.In(SUPPORTED_LABEL_THEME_COLORS), None + probatio.Required("type"): "config/label_registry/update", + probatio.Required("label_id"): str, + probatio.Optional("color"): probatio.Any( + cv.color_hex, probatio.In(SUPPORTED_LABEL_THEME_COLORS), None ), - vol.Optional("description"): vol.Any(str, None), - vol.Optional("icon"): vol.Any(cv.icon, None), - vol.Optional("name"): str, + probatio.Optional("description"): probatio.Any(str, None), + probatio.Optional("icon"): probatio.Any(cv.icon, None), + probatio.Optional("name"): str, } ) @websocket_api.require_admin diff --git a/homeassistant/components/config/view.py b/homeassistant/components/config/view.py index aacb3b966caba..50d69047ff24d 100644 --- a/homeassistant/components/config/view.py +++ b/homeassistant/components/config/view.py @@ -7,7 +7,7 @@ from typing import Any, cast, override from aiohttp import web -import voluptuous as vol +import probatio from homeassistant.components.http import KEY_HASS, HomeAssistantView, require_admin from homeassistant.const import CONF_ID @@ -105,7 +105,7 @@ async def post(self, request: web.Request, config_key: str) -> web.Response: try: self.key_schema(config_key) - except vol.Invalid as err: + except probatio.Invalid as err: return self.json_message(f"Key malformed: {err}", HTTPStatus.BAD_REQUEST) hass = request.app[KEY_HASS] @@ -118,7 +118,7 @@ async def post(self, request: web.Request, config_key: str) -> web.Response: else: # We either have a data_schema or a data_validator, ignore mypy self.data_schema(data) # type: ignore[misc] - except (vol.Invalid, HomeAssistantError) as err: + except (probatio.Invalid, HomeAssistantError) as err: return self.json_message( f"Message malformed: {err}", HTTPStatus.BAD_REQUEST ) diff --git a/homeassistant/components/configurator/__init__.py b/homeassistant/components/configurator/__init__.py index e891601c0dc50..a4d9ab7fa61a0 100644 --- a/homeassistant/components/configurator/__init__.py +++ b/homeassistant/components/configurator/__init__.py @@ -12,7 +12,7 @@ import functools as ft from typing import Any -import voluptuous as vol +import probatio from homeassistant.const import EntityStateAttribute from homeassistant.core import ( @@ -203,7 +203,7 @@ def __init__(self, hass: HomeAssistant) -> None: DOMAIN, SERVICE_CONFIGURE, self.async_handle_service_call, - schema=vol.Schema({}, extra=vol.ALLOW_EXTRA), + schema=probatio.Schema({}, extra=probatio.ALLOW_EXTRA), ) @async_callback diff --git a/homeassistant/components/control4/config_flow.py b/homeassistant/components/control4/config_flow.py index 74f1c34d8224f..b128b86eb9049 100644 --- a/homeassistant/components/control4/config_flow.py +++ b/homeassistant/components/control4/config_flow.py @@ -4,10 +4,10 @@ from typing import Any, override from aiohttp.client_exceptions import ClientError +import probatio from pyControl4.account import C4Account from pyControl4.director import C4Director from pyControl4.error_handling import BadCredentials, NotFound, Unauthorized -import voluptuous as vol from homeassistant.config_entries import ( ConfigFlow, @@ -34,11 +34,11 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) @@ -167,16 +167,16 @@ async def async_step_init( if user_input is not None: return self.async_create_entry(title="", data=user_input) - data_schema = vol.Schema( + data_schema = probatio.Schema( { # Polling interval is user-configurable, which is no longer allowed # pylint: disable-next=home-assistant-config-flow-polling-field - vol.Optional( + probatio.Optional( CONF_SCAN_INTERVAL, default=self.config_entry.options.get( CONF_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL ), - ): vol.All(cv.positive_int, vol.Clamp(min=MIN_SCAN_INTERVAL)), + ): probatio.All(cv.positive_int, probatio.Clamp(min=MIN_SCAN_INTERVAL)), } ) return self.async_show_form(step_id="init", data_schema=data_schema) diff --git a/homeassistant/components/conversation/__init__.py b/homeassistant/components/conversation/__init__.py index f596838aac80b..ec1e039361407 100644 --- a/homeassistant/components/conversation/__init__.py +++ b/homeassistant/components/conversation/__init__.py @@ -5,7 +5,7 @@ from typing import Any, Literal from hassil.recognize import RecognizeResult -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigEntry from homeassistant.const import MATCH_ALL, SERVICE_RELOAD @@ -91,34 +91,34 @@ _LOGGER = logging.getLogger(__name__) -SERVICE_PROCESS_SCHEMA = vol.Schema( +SERVICE_PROCESS_SCHEMA = probatio.Schema( { - vol.Required(ATTR_TEXT): cv.string, - vol.Optional(ATTR_LANGUAGE): cv.string, - vol.Optional(ATTR_AGENT_ID): agent_id_validator, - vol.Optional(ATTR_CONVERSATION_ID): cv.string, + probatio.Required(ATTR_TEXT): cv.string, + probatio.Optional(ATTR_LANGUAGE): cv.string, + probatio.Optional(ATTR_AGENT_ID): agent_id_validator, + probatio.Optional(ATTR_CONVERSATION_ID): cv.string, } ) -SERVICE_RELOAD_SCHEMA = vol.Schema( +SERVICE_RELOAD_SCHEMA = probatio.Schema( { - vol.Optional(ATTR_LANGUAGE): cv.string, - vol.Optional(ATTR_AGENT_ID): agent_id_validator, + probatio.Optional(ATTR_LANGUAGE): cv.string, + probatio.Optional(ATTR_AGENT_ID): agent_id_validator, } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Optional(DOMAIN): vol.Schema( + probatio.Optional(DOMAIN): probatio.Schema( { - vol.Optional("intents"): vol.Schema( - {cv.string: vol.All(cv.ensure_list, [cv.string])} + probatio.Optional("intents"): probatio.Schema( + {cv.string: probatio.All(cv.ensure_list, [cv.string])} ) } ), }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/conversation/agent_manager.py b/homeassistant/components/conversation/agent_manager.py index 02dd833160f91..2b7732c038e2b 100644 --- a/homeassistant/components/conversation/agent_manager.py +++ b/homeassistant/components/conversation/agent_manager.py @@ -5,7 +5,7 @@ import logging from typing import TYPE_CHECKING, Any -import voluptuous as vol +import probatio from homeassistant.core import ( CALLBACK_TYPE, @@ -51,7 +51,7 @@ def agent_id_validator(value: Any) -> str: """Validate agent ID.""" hass = async_get_hass() if async_get_agent(hass, cv.string(value)) is None: - raise vol.Invalid("invalid agent ID") + raise probatio.Invalid("invalid agent ID") return value diff --git a/homeassistant/components/conversation/chat_log.py b/homeassistant/components/conversation/chat_log.py index f5d9879db6a54..4d47b45a68502 100644 --- a/homeassistant/components/conversation/chat_log.py +++ b/homeassistant/components/conversation/chat_log.py @@ -10,7 +10,7 @@ from pathlib import Path from typing import Any, Literal, TypedDict, cast -import voluptuous as vol +import probatio from homeassistant.core import HomeAssistant, callback from homeassistant.exceptions import HomeAssistantError, TemplateError @@ -459,7 +459,7 @@ async def async_add_assistant_content( try: tool_result = await tool_call_tasks[tool_input.id] - except (HomeAssistantError, vol.Invalid) as e: + except (HomeAssistantError, probatio.Invalid) as e: tool_result = {"error": type(e).__name__} if str(e): tool_result["error_text"] = str(e) diff --git a/homeassistant/components/conversation/http.py b/homeassistant/components/conversation/http.py index 3ebfcc711c63c..0e7d03fa47966 100644 --- a/homeassistant/components/conversation/http.py +++ b/homeassistant/components/conversation/http.py @@ -4,7 +4,7 @@ from typing import Any from aiohttp import web -import voluptuous as vol +import probatio from homeassistant.components import http, websocket_api from homeassistant.components.http.data_validator import RequestDataValidator @@ -41,13 +41,13 @@ def async_setup(hass: HomeAssistant) -> None: @websocket_api.websocket_command( { - vol.Required("type"): "conversation/process", - vol.Required("text"): str, - vol.Optional("conversation_id"): vol.Any(str, None), - vol.Optional("language"): str, - vol.Optional("agent_id"): agent_id_validator, - vol.Optional("device_id"): vol.Any(str, None), - vol.Optional("satellite_id"): vol.Any(str, None), + probatio.Required("type"): "conversation/process", + probatio.Required("text"): str, + probatio.Optional("conversation_id"): probatio.Any(str, None), + probatio.Optional("language"): str, + probatio.Optional("agent_id"): agent_id_validator, + probatio.Optional("device_id"): probatio.Any(str, None), + probatio.Optional("satellite_id"): probatio.Any(str, None), } ) @websocket_api.async_response @@ -73,8 +73,8 @@ async def websocket_process( @websocket_api.websocket_command( { "type": "conversation/prepare", - vol.Optional("language"): str, - vol.Optional("agent_id"): agent_id_validator, + probatio.Optional("language"): str, + probatio.Optional("agent_id"): agent_id_validator, } ) @websocket_api.async_response @@ -96,9 +96,9 @@ async def websocket_prepare( @websocket_api.websocket_command( { - vol.Required("type"): "conversation/agent/list", - vol.Optional("language"): str, - vol.Optional("country"): str, + probatio.Required("type"): "conversation/agent/list", + probatio.Optional("language"): str, + probatio.Optional("country"): str, } ) @websocket_api.async_response @@ -156,7 +156,7 @@ async def websocket_list_agents( @websocket_api.websocket_command( { - vol.Required("type"): "conversation/sentences/list", + probatio.Required("type"): "conversation/sentences/list", } ) @websocket_api.require_admin @@ -172,10 +172,10 @@ async def websocket_list_sentences( @websocket_api.websocket_command( { - vol.Required("type"): "conversation/agent/homeassistant/debug", - vol.Required("sentences"): [str], - vol.Optional("language"): str, - vol.Optional("device_id"): vol.Any(str, None), + probatio.Required("type"): "conversation/agent/homeassistant/debug", + probatio.Required("sentences"): [str], + probatio.Optional("language"): str, + probatio.Optional("device_id"): probatio.Any(str, None), } ) @websocket_api.async_response @@ -206,9 +206,9 @@ async def websocket_hass_agent_debug( @websocket_api.websocket_command( { - vol.Required("type"): "conversation/agent/homeassistant/language_scores", - vol.Optional("language"): str, - vol.Optional("country"): str, + probatio.Required("type"): "conversation/agent/homeassistant/language_scores", + probatio.Optional("language"): str, + probatio.Optional("country"): str, } ) @websocket_api.async_response @@ -244,14 +244,14 @@ class ConversationProcessView(http.HomeAssistantView): name = "api:conversation:process" @RequestDataValidator( - vol.Schema( + probatio.Schema( { - vol.Required("text"): str, - vol.Optional("conversation_id"): str, - vol.Optional("language"): str, - vol.Optional("agent_id"): agent_id_validator, - vol.Optional("device_id"): vol.Any(str, None), - vol.Optional("satellite_id"): vol.Any(str, None), + probatio.Required("text"): str, + probatio.Optional("conversation_id"): str, + probatio.Optional("language"): str, + probatio.Optional("agent_id"): agent_id_validator, + probatio.Optional("device_id"): probatio.Any(str, None), + probatio.Optional("satellite_id"): probatio.Any(str, None), } ) ) @@ -275,8 +275,8 @@ async def post(self, request: web.Request, data: dict[str, str]) -> web.Response @websocket_api.websocket_command( { - vol.Required("type"): "conversation/chat_log/subscribe", - vol.Required("conversation_id"): str, + probatio.Required("type"): "conversation/chat_log/subscribe", + probatio.Required("conversation_id"): str, } ) @websocket_api.require_admin @@ -337,7 +337,7 @@ def forward_events(conversation_id: str, event_type: str, data: dict) -> None: @websocket_api.websocket_command( { - vol.Required("type"): "conversation/chat_log/subscribe_index", + probatio.Required("type"): "conversation/chat_log/subscribe_index", } ) @websocket_api.require_admin diff --git a/homeassistant/components/conversation/trigger.py b/homeassistant/components/conversation/trigger.py index 31ac35cb756c8..d8bbb7b5c14b0 100644 --- a/homeassistant/components/conversation/trigger.py +++ b/homeassistant/components/conversation/trigger.py @@ -13,7 +13,7 @@ PUNCTUATION_START, PUNCTUATION_START_WORD, ) -import voluptuous as vol +import probatio from homeassistant.const import CONF_COMMAND, CONF_PLATFORM from homeassistant.core import CALLBACK_TYPE, HassJob, HomeAssistant @@ -42,7 +42,7 @@ def has_no_punctuation(value: list[str]) -> list[str]: or PUNCTUATION_START_WORD.search(sentence) or PUNCTUATION_END_WORD.search(sentence) ): - raise vol.Invalid("sentence should not contain punctuation") + raise probatio.Invalid("sentence should not contain punctuation") return value @@ -58,26 +58,26 @@ def is_valid_sentence(value: list[str]) -> list[str]: try: parse_sentence(sentence) except ParseError as err: - raise vol.Invalid(f"invalid sentence: {err}") from err + raise probatio.Invalid(f"invalid sentence: {err}") from err return value def has_one_non_empty_item(value: list[str]) -> list[str]: """Validate result has at least one item.""" if len(value) < 1: - raise vol.Invalid("at least one sentence is required") + raise probatio.Invalid("at least one sentence is required") for sentence in value: if not sentence: - raise vol.Invalid(f"sentence too short: '{sentence}'") + raise probatio.Invalid(f"sentence too short: '{sentence}'") return value TRIGGER_SCHEMA = cv.TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_PLATFORM): DOMAIN, - vol.Required(CONF_COMMAND): vol.All( + probatio.Required(CONF_PLATFORM): DOMAIN, + probatio.Required(CONF_COMMAND): probatio.All( cv.ensure_list, [cv.string], has_one_non_empty_item, diff --git a/homeassistant/components/cookidoo/config_flow.py b/homeassistant/components/cookidoo/config_flow.py index 17952f35e3a94..569d04810c40f 100644 --- a/homeassistant/components/cookidoo/config_flow.py +++ b/homeassistant/components/cookidoo/config_flow.py @@ -10,7 +10,7 @@ get_country_options, get_localization_options, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_RECONFIGURE, @@ -35,13 +35,13 @@ _LOGGER = logging.getLogger(__name__) AUTH_DATA_SCHEMA = { - vol.Required(CONF_EMAIL): TextSelector( + probatio.Required(CONF_EMAIL): TextSelector( TextSelectorConfig( type=TextSelectorType.EMAIL, autocomplete="email", ), ), - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", @@ -99,7 +99,7 @@ async def async_step_user( return self.async_show_form( step_id="user", data_schema=self.add_suggested_values_to_schema( - data_schema=vol.Schema( + data_schema=probatio.Schema( {**AUTH_DATA_SCHEMA, **self.COUNTRY_DATA_SCHEMA} ), suggested_values=suggested_values, @@ -134,7 +134,7 @@ async def async_step_language( await self.generate_language_schema() return self.async_show_form( step_id="language", - data_schema=vol.Schema(self.LANGUAGE_DATA_SCHEMA), + data_schema=probatio.Schema(self.LANGUAGE_DATA_SCHEMA), description_placeholders={"cookidoo": "Cookidoo"}, errors=errors, ) @@ -165,7 +165,7 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", data_schema=self.add_suggested_values_to_schema( - data_schema=vol.Schema(AUTH_DATA_SCHEMA), + data_schema=probatio.Schema(AUTH_DATA_SCHEMA), suggested_values={CONF_EMAIL: reauth_entry.data[CONF_EMAIL]}, ), description_placeholders={"cookidoo": "Cookidoo"}, @@ -175,7 +175,7 @@ async def async_step_reauth_confirm( async def generate_country_schema(self) -> None: """Generate country schema.""" self.COUNTRY_DATA_SCHEMA = { - vol.Required(CONF_COUNTRY): CountrySelector( + probatio.Required(CONF_COUNTRY): CountrySelector( CountrySelectorConfig( countries=[ country.upper() for country in await get_country_options() @@ -187,7 +187,7 @@ async def generate_country_schema(self) -> None: async def generate_language_schema(self) -> None: """Generate language schema.""" self.LANGUAGE_DATA_SCHEMA = { - vol.Required(CONF_LANGUAGE): LanguageSelector( + probatio.Required(CONF_LANGUAGE): LanguageSelector( LanguageSelectorConfig( languages=[ option.language diff --git a/homeassistant/components/coolmaster/config_flow.py b/homeassistant/components/coolmaster/config_flow.py index 66949f2c9ab84..2b76b5c026e4c 100644 --- a/homeassistant/components/coolmaster/config_flow.py +++ b/homeassistant/components/coolmaster/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from pycoolmasternet_async import CoolMasterNet -import voluptuous as vol from homeassistant.components.climate import HVACMode from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -29,17 +29,17 @@ HVACMode.FAN_ONLY.value, ] -MODES_SCHEMA = {vol.Required(mode, default=True): bool for mode in AVAILABLE_MODES} +MODES_SCHEMA = {probatio.Required(mode, default=True): bool for mode in AVAILABLE_MODES} -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, + probatio.Required(CONF_HOST): str, **MODES_SCHEMA, - vol.Required(CONF_SWING_SUPPORT, default=False): bool, - vol.Required(CONF_MORE_OPTIONS): section( - vol.Schema( + probatio.Required(CONF_SWING_SUPPORT, default=False): bool, + probatio.Required(CONF_MORE_OPTIONS): section( + probatio.Schema( { - vol.Required(CONF_SEND_WAKEUP_PROMPT, default=False): bool, + probatio.Required(CONF_SEND_WAKEUP_PROMPT, default=False): bool, } ), SectionConfig(collapsed=True), diff --git a/homeassistant/components/counter/__init__.py b/homeassistant/components/counter/__init__.py index 029a6fd58d96b..35a187cbc6a38 100644 --- a/homeassistant/components/counter/__init__.py +++ b/homeassistant/components/counter/__init__.py @@ -3,7 +3,7 @@ import logging from typing import Any, Self, override -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_ICON, @@ -48,13 +48,17 @@ STORAGE_VERSION = 1 STORAGE_FIELDS: VolDictType = { - vol.Optional(CONF_ICON): cv.icon, - vol.Optional(CONF_INITIAL, default=DEFAULT_INITIAL): vol.Coerce(int), - vol.Required(CONF_NAME): vol.All(cv.string, vol.Length(min=1)), - vol.Optional(CONF_MAXIMUM, default=None): vol.Any(None, vol.Coerce(int)), - vol.Optional(CONF_MINIMUM, default=None): vol.Any(None, vol.Coerce(int)), - vol.Optional(CONF_RESTORE, default=True): cv.boolean, - vol.Optional(CONF_STEP, default=DEFAULT_STEP): cv.positive_int, + probatio.Optional(CONF_ICON): cv.icon, + probatio.Optional(CONF_INITIAL, default=DEFAULT_INITIAL): probatio.Coerce(int), + probatio.Required(CONF_NAME): probatio.All(cv.string, probatio.Length(min=1)), + probatio.Optional(CONF_MAXIMUM, default=None): probatio.Any( + None, probatio.Coerce(int) + ), + probatio.Optional(CONF_MINIMUM, default=None): probatio.Any( + None, probatio.Coerce(int) + ), + probatio.Optional(CONF_RESTORE, default=True): cv.boolean, + probatio.Optional(CONF_STEP, default=DEFAULT_STEP): cv.positive_int, } @@ -64,30 +68,30 @@ def _none_to_empty_dict[_T](value: _T | None) -> _T | dict[str, Any]: return value -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { DOMAIN: cv.schema_with_slug_keys( - vol.All( + probatio.All( _none_to_empty_dict, { - vol.Optional(CONF_ICON): cv.icon, - vol.Optional(CONF_INITIAL, default=DEFAULT_INITIAL): vol.Coerce( - int + probatio.Optional(CONF_ICON): cv.icon, + probatio.Optional( + CONF_INITIAL, default=DEFAULT_INITIAL + ): probatio.Coerce(int), + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_MAXIMUM, default=None): probatio.Any( + None, probatio.Coerce(int) ), - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_MAXIMUM, default=None): vol.Any( - None, vol.Coerce(int) + probatio.Optional(CONF_MINIMUM, default=None): probatio.Any( + None, probatio.Coerce(int) ), - vol.Optional(CONF_MINIMUM, default=None): vol.Any( - None, vol.Coerce(int) - ), - vol.Optional(CONF_RESTORE, default=True): cv.boolean, - vol.Optional(CONF_STEP, default=DEFAULT_STEP): cv.positive_int, + probatio.Optional(CONF_RESTORE, default=True): cv.boolean, + probatio.Optional(CONF_STEP, default=DEFAULT_STEP): cv.positive_int, }, ) ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) @@ -125,7 +129,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: component.async_register_entity_service(SERVICE_RESET, None, "async_reset") component.async_register_entity_service( SERVICE_SET_VALUE, - {vol.Required(VALUE): vol.Coerce(int)}, + {probatio.Required(VALUE): probatio.Coerce(int)}, "async_set_value", ) @@ -135,7 +139,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: class CounterStorageCollection(collection.DictStorageCollection): """Input storage based collection.""" - CREATE_UPDATE_SCHEMA = vol.Schema(STORAGE_FIELDS) + CREATE_UPDATE_SCHEMA = probatio.Schema(STORAGE_FIELDS) @override async def _process_create_data(self, data: dict) -> dict: diff --git a/homeassistant/components/cover/__init__.py b/homeassistant/components/cover/__init__.py index d7bdf90324c9d..7a4a23b61cc2a 100644 --- a/homeassistant/components/cover/__init__.py +++ b/homeassistant/components/cover/__init__.py @@ -6,8 +6,8 @@ import logging from typing import Any, final, override +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( @@ -58,7 +58,7 @@ PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE SCAN_INTERVAL = timedelta(seconds=15) -DEVICE_CLASSES_SCHEMA = vol.All(vol.Lower, vol.Coerce(CoverDeviceClass)) +DEVICE_CLASSES_SCHEMA = probatio.All(probatio.Lower, probatio.Coerce(CoverDeviceClass)) DEVICE_CLASSES = [cls.value for cls in CoverDeviceClass] # mypy: disallow-any-generics @@ -110,14 +110,14 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: component.async_register_entity_service( SERVICE_OPEN_COVER, - {vol.Optional(ATTR_SPEED): cv.string}, + {probatio.Optional(ATTR_SPEED): cv.string}, "async_handle_open_cover", [CoverEntityFeature.OPEN], ) component.async_register_entity_service( SERVICE_CLOSE_COVER, - {vol.Optional(ATTR_SPEED): cv.string}, + {probatio.Optional(ATTR_SPEED): cv.string}, "async_handle_close_cover", [CoverEntityFeature.CLOSE], ) @@ -125,10 +125,10 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: component.async_register_entity_service( SERVICE_SET_COVER_POSITION, { - vol.Required(ATTR_POSITION): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) + probatio.Required(ATTR_POSITION): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) ), - vol.Optional(ATTR_SPEED): cv.string, + probatio.Optional(ATTR_SPEED): cv.string, }, "async_handle_set_cover_position", [CoverEntityFeature.SET_POSITION], @@ -169,8 +169,8 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: component.async_register_entity_service( SERVICE_SET_COVER_TILT_POSITION, { - vol.Required(ATTR_TILT_POSITION): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) + probatio.Required(ATTR_TILT_POSITION): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) ) }, "async_set_cover_tilt_position", diff --git a/homeassistant/components/cover/device_action.py b/homeassistant/components/cover/device_action.py index a7f7213ef9159..53a970b885270 100644 --- a/homeassistant/components/cover/device_action.py +++ b/homeassistant/components/cover/device_action.py @@ -1,6 +1,6 @@ """Provides device automations for Cover.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import async_validate_entity_schema from homeassistant.const import ( @@ -29,22 +29,22 @@ CMD_ACTION_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): vol.In(CMD_ACTION_TYPES), - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In(CMD_ACTION_TYPES), + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, } ) POSITION_ACTION_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): vol.In(POSITION_ACTION_TYPES), - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Optional("position", default=0): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) + probatio.Required(CONF_TYPE): probatio.In(POSITION_ACTION_TYPES), + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Optional("position", default=0): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) ), } ) -_ACTION_SCHEMA = vol.Any(CMD_ACTION_SCHEMA, POSITION_ACTION_SCHEMA) +_ACTION_SCHEMA = probatio.Any(CMD_ACTION_SCHEMA, POSITION_ACTION_SCHEMA) async def async_validate_action_config( @@ -96,16 +96,16 @@ async def async_get_actions( async def async_get_action_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List action capabilities.""" if config[CONF_TYPE] not in POSITION_ACTION_TYPES: return {} return { - "extra_fields": vol.Schema( + "extra_fields": probatio.Schema( { - vol.Optional(ATTR_POSITION, default=0): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) + probatio.Optional(ATTR_POSITION, default=0): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) ) } ) diff --git a/homeassistant/components/cover/device_condition.py b/homeassistant/components/cover/device_condition.py index 8c3f7b854989f..74a0edd36915a 100644 --- a/homeassistant/components/cover/device_condition.py +++ b/homeassistant/components/cover/device_condition.py @@ -1,6 +1,6 @@ """Provides device automations for Cover.""" -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_ABOVE, @@ -28,16 +28,16 @@ POSITION_CONDITION_TYPES = {"is_position", "is_tilt_position"} STATE_CONDITION_TYPES = {"is_open", "is_closed", "is_opening", "is_closing"} -POSITION_CONDITION_SCHEMA = vol.All( +POSITION_CONDITION_SCHEMA = probatio.All( DEVICE_CONDITION_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In(POSITION_CONDITION_TYPES), - vol.Optional(CONF_ABOVE): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In(POSITION_CONDITION_TYPES), + probatio.Optional(CONF_ABOVE): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) ), - vol.Optional(CONF_BELOW): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) + probatio.Optional(CONF_BELOW): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) ), } ), @@ -46,12 +46,12 @@ STATE_CONDITION_SCHEMA = DEVICE_CONDITION_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In(STATE_CONDITION_TYPES), + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In(STATE_CONDITION_TYPES), } ) -CONDITION_SCHEMA = vol.Any(POSITION_CONDITION_SCHEMA, STATE_CONDITION_SCHEMA) +CONDITION_SCHEMA = probatio.Any(POSITION_CONDITION_SCHEMA, STATE_CONDITION_SCHEMA) async def async_get_conditions( @@ -93,19 +93,19 @@ async def async_get_conditions( async def async_get_condition_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List condition capabilities.""" if config[CONF_TYPE] not in ["is_position", "is_tilt_position"]: return {} return { - "extra_fields": vol.Schema( + "extra_fields": probatio.Schema( { - vol.Optional(CONF_ABOVE, default=0): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) + probatio.Optional(CONF_ABOVE, default=0): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) ), - vol.Optional(CONF_BELOW, default=100): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) + probatio.Optional(CONF_BELOW, default=100): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) ), } ) diff --git a/homeassistant/components/cover/device_trigger.py b/homeassistant/components/cover/device_trigger.py index a7cd60b21834a..8b2f25d7ab357 100644 --- a/homeassistant/components/cover/device_trigger.py +++ b/homeassistant/components/cover/device_trigger.py @@ -1,6 +1,6 @@ """Provides device automations for Cover.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import DEVICE_TRIGGER_BASE_SCHEMA from homeassistant.components.homeassistant.triggers import ( @@ -29,16 +29,16 @@ POSITION_TRIGGER_TYPES = {"position", "tilt_position"} STATE_TRIGGER_TYPES = {"opened", "closed", "opening", "closing"} -POSITION_TRIGGER_SCHEMA = vol.All( +POSITION_TRIGGER_SCHEMA = probatio.All( DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In(POSITION_TRIGGER_TYPES), - vol.Optional(CONF_ABOVE): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In(POSITION_TRIGGER_TYPES), + probatio.Optional(CONF_ABOVE): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) ), - vol.Optional(CONF_BELOW): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) + probatio.Optional(CONF_BELOW): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) ), } ), @@ -47,13 +47,13 @@ STATE_TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In(STATE_TRIGGER_TYPES), - vol.Optional(CONF_FOR): cv.positive_time_period_dict, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In(STATE_TRIGGER_TYPES), + probatio.Optional(CONF_FOR): cv.positive_time_period_dict, } ) -TRIGGER_SCHEMA = vol.Any(POSITION_TRIGGER_SCHEMA, STATE_TRIGGER_SCHEMA) +TRIGGER_SCHEMA = probatio.Any(POSITION_TRIGGER_SCHEMA, STATE_TRIGGER_SCHEMA) async def async_get_triggers( @@ -109,23 +109,23 @@ async def async_get_triggers( async def async_get_trigger_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List trigger capabilities.""" if config[CONF_TYPE] not in POSITION_TRIGGER_TYPES: return { - "extra_fields": vol.Schema( - {vol.Optional(CONF_FOR): cv.positive_time_period_dict} + "extra_fields": probatio.Schema( + {probatio.Optional(CONF_FOR): cv.positive_time_period_dict} ) } return { - "extra_fields": vol.Schema( + "extra_fields": probatio.Schema( { - vol.Optional(CONF_ABOVE, default=0): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) + probatio.Optional(CONF_ABOVE, default=0): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) ), - vol.Optional(CONF_BELOW, default=100): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) + probatio.Optional(CONF_BELOW, default=100): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) ), } ) diff --git a/homeassistant/components/cppm_tracker/device_tracker.py b/homeassistant/components/cppm_tracker/device_tracker.py index 05b294f96d830..72c180020fdd6 100644 --- a/homeassistant/components/cppm_tracker/device_tracker.py +++ b/homeassistant/components/cppm_tracker/device_tracker.py @@ -5,7 +5,7 @@ from typing import override from clearpasspy import ClearPass -import voluptuous as vol +import probatio from homeassistant.components.device_tracker import ( DOMAIN as DEVICE_TRACKER_DOMAIN, @@ -23,9 +23,9 @@ PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_CLIENT_ID): cv.string, - vol.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_CLIENT_ID): cv.string, + probatio.Required(CONF_API_KEY): cv.string, } ) diff --git a/homeassistant/components/crownstone/config_flow.py b/homeassistant/components/crownstone/config_flow.py index 311d5a3eda3c5..4eed49bd76778 100644 --- a/homeassistant/components/crownstone/config_flow.py +++ b/homeassistant/components/crownstone/config_flow.py @@ -8,7 +8,7 @@ CrownstoneAuthenticationError, CrownstoneUnknownError, ) -import voluptuous as vol +import probatio from homeassistant.components import usb from homeassistant.config_entries import ( @@ -86,8 +86,8 @@ async def async_step_usb_config( return self.async_show_form( step_id="usb_config", - data_schema=vol.Schema( - {vol.Required(CONF_USB_PATH): vol.In(ports_as_string)} + data_schema=probatio.Schema( + {probatio.Required(CONF_USB_PATH): probatio.In(ports_as_string)} ), ) @@ -98,7 +98,9 @@ async def async_step_usb_manual_config( if user_input is None: return self.async_show_form( step_id="usb_manual_config", - data_schema=vol.Schema({vol.Required(CONF_USB_MANUAL_PATH): str}), + data_schema=probatio.Schema( + {probatio.Required(CONF_USB_MANUAL_PATH): str} + ), ) self.usb_path = user_input[CONF_USB_MANUAL_PATH] @@ -117,7 +119,9 @@ async def async_step_usb_sphere_config( if user_input is None and sphere_id is None: return self.async_show_form( step_id="usb_sphere_config", - data_schema=vol.Schema({CONF_USB_SPHERE: vol.In(spheres.keys())}), + data_schema=probatio.Schema( + {CONF_USB_SPHERE: probatio.In(spheres.keys())} + ), ) if sphere_id: @@ -156,8 +160,11 @@ async def async_step_user( if user_input is None: return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_EMAIL): str, vol.Required(CONF_PASSWORD): str} + data_schema=probatio.Schema( + { + probatio.Required(CONF_EMAIL): str, + probatio.Required(CONF_PASSWORD): str, + } ), ) @@ -181,8 +188,11 @@ async def async_step_user( if errors: return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_EMAIL): str, vol.Required(CONF_PASSWORD): str} + data_schema=probatio.Schema( + { + probatio.Required(CONF_EMAIL): str, + probatio.Required(CONF_PASSWORD): str, + } ), errors=errors, ) @@ -225,16 +235,16 @@ async def async_step_init( usb_path = self.config_entry.options.get(CONF_USB_PATH) usb_sphere = self.config_entry.options.get(CONF_USB_SPHERE) - options_schema = vol.Schema( - {vol.Optional(CONF_USE_USB_OPTION, default=usb_path is not None): bool} + options_schema = probatio.Schema( + {probatio.Optional(CONF_USE_USB_OPTION, default=usb_path is not None): bool} ) if usb_path is not None and len(spheres) > 1: options_schema = options_schema.extend( { - vol.Optional( + probatio.Optional( CONF_USB_SPHERE_OPTION, default=self.cloud.cloud_data.data[usb_sphere].name, - ): vol.In(spheres.keys()) + ): probatio.In(spheres.keys()) } ) diff --git a/homeassistant/components/currencylayer/sensor.py b/homeassistant/components/currencylayer/sensor.py index c88e586d55e84..37d3ffead7ba9 100644 --- a/homeassistant/components/currencylayer/sensor.py +++ b/homeassistant/components/currencylayer/sensor.py @@ -3,8 +3,8 @@ from datetime import timedelta import logging +import probatio import requests -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -27,10 +27,10 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_API_KEY): cv.string, - vol.Required(CONF_QUOTE): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(CONF_BASE, default=DEFAULT_BASE): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_QUOTE): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(CONF_BASE, default=DEFAULT_BASE): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/cync/config_flow.py b/homeassistant/components/cync/config_flow.py index 05e807afa3852..2ca846564d3d0 100644 --- a/homeassistant/components/cync/config_flow.py +++ b/homeassistant/components/cync/config_flow.py @@ -4,9 +4,9 @@ import logging from typing import Any, override +import probatio from pycync import Auth from pycync.exceptions import AuthFailedError, CyncError, TwoFactorRequiredError -import voluptuous as vol from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_ACCESS_TOKEN, CONF_EMAIL, CONF_PASSWORD @@ -23,14 +23,14 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_EMAIL): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_EMAIL): str, + probatio.Required(CONF_PASSWORD): str, } ) -STEP_TWO_FACTOR_SCHEMA = vol.Schema({vol.Required(CONF_TWO_FACTOR_CODE): str}) +STEP_TWO_FACTOR_SCHEMA = probatio.Schema({probatio.Required(CONF_TWO_FACTOR_CODE): str}) class CyncConfigFlow(ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/components/daikin/config_flow.py b/homeassistant/components/daikin/config_flow.py index 265f6f9240e60..639e74ad76693 100644 --- a/homeassistant/components/daikin/config_flow.py +++ b/homeassistant/components/daikin/config_flow.py @@ -6,11 +6,11 @@ from uuid import uuid4 from aiohttp import ClientError, web_exceptions +import probatio from pydaikin.daikin_base import Appliance from pydaikin.discovery import Discovery from pydaikin.exceptions import DaikinException from pydaikin.factory import DaikinFactory -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY, CONF_HOST, CONF_PASSWORD, CONF_UUID @@ -33,13 +33,13 @@ def __init__(self) -> None: self.host: str | None = None @property - def schema(self) -> vol.Schema: + def schema(self) -> probatio.Schema: """Return current schema.""" - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_HOST, default=self.host): str, - vol.Optional(CONF_API_KEY): str, - vol.Optional(CONF_PASSWORD): str, + probatio.Required(CONF_HOST, default=self.host): str, + probatio.Optional(CONF_API_KEY): str, + probatio.Optional(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/danfoss_air/__init__.py b/homeassistant/components/danfoss_air/__init__.py index d7c16d5da098b..f8d73b49f2a6e 100644 --- a/homeassistant/components/danfoss_air/__init__.py +++ b/homeassistant/components/danfoss_air/__init__.py @@ -3,9 +3,9 @@ from datetime import timedelta import logging +import probatio from pydanfossair.commands import ReadCommand from pydanfossair.danfossclient import DanfossClient -import voluptuous as vol from homeassistant.const import CONF_HOST, Platform from homeassistant.core import HomeAssistant @@ -20,8 +20,9 @@ MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=60) -CONFIG_SCHEMA = vol.Schema( - {DOMAIN: vol.Schema({vol.Required(CONF_HOST): cv.string})}, extra=vol.ALLOW_EXTRA +CONFIG_SCHEMA = probatio.Schema( + {DOMAIN: probatio.Schema({probatio.Required(CONF_HOST): cv.string})}, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/data_grand_lyon/config_flow.py b/homeassistant/components/data_grand_lyon/config_flow.py index 97b1df9f5e5b1..f93cc8c1d7911 100644 --- a/homeassistant/components/data_grand_lyon/config_flow.py +++ b/homeassistant/components/data_grand_lyon/config_flow.py @@ -13,7 +13,7 @@ find_tcl_park_and_ride_by_id, find_tcl_stop_by_id, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -45,16 +45,16 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) -STEP_RECONFIGURE_SCHEMA = vol.Schema( +STEP_RECONFIGURE_SCHEMA = probatio.Schema( { - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ) @@ -215,9 +215,9 @@ async def async_step_user( self._stops, key=lambda s: (s.nom, s.commune or "", s.id or 0) ) ] - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required(CONF_STOP_ID): SelectSelector( + probatio.Required(CONF_STOP_ID): SelectSelector( SelectSelectorConfig( options=options, mode=SelectSelectorMode.DROPDOWN, @@ -244,9 +244,9 @@ async def async_step_pick_line( ) options = self._selected_stop.desserte if self._selected_stop else [] - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required(CONF_LINE): SelectSelector( + probatio.Required(CONF_LINE): SelectSelector( SelectSelectorConfig( options=options, mode=SelectSelectorMode.DROPDOWN, @@ -349,9 +349,9 @@ async def async_step_user( key=lambda s: (s.name, s.commune or "", s.number or 0), ) ] - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required(CONF_STATION_ID): SelectSelector( + probatio.Required(CONF_STATION_ID): SelectSelector( SelectSelectorConfig( options=options, mode=SelectSelectorMode.DROPDOWN, @@ -438,9 +438,9 @@ async def async_step_user( SelectOptionDict(value=park.id, label=_park_and_ride_label(park)) for park in sorted(self._parks, key=lambda p: (p.nom, p.id)) ] - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required(CONF_PARK_ID): SelectSelector( + probatio.Required(CONF_PARK_ID): SelectSelector( SelectSelectorConfig( options=options, mode=SelectSelectorMode.DROPDOWN, diff --git a/homeassistant/components/datadog/config_flow.py b/homeassistant/components/datadog/config_flow.py index bf2d29bce2a72..f7f9dbf72ad97 100644 --- a/homeassistant/components/datadog/config_flow.py +++ b/homeassistant/components/datadog/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from datadog import DogStatsd -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -60,12 +60,12 @@ async def async_step_user( ) return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST, default=DEFAULT_HOST): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, - vol.Required(CONF_PREFIX, default=DEFAULT_PREFIX): str, - vol.Required(CONF_RATE, default=DEFAULT_RATE): int, + probatio.Required(CONF_HOST, default=DEFAULT_HOST): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Required(CONF_PREFIX, default=DEFAULT_PREFIX): str, + probatio.Required(CONF_RATE, default=DEFAULT_RATE): int, } ), errors=errors, @@ -93,15 +93,15 @@ async def async_step_init( if user_input is None: return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_PREFIX, default=options.get( CONF_PREFIX, data.get(CONF_PREFIX, DEFAULT_PREFIX) ), ): str, - vol.Required( + probatio.Required( CONF_RATE, default=options.get( CONF_RATE, data.get(CONF_RATE, DEFAULT_RATE) @@ -127,10 +127,10 @@ async def async_step_init( errors["base"] = "cannot_connect" return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PREFIX, default=options[CONF_PREFIX]): str, - vol.Required(CONF_RATE, default=options[CONF_RATE]): int, + probatio.Required(CONF_PREFIX, default=options[CONF_PREFIX]): str, + probatio.Required(CONF_RATE, default=options[CONF_RATE]): int, } ), errors=errors, diff --git a/homeassistant/components/date/__init__.py b/homeassistant/components/date/__init__.py index 2f96f1aedae21..a1a2e8cb0f487 100644 --- a/homeassistant/components/date/__init__.py +++ b/homeassistant/components/date/__init__.py @@ -4,8 +4,8 @@ import logging from typing import final, override +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.config_entries import ConfigEntry from homeassistant.const import ATTR_DATE @@ -43,7 +43,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: await component.async_setup(config) component.async_register_entity_service( - SERVICE_SET_VALUE, {vol.Required(ATTR_DATE): cv.date}, _async_set_value + SERVICE_SET_VALUE, {probatio.Required(ATTR_DATE): cv.date}, _async_set_value ) return True diff --git a/homeassistant/components/datetime/__init__.py b/homeassistant/components/datetime/__init__.py index 07b34045b1d82..b5c4f7df94504 100644 --- a/homeassistant/components/datetime/__init__.py +++ b/homeassistant/components/datetime/__init__.py @@ -4,8 +4,8 @@ import logging from typing import final, override +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant, ServiceCall @@ -48,7 +48,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: component.async_register_entity_service( SERVICE_SET_VALUE, { - vol.Required(ATTR_DATETIME): cv.datetime, + probatio.Required(ATTR_DATETIME): cv.datetime, }, _async_set_value, ) diff --git a/homeassistant/components/ddwrt/device_tracker.py b/homeassistant/components/ddwrt/device_tracker.py index cc05867a00332..14fd29fcd037f 100644 --- a/homeassistant/components/ddwrt/device_tracker.py +++ b/homeassistant/components/ddwrt/device_tracker.py @@ -5,8 +5,8 @@ import re from typing import override +import probatio import requests -import voluptuous as vol from homeassistant.components.device_tracker import ( DOMAIN as DEVICE_TRACKER_DOMAIN, @@ -36,12 +36,14 @@ PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Required(CONF_USERNAME): cv.string, - vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, - vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, - vol.Optional(CONF_WIRELESS_ONLY, default=DEFAULT_WIRELESS_ONLY): cv.boolean, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, + probatio.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, + probatio.Optional( + CONF_WIRELESS_ONLY, default=DEFAULT_WIRELESS_ONLY + ): cv.boolean, } ) diff --git a/homeassistant/components/debugpy/__init__.py b/homeassistant/components/debugpy/__init__.py index 4ed32cac83450..0e10121ea0639 100644 --- a/homeassistant/components/debugpy/__init__.py +++ b/homeassistant/components/debugpy/__init__.py @@ -5,7 +5,7 @@ from threading import Thread import debugpy # noqa: T100 -import voluptuous as vol +import probatio from homeassistant.const import CONF_HOST, CONF_PORT from homeassistant.core import HomeAssistant, ServiceCall @@ -18,18 +18,18 @@ CONF_WAIT = "wait" SERVICE_START = "start" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Optional(CONF_HOST, default="0.0.0.0"): cv.string, - vol.Optional(CONF_PORT, default=5678): cv.port, - vol.Optional(CONF_START, default=True): cv.boolean, - vol.Optional(CONF_WAIT, default=False): cv.boolean, + probatio.Optional(CONF_HOST, default="0.0.0.0"): cv.string, + probatio.Optional(CONF_PORT, default=5678): cv.port, + probatio.Optional(CONF_START, default=True): cv.boolean, + probatio.Optional(CONF_WAIT, default=False): cv.boolean, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) _LOGGER = logging.getLogger(__name__) @@ -72,7 +72,7 @@ def waitfor(): ) async_register_admin_service( - hass, DOMAIN, SERVICE_START, debug_start, schema=vol.Schema({}) + hass, DOMAIN, SERVICE_START, debug_start, schema=probatio.Schema({}) ) # If set to start the debugger on startup, do so diff --git a/homeassistant/components/deconz/config_flow.py b/homeassistant/components/deconz/config_flow.py index 9f07fd329a806..337ca73cd0493 100644 --- a/homeassistant/components/deconz/config_flow.py +++ b/homeassistant/components/deconz/config_flow.py @@ -7,6 +7,7 @@ from typing import Any, cast, override from urllib.parse import urlparse +import probatio from pydeconz.errors import LinkButtonNotPressed, RequestError, ResponseError from pydeconz.gateway import DeconzSession from pydeconz.utils import ( @@ -15,7 +16,6 @@ get_bridge_id as deconz_get_bridge_id, normalize_bridge_id, ) -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_HASSIO, @@ -113,7 +113,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Optional(CONF_HOST): vol.In(hosts)}), + data_schema=probatio.Schema( + {probatio.Optional(CONF_HOST): probatio.In(hosts)} + ), ) return await self.async_step_manual_input() @@ -129,10 +131,10 @@ async def async_step_manual_input( return self.async_show_form( step_id="manual_input", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, } ), ) @@ -317,7 +319,7 @@ async def async_step_deconz_devices( (CONF_ALLOW_NEW_DEVICES, DEFAULT_ALLOW_NEW_DEVICES), ): schema_options[ - vol.Optional( + probatio.Optional( option, default=self.config_entry.options.get(option, default), ) @@ -325,5 +327,5 @@ async def async_step_deconz_devices( return self.async_show_form( step_id="deconz_devices", - data_schema=vol.Schema(schema_options), + data_schema=probatio.Schema(schema_options), ) diff --git a/homeassistant/components/deconz/device_trigger.py b/homeassistant/components/deconz/device_trigger.py index 58e4b64999797..88f7ca39fd88e 100644 --- a/homeassistant/components/deconz/device_trigger.py +++ b/homeassistant/components/deconz/device_trigger.py @@ -1,6 +1,6 @@ """Provides device automations for deconz events.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import ( DEVICE_TRIGGER_BASE_SCHEMA, @@ -674,7 +674,7 @@ } TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( - {vol.Required(CONF_TYPE): str, vol.Required(CONF_SUBTYPE): str} + {probatio.Required(CONF_TYPE): str, probatio.Required(CONF_SUBTYPE): str} ) diff --git a/homeassistant/components/deconz/services.py b/homeassistant/components/deconz/services.py index 51375b82617e6..76c6cfd7dedd3 100644 --- a/homeassistant/components/deconz/services.py +++ b/homeassistant/components/deconz/services.py @@ -1,8 +1,8 @@ """deCONZ services.""" +import probatio from pydeconz import errors from pydeconz.utils import normalize_bridge_id -import voluptuous as vol from homeassistant.core import HomeAssistant, ServiceCall, callback from homeassistant.exceptions import HomeAssistantError, ServiceValidationError @@ -25,13 +25,13 @@ SERVICE_DATA = "data" SERVICE_CONFIGURE_DEVICE = "configure" -SERVICE_CONFIGURE_DEVICE_SCHEMA = vol.All( - vol.Schema( +SERVICE_CONFIGURE_DEVICE_SCHEMA = probatio.All( + probatio.Schema( { - vol.Optional(SERVICE_ENTITY): cv.entity_id, - vol.Optional(SERVICE_FIELD): cv.matches_regex("/.*"), - vol.Required(SERVICE_DATA): dict, - vol.Optional(CONF_BRIDGE_ID): str, + probatio.Optional(SERVICE_ENTITY): cv.entity_id, + probatio.Optional(SERVICE_FIELD): cv.matches_regex("/.*"), + probatio.Required(SERVICE_DATA): dict, + probatio.Optional(CONF_BRIDGE_ID): str, } ), cv.has_at_least_one_key(SERVICE_ENTITY, SERVICE_FIELD), @@ -39,7 +39,9 @@ SERVICE_DEVICE_REFRESH = "device_refresh" SERVICE_REMOVE_ORPHANED_ENTRIES = "remove_orphaned_entries" -SELECT_GATEWAY_SCHEMA = vol.All(vol.Schema({vol.Optional(CONF_BRIDGE_ID): str})) +SELECT_GATEWAY_SCHEMA = probatio.All( + probatio.Schema({probatio.Optional(CONF_BRIDGE_ID): str}) +) SUPPORTED_SERVICES = ( SERVICE_CONFIGURE_DEVICE, diff --git a/homeassistant/components/decora_wifi/config_flow.py b/homeassistant/components/decora_wifi/config_flow.py index 2d0215c9ce700..811a5e66de2c7 100644 --- a/homeassistant/components/decora_wifi/config_flow.py +++ b/homeassistant/components/decora_wifi/config_flow.py @@ -5,7 +5,7 @@ from decora_wifi import DecoraWiFiSession from decora_wifi.models.person import Person -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -17,10 +17,10 @@ from .const import DOMAIN -USER_SCHEMA = vol.Schema( +USER_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): TextSelector(), - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_USERNAME): TextSelector(), + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } diff --git a/homeassistant/components/decora_wifi/light.py b/homeassistant/components/decora_wifi/light.py index 2ae5ac4cb657d..b4a7cc757d639 100644 --- a/homeassistant/components/decora_wifi/light.py +++ b/homeassistant/components/decora_wifi/light.py @@ -4,7 +4,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.light import ( ATTR_BRIGHTNESS, @@ -33,7 +33,10 @@ # Validation of the user's configuration PLATFORM_SCHEMA = LIGHT_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_USERNAME): cv.string, vol.Required(CONF_PASSWORD): cv.string} + { + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + } ) diff --git a/homeassistant/components/delijn/sensor.py b/homeassistant/components/delijn/sensor.py index bf7692f57d932..afe5f47131fff 100644 --- a/homeassistant/components/delijn/sensor.py +++ b/homeassistant/components/delijn/sensor.py @@ -3,9 +3,9 @@ from datetime import datetime import logging +import probatio from pydelijn.api import Passages from pydelijn.common import HttpException -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -31,11 +31,13 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_API_KEY): cv.string, - vol.Required(CONF_NEXT_DEPARTURE): [ + probatio.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_NEXT_DEPARTURE): [ { - vol.Required(CONF_STOP_ID): cv.string, - vol.Optional(CONF_NUMBER_OF_DEPARTURES, default=5): cv.positive_int, + probatio.Required(CONF_STOP_ID): cv.string, + probatio.Optional( + CONF_NUMBER_OF_DEPARTURES, default=5 + ): cv.positive_int, } ], } diff --git a/homeassistant/components/deluge/config_flow.py b/homeassistant/components/deluge/config_flow.py index 1c14f99f94297..71ddcb890c7a9 100644 --- a/homeassistant/components/deluge/config_flow.py +++ b/homeassistant/components/deluge/config_flow.py @@ -6,7 +6,7 @@ from typing import Any, override from deluge_client.client import DelugeRPCClient -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_PORT, CONF_USERNAME @@ -51,17 +51,19 @@ async def async_step_user( ) errors["base"] = error user_input = user_input or {} - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required(CONF_HOST, default=user_input.get(CONF_HOST)): cv.string, - vol.Required( + probatio.Required( + CONF_HOST, default=user_input.get(CONF_HOST) + ): cv.string, + probatio.Required( CONF_USERNAME, default=user_input.get(CONF_USERNAME) ): cv.string, - vol.Required(CONF_PASSWORD, default=""): cv.string, - vol.Optional( + probatio.Required(CONF_PASSWORD, default=""): cv.string, + probatio.Optional( CONF_PORT, default=user_input.get(CONF_PORT, DEFAULT_RPC_PORT) ): int, - vol.Optional( + probatio.Optional( CONF_WEB_PORT, default=user_input.get(CONF_WEB_PORT, DEFAULT_WEB_PORT), ): int, diff --git a/homeassistant/components/demo/config_flow.py b/homeassistant/components/demo/config_flow.py index 9f2ea8c6dfcee..510bffe13cd96 100644 --- a/homeassistant/components/demo/config_flow.py +++ b/homeassistant/components/demo/config_flow.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -64,14 +64,14 @@ async def async_step_options_1( return self.async_show_form( step_id="options_1", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required("constant"): "Constant Value", - vol.Optional( + probatio.Required("constant"): "Constant Value", + probatio.Optional( CONF_BOOLEAN, default=self.config_entry.options.get(CONF_BOOLEAN, False), ): bool, - vol.Optional( + probatio.Optional( CONF_INT, default=self.config_entry.options.get(CONF_INT, 10), ): int, @@ -89,20 +89,20 @@ async def async_step_options_2( return self.async_show_form( step_id="options_2", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_STRING, default=self.config_entry.options.get( CONF_STRING, "Default", ), ): str, - vol.Optional( + probatio.Optional( CONF_SELECT, default=self.config_entry.options.get(CONF_SELECT, "default"), - ): vol.In(["default", "other"]), - vol.Optional( + ): probatio.In(["default", "other"]), + probatio.Optional( CONF_MULTISELECT, default=self.config_entry.options.get( CONF_MULTISELECT, ["default"] diff --git a/homeassistant/components/demo/tts.py b/homeassistant/components/demo/tts.py index 4c5985a78a6ef..60839929b571c 100644 --- a/homeassistant/components/demo/tts.py +++ b/homeassistant/components/demo/tts.py @@ -3,7 +3,7 @@ import os from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.tts import ( CONF_LANG, @@ -19,7 +19,7 @@ DEFAULT_LANG = "en" PLATFORM_SCHEMA = TTS_PLATFORM_SCHEMA.extend( - {vol.Optional(CONF_LANG, default=DEFAULT_LANG): vol.In(SUPPORT_LANGUAGES)} + {probatio.Optional(CONF_LANG, default=DEFAULT_LANG): probatio.In(SUPPORT_LANGUAGES)} ) diff --git a/homeassistant/components/denon/media_player.py b/homeassistant/components/denon/media_player.py index 9f35980ea0f78..2cb77c59cf32e 100644 --- a/homeassistant/components/denon/media_player.py +++ b/homeassistant/components/denon/media_player.py @@ -3,8 +3,8 @@ import logging from typing import override +import probatio import telnetlib # pylint: disable=deprecated-module -import voluptuous as vol from homeassistant.components.media_player import ( PLATFORM_SCHEMA as MEDIA_PLAYER_PLATFORM_SCHEMA, @@ -39,8 +39,8 @@ PLATFORM_SCHEMA = MEDIA_PLAYER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/denon_rs232/config_flow.py b/homeassistant/components/denon_rs232/config_flow.py index 697042a1063b6..c65c3e8c3f996 100644 --- a/homeassistant/components/denon_rs232/config_flow.py +++ b/homeassistant/components/denon_rs232/config_flow.py @@ -4,7 +4,7 @@ from denon_rs232 import DenonReceiver from denon_rs232.models import MODELS -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_DEVICE, CONF_MODEL @@ -94,9 +94,9 @@ async def async_step_user( return self.async_show_form( step_id="user", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_MODEL): SelectSelector( + probatio.Required(CONF_MODEL): SelectSelector( SelectSelectorConfig( options=[ SelectOptionDict( @@ -109,7 +109,7 @@ async def async_step_user( translation_key="model", ) ), - vol.Required(CONF_DEVICE): SerialPortSelector(), + probatio.Required(CONF_DEVICE): SerialPortSelector(), } ), user_input or {}, diff --git a/homeassistant/components/denonavr/config_flow.py b/homeassistant/components/denonavr/config_flow.py index 22860440758a3..0c0de9f9f491b 100644 --- a/homeassistant/components/denonavr/config_flow.py +++ b/homeassistant/components/denonavr/config_flow.py @@ -6,7 +6,7 @@ import denonavr from denonavr.exceptions import AvrNetworkError, AvrTimoutError -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigFlow, @@ -50,7 +50,7 @@ DEFAULT_USE_TELNET_NEW_INSTALL = True -CONFIG_SCHEMA = vol.Schema({vol.Optional(CONF_HOST): str}) +CONFIG_SCHEMA = probatio.Schema({probatio.Optional(CONF_HOST): str}) class OptionsFlowHandler(OptionsFlowWithReload): @@ -63,29 +63,29 @@ async def async_step_init( if user_input is not None: return self.async_create_entry(title="", data=user_input) - settings_schema = vol.Schema( + settings_schema = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_SHOW_ALL_SOURCES, default=self.config_entry.options.get( CONF_SHOW_ALL_SOURCES, DEFAULT_SHOW_SOURCES ), ): bool, - vol.Optional( + probatio.Optional( CONF_ZONE2, default=self.config_entry.options.get(CONF_ZONE2, DEFAULT_ZONE2), ): bool, - vol.Optional( + probatio.Optional( CONF_ZONE3, default=self.config_entry.options.get(CONF_ZONE3, DEFAULT_ZONE3), ): bool, - vol.Optional( + probatio.Optional( CONF_UPDATE_AUDYSSEY, default=self.config_entry.options.get( CONF_UPDATE_AUDYSSEY, DEFAULT_UPDATE_AUDYSSEY ), ): bool, - vol.Optional( + probatio.Optional( CONF_USE_TELNET, default=self.config_entry.options.get( CONF_USE_TELNET, DEFAULT_USE_TELNET @@ -159,9 +159,9 @@ async def async_step_select( self.host = user_input["select_host"] return await self.async_step_connect() - select_scheme = vol.Schema( + select_scheme = probatio.Schema( { - vol.Required("select_host"): vol.In( + probatio.Required("select_host"): probatio.In( [d_receiver["host"] for d_receiver in self.d_receivers] ) } diff --git a/homeassistant/components/denonavr/services.py b/homeassistant/components/denonavr/services.py index 126d16c92b132..d89092c3eb7b2 100644 --- a/homeassistant/components/denonavr/services.py +++ b/homeassistant/components/denonavr/services.py @@ -1,6 +1,6 @@ """Support for Denon AVR receivers using their HTTP interface.""" -import voluptuous as vol +import probatio from homeassistant.components.media_player import DOMAIN as MEDIA_PLAYER_DOMAIN from homeassistant.const import ATTR_COMMAND @@ -24,7 +24,7 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, SERVICE_GET_COMMAND, entity_domain=MEDIA_PLAYER_DOMAIN, - schema={vol.Required(ATTR_COMMAND): cv.string}, + schema={probatio.Required(ATTR_COMMAND): cv.string}, func=f"async_{SERVICE_GET_COMMAND}", ) service.async_register_platform_entity_service( @@ -32,7 +32,7 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, SERVICE_SET_DYNAMIC_EQ, entity_domain=MEDIA_PLAYER_DOMAIN, - schema={vol.Required(ATTR_DYNAMIC_EQ): cv.boolean}, + schema={probatio.Required(ATTR_DYNAMIC_EQ): cv.boolean}, func=f"async_{SERVICE_SET_DYNAMIC_EQ}", ) service.async_register_platform_entity_service( diff --git a/homeassistant/components/derivative/config_flow.py b/homeassistant/components/derivative/config_flow.py index 437eb92e336c6..f0f0cf738b294 100644 --- a/homeassistant/components/derivative/config_flow.py +++ b/homeassistant/components/derivative/config_flow.py @@ -3,7 +3,7 @@ from collections.abc import Mapping from typing import Any, cast, override -import voluptuous as vol +import probatio from homeassistant.components.counter import DOMAIN as COUNTER_DOMAIN from homeassistant.components.input_number import DOMAIN as INPUT_NUMBER_DOMAIN @@ -83,8 +83,8 @@ async def _get_options_dict(handler: SchemaCommonFlowHandler | None) -> dict: entity_selector = entity_selector_compatible(handler.parent_handler) return { - vol.Required(CONF_SOURCE): entity_selector, - vol.Required(CONF_ROUND_DIGITS, default=2): selector.NumberSelector( + probatio.Required(CONF_SOURCE): entity_selector, + probatio.Required(CONF_ROUND_DIGITS, default=2): selector.NumberSelector( selector.NumberSelectorConfig( min=0, max=6, @@ -93,30 +93,32 @@ async def _get_options_dict(handler: SchemaCommonFlowHandler | None) -> dict: translation_key="round", ), ), - vol.Required(CONF_TIME_WINDOW): selector.DurationSelector(), - vol.Optional(CONF_UNIT_PREFIX): selector.SelectSelector( + probatio.Required(CONF_TIME_WINDOW): selector.DurationSelector(), + probatio.Optional(CONF_UNIT_PREFIX): selector.SelectSelector( selector.SelectSelectorConfig(options=UNIT_PREFIXES), ), - vol.Required(CONF_UNIT_TIME, default=UnitOfTime.HOURS): selector.SelectSelector( + probatio.Required( + CONF_UNIT_TIME, default=UnitOfTime.HOURS + ): selector.SelectSelector( selector.SelectSelectorConfig( options=TIME_UNITS, translation_key="time_unit" ), ), - vol.Optional(CONF_MAX_SUB_INTERVAL): selector.DurationSelector( + probatio.Optional(CONF_MAX_SUB_INTERVAL): selector.DurationSelector( selector.DurationSelectorConfig(allow_negative=False) ), } -async def _get_options_schema(handler: SchemaCommonFlowHandler) -> vol.Schema: - return vol.Schema(await _get_options_dict(handler)) +async def _get_options_schema(handler: SchemaCommonFlowHandler) -> probatio.Schema: + return probatio.Schema(await _get_options_dict(handler)) -async def _get_config_schema(handler: SchemaCommonFlowHandler) -> vol.Schema: +async def _get_config_schema(handler: SchemaCommonFlowHandler) -> probatio.Schema: options = await _get_options_dict(handler) - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_NAME): selector.TextSelector(), + probatio.Required(CONF_NAME): selector.TextSelector(), **options, } ) diff --git a/homeassistant/components/derivative/sensor.py b/homeassistant/components/derivative/sensor.py index 3fd227d1156f7..fe13d4f1780d1 100644 --- a/homeassistant/components/derivative/sensor.py +++ b/homeassistant/components/derivative/sensor.py @@ -5,7 +5,7 @@ import logging from typing import override -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( DEVICE_CLASS_UNITS, @@ -101,15 +101,21 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_UNIQUE_ID): cv.string, - vol.Required(CONF_SOURCE): cv.entity_id, - vol.Optional(CONF_ROUND_DIGITS, default=DEFAULT_ROUND): vol.Coerce(int), - vol.Optional(CONF_UNIT_PREFIX, default=None): vol.In(UNIT_PREFIXES), - vol.Optional(CONF_UNIT_TIME, default=UnitOfTime.HOURS): vol.In(UNIT_TIME), - vol.Optional(CONF_UNIT): cv.string, - vol.Optional(CONF_TIME_WINDOW, default=DEFAULT_TIME_WINDOW): cv.time_period, - vol.Optional(CONF_MAX_SUB_INTERVAL): cv.positive_time_period, + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Required(CONF_SOURCE): cv.entity_id, + probatio.Optional(CONF_ROUND_DIGITS, default=DEFAULT_ROUND): probatio.Coerce( + int + ), + probatio.Optional(CONF_UNIT_PREFIX, default=None): probatio.In(UNIT_PREFIXES), + probatio.Optional(CONF_UNIT_TIME, default=UnitOfTime.HOURS): probatio.In( + UNIT_TIME + ), + probatio.Optional(CONF_UNIT): cv.string, + probatio.Optional( + CONF_TIME_WINDOW, default=DEFAULT_TIME_WINDOW + ): cv.time_period, + probatio.Optional(CONF_MAX_SUB_INTERVAL): cv.positive_time_period, } ) diff --git a/homeassistant/components/devialet/config_flow.py b/homeassistant/components/devialet/config_flow.py index aa37ed5cbf234..2d391e2c1bd5c 100644 --- a/homeassistant/components/devialet/config_flow.py +++ b/homeassistant/components/devialet/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from devialet.devialet_api import DevialetApi -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_NAME @@ -64,7 +64,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_HOST): str}), + data_schema=probatio.Schema({probatio.Required(CONF_HOST): str}), errors=self._errors, ) diff --git a/homeassistant/components/device_automation/__init__.py b/homeassistant/components/device_automation/__init__.py index 8c405c12dc928..695a8c8f3ff99 100644 --- a/homeassistant/components/device_automation/__init__.py +++ b/homeassistant/components/device_automation/__init__.py @@ -9,8 +9,7 @@ from types import ModuleType from typing import TYPE_CHECKING, Any, Literal, overload -from probatio import to_field_list -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.components.websocket_api import ActiveConnection @@ -59,12 +58,12 @@ CONFIG_SCHEMA = cv.empty_config_schema(DOMAIN) -DEVICE_TRIGGER_BASE_SCHEMA: vol.Schema = cv.TRIGGER_BASE_SCHEMA.extend( +DEVICE_TRIGGER_BASE_SCHEMA: probatio.Schema = cv.TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_PLATFORM): "device", - vol.Required(CONF_DOMAIN): str, - vol.Required(CONF_DEVICE_ID): str, - vol.Remove("metadata"): dict, + probatio.Required(CONF_PLATFORM): "device", + probatio.Required(CONF_DOMAIN): str, + probatio.Required(CONF_DEVICE_ID): str, + probatio.Remove("metadata"): dict, } ) @@ -324,7 +323,7 @@ async def _async_get_device_automation_capabilities( if (extra_fields := capabilities.get("extra_fields")) is None: capabilities["extra_fields"] = [] else: - capabilities["extra_fields"] = to_field_list( + capabilities["extra_fields"] = probatio.to_field_list( extra_fields, custom_serializer=cv.custom_serializer ) @@ -382,8 +381,8 @@ async def with_error_handling( @websocket_api.websocket_command( { - vol.Required("type"): "device_automation/action/list", - vol.Required("device_id"): str, + probatio.Required("type"): "device_automation/action/list", + probatio.Required("device_id"): str, } ) @websocket_api.async_response @@ -403,8 +402,8 @@ async def websocket_device_automation_list_actions( @websocket_api.websocket_command( { - vol.Required("type"): "device_automation/condition/list", - vol.Required("device_id"): str, + probatio.Required("type"): "device_automation/condition/list", + probatio.Required("device_id"): str, } ) @websocket_api.async_response @@ -424,8 +423,8 @@ async def websocket_device_automation_list_conditions( @websocket_api.websocket_command( { - vol.Required("type"): "device_automation/trigger/list", - vol.Required("device_id"): str, + probatio.Required("type"): "device_automation/trigger/list", + probatio.Required("device_id"): str, } ) @websocket_api.async_response @@ -445,8 +444,8 @@ async def websocket_device_automation_list_triggers( @websocket_api.websocket_command( { - vol.Required("type"): "device_automation/action/capabilities", - vol.Required("action"): dict, + probatio.Required("type"): "device_automation/action/capabilities", + probatio.Required("action"): dict, } ) @websocket_api.async_response @@ -464,9 +463,9 @@ async def websocket_device_automation_get_action_capabilities( @websocket_api.websocket_command( { - vol.Required("type"): "device_automation/condition/capabilities", - vol.Required("condition"): cv.DEVICE_CONDITION_BASE_SCHEMA.extend( - {}, extra=vol.ALLOW_EXTRA + probatio.Required("type"): "device_automation/condition/capabilities", + probatio.Required("condition"): cv.DEVICE_CONDITION_BASE_SCHEMA.extend( + {}, extra=probatio.ALLOW_EXTRA ), } ) @@ -485,12 +484,12 @@ async def websocket_device_automation_get_condition_capabilities( @websocket_api.websocket_command( { - vol.Required("type"): "device_automation/trigger/capabilities", + probatio.Required("type"): "device_automation/trigger/capabilities", # The frontend responds with `trigger` as key, while the # `DEVICE_TRIGGER_BASE_SCHEMA` expects `platform1` as key. - vol.Required("trigger"): vol.All( + probatio.Required("trigger"): probatio.All( cv._trigger_pre_validator, # noqa: SLF001 - DEVICE_TRIGGER_BASE_SCHEMA.extend({}, extra=vol.ALLOW_EXTRA), + DEVICE_TRIGGER_BASE_SCHEMA.extend({}, extra=probatio.ALLOW_EXTRA), ), } ) diff --git a/homeassistant/components/device_automation/action.py b/homeassistant/components/device_automation/action.py index b9535d392ef99..b236e6d407d18 100644 --- a/homeassistant/components/device_automation/action.py +++ b/homeassistant/components/device_automation/action.py @@ -2,7 +2,7 @@ from typing import Any, Protocol -import voluptuous as vol +import probatio from homeassistant.const import CONF_DOMAIN from homeassistant.core import Context, HomeAssistant @@ -19,7 +19,7 @@ class DeviceAutomationActionProtocol(Protocol): Each module must define either ACTION_SCHEMA or async_validate_action_config. """ - ACTION_SCHEMA: vol.Schema + ACTION_SCHEMA: probatio.Schema async def async_validate_action_config( self, hass: HomeAssistant, config: ConfigType @@ -37,7 +37,7 @@ async def async_call_action_from_config( async def async_get_action_capabilities( self, hass: HomeAssistant, config: ConfigType - ) -> dict[str, vol.Schema]: + ) -> dict[str, probatio.Schema]: """List action capabilities.""" async def async_get_actions( diff --git a/homeassistant/components/device_automation/condition.py b/homeassistant/components/device_automation/condition.py index 2867d88130d43..afdbbfdffe9ec 100644 --- a/homeassistant/components/device_automation/condition.py +++ b/homeassistant/components/device_automation/condition.py @@ -2,7 +2,7 @@ from typing import Any, Protocol, override -import voluptuous as vol +import probatio from homeassistant.const import CONF_DOMAIN, CONF_OPTIONS from homeassistant.core import HomeAssistant @@ -24,7 +24,7 @@ class DeviceAutomationConditionProtocol(Protocol): Each module must define either CONDITION_SCHEMA or async_validate_condition_config. """ - CONDITION_SCHEMA: vol.Schema + CONDITION_SCHEMA: probatio.Schema async def async_validate_condition_config( self, hass: HomeAssistant, config: ConfigType @@ -38,7 +38,7 @@ def async_condition_from_config( async def async_get_condition_capabilities( self, hass: HomeAssistant, config: ConfigType - ) -> dict[str, vol.Schema]: + ) -> dict[str, probatio.Schema]: """List condition capabilities.""" async def async_get_conditions( diff --git a/homeassistant/components/device_automation/entity.py b/homeassistant/components/device_automation/entity.py index a3886ad2d9cb0..145f71fc98668 100644 --- a/homeassistant/components/device_automation/entity.py +++ b/homeassistant/components/device_automation/entity.py @@ -1,6 +1,6 @@ """Device automation helpers for entity.""" -import voluptuous as vol +import probatio from homeassistant.components.homeassistant.triggers import state as state_trigger from homeassistant.const import CONF_ENTITY_ID, CONF_FOR, CONF_PLATFORM, CONF_TYPE @@ -22,9 +22,9 @@ TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In([CONF_CHANGED_STATES]), - vol.Optional(CONF_FOR): cv.positive_time_period_dict, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In([CONF_CHANGED_STATES]), + probatio.Optional(CONF_FOR): cv.positive_time_period_dict, } ) @@ -90,10 +90,10 @@ async def async_get_triggers( async def async_get_trigger_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List trigger capabilities.""" return { - "extra_fields": vol.Schema( - {vol.Optional(CONF_FOR): cv.positive_time_period_dict} + "extra_fields": probatio.Schema( + {probatio.Optional(CONF_FOR): cv.positive_time_period_dict} ) } diff --git a/homeassistant/components/device_automation/helpers.py b/homeassistant/components/device_automation/helpers.py index b34b50df0f6d5..264015d605cf9 100644 --- a/homeassistant/components/device_automation/helpers.py +++ b/homeassistant/components/device_automation/helpers.py @@ -2,7 +2,7 @@ from typing import cast -import voluptuous as vol +import probatio from homeassistant.const import CONF_DEVICE_ID, CONF_DOMAIN, CONF_ENTITY_ID, Platform from homeassistant.core import HomeAssistant @@ -75,7 +75,7 @@ def _resolve_device_id(hass: HomeAssistant, device_id: str, domain: str) -> str: async def async_validate_device_automation_config( hass: HomeAssistant, config: ConfigType, - automation_schema: vol.Schema, + automation_schema: probatio.Schema, automation_type: DeviceAutomationType, ) -> ConfigType: """Validate config.""" @@ -105,7 +105,7 @@ async def async_validate_device_automation_config( if entity_id := validated_config.get(CONF_ENTITY_ID): try: er.async_validate_entity_id(er.async_get(hass), entity_id) - except vol.Invalid as err: + except probatio.Invalid as err: raise InvalidDeviceAutomationConfig( f"Unknown entity '{entity_id}'" ) from err diff --git a/homeassistant/components/device_automation/toggle_entity.py b/homeassistant/components/device_automation/toggle_entity.py index a7b8ab2fa1212..c54c0e68b47eb 100644 --- a/homeassistant/components/device_automation/toggle_entity.py +++ b/homeassistant/components/device_automation/toggle_entity.py @@ -1,6 +1,6 @@ """Device automation helpers for toggle entity.""" -import voluptuous as vol +import probatio from homeassistant.components.homeassistant.triggers import state as state_trigger from homeassistant.const import ( @@ -77,28 +77,28 @@ ACTION_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In(DEVICE_ACTION_TYPES), + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In(DEVICE_ACTION_TYPES), } ) CONDITION_SCHEMA = cv.DEVICE_CONDITION_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In([CONF_IS_OFF, CONF_IS_ON]), - vol.Optional(CONF_FOR): cv.positive_time_period_dict, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In([CONF_IS_OFF, CONF_IS_ON]), + probatio.Optional(CONF_FOR): cv.positive_time_period_dict, } ) _TOGGLE_TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In([CONF_TURNED_OFF, CONF_TURNED_ON]), - vol.Optional(CONF_FOR): cv.positive_time_period_dict, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In([CONF_TURNED_OFF, CONF_TURNED_ON]), + probatio.Optional(CONF_FOR): cv.positive_time_period_dict, } ) -TRIGGER_SCHEMA = vol.Any(entity.TRIGGER_SCHEMA, _TOGGLE_TRIGGER_SCHEMA) +TRIGGER_SCHEMA = probatio.Any(entity.TRIGGER_SCHEMA, _TOGGLE_TRIGGER_SCHEMA) async def async_call_action_from_config( @@ -231,24 +231,24 @@ async def async_get_triggers( async def async_get_condition_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List condition capabilities.""" return { - "extra_fields": vol.Schema( - {vol.Optional(CONF_FOR): cv.positive_time_period_dict} + "extra_fields": probatio.Schema( + {probatio.Optional(CONF_FOR): cv.positive_time_period_dict} ) } async def async_get_trigger_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List trigger capabilities.""" if config[CONF_TYPE] not in [CONF_TURNED_ON, CONF_TURNED_OFF]: return await entity.async_get_trigger_capabilities(hass, config) return { - "extra_fields": vol.Schema( - {vol.Optional(CONF_FOR): cv.positive_time_period_dict} + "extra_fields": probatio.Schema( + {probatio.Optional(CONF_FOR): cv.positive_time_period_dict} ) } diff --git a/homeassistant/components/device_automation/trigger.py b/homeassistant/components/device_automation/trigger.py index f297cb47fd050..ffc9e32c3ed60 100644 --- a/homeassistant/components/device_automation/trigger.py +++ b/homeassistant/components/device_automation/trigger.py @@ -2,7 +2,7 @@ from typing import Any, Protocol -import voluptuous as vol +import probatio from homeassistant.const import CONF_DOMAIN from homeassistant.core import CALLBACK_TYPE, HomeAssistant @@ -16,7 +16,7 @@ ) from .helpers import async_validate_device_automation_config -TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend({}, extra=vol.ALLOW_EXTRA) +TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend({}, extra=probatio.ALLOW_EXTRA) class DeviceAutomationTriggerProtocol(Protocol): @@ -25,7 +25,7 @@ class DeviceAutomationTriggerProtocol(Protocol): Each module must define either TRIGGER_SCHEMA or async_validate_trigger_config. """ - TRIGGER_SCHEMA: vol.Schema + TRIGGER_SCHEMA: probatio.Schema async def async_validate_trigger_config( self, hass: HomeAssistant, config: ConfigType @@ -43,7 +43,7 @@ async def async_attach_trigger( async def async_get_trigger_capabilities( self, hass: HomeAssistant, config: ConfigType - ) -> dict[str, vol.Schema]: + ) -> dict[str, probatio.Schema]: """List trigger capabilities.""" async def async_get_triggers( diff --git a/homeassistant/components/device_sun_light_trigger/__init__.py b/homeassistant/components/device_sun_light_trigger/__init__.py index b97f3cf32cf93..3634b0000be2c 100644 --- a/homeassistant/components/device_sun_light_trigger/__init__.py +++ b/homeassistant/components/device_sun_light_trigger/__init__.py @@ -4,7 +4,7 @@ from functools import partial import logging -import voluptuous as vol +import probatio from homeassistant.components.device_tracker import ( DOMAIN as DEVICE_TRACKER_DOMAIN, @@ -49,22 +49,22 @@ LIGHT_TRANSITION_TIME = timedelta(minutes=15) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Optional(CONF_DEVICE_GROUP): cv.entity_id, - vol.Optional( + probatio.Optional(CONF_DEVICE_GROUP): cv.entity_id, + probatio.Optional( CONF_DISABLE_TURN_OFF, default=DEFAULT_DISABLE_TURN_OFF ): cv.boolean, - vol.Optional(CONF_LIGHT_GROUP): cv.string, - vol.Optional( + probatio.Optional(CONF_LIGHT_GROUP): cv.string, + probatio.Optional( CONF_LIGHT_PROFILE, default=DEFAULT_LIGHT_PROFILE ): cv.string, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/device_tracker/device_condition.py b/homeassistant/components/device_tracker/device_condition.py index d7cf67404fdc0..ec75f3b53790a 100644 --- a/homeassistant/components/device_tracker/device_condition.py +++ b/homeassistant/components/device_tracker/device_condition.py @@ -1,6 +1,6 @@ """Provides device automations for Device tracker.""" -import voluptuous as vol +import probatio from homeassistant.const import ( ATTR_ENTITY_ID, @@ -26,8 +26,8 @@ CONDITION_SCHEMA = DEVICE_CONDITION_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In(CONDITION_TYPES), + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In(CONDITION_TYPES), } ) diff --git a/homeassistant/components/device_tracker/device_trigger.py b/homeassistant/components/device_tracker/device_trigger.py index 8e9c1ddbad8be..b045eb704bf58 100644 --- a/homeassistant/components/device_tracker/device_trigger.py +++ b/homeassistant/components/device_tracker/device_trigger.py @@ -3,7 +3,7 @@ from operator import attrgetter from typing import Final -import voluptuous as vol +import probatio from homeassistant.components.device_automation import DEVICE_TRIGGER_BASE_SCHEMA from homeassistant.components.zone import DOMAIN as ZONE_DOMAIN, trigger as zone @@ -33,9 +33,9 @@ TRIGGER_SCHEMA: Final = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In(TRIGGER_TYPES), - vol.Required(CONF_ZONE): cv.entity_domain(ZONE_DOMAIN), + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In(TRIGGER_TYPES), + probatio.Required(CONF_ZONE): cv.entity_domain(ZONE_DOMAIN), } ) @@ -102,16 +102,16 @@ async def async_attach_trigger( async def async_get_trigger_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List trigger capabilities.""" zones = { ent.entity_id: ent.name for ent in sorted(hass.states.async_all(ZONE_DOMAIN), key=attrgetter("name")) } return { - "extra_fields": vol.Schema( + "extra_fields": probatio.Schema( { - vol.Required(CONF_ZONE): vol.In(zones), + probatio.Required(CONF_ZONE): probatio.In(zones), } ) } diff --git a/homeassistant/components/device_tracker/legacy.py b/homeassistant/components/device_tracker/legacy.py index d7f3a575799cb..2411f721247d0 100644 --- a/homeassistant/components/device_tracker/legacy.py +++ b/homeassistant/components/device_tracker/legacy.py @@ -9,8 +9,8 @@ from typing import Any, Final, Protocol, final, override import attr +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant import util from homeassistant.components import zone @@ -91,26 +91,30 @@ SOURCE_TYPES = [cls.value for cls in SourceType] -NEW_DEVICE_DEFAULTS_SCHEMA = vol.Any( +NEW_DEVICE_DEFAULTS_SCHEMA = probatio.Any( None, - vol.Schema({vol.Optional(CONF_TRACK_NEW, default=DEFAULT_TRACK_NEW): cv.boolean}), + probatio.Schema( + {probatio.Optional(CONF_TRACK_NEW, default=DEFAULT_TRACK_NEW): cv.boolean} + ), ) PLATFORM_SCHEMA: Final = cv.PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_SCAN_INTERVAL): cv.time_period, - vol.Optional(CONF_TRACK_NEW): cv.boolean, - vol.Optional(CONF_CONSIDER_HOME, default=DEFAULT_CONSIDER_HOME): vol.All( - cv.time_period, cv.positive_timedelta - ), - vol.Optional(CONF_NEW_DEVICE_DEFAULTS, default={}): NEW_DEVICE_DEFAULTS_SCHEMA, + probatio.Optional(CONF_SCAN_INTERVAL): cv.time_period, + probatio.Optional(CONF_TRACK_NEW): cv.boolean, + probatio.Optional( + CONF_CONSIDER_HOME, default=DEFAULT_CONSIDER_HOME + ): probatio.All(cv.time_period, cv.positive_timedelta), + probatio.Optional( + CONF_NEW_DEVICE_DEFAULTS, default={} + ): NEW_DEVICE_DEFAULTS_SCHEMA, } ) -PLATFORM_SCHEMA_BASE: Final[vol.Schema] = cv.PLATFORM_SCHEMA_BASE.extend( +PLATFORM_SCHEMA_BASE: Final[probatio.Schema] = cv.PLATFORM_SCHEMA_BASE.extend( PLATFORM_SCHEMA.schema ) -SERVICE_SEE_PAYLOAD_SCHEMA: Final[vol.Schema] = vol.Schema( - vol.All( +SERVICE_SEE_PAYLOAD_SCHEMA: Final[probatio.Schema] = probatio.Schema( + probatio.All( cv.has_at_least_one_key(ATTR_MAC, ATTR_DEV_ID), { ATTR_MAC: cv.string, @@ -121,11 +125,11 @@ ATTR_GPS_ACCURACY: cv.positive_int, ATTR_BATTERY: cv.positive_int, ATTR_ATTRIBUTES: dict, - ATTR_SOURCE_TYPE: vol.Coerce(SourceType), + ATTR_SOURCE_TYPE: probatio.Coerce(SourceType), ATTR_CONSIDER_HOME: cv.time_period, # Temp workaround for iOS app introduced in 0.65 - vol.Optional("battery_status"): str, - vol.Optional("hostname"): str, + probatio.Optional("battery_status"): str, + probatio.Optional("hostname"): str, }, ) ) @@ -1034,17 +1038,17 @@ async def async_load_config( This method is a coroutine. """ - dev_schema = vol.Schema( + dev_schema = probatio.Schema( { - vol.Required(CONF_NAME): cv.string, - vol.Optional(CONF_ICON, default=None): vol.Any(None, cv.icon), - vol.Optional("track", default=False): cv.boolean, - vol.Optional(CONF_MAC, default=None): vol.Any( - None, vol.All(cv.string, vol.Upper) + probatio.Required(CONF_NAME): cv.string, + probatio.Optional(CONF_ICON, default=None): probatio.Any(None, cv.icon), + probatio.Optional("track", default=False): cv.boolean, + probatio.Optional(CONF_MAC, default=None): probatio.Any( + None, probatio.All(cv.string, probatio.Upper) ), - vol.Optional("gravatar", default=None): vol.Any(None, cv.string), - vol.Optional("picture", default=None): vol.Any(None, cv.string), - vol.Optional(CONF_CONSIDER_HOME, default=consider_home): vol.All( + probatio.Optional("gravatar", default=None): probatio.Any(None, cv.string), + probatio.Optional("picture", default=None): probatio.Any(None, cv.string), + probatio.Optional(CONF_CONSIDER_HOME, default=consider_home): probatio.All( cv.time_period, cv.positive_timedelta ), } @@ -1065,7 +1069,7 @@ async def async_load_config( try: device = dev_schema(device) device["dev_id"] = cv.slugify(dev_id) - except vol.Invalid as exp: + except probatio.Invalid as exp: async_log_schema_error(exp, dev_id, devices, hass) async_notify_setup_error(hass, DOMAIN) else: diff --git a/homeassistant/components/devolo_home_control/config_flow.py b/homeassistant/components/devolo_home_control/config_flow.py index fe9278873c4f7..7bfbac89e47ff 100644 --- a/homeassistant/components/devolo_home_control/config_flow.py +++ b/homeassistant/components/devolo_home_control/config_flow.py @@ -3,7 +3,7 @@ from collections.abc import Mapping from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -13,8 +13,8 @@ from .const import DOMAIN, SUPPORTED_MODEL_TYPES from .exceptions import CredentialsInvalid, UuidChanged -DATA_SCHEMA = vol.Schema( - {vol.Required(CONF_USERNAME): str, vol.Required(CONF_PASSWORD): str} +DATA_SCHEMA = probatio.Schema( + {probatio.Required(CONF_USERNAME): str, probatio.Required(CONF_PASSWORD): str} ) @@ -78,10 +78,12 @@ async def async_step_reauth_confirm( ) -> ConfigFlowResult: """Handle a flow initiated by reauthentication.""" errors: dict[str, str] = {} - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_USERNAME, default=self.init_data[CONF_USERNAME]): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required( + CONF_USERNAME, default=self.init_data[CONF_USERNAME] + ): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/devolo_home_network/config_flow.py b/homeassistant/components/devolo_home_network/config_flow.py index 1c68977b47ad3..3f96e40a78b8a 100644 --- a/homeassistant/components/devolo_home_network/config_flow.py +++ b/homeassistant/components/devolo_home_network/config_flow.py @@ -6,7 +6,7 @@ from devolo_plc_api.device import Device from devolo_plc_api.exceptions.device import DeviceNotFound, DevicePasswordProtected -import voluptuous as vol +import probatio from homeassistant.components import zeroconf from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -20,10 +20,10 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( - {vol.Required(CONF_IP_ADDRESS): str, vol.Optional(CONF_PASSWORD): str} +STEP_USER_DATA_SCHEMA = probatio.Schema( + {probatio.Required(CONF_IP_ADDRESS): str, probatio.Optional(CONF_PASSWORD): str} ) -STEP_REAUTH_DATA_SCHEMA = vol.Schema({vol.Optional(CONF_PASSWORD): str}) +STEP_REAUTH_DATA_SCHEMA = probatio.Schema({probatio.Optional(CONF_PASSWORD): str}) async def validate_input(hass: HomeAssistant, data: dict[str, Any]) -> dict[str, str]: @@ -119,7 +119,7 @@ async def async_step_zeroconf_confirm( """Handle a flow initiated by zeroconf.""" title = self.context["title_placeholders"][CONF_NAME] errors: dict = {} - data_schema: vol.Schema | None = None + data_schema: probatio.Schema | None = None if user_input is not None: data = { diff --git a/homeassistant/components/dexcom/config_flow.py b/homeassistant/components/dexcom/config_flow.py index 9fff34b026129..5ca77b4b72297 100644 --- a/homeassistant/components/dexcom/config_flow.py +++ b/homeassistant/components/dexcom/config_flow.py @@ -3,9 +3,9 @@ import logging from typing import Any, override +import probatio from pydexcom import Dexcom, Region from pydexcom.errors import AccountError, SessionError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -14,11 +14,11 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Required(CONF_SERVER): vol.In({SERVER_US, SERVER_OUS}), + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Required(CONF_SERVER): probatio.In({SERVER_US, SERVER_OUS}), } ) diff --git a/homeassistant/components/dhcp/websocket_api.py b/homeassistant/components/dhcp/websocket_api.py index dda36c81aef8e..e505d21bb3559 100644 --- a/homeassistant/components/dhcp/websocket_api.py +++ b/homeassistant/components/dhcp/websocket_api.py @@ -2,7 +2,7 @@ from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.core import HomeAssistant, callback @@ -26,7 +26,7 @@ def async_setup(hass: HomeAssistant) -> None: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "dhcp/subscribe_discovery", + probatio.Required("type"): "dhcp/subscribe_discovery", } ) @websocket_api.async_response diff --git a/homeassistant/components/diagnostics/__init__.py b/homeassistant/components/diagnostics/__init__.py index b3ce65c208d6c..ac71be8448abf 100644 --- a/homeassistant/components/diagnostics/__init__.py +++ b/homeassistant/components/diagnostics/__init__.py @@ -8,7 +8,7 @@ from typing import Any, Protocol from aiohttp import web -import voluptuous as vol +import probatio from homeassistant.components import http, websocket_api from homeassistant.config_entries import ConfigEntry @@ -120,7 +120,7 @@ def _register_diagnostics_platform( @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required("type"): "diagnostics/list"}) +@websocket_api.websocket_command({probatio.Required("type"): "diagnostics/list"}) @callback def handle_info( hass: HomeAssistant, connection: websocket_api.ActiveConnection, msg: dict @@ -143,8 +143,8 @@ def handle_info( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "diagnostics/get", - vol.Required("domain"): str, + probatio.Required("type"): "diagnostics/get", + probatio.Required("domain"): str, } ) @callback diff --git a/homeassistant/components/dialogflow/__init__.py b/homeassistant/components/dialogflow/__init__.py index da6fbaf9969ed..098039e8496ac 100644 --- a/homeassistant/components/dialogflow/__init__.py +++ b/homeassistant/components/dialogflow/__init__.py @@ -3,7 +3,7 @@ import logging from aiohttp import web -import voluptuous as vol +import probatio from homeassistant.components import webhook from homeassistant.config_entries import ConfigEntry @@ -18,7 +18,7 @@ SOURCE = "Home Assistant Dialogflow" -CONFIG_SCHEMA = vol.Schema({DOMAIN: {}}, extra=vol.ALLOW_EXTRA) +CONFIG_SCHEMA = probatio.Schema({DOMAIN: {}}, extra=probatio.ALLOW_EXTRA) V1 = 1 V2 = 2 diff --git a/homeassistant/components/digital_ocean/__init__.py b/homeassistant/components/digital_ocean/__init__.py index 44cad0fc68ad7..b25c633afa640 100644 --- a/homeassistant/components/digital_ocean/__init__.py +++ b/homeassistant/components/digital_ocean/__init__.py @@ -3,7 +3,7 @@ import logging import digitalocean -import voluptuous as vol +import probatio from homeassistant.const import CONF_ACCESS_TOKEN, Platform from homeassistant.core import HomeAssistant @@ -18,9 +18,9 @@ DIGITAL_OCEAN_PLATFORMS = [Platform.SWITCH, Platform.BINARY_SENSOR] -CONFIG_SCHEMA = vol.Schema( - {DOMAIN: vol.Schema({vol.Required(CONF_ACCESS_TOKEN): cv.string})}, - extra=vol.ALLOW_EXTRA, +CONFIG_SCHEMA = probatio.Schema( + {DOMAIN: probatio.Schema({probatio.Required(CONF_ACCESS_TOKEN): cv.string})}, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/digital_ocean/binary_sensor.py b/homeassistant/components/digital_ocean/binary_sensor.py index 70be0f6b425d2..5927bfe923811 100644 --- a/homeassistant/components/digital_ocean/binary_sensor.py +++ b/homeassistant/components/digital_ocean/binary_sensor.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import ( PLATFORM_SCHEMA as BINARY_SENSOR_PLATFORM_SCHEMA, @@ -34,7 +34,7 @@ DEFAULT_NAME = "Droplet" PLATFORM_SCHEMA = BINARY_SENSOR_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_DROPLETS): vol.All(cv.ensure_list, [cv.string])} + {probatio.Required(CONF_DROPLETS): probatio.All(cv.ensure_list, [cv.string])} ) diff --git a/homeassistant/components/digital_ocean/switch.py b/homeassistant/components/digital_ocean/switch.py index cf0a3c55b3492..154303c4abb17 100644 --- a/homeassistant/components/digital_ocean/switch.py +++ b/homeassistant/components/digital_ocean/switch.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.switch import ( PLATFORM_SCHEMA as SWITCH_PLATFORM_SCHEMA, @@ -34,7 +34,7 @@ DEFAULT_NAME = "Droplet" PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_DROPLETS): vol.All(cv.ensure_list, [cv.string])} + {probatio.Required(CONF_DROPLETS): probatio.All(cv.ensure_list, [cv.string])} ) diff --git a/homeassistant/components/directv/config_flow.py b/homeassistant/components/directv/config_flow.py index c0b9458c282a8..7c4ed84b8f0e1 100644 --- a/homeassistant/components/directv/config_flow.py +++ b/homeassistant/components/directv/config_flow.py @@ -5,7 +5,7 @@ from urllib.parse import urlparse from directv import DIRECTV, DIRECTVError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_NAME @@ -121,6 +121,6 @@ def _show_setup_form(self, errors: dict | None = None) -> ConfigFlowResult: """Show the setup form to the user.""" return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_HOST): str}), + data_schema=probatio.Schema({probatio.Required(CONF_HOST): str}), errors=errors or {}, ) diff --git a/homeassistant/components/discogs/sensor.py b/homeassistant/components/discogs/sensor.py index c927f54d3bf03..76b35ac4c05f0 100644 --- a/homeassistant/components/discogs/sensor.py +++ b/homeassistant/components/discogs/sensor.py @@ -6,7 +6,7 @@ from typing import Any, override import discogs_client -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -59,10 +59,10 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_TOKEN): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_MONITORED_CONDITIONS, default=SENSOR_KEYS): vol.All( - cv.ensure_list, [vol.In(SENSOR_KEYS)] + probatio.Required(CONF_TOKEN): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_MONITORED_CONDITIONS, default=SENSOR_KEYS): probatio.All( + cv.ensure_list, [probatio.In(SENSOR_KEYS)] ), } ) diff --git a/homeassistant/components/discord/config_flow.py b/homeassistant/components/discord/config_flow.py index 1e72d876c8fd7..69aef4b273c24 100644 --- a/homeassistant/components/discord/config_flow.py +++ b/homeassistant/components/discord/config_flow.py @@ -6,7 +6,7 @@ from aiohttp.client_exceptions import ClientConnectorError import nextcord -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_TOKEN, CONF_NAME @@ -15,7 +15,7 @@ _LOGGER = logging.getLogger(__name__) -CONFIG_SCHEMA = vol.Schema({vol.Required(CONF_API_TOKEN): str}) +CONFIG_SCHEMA = probatio.Schema({probatio.Required(CONF_API_TOKEN): str}) class DiscordFlowHandler(ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/components/discovergy/config_flow.py b/homeassistant/components/discovergy/config_flow.py index bf3a323afa5e3..688986f241f3b 100644 --- a/homeassistant/components/discovergy/config_flow.py +++ b/homeassistant/components/discovergy/config_flow.py @@ -4,10 +4,10 @@ import logging from typing import Any, override +import probatio from pydiscovergy import Discovergy from pydiscovergy.authentication import BasicAuth import pydiscovergy.error as discovergyError -import voluptuous as vol from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_EMAIL, CONF_PASSWORD @@ -23,9 +23,9 @@ _LOGGER = logging.getLogger(__name__) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Required( + probatio.Required( CONF_EMAIL, ): TextSelector( TextSelectorConfig( @@ -33,7 +33,7 @@ autocomplete="email", ) ), - vol.Required( + probatio.Required( CONF_PASSWORD, ): TextSelector( TextSelectorConfig( diff --git a/homeassistant/components/dlink/config_flow.py b/homeassistant/components/dlink/config_flow.py index 0ef820a024de3..c02168aa951a8 100644 --- a/homeassistant/components/dlink/config_flow.py +++ b/homeassistant/components/dlink/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from pyW215.pyW215 import SmartPlug -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME @@ -60,14 +60,14 @@ async def async_step_confirm_discovery( user_input = user_input or {} return self.async_show_form( step_id="confirm_discovery", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_USERNAME, default=user_input.get(CONF_USERNAME, DEFAULT_USERNAME), ): str, - vol.Required(CONF_PASSWORD): str, - vol.Required(CONF_USE_LEGACY_PROTOCOL): bool, + probatio.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USE_LEGACY_PROTOCOL): bool, } ), errors=errors, @@ -96,17 +96,17 @@ async def async_step_user( user_input = user_input or {} return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_HOST, default=user_input.get(CONF_HOST, self.ip_address) ): str, - vol.Optional( + probatio.Optional( CONF_USERNAME, default=user_input.get(CONF_USERNAME, DEFAULT_USERNAME), ): str, - vol.Required(CONF_PASSWORD): str, - vol.Required(CONF_USE_LEGACY_PROTOCOL): bool, + probatio.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USE_LEGACY_PROTOCOL): bool, } ), errors=errors, diff --git a/homeassistant/components/dlna_dmr/config_flow.py b/homeassistant/components/dlna_dmr/config_flow.py index ed151cbdfd556..ffa0b6dd89959 100644 --- a/homeassistant/components/dlna_dmr/config_flow.py +++ b/homeassistant/components/dlna_dmr/config_flow.py @@ -12,7 +12,7 @@ from async_upnp_client.profiles.dlna import DmrDevice from async_upnp_client.profiles.profile import find_device_of_type from getmac import get_mac_address -import voluptuous as vol +import probatio from homeassistant.components import ssdp from homeassistant.config_entries import ( @@ -111,8 +111,8 @@ async def async_step_user(self, user_input: FlowInput = None) -> ConfigFlowResul for discovery in discoveries } - data_schema = vol.Schema( - {vol.Optional(CONF_HOST): vol.In(self._discoveries.keys())} + data_schema = probatio.Schema( + {probatio.Optional(CONF_HOST): probatio.In(self._discoveries.keys())} ) return self.async_show_form(step_id="user", data_schema=data_schema) @@ -133,7 +133,7 @@ async def async_step_manual(self, user_input: FlowInput = None) -> ConfigFlowRes else: return self._create_entry() - data_schema = vol.Schema({CONF_URL: str}) + data_schema = probatio.Schema({CONF_URL: str}) return self.async_show_form( step_id="manual", data_schema=data_schema, errors=errors ) @@ -355,7 +355,7 @@ async def async_step_init( # extra validation here if callback_url_override: cv.url(callback_url_override) - except vol.Invalid: + except probatio.Invalid: errors["base"] = "invalid_url" options[CONF_LISTEN_PORT] = listen_port @@ -375,12 +375,16 @@ def _add_with_suggestion(key: str, validator: Callable | type[bool]) -> None: For bools, use the existing value as default, or fallback to False. """ if validator is bool: - fields[vol.Required(key, default=options.get(key, False))] = validator + fields[probatio.Required(key, default=options.get(key, False))] = ( + validator + ) elif (suggested_value := options.get(key)) is None: - fields[vol.Optional(key)] = validator + fields[probatio.Optional(key)] = validator else: fields[ - vol.Optional(key, description={"suggested_value": suggested_value}) + probatio.Optional( + key, description={"suggested_value": suggested_value} + ) ] = validator # listen_port can be blank or 0 for "bind any free port" @@ -391,7 +395,7 @@ def _add_with_suggestion(key: str, validator: Callable | type[bool]) -> None: return self.async_show_form( step_id="init", - data_schema=vol.Schema(fields), + data_schema=probatio.Schema(fields), errors=errors, ) diff --git a/homeassistant/components/dlna_dms/config_flow.py b/homeassistant/components/dlna_dms/config_flow.py index 18450fee7f823..f4064ef060bbc 100644 --- a/homeassistant/components/dlna_dms/config_flow.py +++ b/homeassistant/components/dlna_dms/config_flow.py @@ -6,7 +6,7 @@ from urllib.parse import urlparse from async_upnp_client.profiles.dlna import DmsDevice -import voluptuous as vol +import probatio from homeassistant.components import ssdp from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -67,7 +67,9 @@ async def async_step_user( host: f"{discovery.upnp.get(ATTR_UPNP_FRIENDLY_NAME)} ({host})" for host, discovery in self._discoveries.items() } - data_schema = vol.Schema({vol.Optional(CONF_HOST): vol.In(discovery_choices)}) + data_schema = probatio.Schema( + {probatio.Optional(CONF_HOST): probatio.In(discovery_choices)} + ) return self.async_show_form(step_id="user", data_schema=data_schema) @override diff --git a/homeassistant/components/dnsip/config_flow.py b/homeassistant/components/dnsip/config_flow.py index 4f91de1441f8c..6371f6e897628 100644 --- a/homeassistant/components/dnsip/config_flow.py +++ b/homeassistant/components/dnsip/config_flow.py @@ -6,7 +6,7 @@ import aiodns from aiodns.error import DNSError -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -36,16 +36,16 @@ DOMAIN, ) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOSTNAME, default=DEFAULT_HOSTNAME): cv.string, - vol.Required(CONF_ADDITIONAL_OPTIONS): section( - vol.Schema( + probatio.Required(CONF_HOSTNAME, default=DEFAULT_HOSTNAME): cv.string, + probatio.Required(CONF_ADDITIONAL_OPTIONS): section( + probatio.Schema( { - vol.Optional(CONF_RESOLVER): cv.string, - vol.Optional(CONF_PORT): cv.port, - vol.Optional(CONF_RESOLVER_IPV6): cv.string, - vol.Optional(CONF_PORT_IPV6): cv.port, + probatio.Optional(CONF_RESOLVER): cv.string, + probatio.Optional(CONF_PORT): cv.port, + probatio.Optional(CONF_RESOLVER_IPV6): cv.string, + probatio.Optional(CONF_PORT_IPV6): cv.port, } ), SectionConfig(collapsed=True), @@ -213,12 +213,12 @@ async def async_step_init( ) schema = self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Optional(CONF_RESOLVER): cv.string, - vol.Optional(CONF_PORT): cv.port, - vol.Optional(CONF_RESOLVER_IPV6): cv.string, - vol.Optional(CONF_PORT_IPV6): cv.port, + probatio.Optional(CONF_RESOLVER): cv.string, + probatio.Optional(CONF_PORT): cv.port, + probatio.Optional(CONF_RESOLVER_IPV6): cv.string, + probatio.Optional(CONF_PORT_IPV6): cv.port, } ), self.config_entry.options, diff --git a/homeassistant/components/doods/image_processing.py b/homeassistant/components/doods/image_processing.py index 2d5d72c0aaddf..eab8a7f416165 100644 --- a/homeassistant/components/doods/image_processing.py +++ b/homeassistant/components/doods/image_processing.py @@ -7,8 +7,8 @@ from typing import Any, override from PIL import Image, ImageDraw, UnidentifiedImageError +import probatio from pydoods import PyDOODS -import voluptuous as vol from homeassistant.components.image_processing import ( CONF_CONFIDENCE, @@ -46,36 +46,38 @@ CONF_LEFT = "left" CONF_FILE_OUT = "file_out" -AREA_SCHEMA = vol.Schema( +AREA_SCHEMA = probatio.Schema( { - vol.Optional(CONF_BOTTOM, default=1): cv.small_float, - vol.Optional(CONF_LEFT, default=0): cv.small_float, - vol.Optional(CONF_RIGHT, default=1): cv.small_float, - vol.Optional(CONF_TOP, default=0): cv.small_float, - vol.Optional(CONF_COVERS, default=True): cv.boolean, + probatio.Optional(CONF_BOTTOM, default=1): cv.small_float, + probatio.Optional(CONF_LEFT, default=0): cv.small_float, + probatio.Optional(CONF_RIGHT, default=1): cv.small_float, + probatio.Optional(CONF_TOP, default=0): cv.small_float, + probatio.Optional(CONF_COVERS, default=True): cv.boolean, } ) -LABEL_SCHEMA = vol.Schema( +LABEL_SCHEMA = probatio.Schema( { - vol.Required(CONF_NAME): cv.string, - vol.Optional(CONF_AREA): AREA_SCHEMA, - vol.Optional(CONF_CONFIDENCE): vol.Range(min=0, max=100), + probatio.Required(CONF_NAME): cv.string, + probatio.Optional(CONF_AREA): AREA_SCHEMA, + probatio.Optional(CONF_CONFIDENCE): probatio.Range(min=0, max=100), } ) PLATFORM_SCHEMA = IMAGE_PROCESSING_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_URL): cv.string, - vol.Required(CONF_DETECTOR): cv.string, - vol.Required(CONF_TIMEOUT, default=90): cv.positive_int, - vol.Optional(CONF_AUTH_KEY, default=""): cv.string, - vol.Optional(CONF_FILE_OUT, default=[]): vol.All(cv.ensure_list, [cv.template]), - vol.Optional(CONF_CONFIDENCE, default=0.0): vol.Range(min=0, max=100), - vol.Optional(CONF_LABELS, default=[]): vol.All( - cv.ensure_list, [vol.Any(cv.string, LABEL_SCHEMA)] + probatio.Required(CONF_URL): cv.string, + probatio.Required(CONF_DETECTOR): cv.string, + probatio.Required(CONF_TIMEOUT, default=90): cv.positive_int, + probatio.Optional(CONF_AUTH_KEY, default=""): cv.string, + probatio.Optional(CONF_FILE_OUT, default=[]): probatio.All( + cv.ensure_list, [cv.template] ), - vol.Optional(CONF_AREA): AREA_SCHEMA, + probatio.Optional(CONF_CONFIDENCE, default=0.0): probatio.Range(min=0, max=100), + probatio.Optional(CONF_LABELS, default=[]): probatio.All( + cv.ensure_list, [probatio.Any(cv.string, LABEL_SCHEMA)] + ), + probatio.Optional(CONF_AREA): AREA_SCHEMA, } ) diff --git a/homeassistant/components/doorbird/config_flow.py b/homeassistant/components/doorbird/config_flow.py index 2a7681cc2c347..dc7202bc1629b 100644 --- a/homeassistant/components/doorbird/config_flow.py +++ b/homeassistant/components/doorbird/config_flow.py @@ -7,7 +7,7 @@ from aiohttp import ClientResponseError from doorbirdpy import DoorBird -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_IGNORE, @@ -40,22 +40,22 @@ AUTH_VOL_DICT: VolDictType = { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } -AUTH_SCHEMA = vol.Schema(AUTH_VOL_DICT) +AUTH_SCHEMA = probatio.Schema(AUTH_VOL_DICT) def _schema_with_defaults( host: str | None = None, name: str | None = None -) -> vol.Schema: - return vol.Schema( +) -> probatio.Schema: + return probatio.Schema( { - vol.Required(CONF_HOST, default=host): str, + probatio.Required(CONF_HOST, default=host): str, **AUTH_VOL_DICT, # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Optional(CONF_NAME, default=name): str, + probatio.Optional(CONF_NAME, default=name): str, } ) @@ -104,7 +104,7 @@ class DoorBirdConfigFlow(ConfigFlow, domain=DOMAIN): def __init__(self) -> None: """Initialize the DoorBird config flow.""" - self.discovery_schema: vol.Schema | None = None + self.discovery_schema: probatio.Schema | None = None async def _async_verify_existing_device_for_discovery( self, @@ -293,8 +293,8 @@ async def async_step_init( # We convert to a comma separated list for the UI # since there really isn't anything better - options_schema = vol.Schema( - {vol.Optional(CONF_EVENTS, default=", ".join(current_events)): str} + options_schema = probatio.Schema( + {probatio.Optional(CONF_EVENTS, default=", ".join(current_events)): str} ) return self.async_show_form(step_id="init", data_schema=options_schema) diff --git a/homeassistant/components/doorbird/repairs.py b/homeassistant/components/doorbird/repairs.py index a14b5a0dc1b23..263f8c78bc614 100644 --- a/homeassistant/components/doorbird/repairs.py +++ b/homeassistant/components/doorbird/repairs.py @@ -1,6 +1,6 @@ """Repairs for DoorBird.""" -import voluptuous as vol +import probatio from homeassistant.components.repairs import RepairsFlow, RepairsFlowResult from homeassistant.core import HomeAssistant @@ -35,7 +35,7 @@ async def async_step_confirm( return self.async_show_form( step_id="confirm", - data_schema=vol.Schema({}), + data_schema=probatio.Schema({}), description_placeholders=description_placeholders, ) diff --git a/homeassistant/components/dormakaba_dkey/config_flow.py b/homeassistant/components/dormakaba_dkey/config_flow.py index f2ae911225fba..24a3326ad7fff 100644 --- a/homeassistant/components/dormakaba_dkey/config_flow.py +++ b/homeassistant/components/dormakaba_dkey/config_flow.py @@ -5,8 +5,8 @@ from typing import Any, override from bleak import BleakError +import probatio from py_dormakaba_dkey import DKEYLock, device_filter, errors as dkey_errors -import voluptuous as vol from homeassistant.components.bluetooth import ( BluetoothServiceInfoBleak, @@ -20,9 +20,9 @@ _LOGGER = logging.getLogger(__name__) -STEP_ASSOCIATE_SCHEMA = vol.Schema( +STEP_ASSOCIATE_SCHEMA = probatio.Schema( { - vol.Required("activation_code"): str, + probatio.Required("activation_code"): str, } ) @@ -69,9 +69,9 @@ async def async_step_user( if not self._discovered_devices: return self.async_abort(reason="no_devices_found") - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_ADDRESS): vol.In( + probatio.Required(CONF_ADDRESS): probatio.In( { service_info.address: ( f"{service_info.name} ({service_info.address})" @@ -139,7 +139,7 @@ async def async_step_reauth_confirm( return await self.async_step_associate() return self.async_show_form( - step_id="reauth_confirm", data_schema=vol.Schema({}), errors=errors + step_id="reauth_confirm", data_schema=probatio.Schema({}), errors=errors ) async def async_step_associate( diff --git a/homeassistant/components/downloader/config_flow.py b/homeassistant/components/downloader/config_flow.py index 6fdf2f52f45b5..1e57c724309ee 100644 --- a/homeassistant/components/downloader/config_flow.py +++ b/homeassistant/components/downloader/config_flow.py @@ -3,7 +3,7 @@ import os from typing import Any, override -import voluptuous as vol +import probatio from homeassistant import exceptions from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -34,9 +34,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_DOWNLOAD_DIR): cv.string, + probatio.Required(CONF_DOWNLOAD_DIR): cv.string, } ), errors=errors, diff --git a/homeassistant/components/downloader/services.py b/homeassistant/components/downloader/services.py index 0a147ccb0865c..cce42eeaf8e1a 100644 --- a/homeassistant/components/downloader/services.py +++ b/homeassistant/components/downloader/services.py @@ -4,8 +4,8 @@ import os import re +import probatio import requests -import voluptuous as vol from homeassistant.core import HomeAssistant, ServiceCall, callback from homeassistant.exceptions import HomeAssistantError, ServiceValidationError @@ -165,13 +165,13 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, SERVICE_DOWNLOAD_FILE, download_file, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Optional(ATTR_FILENAME): cv.string, - vol.Optional(ATTR_SUBDIR): cv.string, - vol.Required(ATTR_URL): cv.url, - vol.Optional(ATTR_OVERWRITE, default=False): cv.boolean, - vol.Optional(ATTR_HEADERS, default=dict): vol.Schema( + probatio.Optional(ATTR_FILENAME): cv.string, + probatio.Optional(ATTR_SUBDIR): cv.string, + probatio.Required(ATTR_URL): cv.url, + probatio.Optional(ATTR_OVERWRITE, default=False): cv.boolean, + probatio.Optional(ATTR_HEADERS, default=dict): probatio.Schema( {cv.string: cv.string} ), } diff --git a/homeassistant/components/dremel_3d_printer/config_flow.py b/homeassistant/components/dremel_3d_printer/config_flow.py index 3b4781af172f8..d7bb732bc8046 100644 --- a/homeassistant/components/dremel_3d_printer/config_flow.py +++ b/homeassistant/components/dremel_3d_printer/config_flow.py @@ -4,8 +4,8 @@ from typing import Any, override from dremel3dpy import Dremel3DPrinter +import probatio from requests.exceptions import ConnectTimeout, HTTPError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST @@ -14,8 +14,8 @@ from .const import DOMAIN, LOGGER -def _schema_with_defaults(host: str = "") -> vol.Schema: - return vol.Schema({vol.Required(CONF_HOST, default=host): cv.string}) +def _schema_with_defaults(host: str = "") -> probatio.Schema: + return probatio.Schema({probatio.Required(CONF_HOST, default=host): cv.string}) class Dremel3DPrinterConfigFlow(ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/components/droplet/config_flow.py b/homeassistant/components/droplet/config_flow.py index 865979cfb964f..1f971e5226566 100644 --- a/homeassistant/components/droplet/config_flow.py +++ b/homeassistant/components/droplet/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from pydroplet.droplet import DropletConnection, DropletDiscovery -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_CODE, CONF_DEVICE_ID, CONF_IP_ADDRESS, CONF_PORT @@ -72,9 +72,9 @@ async def async_step_confirm( errors["base"] = "cannot_connect" return self.async_show_form( step_id="confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_CODE): str, + probatio.Required(CONF_CODE): str, } ), description_placeholders={ @@ -116,8 +116,11 @@ async def async_step_user( errors["base"] = "cannot_connect" return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_IP_ADDRESS): str, vol.Required(CONF_CODE): str} + data_schema=probatio.Schema( + { + probatio.Required(CONF_IP_ADDRESS): str, + probatio.Required(CONF_CODE): str, + } ), errors=errors, ) diff --git a/homeassistant/components/dsmr/config_flow.py b/homeassistant/components/dsmr/config_flow.py index 9130accf24ca3..45b851ea1b1a8 100644 --- a/homeassistant/components/dsmr/config_flow.py +++ b/homeassistant/components/dsmr/config_flow.py @@ -9,7 +9,7 @@ from dsmr_parser.clients.protocol import create_dsmr_reader from dsmr_parser.clients.rfxtrx_protocol import create_rfxtrx_dsmr_reader from dsmr_parser.objects import DSMRObject -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -215,10 +215,10 @@ async def async_step_user( if not errors: return self.async_create_entry(title=data[CONF_PORT], data=data) - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required(CONF_PORT): SerialPortSelector(), - vol.Required(CONF_DSMR_VERSION): vol.In(DSMR_VERSIONS), + probatio.Required(CONF_PORT): SerialPortSelector(), + probatio.Required(CONF_DSMR_VERSION): probatio.In(DSMR_VERSIONS), } ) return self.async_show_form( @@ -246,7 +246,7 @@ async def async_step_encryption_key( return self.async_show_form( step_id="encryption_key", - data_schema=vol.Schema({vol.Required(CONF_ENCRYPTION_KEY): str}), + data_schema=probatio.Schema({probatio.Required(CONF_ENCRYPTION_KEY): str}), errors=errors, ) @@ -294,14 +294,14 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_TIME_BETWEEN_UPDATE, default=self.config_entry.options.get( CONF_TIME_BETWEEN_UPDATE, DEFAULT_TIME_BETWEEN_UPDATE ), - ): vol.All(vol.Coerce(int), vol.Range(min=0)), + ): probatio.All(probatio.Coerce(int), probatio.Range(min=0)), } ), ) diff --git a/homeassistant/components/dublin_bus_transport/sensor.py b/homeassistant/components/dublin_bus_transport/sensor.py index 87f059fdae09f..00be22039c893 100644 --- a/homeassistant/components/dublin_bus_transport/sensor.py +++ b/homeassistant/components/dublin_bus_transport/sensor.py @@ -9,8 +9,8 @@ from http import HTTPStatus from typing import Any, override +import probatio import requests -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -42,9 +42,9 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_STOP_ID): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_ROUTE, default=""): cv.string, + probatio.Required(CONF_STOP_ID): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_ROUTE, default=""): cv.string, } ) diff --git a/homeassistant/components/duckdns/config_flow.py b/homeassistant/components/duckdns/config_flow.py index 9107164ac2cc9..d05d7e78c1910 100644 --- a/homeassistant/components/duckdns/config_flow.py +++ b/homeassistant/components/duckdns/config_flow.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_ACCESS_TOKEN, CONF_DOMAIN, CONF_NAME @@ -19,16 +19,18 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_DOMAIN): TextSelector( + probatio.Required(CONF_DOMAIN): TextSelector( TextSelectorConfig(type=TextSelectorType.TEXT, suffix=".duckdns.org") ), - vol.Required(CONF_ACCESS_TOKEN): str, + probatio.Required(CONF_ACCESS_TOKEN): str, } ) -STEP_RECONFIGURE_DATA_SCHEMA = vol.Schema({vol.Required(CONF_ACCESS_TOKEN): str}) +STEP_RECONFIGURE_DATA_SCHEMA = probatio.Schema( + {probatio.Required(CONF_ACCESS_TOKEN): str} +) class DuckDnsConfigFlow(ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/components/duckdns/services.py b/homeassistant/components/duckdns/services.py index 57f48ddf85597..1389a4586ce9f 100644 --- a/homeassistant/components/duckdns/services.py +++ b/homeassistant/components/duckdns/services.py @@ -1,7 +1,7 @@ """Actions for Duck DNS.""" from aiohttp import ClientError -import voluptuous as vol +import probatio from homeassistant.const import CONF_ACCESS_TOKEN, CONF_DOMAIN from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -13,10 +13,12 @@ from .const import ATTR_CONFIG_ENTRY, ATTR_TXT, DOMAIN, SERVICE_SET_TXT from .helpers import update_duckdns -SERVICE_TXT_SCHEMA = vol.Schema( +SERVICE_TXT_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY): ConfigEntrySelector({"integration": DOMAIN}), - vol.Optional(ATTR_TXT): vol.Any(None, cv.string), + probatio.Required(ATTR_CONFIG_ENTRY): ConfigEntrySelector( + {"integration": DOMAIN} + ), + probatio.Optional(ATTR_TXT): probatio.Any(None, cv.string), } ) diff --git a/homeassistant/components/duco/config_flow.py b/homeassistant/components/duco/config_flow.py index 79466204de827..156e2c6b6ac15 100644 --- a/homeassistant/components/duco/config_flow.py +++ b/homeassistant/components/duco/config_flow.py @@ -5,7 +5,7 @@ from duco_connectivity import DucoClient from duco_connectivity.exceptions import DucoConnectionError, DucoError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST @@ -19,9 +19,9 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_SCHEMA = vol.Schema( +STEP_USER_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, + probatio.Required(CONF_HOST): str, } ) diff --git a/homeassistant/components/dunehd/config_flow.py b/homeassistant/components/dunehd/config_flow.py index 130b08c276255..21f95b52f9447 100644 --- a/homeassistant/components/dunehd/config_flow.py +++ b/homeassistant/components/dunehd/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from pdunehd import DuneHDPlayer -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST @@ -51,7 +51,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_HOST, default=""): str}), + data_schema=probatio.Schema( + {probatio.Required(CONF_HOST, default=""): str} + ), errors=errors, ) diff --git a/homeassistant/components/duotecno/config_flow.py b/homeassistant/components/duotecno/config_flow.py index 31b45d9e7b210..1c293281ff35f 100644 --- a/homeassistant/components/duotecno/config_flow.py +++ b/homeassistant/components/duotecno/config_flow.py @@ -5,7 +5,7 @@ from duotecno.controller import PyDuotecno from duotecno.exceptions import InvalidPassword -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_PORT @@ -14,11 +14,11 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PASSWORD): str, - vol.Required(CONF_PORT): int, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PORT): int, } ) diff --git a/homeassistant/components/dwd_weather_warnings/config_flow.py b/homeassistant/components/dwd_weather_warnings/config_flow.py index d6f67b68bc091..1a4702049e880 100644 --- a/homeassistant/components/dwd_weather_warnings/config_flow.py +++ b/homeassistant/components/dwd_weather_warnings/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from dwdwfsapi import DwdWeatherWarningsAPI -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.helpers import config_validation as cv, entity_registry as er @@ -87,10 +87,10 @@ async def async_step_user( return self.async_show_form( step_id="user", errors=errors, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional(CONF_REGION_IDENTIFIER): cv.string, - vol.Optional(CONF_REGION_DEVICE_TRACKER): EntitySelector( + probatio.Optional(CONF_REGION_IDENTIFIER): cv.string, + probatio.Optional(CONF_REGION_DEVICE_TRACKER): EntitySelector( EntitySelectorConfig(domain="device_tracker") ), } diff --git a/homeassistant/components/dynalite/config_flow.py b/homeassistant/components/dynalite/config_flow.py index 01d23164eb614..b2fe73746f8f9 100644 --- a/homeassistant/components/dynalite/config_flow.py +++ b/homeassistant/components/dynalite/config_flow.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PORT @@ -30,10 +30,10 @@ async def async_step_user( if user_input is not None: return await self._try_create(user_input) - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, } ) return self.async_show_form(step_id="user", data_schema=schema) diff --git a/homeassistant/components/dynalite/panel.py b/homeassistant/components/dynalite/panel.py index 623736cf02a05..d3793586d03bb 100644 --- a/homeassistant/components/dynalite/panel.py +++ b/homeassistant/components/dynalite/panel.py @@ -1,7 +1,7 @@ """Dynalite API interface for the frontend.""" from dynalite_panel import get_build_id, locate_dir -import voluptuous as vol +import probatio from homeassistant.components import panel_custom, websocket_api from homeassistant.components.cover import DEVICE_CLASSES @@ -39,7 +39,7 @@ @websocket_api.websocket_command( { - vol.Required("type"): "dynalite/get-config", + probatio.Required("type"): "dynalite/get-config", } ) @websocket_api.require_admin @@ -67,9 +67,9 @@ def get_dynalite_config( @websocket_api.websocket_command( { - vol.Required("type"): "dynalite/save-config", - vol.Required("entry_id"): str, - vol.Required("config"): BRIDGE_SCHEMA, + probatio.Required("type"): "dynalite/save-config", + probatio.Required("entry_id"): str, + probatio.Required("config"): BRIDGE_SCHEMA, } ) @websocket_api.require_admin diff --git a/homeassistant/components/dynalite/schema.py b/homeassistant/components/dynalite/schema.py index 024cc3f91777b..050df45e37128 100644 --- a/homeassistant/components/dynalite/schema.py +++ b/homeassistant/components/dynalite/schema.py @@ -2,7 +2,7 @@ from typing import Any -import voluptuous as vol +import probatio from homeassistant.components.cover import DEVICE_CLASSES_SCHEMA from homeassistant.const import CONF_DEFAULT, CONF_HOST, CONF_NAME, CONF_PORT, CONF_TYPE @@ -43,50 +43,53 @@ def num_string(value: str | int) -> str: new_value = str(value) if new_value.isdigit(): return new_value - raise vol.Invalid("Not a string with numbers") + raise probatio.Invalid("Not a string with numbers") -CHANNEL_DATA_SCHEMA = vol.Schema( +CHANNEL_DATA_SCHEMA = probatio.Schema( { - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_FADE): vol.Coerce(float), - vol.Optional(CONF_TYPE, default=DEFAULT_CHANNEL_TYPE): vol.Any( + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_FADE): probatio.Coerce(float), + probatio.Optional(CONF_TYPE, default=DEFAULT_CHANNEL_TYPE): probatio.Any( "light", "switch" ), } ) -CHANNEL_SCHEMA = vol.Schema({num_string: CHANNEL_DATA_SCHEMA}) +CHANNEL_SCHEMA = probatio.Schema({num_string: CHANNEL_DATA_SCHEMA}) -PRESET_DATA_SCHEMA = vol.Schema( +PRESET_DATA_SCHEMA = probatio.Schema( { - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_FADE): vol.Coerce(float), - vol.Optional(CONF_LEVEL): vol.Coerce(float), + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_FADE): probatio.Coerce(float), + probatio.Optional(CONF_LEVEL): probatio.Coerce(float), } ) -PRESET_SCHEMA = vol.Schema({num_string: vol.Any(PRESET_DATA_SCHEMA, None)}) +PRESET_SCHEMA = probatio.Schema({num_string: probatio.Any(PRESET_DATA_SCHEMA, None)}) -TEMPLATE_ROOM_SCHEMA = vol.Schema( - {vol.Optional(CONF_ROOM_ON): num_string, vol.Optional(CONF_ROOM_OFF): num_string} +TEMPLATE_ROOM_SCHEMA = probatio.Schema( + { + probatio.Optional(CONF_ROOM_ON): num_string, + probatio.Optional(CONF_ROOM_OFF): num_string, + } ) -TEMPLATE_TIMECOVER_SCHEMA = vol.Schema( +TEMPLATE_TIMECOVER_SCHEMA = probatio.Schema( { - vol.Optional(CONF_CHANNEL_COVER): num_string, - vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, - vol.Optional(CONF_OPEN_PRESET): num_string, - vol.Optional(CONF_CLOSE_PRESET): num_string, - vol.Optional(CONF_STOP_PRESET): num_string, - vol.Optional(CONF_DURATION): vol.Coerce(float), - vol.Optional(CONF_TILT_TIME): vol.Coerce(float), + probatio.Optional(CONF_CHANNEL_COVER): num_string, + probatio.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_OPEN_PRESET): num_string, + probatio.Optional(CONF_CLOSE_PRESET): num_string, + probatio.Optional(CONF_STOP_PRESET): num_string, + probatio.Optional(CONF_DURATION): probatio.Coerce(float), + probatio.Optional(CONF_TILT_TIME): probatio.Coerce(float), } ) -TEMPLATE_DATA_SCHEMA = vol.Any(TEMPLATE_ROOM_SCHEMA, TEMPLATE_TIMECOVER_SCHEMA) +TEMPLATE_DATA_SCHEMA = probatio.Any(TEMPLATE_ROOM_SCHEMA, TEMPLATE_TIMECOVER_SCHEMA) -TEMPLATE_SCHEMA = vol.Schema({str: TEMPLATE_DATA_SCHEMA}) +TEMPLATE_SCHEMA = probatio.Schema({str: TEMPLATE_DATA_SCHEMA}) def validate_area(config: dict[str, Any]) -> dict[str, Any]: @@ -100,54 +103,56 @@ def validate_area(config: dict[str, Any]) -> dict[str, Any]: conf_set.remove(conf) for conf in conf_set: if config.get(conf): - raise vol.Invalid( + raise probatio.Invalid( f"{conf} should not be part of area {config[CONF_NAME]} config" ) return config -AREA_DATA_SCHEMA = vol.Schema( - vol.All( +AREA_DATA_SCHEMA = probatio.Schema( + probatio.All( { - vol.Required(CONF_NAME): cv.string, - vol.Optional(CONF_TEMPLATE): vol.In(DEFAULT_TEMPLATES), - vol.Optional(CONF_FADE): vol.Coerce(float), - vol.Optional(CONF_NO_DEFAULT): cv.boolean, - vol.Optional(CONF_CHANNEL): CHANNEL_SCHEMA, - vol.Optional(CONF_PRESET): PRESET_SCHEMA, + probatio.Required(CONF_NAME): cv.string, + probatio.Optional(CONF_TEMPLATE): probatio.In(DEFAULT_TEMPLATES), + probatio.Optional(CONF_FADE): probatio.Coerce(float), + probatio.Optional(CONF_NO_DEFAULT): cv.boolean, + probatio.Optional(CONF_CHANNEL): CHANNEL_SCHEMA, + probatio.Optional(CONF_PRESET): PRESET_SCHEMA, # the next ones can be part of the templates - vol.Optional(CONF_ROOM_ON): num_string, - vol.Optional(CONF_ROOM_OFF): num_string, - vol.Optional(CONF_CHANNEL_COVER): num_string, - vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, - vol.Optional(CONF_OPEN_PRESET): num_string, - vol.Optional(CONF_CLOSE_PRESET): num_string, - vol.Optional(CONF_STOP_PRESET): num_string, - vol.Optional(CONF_DURATION): vol.Coerce(float), - vol.Optional(CONF_TILT_TIME): vol.Coerce(float), + probatio.Optional(CONF_ROOM_ON): num_string, + probatio.Optional(CONF_ROOM_OFF): num_string, + probatio.Optional(CONF_CHANNEL_COVER): num_string, + probatio.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_OPEN_PRESET): num_string, + probatio.Optional(CONF_CLOSE_PRESET): num_string, + probatio.Optional(CONF_STOP_PRESET): num_string, + probatio.Optional(CONF_DURATION): probatio.Coerce(float), + probatio.Optional(CONF_TILT_TIME): probatio.Coerce(float), }, validate_area, ) ) -AREA_SCHEMA = vol.Schema({num_string: vol.Any(AREA_DATA_SCHEMA, None)}) +AREA_SCHEMA = probatio.Schema({num_string: probatio.Any(AREA_DATA_SCHEMA, None)}) -PLATFORM_DEFAULTS_SCHEMA = vol.Schema({vol.Optional(CONF_FADE): vol.Coerce(float)}) +PLATFORM_DEFAULTS_SCHEMA = probatio.Schema( + {probatio.Optional(CONF_FADE): probatio.Coerce(float)} +) -BRIDGE_SCHEMA = vol.Schema( +BRIDGE_SCHEMA = probatio.Schema( { - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): int, - vol.Optional(CONF_AUTO_DISCOVER, default=False): vol.Coerce(bool), - vol.Optional(CONF_POLL_TIMER, default=1.0): vol.Coerce(float), - vol.Optional(CONF_AREA): AREA_SCHEMA, - vol.Optional(CONF_DEFAULT): PLATFORM_DEFAULTS_SCHEMA, - vol.Optional(CONF_ACTIVE, default=False): vol.Any( + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Optional(CONF_AUTO_DISCOVER, default=False): probatio.Coerce(bool), + probatio.Optional(CONF_POLL_TIMER, default=1.0): probatio.Coerce(float), + probatio.Optional(CONF_AREA): AREA_SCHEMA, + probatio.Optional(CONF_DEFAULT): PLATFORM_DEFAULTS_SCHEMA, + probatio.Optional(CONF_ACTIVE, default=False): probatio.Any( ACTIVE_ON, ACTIVE_OFF, ACTIVE_INIT, cv.boolean ), - vol.Optional(CONF_PRESET): PRESET_SCHEMA, - vol.Optional(CONF_TEMPLATE): TEMPLATE_SCHEMA, + probatio.Optional(CONF_PRESET): PRESET_SCHEMA, + probatio.Optional(CONF_TEMPLATE): TEMPLATE_SCHEMA, } ) diff --git a/homeassistant/components/dynalite/services.py b/homeassistant/components/dynalite/services.py index e5ad9c374af39..4b8ded65b78d3 100644 --- a/homeassistant/components/dynalite/services.py +++ b/homeassistant/components/dynalite/services.py @@ -1,6 +1,6 @@ """Support for the Dynalite networks.""" -import voluptuous as vol +import probatio from homeassistant.core import HomeAssistant, ServiceCall, callback from homeassistant.helpers import config_validation as cv @@ -54,11 +54,11 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, SERVICE_REQUEST_AREA_PRESET, _request_area_preset, - vol.Schema( + probatio.Schema( { - vol.Optional(ATTR_HOST): cv.string, - vol.Required(ATTR_AREA): int, - vol.Optional(ATTR_CHANNEL): int, + probatio.Optional(ATTR_HOST): cv.string, + probatio.Required(ATTR_AREA): int, + probatio.Optional(ATTR_CHANNEL): int, } ), ) @@ -67,11 +67,11 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, SERVICE_REQUEST_CHANNEL_LEVEL, _request_channel_level, - vol.Schema( + probatio.Schema( { - vol.Optional(ATTR_HOST): cv.string, - vol.Required(ATTR_AREA): int, - vol.Required(ATTR_CHANNEL): int, + probatio.Optional(ATTR_HOST): cv.string, + probatio.Required(ATTR_AREA): int, + probatio.Required(ATTR_CHANNEL): int, } ), ) diff --git a/homeassistant/components/dyson_infrared/config_flow.py b/homeassistant/components/dyson_infrared/config_flow.py index da14053ff33d0..a2a7bc1b4cba7 100644 --- a/homeassistant/components/dyson_infrared/config_flow.py +++ b/homeassistant/components/dyson_infrared/config_flow.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components import infrared from homeassistant.components.infrared import DOMAIN as INFRARED_DOMAIN @@ -62,9 +62,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_DEVICE_TYPE): SelectSelector( + probatio.Required(CONF_DEVICE_TYPE): SelectSelector( SelectSelectorConfig( options=[ device_type.value for device_type in DysonDeviceType @@ -73,7 +73,7 @@ async def async_step_user( mode=SelectSelectorMode.DROPDOWN, ) ), - vol.Required(CONF_INFRARED_EMITTER_ENTITY_ID): EntitySelector( + probatio.Required(CONF_INFRARED_EMITTER_ENTITY_ID): EntitySelector( EntitySelectorConfig( domain=INFRARED_DOMAIN, include_entities=emitter_entity_ids, diff --git a/homeassistant/components/eafm/config_flow.py b/homeassistant/components/eafm/config_flow.py index 8b36667c92d59..cac7a2482a6a4 100644 --- a/homeassistant/components/eafm/config_flow.py +++ b/homeassistant/components/eafm/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from aioeafm import get_stations -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.helpers.aiohttp_client import async_get_clientsession @@ -63,7 +63,7 @@ async def async_step_user( return self.async_show_form( step_id="user", errors=errors, - data_schema=vol.Schema( - {vol.Required("station"): vol.In(sorted(self.stations))} + data_schema=probatio.Schema( + {probatio.Required("station"): probatio.In(sorted(self.stations))} ), ) diff --git a/homeassistant/components/earn_e_p1/config_flow.py b/homeassistant/components/earn_e_p1/config_flow.py index 68fde9248bf8b..126c46d836829 100644 --- a/homeassistant/components/earn_e_p1/config_flow.py +++ b/homeassistant/components/earn_e_p1/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from earn_e_p1 import EarnEP1Device, EarnEP1Listener, discover, validate -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_MAC @@ -18,9 +18,9 @@ DISCOVERY_TIMEOUT = 10 VALIDATION_TIMEOUT = 65 -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, + probatio.Required(CONF_HOST): str, } ) diff --git a/homeassistant/components/easyenergy/services.py b/homeassistant/components/easyenergy/services.py index ad7cb7f5cea0b..f92ece95e40ff 100644 --- a/homeassistant/components/easyenergy/services.py +++ b/homeassistant/components/easyenergy/services.py @@ -15,7 +15,7 @@ VatOption, ) from easyenergy.const import MARKET_TIMEZONE -import voluptuous as vol +import probatio from homeassistant.core import ( HomeAssistant, @@ -58,41 +58,41 @@ class ServicePriceType(StrEnum): electricity_price_type.value for electricity_price_type in ElectricityPriceType ) -BASE_SERVICE_SCHEMA: Final = vol.Schema( +BASE_SERVICE_SCHEMA: Final = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY): selector.ConfigEntrySelector( + probatio.Required(ATTR_CONFIG_ENTRY): selector.ConfigEntrySelector( { "integration": DOMAIN, } ), - vol.Optional(ATTR_START): str, - vol.Optional(ATTR_END): str, + probatio.Optional(ATTR_START): str, + probatio.Optional(ATTR_END): str, } ) GAS_SERVICE_SCHEMA: Final = BASE_SERVICE_SCHEMA.extend( { - vol.Required(ATTR_INCL_VAT): bool, - vol.Optional( + probatio.Required(ATTR_INCL_VAT): bool, + probatio.Optional( ATTR_PRICE_TYPE, default=ElectricityPriceType.MARKET.value - ): vol.In(PRICE_TYPE_OPTIONS), + ): probatio.In(PRICE_TYPE_OPTIONS), } ) ENERGY_USAGE_SERVICE_SCHEMA: Final = BASE_SERVICE_SCHEMA.extend( { - vol.Required(ATTR_INCL_VAT): bool, - vol.Optional( + probatio.Required(ATTR_INCL_VAT): bool, + probatio.Optional( ATTR_GRANULARITY, default=ElectricityGranularity.HOUR.value - ): vol.In(GRANULARITY_OPTIONS), - vol.Optional( + ): probatio.In(GRANULARITY_OPTIONS), + probatio.Optional( ATTR_PRICE_TYPE, default=ElectricityPriceType.MARKET.value - ): vol.In(PRICE_TYPE_OPTIONS), + ): probatio.In(PRICE_TYPE_OPTIONS), } ) ENERGY_RETURN_SERVICE_SCHEMA: Final = BASE_SERVICE_SCHEMA.extend( { - vol.Optional( + probatio.Optional( ATTR_GRANULARITY, default=ElectricityGranularity.HOUR.value - ): vol.In(GRANULARITY_OPTIONS), + ): probatio.In(GRANULARITY_OPTIONS), } ) diff --git a/homeassistant/components/ebox/sensor.py b/homeassistant/components/ebox/sensor.py index 56352312262a9..63d456c8692d7 100644 --- a/homeassistant/components/ebox/sensor.py +++ b/homeassistant/components/ebox/sensor.py @@ -6,9 +6,9 @@ from datetime import timedelta import logging +import probatio from pyebox import EboxClient from pyebox.client import PyEboxError -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -139,12 +139,12 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_MONITORED_VARIABLES): vol.All( - cv.ensure_list, [vol.In(SENSOR_TYPE_KEYS)] + probatio.Required(CONF_MONITORED_VARIABLES): probatio.All( + cv.ensure_list, [probatio.In(SENSOR_TYPE_KEYS)] ), - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/ebusd/__init__.py b/homeassistant/components/ebusd/__init__.py index edd948a59319c..fd9cd7d76af16 100644 --- a/homeassistant/components/ebusd/__init__.py +++ b/homeassistant/components/ebusd/__init__.py @@ -4,7 +4,7 @@ from typing import Any import ebusdpy -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_HOST, @@ -34,26 +34,28 @@ def verify_ebusd_config(config: ConfigType) -> ConfigType: circuit: str = config[CONF_CIRCUIT] for condition in config[CONF_MONITORED_CONDITIONS]: if condition not in SENSOR_TYPES[circuit]: - raise vol.Invalid(f"Condition '{condition}' not in '{circuit}'.") + raise probatio.Invalid(f"Condition '{condition}' not in '{circuit}'.") return config -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( - vol.All( + DOMAIN: probatio.Schema( + probatio.All( { - vol.Required(CONF_CIRCUIT): cv.string, - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_MONITORED_CONDITIONS, default=[]): cv.ensure_list, + probatio.Required(CONF_CIRCUIT): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional( + CONF_MONITORED_CONDITIONS, default=[] + ): cv.ensure_list, }, verify_ebusd_config, ) ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/ecoal_boiler/__init__.py b/homeassistant/components/ecoal_boiler/__init__.py index 0648dfb56bf48..3462c61e4806b 100644 --- a/homeassistant/components/ecoal_boiler/__init__.py +++ b/homeassistant/components/ecoal_boiler/__init__.py @@ -3,7 +3,7 @@ import logging from ecoaliface.simple import ECoalController -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_HOST, @@ -51,35 +51,35 @@ "exhaust_temp": "Exhaust temperature", } -SWITCH_SCHEMA = vol.Schema( +SWITCH_SCHEMA = probatio.Schema( { - vol.Optional(CONF_MONITORED_CONDITIONS, default=list(AVAILABLE_PUMPS)): vol.All( - cv.ensure_list, [vol.In(AVAILABLE_PUMPS)] - ) + probatio.Optional( + CONF_MONITORED_CONDITIONS, default=list(AVAILABLE_PUMPS) + ): probatio.All(cv.ensure_list, [probatio.In(AVAILABLE_PUMPS)]) } ) -SENSOR_SCHEMA = vol.Schema( +SENSOR_SCHEMA = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_MONITORED_CONDITIONS, default=list(AVAILABLE_SENSORS) - ): vol.All(cv.ensure_list, [vol.In(AVAILABLE_SENSORS)]) + ): probatio.All(cv.ensure_list, [probatio.In(AVAILABLE_SENSORS)]) } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_PASSWORD, default=DEFAULT_PASSWORD): cv.string, - vol.Optional(CONF_SENSORS, default={}): SENSOR_SCHEMA, - vol.Optional(CONF_SWITCHES, default={}): SWITCH_SCHEMA, - vol.Optional(CONF_USERNAME, default=DEFAULT_USERNAME): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_PASSWORD, default=DEFAULT_PASSWORD): cv.string, + probatio.Optional(CONF_SENSORS, default={}): SENSOR_SCHEMA, + probatio.Optional(CONF_SWITCHES, default={}): SWITCH_SCHEMA, + probatio.Optional(CONF_USERNAME, default=DEFAULT_USERNAME): cv.string, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/ecobee/climate.py b/homeassistant/components/ecobee/climate.py index fdc0009cddbb8..663087ae51e2f 100644 --- a/homeassistant/components/ecobee/climate.py +++ b/homeassistant/components/ecobee/climate.py @@ -3,7 +3,7 @@ import collections from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.climate import ( ATTR_TARGET_TEMP_HIGH, @@ -185,21 +185,21 @@ def _remove_thermostats() -> None: platform.async_register_entity_service( SERVICE_SET_DST_MODE, - {vol.Required(ATTR_DST_ENABLED): cv.boolean}, + {probatio.Required(ATTR_DST_ENABLED): cv.boolean}, "set_dst_mode", ) platform.async_register_entity_service( SERVICE_SET_MIC_MODE, - {vol.Required(ATTR_MIC_ENABLED): cv.boolean}, + {probatio.Required(ATTR_MIC_ENABLED): cv.boolean}, "set_mic_mode", ) platform.async_register_entity_service( SERVICE_SET_OCCUPANCY_MODES, { - vol.Optional(ATTR_AUTO_AWAY): cv.boolean, - vol.Optional(ATTR_FOLLOW_ME): cv.boolean, + probatio.Optional(ATTR_AUTO_AWAY): cv.boolean, + probatio.Optional(ATTR_FOLLOW_ME): cv.boolean, }, "set_occupancy_modes", ) @@ -207,8 +207,8 @@ def _remove_thermostats() -> None: platform.async_register_entity_service( SERVICE_SET_SENSORS_USED_IN_CLIMATE, { - vol.Optional(ATTR_PRESET_MODE): cv.string, - vol.Required(ATTR_SENSOR_LIST): cv.ensure_list, + probatio.Optional(ATTR_PRESET_MODE): cv.string, + probatio.Required(ATTR_SENSOR_LIST): cv.ensure_list, }, "set_sensors_used_in_climate", ) diff --git a/homeassistant/components/ecobee/config_flow.py b/homeassistant/components/ecobee/config_flow.py index 1264f2f2b6760..3ee7cf6691bd8 100644 --- a/homeassistant/components/ecobee/config_flow.py +++ b/homeassistant/components/ecobee/config_flow.py @@ -3,6 +3,7 @@ from collections.abc import Mapping from typing import Any, override +import probatio from pyecobee import ( ECOBEE_API_KEY, ECOBEE_PASSWORD, @@ -13,23 +14,22 @@ EcobeeAuthUnknownError, MfaChallenge, ) -import voluptuous as vol from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY, CONF_CODE, CONF_PASSWORD, CONF_USERNAME from .const import CONF_REFRESH_TOKEN, DOMAIN -_USER_SCHEMA = vol.Schema( +_USER_SCHEMA = probatio.Schema( { - vol.Optional(CONF_API_KEY): str, - vol.Optional(CONF_USERNAME): str, - vol.Optional(CONF_PASSWORD): str, + probatio.Optional(CONF_API_KEY): str, + probatio.Optional(CONF_USERNAME): str, + probatio.Optional(CONF_PASSWORD): str, } ) -_MFA_SCHEMA = vol.Schema({vol.Required(CONF_CODE): str}) -_REAUTH_SCHEMA = vol.Schema({vol.Required(CONF_PASSWORD): str}) +_MFA_SCHEMA = probatio.Schema({probatio.Required(CONF_CODE): str}) +_REAUTH_SCHEMA = probatio.Schema({probatio.Required(CONF_PASSWORD): str}) class EcobeeFlowHandler(ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/components/ecobee/services.py b/homeassistant/components/ecobee/services.py index 86cdabe32055a..bd413ee76f46c 100644 --- a/homeassistant/components/ecobee/services.py +++ b/homeassistant/components/ecobee/services.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING -import voluptuous as vol +import probatio from homeassistant.const import ATTR_ENTITY_ID from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -42,49 +42,53 @@ f"{ATTR_END_DATE} and {ATTR_END_TIME} must be specified together" ) -CREATE_VACATION_SCHEMA = vol.Schema( +CREATE_VACATION_SCHEMA = probatio.Schema( { - vol.Required(ATTR_ENTITY_ID): cv.entity_id, - vol.Required(ATTR_VACATION_NAME): vol.All(cv.string, vol.Length(max=12)), - vol.Required(ATTR_COOL_TEMP): vol.Coerce(float), - vol.Required(ATTR_HEAT_TEMP): vol.Coerce(float), - vol.Inclusive( + probatio.Required(ATTR_ENTITY_ID): cv.entity_id, + probatio.Required(ATTR_VACATION_NAME): probatio.All( + cv.string, probatio.Length(max=12) + ), + probatio.Required(ATTR_COOL_TEMP): probatio.Coerce(float), + probatio.Required(ATTR_HEAT_TEMP): probatio.Coerce(float), + probatio.Inclusive( ATTR_START_DATE, "dtgroup_start", msg=DTGROUP_START_INCLUSIVE_MSG ): ecobee_date, - vol.Inclusive( + probatio.Inclusive( ATTR_START_TIME, "dtgroup_start", msg=DTGROUP_START_INCLUSIVE_MSG ): ecobee_time, - vol.Inclusive( + probatio.Inclusive( ATTR_END_DATE, "dtgroup_end", msg=DTGROUP_END_INCLUSIVE_MSG ): ecobee_date, - vol.Inclusive( + probatio.Inclusive( ATTR_END_TIME, "dtgroup_end", msg=DTGROUP_END_INCLUSIVE_MSG ): ecobee_time, - vol.Optional(ATTR_FAN_MODE, default="auto"): vol.Any("auto", "on"), - vol.Optional(ATTR_FAN_MIN_ON_TIME, default=0): vol.All( - int, vol.Range(min=0, max=60) + probatio.Optional(ATTR_FAN_MODE, default="auto"): probatio.Any("auto", "on"), + probatio.Optional(ATTR_FAN_MIN_ON_TIME, default=0): probatio.All( + int, probatio.Range(min=0, max=60) ), } ) -DELETE_VACATION_SCHEMA = vol.Schema( +DELETE_VACATION_SCHEMA = probatio.Schema( { - vol.Required(ATTR_ENTITY_ID): cv.entity_id, - vol.Required(ATTR_VACATION_NAME): vol.All(cv.string, vol.Length(max=12)), + probatio.Required(ATTR_ENTITY_ID): cv.entity_id, + probatio.Required(ATTR_VACATION_NAME): probatio.All( + cv.string, probatio.Length(max=12) + ), } ) -RESUME_PROGRAM_SCHEMA = vol.Schema( +RESUME_PROGRAM_SCHEMA = probatio.Schema( { - vol.Optional(ATTR_ENTITY_ID): cv.entity_ids, - vol.Optional(ATTR_RESUME_ALL, default=DEFAULT_RESUME_ALL): cv.boolean, + probatio.Optional(ATTR_ENTITY_ID): cv.entity_ids, + probatio.Optional(ATTR_RESUME_ALL, default=DEFAULT_RESUME_ALL): cv.boolean, } ) -SET_FAN_MIN_ON_TIME_SCHEMA = vol.Schema( +SET_FAN_MIN_ON_TIME_SCHEMA = probatio.Schema( { - vol.Optional(ATTR_ENTITY_ID): cv.entity_ids, - vol.Required(ATTR_FAN_MIN_ON_TIME): vol.Coerce(int), + probatio.Optional(ATTR_ENTITY_ID): cv.entity_ids, + probatio.Required(ATTR_FAN_MIN_ON_TIME): probatio.Coerce(int), } ) diff --git a/homeassistant/components/ecobee/util.py b/homeassistant/components/ecobee/util.py index 8dbc11c8cf665..6193b8ada62a9 100644 --- a/homeassistant/components/ecobee/util.py +++ b/homeassistant/components/ecobee/util.py @@ -2,7 +2,7 @@ from datetime import date, datetime, timedelta -import voluptuous as vol +import probatio def ecobee_date(date_string): @@ -10,7 +10,9 @@ def ecobee_date(date_string): try: datetime.strptime(date_string, "%Y-%m-%d") except ValueError as err: - raise vol.Invalid("Date does not match ecobee date format YYYY-MM-DD") from err + raise probatio.Invalid( + "Date does not match ecobee date format YYYY-MM-DD" + ) from err return date_string @@ -19,7 +21,7 @@ def ecobee_time(time_string): try: datetime.strptime(time_string, "%H:%M:%S") except ValueError as err: - raise vol.Invalid( + raise probatio.Invalid( "Time does not match ecobee 24-hour time format HH:MM:SS" ) from err return time_string diff --git a/homeassistant/components/ecoforest/config_flow.py b/homeassistant/components/ecoforest/config_flow.py index 3d8919f254b12..46aa55624dc43 100644 --- a/homeassistant/components/ecoforest/config_flow.py +++ b/homeassistant/components/ecoforest/config_flow.py @@ -4,9 +4,9 @@ from typing import Any, override from httpx import BasicAuth +import probatio from pyecoforest.api import EcoforestApi from pyecoforest.exceptions import EcoforestAuthenticationRequired -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME @@ -15,11 +15,11 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/econet/config_flow.py b/homeassistant/components/econet/config_flow.py index 38af7e236ba9d..c37461f9221ab 100644 --- a/homeassistant/components/econet/config_flow.py +++ b/homeassistant/components/econet/config_flow.py @@ -2,9 +2,9 @@ from typing import Any, override +import probatio from pyeconet import EcoNetApiInterface from pyeconet.errors import InvalidCredentialsError, PyeconetError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_EMAIL, CONF_PASSWORD @@ -19,10 +19,10 @@ class EcoNetFlowHandler(ConfigFlow, domain=DOMAIN): def __init__(self) -> None: """Initialize the config flow.""" - self.data_schema = vol.Schema( + self.data_schema = probatio.Schema( { - vol.Required(CONF_EMAIL): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_EMAIL): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/ecovacs/config_flow.py b/homeassistant/components/ecovacs/config_flow.py index 1790492e33d29..0dd997f60a37b 100644 --- a/homeassistant/components/ecovacs/config_flow.py +++ b/homeassistant/components/ecovacs/config_flow.py @@ -18,7 +18,7 @@ ) from deebot_client.mqtt_client import MqttClient, create_mqtt_config from deebot_client.util import md5 -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -55,8 +55,8 @@ def _validate_url( if urlparse(value).scheme not in schema_list: return {field_name: f"invalid_url_schema_{field_name}"} try: - vol.Schema(vol.Url())(value) - except vol.Invalid: + probatio.Schema(probatio.Url())(value) + except probatio.Invalid: return {field_name: "invalid_url"} return {} @@ -227,9 +227,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_MODE, default=InstanceMode.CLOUD ): selector.SelectSelector( selector.SelectSelectorConfig( @@ -250,27 +250,29 @@ def _show_auth_form( ) -> ConfigFlowResult: """Show the authentication form.""" schema: VolDictType = { - vol.Required(CONF_USERNAME): selector.TextSelector( + probatio.Required(CONF_USERNAME): selector.TextSelector( selector.TextSelectorConfig(type=selector.TextSelectorType.TEXT) ), - vol.Required(CONF_PASSWORD): selector.TextSelector( + probatio.Required(CONF_PASSWORD): selector.TextSelector( selector.TextSelectorConfig(type=selector.TextSelectorType.PASSWORD) ), - vol.Required(CONF_COUNTRY): selector.CountrySelector(), + probatio.Required(CONF_COUNTRY): selector.CountrySelector(), } if self._mode == InstanceMode.SELF_HOSTED: schema.update( { - vol.Required(CONF_OVERRIDE_REST_URL): selector.TextSelector( + probatio.Required(CONF_OVERRIDE_REST_URL): selector.TextSelector( selector.TextSelectorConfig(type=selector.TextSelectorType.URL) ), - vol.Required(CONF_OVERRIDE_MQTT_URL): selector.TextSelector( + probatio.Required(CONF_OVERRIDE_MQTT_URL): selector.TextSelector( selector.TextSelectorConfig(type=selector.TextSelectorType.URL) ), } ) if errors: - schema[vol.Optional(CONF_VERIFY_MQTT_CERTIFICATE, default=True)] = bool + schema[ + probatio.Optional(CONF_VERIFY_MQTT_CERTIFICATE, default=True) + ] = bool if not user_input: user_input = { @@ -280,7 +282,7 @@ def _show_auth_form( return self.async_show_form( step_id="auth", data_schema=self.add_suggested_values_to_schema( - data_schema=vol.Schema(schema), suggested_values=user_input + data_schema=probatio.Schema(schema), suggested_values=user_input ), errors=errors, last_step=True, @@ -350,9 +352,11 @@ async def async_step_device_verification( return self.async_show_form( step_id="device_verification", data_schema=self.add_suggested_values_to_schema( - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_VERIFICATION_CODE): selector.TextSelector( + probatio.Required( + CONF_VERIFICATION_CODE + ): selector.TextSelector( selector.TextSelectorConfig( type=selector.TextSelectorType.TEXT ) @@ -374,9 +378,9 @@ def _show_reauth_form( return self.async_show_form( step_id="reauth_confirm", data_schema=self.add_suggested_values_to_schema( - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PASSWORD): selector.TextSelector( + probatio.Required(CONF_PASSWORD): selector.TextSelector( selector.TextSelectorConfig( type=selector.TextSelectorType.PASSWORD ) diff --git a/homeassistant/components/edifier_infrared/config_flow.py b/homeassistant/components/edifier_infrared/config_flow.py index 805ec1e8dc60f..99e77d4bfa009 100644 --- a/homeassistant/components/edifier_infrared/config_flow.py +++ b/homeassistant/components/edifier_infrared/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from infrared_protocols.codes.edifier.models import MODEL_TO_COMMAND_SET, EdifierModel -import voluptuous as vol +import probatio from homeassistant.components.infrared import ( DOMAIN as INFRARED_DOMAIN, @@ -60,14 +60,14 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_INFRARED_ENTITY_ID): EntitySelector( + probatio.Required(CONF_INFRARED_ENTITY_ID): EntitySelector( EntitySelectorConfig( domain=INFRARED_DOMAIN, include_entities=emitter_entity_ids ) ), - vol.Required(CONF_MODEL): SelectSelector( + probatio.Required(CONF_MODEL): SelectSelector( SelectSelectorConfig( options=[model.value for model in EdifierModel], mode=SelectSelectorMode.DROPDOWN, diff --git a/homeassistant/components/edimax/switch.py b/homeassistant/components/edimax/switch.py index 4d0d0ee7e1dea..40f13c0046b36 100644 --- a/homeassistant/components/edimax/switch.py +++ b/homeassistant/components/edimax/switch.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from pyedimax.smartplug import SmartPlug -import voluptuous as vol from homeassistant.components.switch import ( PLATFORM_SCHEMA as SWITCH_PLATFORM_SCHEMA, @@ -23,10 +23,10 @@ PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_PASSWORD, default=DEFAULT_PASSWORD): cv.string, - vol.Optional(CONF_USERNAME, default=DEFAULT_USERNAME): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_PASSWORD, default=DEFAULT_PASSWORD): cv.string, + probatio.Optional(CONF_USERNAME, default=DEFAULT_USERNAME): cv.string, } ) diff --git a/homeassistant/components/edl21/config_flow.py b/homeassistant/components/edl21/config_flow.py index ec86ea7c99a41..365aa1cb19879 100644 --- a/homeassistant/components/edl21/config_flow.py +++ b/homeassistant/components/edl21/config_flow.py @@ -2,16 +2,16 @@ from typing import override -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.helpers.selector import SerialPortSelector from .const import CONF_SERIAL_PORT, DEFAULT_TITLE, DOMAIN -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_SERIAL_PORT): SerialPortSelector(), + probatio.Required(CONF_SERIAL_PORT): SerialPortSelector(), } ) diff --git a/homeassistant/components/efergy/config_flow.py b/homeassistant/components/efergy/config_flow.py index 40ff29c0aab54..21092ea6b5772 100644 --- a/homeassistant/components/efergy/config_flow.py +++ b/homeassistant/components/efergy/config_flow.py @@ -3,8 +3,8 @@ from collections.abc import Mapping from typing import Any, override +import probatio from pyefergy import Efergy, exceptions -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY @@ -42,9 +42,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_API_KEY): str, + probatio.Required(CONF_API_KEY): str, } ), errors=errors, diff --git a/homeassistant/components/egardia/__init__.py b/homeassistant/components/egardia/__init__.py index dc94bb79a4e0f..4ad269eadfcde 100644 --- a/homeassistant/components/egardia/__init__.py +++ b/homeassistant/components/egardia/__init__.py @@ -2,9 +2,9 @@ import logging +import probatio from pythonegardia import egardiadevice, egardiaserver import requests -import voluptuous as vol from homeassistant.const import ( CONF_HOST, @@ -47,37 +47,39 @@ REPORT_SERVER_CODES_IGNORE = "ignore" -SERVER_CODE_SCHEMA = vol.Schema( +SERVER_CODE_SCHEMA = probatio.Schema( { - vol.Optional("arm"): vol.All(cv.ensure_list_csv, [cv.string]), - vol.Optional("disarm"): vol.All(cv.ensure_list_csv, [cv.string]), - vol.Optional("armhome"): vol.All(cv.ensure_list_csv, [cv.string]), - vol.Optional("triggered"): vol.All(cv.ensure_list_csv, [cv.string]), - vol.Optional("ignore"): vol.All(cv.ensure_list_csv, [cv.string]), + probatio.Optional("arm"): probatio.All(cv.ensure_list_csv, [cv.string]), + probatio.Optional("disarm"): probatio.All(cv.ensure_list_csv, [cv.string]), + probatio.Optional("armhome"): probatio.All(cv.ensure_list_csv, [cv.string]), + probatio.Optional("triggered"): probatio.All(cv.ensure_list_csv, [cv.string]), + probatio.Optional("ignore"): probatio.All(cv.ensure_list_csv, [cv.string]), } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Required(CONF_USERNAME): cv.string, - vol.Optional(CONF_VERSION, default=DEFAULT_VERSION): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_REPORT_SERVER_CODES, default={}): SERVER_CODE_SCHEMA, - vol.Optional( + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Optional(CONF_VERSION, default=DEFAULT_VERSION): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional( + CONF_REPORT_SERVER_CODES, default={} + ): SERVER_CODE_SCHEMA, + probatio.Optional( CONF_REPORT_SERVER_ENABLED, default=DEFAULT_REPORT_SERVER_ENABLED ): cv.boolean, - vol.Optional( + probatio.Optional( CONF_REPORT_SERVER_PORT, default=DEFAULT_REPORT_SERVER_PORT ): cv.port, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/egauge/config_flow.py b/homeassistant/components/egauge/config_flow.py index 078291eb020ce..9d84f95dd484b 100644 --- a/homeassistant/components/egauge/config_flow.py +++ b/homeassistant/components/egauge/config_flow.py @@ -5,7 +5,7 @@ from egauge_async.exceptions import EgaugeAuthenticationError, EgaugePermissionError from egauge_async.json.client import EgaugeJsonClient from httpx import ConnectError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -19,13 +19,13 @@ from .const import DOMAIN, LOGGER -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Required(CONF_SSL, default=True): bool, - vol.Required(CONF_VERIFY_SSL, default=False): bool, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Required(CONF_SSL, default=True): bool, + probatio.Required(CONF_VERIFY_SSL, default=False): bool, } ) diff --git a/homeassistant/components/eheimdigital/config_flow.py b/homeassistant/components/eheimdigital/config_flow.py index 6ec5b677cedfb..b61dedb436fd2 100644 --- a/homeassistant/components/eheimdigital/config_flow.py +++ b/homeassistant/components/eheimdigital/config_flow.py @@ -6,7 +6,7 @@ from aiohttp import ClientError from eheimdigital.device import EheimDigitalDevice from eheimdigital.hub import EheimDigitalHub -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_RECONFIGURE, @@ -21,8 +21,12 @@ from .const import DOMAIN, LOGGER -CONFIG_SCHEMA = vol.Schema( - {vol.Required(CONF_HOST, default="eheimdigital.local"): selector.TextSelector()} +CONFIG_SCHEMA = probatio.Schema( + { + probatio.Required( + CONF_HOST, default="eheimdigital.local" + ): selector.TextSelector() + } ) diff --git a/homeassistant/components/ekeybionyx/config_flow.py b/homeassistant/components/ekeybionyx/config_flow.py index 41dd47eb1bc82..4d14b531a36ac 100644 --- a/homeassistant/components/ekeybionyx/config_flow.py +++ b/homeassistant/components/ekeybionyx/config_flow.py @@ -9,7 +9,7 @@ import aiohttp import ekey_bionyxpy -import voluptuous as vol +import probatio from homeassistant.components.webhook import ( async_generate_id as webhook_generate_id, @@ -121,10 +121,12 @@ async def async_step_choose_system( {"value": s.system_id, "label": s.system_name} for s in self._data["systems"] ] - data_schema = {vol.Required("system"): SelectSelector({"options": options})} + data_schema = { + probatio.Required("system"): SelectSelector({"options": options}) + } return self.async_show_form( step_id="choose_system", - data_schema=vol.Schema(data_schema), + data_schema=probatio.Schema(data_schema), description_placeholders={"ekeybionyx": INTEGRATION_NAME}, ) self._data["system"] = [ @@ -169,7 +171,7 @@ async def async_step_webhooks( errors.update({key: "invalid_name"}) try: cv.url(user_input[CONF_URL]) - except vol.Invalid: + except probatio.Invalid: errors[CONF_URL] = "invalid_url" if set(user_input) == {CONF_URL}: errors["base"] = "no_webhooks_provided" @@ -208,14 +210,16 @@ async def async_step_webhooks( ) data_schema: dict[Any, Any] = { - vol.Optional(f"webhook{i + 1}"): vol.All(str, vol.Length(max=50)) + probatio.Optional(f"webhook{i + 1}"): probatio.All( + str, probatio.Length(max=50) + ) for i in range(self._data["system"].function_webhook_quotas["free"]) } - data_schema[vol.Required(CONF_URL)] = str + data_schema[probatio.Required(CONF_URL)] = str return self.async_show_form( step_id="webhooks", data_schema=self.add_suggested_values_to_schema( - vol.Schema(data_schema), + probatio.Schema(data_schema), { CONF_URL: get_url( self.hass, diff --git a/homeassistant/components/electrasmart/config_flow.py b/homeassistant/components/electrasmart/config_flow.py index 02a49e0d1d66b..eb0116e2dddf4 100644 --- a/homeassistant/components/electrasmart/config_flow.py +++ b/homeassistant/components/electrasmart/config_flow.py @@ -5,7 +5,7 @@ from electrasmart.api import STATUS_SUCCESS, Attributes, ElectraAPI, ElectraApiError from electrasmart.api.utils import generate_imei -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_TOKEN @@ -58,16 +58,18 @@ def _show_setup_form( if step_id == "user": schema = { - vol.Required( + probatio.Required( CONF_PHONE_NUMBER, default=user_input.get(CONF_PHONE_NUMBER, "") ): str } else: - schema = {vol.Required(CONF_OTP, default=user_input.get(CONF_OTP, "")): str} + schema = { + probatio.Required(CONF_OTP, default=user_input.get(CONF_OTP, "")): str + } return self.async_show_form( step_id=step_id, - data_schema=vol.Schema(schema), + data_schema=probatio.Schema(schema), errors=errors or {}, description_placeholders=self._description_placeholders, ) @@ -154,6 +156,6 @@ async def _show_otp_form( return self.async_show_form( step_id=CONF_OTP, - data_schema=vol.Schema({vol.Required(CONF_OTP): str}), + data_schema=probatio.Schema({probatio.Required(CONF_OTP): str}), errors=errors or {}, ) diff --git a/homeassistant/components/elevenlabs/config_flow.py b/homeassistant/components/elevenlabs/config_flow.py index 4ec4749cf4e7e..058bb10803e99 100644 --- a/homeassistant/components/elevenlabs/config_flow.py +++ b/homeassistant/components/elevenlabs/config_flow.py @@ -5,7 +5,7 @@ from elevenlabs import AsyncElevenLabs from elevenlabs.core import ApiError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, OptionsFlow from homeassistant.const import CONF_API_KEY, CONF_MODEL @@ -38,7 +38,7 @@ STT_MODELS, ) -USER_STEP_SCHEMA = vol.Schema({vol.Required(CONF_API_KEY): str}) +USER_STEP_SCHEMA = probatio.Schema({probatio.Required(CONF_API_KEY): str}) _LOGGER = logging.getLogger(__name__) @@ -155,12 +155,12 @@ async def async_step_init( data_schema=schema, ) - def elevenlabs_config_option_schema(self) -> vol.Schema: + def elevenlabs_config_option_schema(self) -> probatio.Schema: """Elevenlabs options schema.""" return self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required( + probatio.Required( CONF_MODEL, ): SelectSelector( SelectSelectorConfig( @@ -170,7 +170,7 @@ def elevenlabs_config_option_schema(self) -> vol.Schema: ] ) ), - vol.Required( + probatio.Required( CONF_VOICE, ): SelectSelector( SelectSelectorConfig( @@ -180,7 +180,7 @@ def elevenlabs_config_option_schema(self) -> vol.Schema: ] ) ), - vol.Required( + probatio.Required( CONF_STT_MODEL, ): SelectSelector( SelectSelectorConfig( @@ -190,13 +190,13 @@ def elevenlabs_config_option_schema(self) -> vol.Schema: ] ) ), - vol.Required( + probatio.Required( CONF_STT_AUTO_LANGUAGE, default=self.config_entry.options.get( CONF_STT_AUTO_LANGUAGE, DEFAULT_STT_AUTO_LANGUAGE ), ): bool, - vol.Required(CONF_CONFIGURE_VOICE, default=False): bool, + probatio.Required(CONF_CONFIGURE_VOICE, default=False): bool, } ), self.config_entry.options, @@ -221,36 +221,36 @@ async def async_step_voice_settings( data_schema=self.elevenlabs_config_options_voice_schema(), ) - def elevenlabs_config_options_voice_schema(self) -> vol.Schema: + def elevenlabs_config_options_voice_schema(self) -> probatio.Schema: """Elevenlabs options voice schema.""" - return vol.Schema( + return probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_STABILITY, default=self.config_entry.options.get( CONF_STABILITY, DEFAULT_STABILITY ), - ): vol.All( - vol.Coerce(float), - vol.Range(min=0, max=1), + ): probatio.All( + probatio.Coerce(float), + probatio.Range(min=0, max=1), ), - vol.Optional( + probatio.Optional( CONF_SIMILARITY, default=self.config_entry.options.get( CONF_SIMILARITY, DEFAULT_SIMILARITY ), - ): vol.All( - vol.Coerce(float), - vol.Range(min=0, max=1), + ): probatio.All( + probatio.Coerce(float), + probatio.Range(min=0, max=1), ), - vol.Optional( + probatio.Optional( CONF_STYLE, default=self.config_entry.options.get(CONF_STYLE, DEFAULT_STYLE), - ): vol.All( - vol.Coerce(float), - vol.Range(min=0, max=1), + ): probatio.All( + probatio.Coerce(float), + probatio.Range(min=0, max=1), ), - vol.Optional( + probatio.Optional( CONF_USE_SPEAKER_BOOST, default=self.config_entry.options.get( CONF_USE_SPEAKER_BOOST, DEFAULT_USE_SPEAKER_BOOST diff --git a/homeassistant/components/elgato/config_flow.py b/homeassistant/components/elgato/config_flow.py index f5ffec5a8e046..e5bb46a9d823a 100644 --- a/homeassistant/components/elgato/config_flow.py +++ b/homeassistant/components/elgato/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from elgato import Elgato, ElgatoError -import voluptuous as vol +import probatio from homeassistant.components import onboarding from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -97,9 +97,9 @@ async def async_step_reconfigure( return self.async_show_form( step_id="reconfigure", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_HOST, default=self._get_reconfigure_entry().data[CONF_HOST], ): str, @@ -142,9 +142,9 @@ def _async_show_setup_form( """Show the setup form to the user.""" return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST): str, + probatio.Required(CONF_HOST): str, } ), errors=errors or {}, diff --git a/homeassistant/components/elkm1/__init__.py b/homeassistant/components/elkm1/__init__.py index 74774a09de20a..6a7c1f15f5d95 100644 --- a/homeassistant/components/elkm1/__init__.py +++ b/homeassistant/components/elkm1/__init__.py @@ -8,7 +8,7 @@ from elkm1_lib.elements import Element from elkm1_lib.elk import Elk from elkm1_lib.util import parse_url -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry from homeassistant.const import ( @@ -90,13 +90,13 @@ def _host_validator(config: dict[str, str]) -> dict[str, str]: """Validate that a host is properly configured.""" if config[CONF_HOST].startswith(("elks://", "elksv1_2://")): if CONF_USERNAME not in config or CONF_PASSWORD not in config: - raise vol.Invalid( + raise probatio.Invalid( "Specify username and password for elks:// or elksv1_2://" ) elif not config[CONF_HOST].startswith("elk://") and not config[ CONF_HOST ].startswith("serial://"): - raise vol.Invalid("Invalid host URL") + raise probatio.Invalid("Invalid host URL") return config @@ -105,7 +105,7 @@ def _housecode_to_int(val: str) -> int: match = re.search(r"^([a-p])(0[1-9]|1[0-6]|[1-9])$", val.lower()) if match: return (ord(match.group(1)) - ord("a")) * 16 + int(match.group(2)) - raise vol.Invalid("Invalid range") + raise probatio.Invalid("Invalid range") def _elk_value(val: str) -> int: return int(val) if val.isdigit() else _housecode_to_int(val) @@ -122,46 +122,48 @@ def _has_all_unique_prefixes(value: list[dict[str, str]]) -> list[dict[str, str] Uniqueness is determined case-independently. """ prefixes = [device[CONF_PREFIX] for device in value] - schema = vol.Schema(vol.Unique()) + schema = probatio.Schema(probatio.Unique()) schema(prefixes) return value -DEVICE_SCHEMA_SUBDOMAIN = vol.Schema( +DEVICE_SCHEMA_SUBDOMAIN = probatio.Schema( { - vol.Optional(CONF_ENABLED, default=True): cv.boolean, - vol.Optional(CONF_INCLUDE, default=[]): [_elk_range_validator], - vol.Optional(CONF_EXCLUDE, default=[]): [_elk_range_validator], + probatio.Optional(CONF_ENABLED, default=True): cv.boolean, + probatio.Optional(CONF_INCLUDE, default=[]): [_elk_range_validator], + probatio.Optional(CONF_EXCLUDE, default=[]): [_elk_range_validator], } ) -DEVICE_SCHEMA = vol.All( +DEVICE_SCHEMA = probatio.All( cv.deprecated(CONF_TEMPERATURE_UNIT), - vol.Schema( + probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_PREFIX, default=""): vol.All(cv.string, vol.Lower), - vol.Optional(CONF_USERNAME, default=""): cv.string, - vol.Optional(CONF_PASSWORD, default=""): cv.string, - vol.Optional(CONF_AUTO_CONFIGURE, default=False): cv.boolean, - vol.Optional(CONF_TEMPERATURE_UNIT, default="F"): cv.temperature_unit, - vol.Optional(CONF_AREA, default={}): DEVICE_SCHEMA_SUBDOMAIN, - vol.Optional(CONF_COUNTER, default={}): DEVICE_SCHEMA_SUBDOMAIN, - vol.Optional(CONF_KEYPAD, default={}): DEVICE_SCHEMA_SUBDOMAIN, - vol.Optional(CONF_OUTPUT, default={}): DEVICE_SCHEMA_SUBDOMAIN, - vol.Optional(CONF_PLC, default={}): DEVICE_SCHEMA_SUBDOMAIN, - vol.Optional(CONF_SETTING, default={}): DEVICE_SCHEMA_SUBDOMAIN, - vol.Optional(CONF_TASK, default={}): DEVICE_SCHEMA_SUBDOMAIN, - vol.Optional(CONF_THERMOSTAT, default={}): DEVICE_SCHEMA_SUBDOMAIN, - vol.Optional(CONF_ZONE, default={}): DEVICE_SCHEMA_SUBDOMAIN, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_PREFIX, default=""): probatio.All( + cv.string, probatio.Lower + ), + probatio.Optional(CONF_USERNAME, default=""): cv.string, + probatio.Optional(CONF_PASSWORD, default=""): cv.string, + probatio.Optional(CONF_AUTO_CONFIGURE, default=False): cv.boolean, + probatio.Optional(CONF_TEMPERATURE_UNIT, default="F"): cv.temperature_unit, + probatio.Optional(CONF_AREA, default={}): DEVICE_SCHEMA_SUBDOMAIN, + probatio.Optional(CONF_COUNTER, default={}): DEVICE_SCHEMA_SUBDOMAIN, + probatio.Optional(CONF_KEYPAD, default={}): DEVICE_SCHEMA_SUBDOMAIN, + probatio.Optional(CONF_OUTPUT, default={}): DEVICE_SCHEMA_SUBDOMAIN, + probatio.Optional(CONF_PLC, default={}): DEVICE_SCHEMA_SUBDOMAIN, + probatio.Optional(CONF_SETTING, default={}): DEVICE_SCHEMA_SUBDOMAIN, + probatio.Optional(CONF_TASK, default={}): DEVICE_SCHEMA_SUBDOMAIN, + probatio.Optional(CONF_THERMOSTAT, default={}): DEVICE_SCHEMA_SUBDOMAIN, + probatio.Optional(CONF_ZONE, default={}): DEVICE_SCHEMA_SUBDOMAIN, }, ), _host_validator, ) -CONFIG_SCHEMA = vol.Schema( - {DOMAIN: vol.All(cv.ensure_list, [DEVICE_SCHEMA], _has_all_unique_prefixes)}, - extra=vol.ALLOW_EXTRA, +CONFIG_SCHEMA = probatio.Schema( + {DOMAIN: probatio.All(cv.ensure_list, [DEVICE_SCHEMA], _has_all_unique_prefixes)}, + extra=probatio.ALLOW_EXTRA, ) @@ -249,7 +251,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ElkM1ConfigEntry) -> boo try: _included(conf[item]["include"], True, config[item]["included"]) _included(conf[item]["exclude"], False, config[item]["included"]) - except (ValueError, vol.Invalid) as err: + except (ValueError, probatio.Invalid) as err: _LOGGER.error("Config item: %s; %s", item, err) return False @@ -324,7 +326,7 @@ def _keypad_changed(keypad: Element, changeset: dict[str, Any]) -> None: def _included(ranges: list[tuple[int, int]], set_to: bool, values: list[bool]) -> None: for rng in ranges: if not rng[0] <= rng[1] <= len(values): - raise vol.Invalid(f"Invalid range {rng}") + raise probatio.Invalid(f"Invalid range {rng}") values[rng[0] - 1 : rng[1]] = [set_to] * (rng[1] - rng[0] + 1) diff --git a/homeassistant/components/elkm1/alarm_control_panel.py b/homeassistant/components/elkm1/alarm_control_panel.py index e85a9a303b6cc..c22eb97c13e60 100644 --- a/homeassistant/components/elkm1/alarm_control_panel.py +++ b/homeassistant/components/elkm1/alarm_control_panel.py @@ -7,7 +7,7 @@ from elkm1_lib.elements import Element from elkm1_lib.elk import Elk from elkm1_lib.keypads import Keypad -import voluptuous as vol +import probatio from homeassistant.components.alarm_control_panel import ( AlarmControlPanelEntity, @@ -34,13 +34,15 @@ from .models import ELKM1Data DISPLAY_MESSAGE_SERVICE_SCHEMA: VolDictType = { - vol.Optional("clear", default=2): vol.All(vol.Coerce(int), vol.In([0, 1, 2])), - vol.Optional("beep", default=False): cv.boolean, - vol.Optional("timeout", default=0): vol.All( - vol.Coerce(int), vol.Range(min=0, max=65535) + probatio.Optional("clear", default=2): probatio.All( + probatio.Coerce(int), probatio.In([0, 1, 2]) ), - vol.Optional("line1", default=""): cv.string, - vol.Optional("line2", default=""): cv.string, + probatio.Optional("beep", default=False): cv.boolean, + probatio.Optional("timeout", default=0): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=65535) + ), + probatio.Optional("line1", default=""): cv.string, + probatio.Optional("line2", default=""): cv.string, } SERVICE_ALARM_DISPLAY_MESSAGE = "alarm_display_message" diff --git a/homeassistant/components/elkm1/config_flow.py b/homeassistant/components/elkm1/config_flow.py index eea9e6bc846df..f80518b5ab472 100644 --- a/homeassistant/components/elkm1/config_flow.py +++ b/homeassistant/components/elkm1/config_flow.py @@ -5,7 +5,7 @@ from elkm1_lib.discovery import ElkSystem from elkm1_lib.elk import Elk -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -50,8 +50,8 @@ VALIDATE_TIMEOUT = 35 BASE_SCHEMA: VolDictType = { - vol.Optional(CONF_USERNAME, default=""): str, - vol.Optional(CONF_PASSWORD, default=""): str, + probatio.Optional(CONF_USERNAME, default=""): str, + probatio.Optional(CONF_PASSWORD, default=""): str, } SECURE_PROTOCOLS = ["secure", "TLS 1.2"] @@ -271,24 +271,24 @@ async def async_step_reconfigure( return self.async_show_form( step_id="reconfigure", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_USERNAME, default=existing_data.get(CONF_USERNAME, ""), ): str, - vol.Optional( + probatio.Optional( CONF_PASSWORD, default="", ): str, - vol.Required( + probatio.Required( CONF_ADDRESS, default=hostname_from_url(existing_data[CONF_HOST]), ): str, - vol.Required( + probatio.Required( CONF_PROTOCOL, default=_get_protocol_from_url(existing_data[CONF_HOST]), - ): vol.In(ALL_PROTOCOLS), + ): probatio.In(ALL_PROTOCOLS), } ), errors=errors, @@ -327,7 +327,9 @@ async def async_step_user( devices_name[None] = "Manual Entry" return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_DEVICE): vol.In(devices_name)}), + data_schema=probatio.Schema( + {probatio.Required(CONF_DEVICE): probatio.In(devices_name)} + ), ) async def _async_create_or_error( @@ -383,12 +385,12 @@ async def async_step_discovered_connection( default_proto = PORT_PROTOCOL_MAP.get(device.port, DEFAULT_SECURE_PROTOCOL) return self.async_show_form( step_id="discovered_connection", - data_schema=vol.Schema( + data_schema=probatio.Schema( { **BASE_SCHEMA, - vol.Required(CONF_PROTOCOL, default=default_proto): vol.In( - ALL_PROTOCOLS - ), + probatio.Required( + CONF_PROTOCOL, default=default_proto + ): probatio.In(ALL_PROTOCOLS), } ), errors=errors, @@ -419,14 +421,14 @@ async def async_step_manual_connection( return self.async_show_form( step_id="manual_connection", - data_schema=vol.Schema( + data_schema=probatio.Schema( { **BASE_SCHEMA, - vol.Required(CONF_ADDRESS): str, - vol.Optional(CONF_PREFIX, default=""): str, - vol.Required( + probatio.Required(CONF_ADDRESS): str, + probatio.Optional(CONF_PREFIX, default=""): str, + probatio.Required( CONF_PROTOCOL, default=DEFAULT_SECURE_PROTOCOL - ): vol.In(ALL_PROTOCOLS), + ): probatio.In(ALL_PROTOCOLS), } ), errors=errors, diff --git a/homeassistant/components/elkm1/const.py b/homeassistant/components/elkm1/const.py index 70b48ecf0c8ed..9a3d13b9f6cf5 100644 --- a/homeassistant/components/elkm1/const.py +++ b/homeassistant/components/elkm1/const.py @@ -3,7 +3,7 @@ from datetime import timedelta from elkm1_lib.const import Max -import voluptuous as vol +import probatio from homeassistant.const import ATTR_CODE, CONF_ZONE from homeassistant.helpers.typing import VolDictType @@ -51,5 +51,7 @@ ATTR_VALUE = "value" ELK_USER_CODE_SERVICE_SCHEMA: VolDictType = { - vol.Required(ATTR_CODE): vol.All(vol.Coerce(int), vol.Range(0, 999999)) + probatio.Required(ATTR_CODE): probatio.All( + probatio.Coerce(int), probatio.Range(0, 999999) + ) } diff --git a/homeassistant/components/elkm1/sensor.py b/homeassistant/components/elkm1/sensor.py index 14cebf21df981..a420c17a688ef 100644 --- a/homeassistant/components/elkm1/sensor.py +++ b/homeassistant/components/elkm1/sensor.py @@ -10,7 +10,7 @@ from elkm1_lib.settings import Setting from elkm1_lib.util import pretty_const from elkm1_lib.zones import Zone -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( SensorDeviceClass, @@ -51,7 +51,9 @@ } ELK_SET_COUNTER_SERVICE_SCHEMA: VolDictType = { - vol.Required(ATTR_VALUE): vol.All(vol.Coerce(int), vol.Range(0, 65535)) + probatio.Required(ATTR_VALUE): probatio.All( + probatio.Coerce(int), probatio.Range(0, 65535) + ) } diff --git a/homeassistant/components/elkm1/services.py b/homeassistant/components/elkm1/services.py index 5ad9df46f7f36..7b5cff22dbb72 100644 --- a/homeassistant/components/elkm1/services.py +++ b/homeassistant/components/elkm1/services.py @@ -1,7 +1,7 @@ """Support the ElkM1 Gold and ElkM1 EZ8 alarm/integration panels.""" from elkm1_lib.elk import Elk, Panel -import voluptuous as vol +import probatio from homeassistant.core import HomeAssistant, ServiceCall, callback from homeassistant.exceptions import HomeAssistantError @@ -11,16 +11,18 @@ from .const import DOMAIN from .models import ELKM1Data -SPEAK_SERVICE_SCHEMA = vol.Schema( +SPEAK_SERVICE_SCHEMA = probatio.Schema( { - vol.Required("number"): vol.All(vol.Coerce(int), vol.Range(min=0, max=999)), - vol.Optional("prefix", default=""): cv.string, + probatio.Required("number"): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=999) + ), + probatio.Optional("prefix", default=""): cv.string, } ) -SET_TIME_SERVICE_SCHEMA = vol.Schema( +SET_TIME_SERVICE_SCHEMA = probatio.Schema( { - vol.Optional("prefix", default=""): cv.string, + probatio.Optional("prefix", default=""): cv.string, } ) diff --git a/homeassistant/components/elkm1/switch.py b/homeassistant/components/elkm1/switch.py index e8d6bce79aa6b..c6e9e9d932368 100644 --- a/homeassistant/components/elkm1/switch.py +++ b/homeassistant/components/elkm1/switch.py @@ -9,7 +9,7 @@ from elkm1_lib.elk import Elk from elkm1_lib.outputs import Output from elkm1_lib.thermostats import Thermostat -import voluptuous as vol +import probatio from homeassistant.components.switch import DOMAIN as SWITCH_DOMAIN, SwitchEntity from homeassistant.core import HomeAssistant @@ -26,9 +26,9 @@ SERVICE_SWITCH_OUTPUT_TURN_ON_FOR = "switch_output_turn_on_for" ELK_OUTPUT_TURN_ON_FOR_SERVICE_SCHEMA: VolDictType = { - vol.Required(ATTR_DURATION): vol.All( + probatio.Required(ATTR_DURATION): probatio.All( cv.time_period, - vol.Range(min=timedelta(seconds=1), max=timedelta(seconds=65535)), + probatio.Range(min=timedelta(seconds=1), max=timedelta(seconds=65535)), ), } diff --git a/homeassistant/components/elmax/config_flow.py b/homeassistant/components/elmax/config_flow.py index 3bdaeffffa055..f005dd999dfca 100644 --- a/homeassistant/components/elmax/config_flow.py +++ b/homeassistant/components/elmax/config_flow.py @@ -8,7 +8,7 @@ from elmax_api.http import Elmax, ElmaxLocal, GenericElmax from elmax_api.model.panel import PanelEntry, PanelStatus import httpx -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.exceptions import HomeAssistantError @@ -39,34 +39,34 @@ _LOGGER = logging.getLogger(__name__) -LOGIN_FORM_SCHEMA = vol.Schema( +LOGIN_FORM_SCHEMA = probatio.Schema( { - vol.Required(CONF_ELMAX_USERNAME): str, - vol.Required(CONF_ELMAX_PASSWORD): str, + probatio.Required(CONF_ELMAX_USERNAME): str, + probatio.Required(CONF_ELMAX_PASSWORD): str, } ) -REAUTH_FORM_SCHEMA = vol.Schema( +REAUTH_FORM_SCHEMA = probatio.Schema( { - vol.Required(CONF_ELMAX_USERNAME): str, - vol.Required(CONF_ELMAX_PASSWORD): str, - vol.Required(CONF_ELMAX_PANEL_PIN): str, + probatio.Required(CONF_ELMAX_USERNAME): str, + probatio.Required(CONF_ELMAX_PASSWORD): str, + probatio.Required(CONF_ELMAX_PANEL_PIN): str, } ) -DIRECT_SETUP_SCHEMA = vol.Schema( +DIRECT_SETUP_SCHEMA = probatio.Schema( { - vol.Required(CONF_ELMAX_MODE_DIRECT_HOST): str, - vol.Required(CONF_ELMAX_MODE_DIRECT_PORT, default=443): int, - vol.Required(CONF_ELMAX_MODE_DIRECT_SSL, default=True): bool, - vol.Required(CONF_ELMAX_PANEL_PIN): str, + probatio.Required(CONF_ELMAX_MODE_DIRECT_HOST): str, + probatio.Required(CONF_ELMAX_MODE_DIRECT_PORT, default=443): int, + probatio.Required(CONF_ELMAX_MODE_DIRECT_SSL, default=True): bool, + probatio.Required(CONF_ELMAX_PANEL_PIN): str, } ) -ZEROCONF_SETUP_SCHEMA = vol.Schema( +ZEROCONF_SETUP_SCHEMA = probatio.Schema( { - vol.Required(CONF_ELMAX_PANEL_PIN): str, - vol.Required(CONF_ELMAX_MODE_DIRECT_SSL, default=True): bool, + probatio.Required(CONF_ELMAX_PANEL_PIN): str, + probatio.Required(CONF_ELMAX_MODE_DIRECT_SSL, default=True): bool, } ) @@ -110,7 +110,7 @@ class ElmaxConfigFlow(ConfigFlow, domain=DOMAIN): _reauth_cloud_panelid: str | None # Panel selection variables - _panels_schema: vol.Schema + _panels_schema: probatio.Schema _panel_names: dict @override @@ -133,7 +133,7 @@ async def async_step_choose_mode( ) async def _handle_direct_and_create_entry( - self, fallback_step_id: str, schema: vol.Schema + self, fallback_step_id: str, schema: probatio.Schema ) -> ConfigFlowResult: return await self._test_direct_and_create_entry() @@ -220,18 +220,18 @@ async def async_step_direct(self, user_input: dict[str, Any]) -> ConfigFlowResul self._panel_pin = user_input[CONF_ELMAX_PANEL_PIN] self._panel_direct_follow_mdns = True - tmp_schema = vol.Schema( + tmp_schema = probatio.Schema( { - vol.Required( + probatio.Required( CONF_ELMAX_MODE_DIRECT_HOST, default=self._panel_direct_hostname ): str, - vol.Required( + probatio.Required( CONF_ELMAX_MODE_DIRECT_PORT, default=self._panel_direct_port ): int, - vol.Required( + probatio.Required( CONF_ELMAX_MODE_DIRECT_SSL, default=self._panel_direct_use_ssl ): bool, - vol.Required(CONF_ELMAX_PANEL_PIN, default=self._panel_pin): str, + probatio.Required(CONF_ELMAX_PANEL_PIN, default=self._panel_pin): str, } ) return await self._handle_direct_and_create_entry( @@ -255,10 +255,10 @@ async def async_step_zeroconf_setup( else self._panel_direct_http_port ) self._panel_pin = user_input[CONF_ELMAX_PANEL_PIN] - tmp_schema = vol.Schema( + tmp_schema = probatio.Schema( { - vol.Required(CONF_ELMAX_PANEL_PIN, default=self._panel_pin): str, - vol.Required( + probatio.Required(CONF_ELMAX_PANEL_PIN, default=self._panel_pin): str, + probatio.Required( CONF_ELMAX_MODE_DIRECT_SSL, default=self._panel_direct_use_ssl ): bool, } @@ -336,10 +336,12 @@ async def async_step_cloud(self, user_input: dict[str, Any]) -> ConfigFlowResult self._client = client self._panel_names = panel_names - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required(CONF_ELMAX_PANEL_NAME): vol.In(self._panel_names.keys()), - vol.Required(CONF_ELMAX_PANEL_PIN, default="000000"): str, + probatio.Required(CONF_ELMAX_PANEL_NAME): probatio.In( + self._panel_names.keys() + ), + probatio.Required(CONF_ELMAX_PANEL_PIN, default="000000"): str, } ) self._panels_schema = schema diff --git a/homeassistant/components/elv/__init__.py b/homeassistant/components/elv/__init__.py index 97f08c786f401..7a88e858fa652 100644 --- a/homeassistant/components/elv/__init__.py +++ b/homeassistant/components/elv/__init__.py @@ -1,6 +1,6 @@ """The Elv integration.""" -import voluptuous as vol +import probatio from homeassistant.const import CONF_DEVICE, Platform from homeassistant.core import HomeAssistant @@ -13,13 +13,13 @@ ELV_PLATFORMS = [Platform.SWITCH] -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( - {vol.Optional(CONF_DEVICE, default=DEFAULT_DEVICE): cv.string} + DOMAIN: probatio.Schema( + {probatio.Optional(CONF_DEVICE, default=DEFAULT_DEVICE): cv.string} ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/elvia/config_flow.py b/homeassistant/components/elvia/config_flow.py index 7067d6649338a..50338fb088730 100644 --- a/homeassistant/components/elvia/config_flow.py +++ b/homeassistant/components/elvia/config_flow.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING, Any, override from elvia import Elvia, error as ElviaError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_TOKEN @@ -64,9 +64,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_API_TOKEN): str, + probatio.Required(CONF_API_TOKEN): str, } ), errors=errors, @@ -88,12 +88,12 @@ async def async_step_select_meter( return self.async_show_form( step_id="select_meter", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_METERING_POINT_ID, default=self._metering_point_ids[0], - ): vol.In(self._metering_point_ids), + ): probatio.In(self._metering_point_ids), } ), ) diff --git a/homeassistant/components/emby/media_player.py b/homeassistant/components/emby/media_player.py index 0e214728c82d1..73bf1c05e9c15 100644 --- a/homeassistant/components/emby/media_player.py +++ b/homeassistant/components/emby/media_player.py @@ -3,8 +3,8 @@ import logging from typing import override +import probatio from pyemby import EmbyServer -import voluptuous as vol from homeassistant.components.media_player import ( PLATFORM_SCHEMA as MEDIA_PLAYER_PLATFORM_SCHEMA, @@ -47,10 +47,10 @@ PLATFORM_SCHEMA = MEDIA_PLAYER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_API_KEY): cv.string, - vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, - vol.Optional(CONF_PORT): cv.port, - vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, + probatio.Required(CONF_API_KEY): cv.string, + probatio.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, + probatio.Optional(CONF_PORT): cv.port, + probatio.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, } ) diff --git a/homeassistant/components/emoncms/config_flow.py b/homeassistant/components/emoncms/config_flow.py index 38f21e344521f..aa8a6933be7a7 100644 --- a/homeassistant/components/emoncms/config_flow.py +++ b/homeassistant/components/emoncms/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from pyemoncms import EmoncmsClient -import voluptuous as vol from homeassistant.config_entries import ( ConfigEntry, @@ -125,11 +125,11 @@ async def async_step_user( return self.async_show_form( step_id="user", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_URL): str, - vol.Required(CONF_API_KEY): str, - vol.Required( + probatio.Required(CONF_URL): str, + probatio.Required(CONF_API_KEY): str, + probatio.Required( SYNC_MODE, default=SYNC_MODE_MANUAL ): SelectSelector( SelectSelectorConfig( @@ -168,9 +168,9 @@ async def async_step_choose_feeds( ) return self.async_show_form( step_id="choose_feeds", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_ONLY_INCLUDE_FEEDID, default=include_only_feeds, ): selector({"select": self.dropdown}), @@ -208,10 +208,10 @@ async def async_step_reconfigure( return self.async_show_form( step_id="reconfigure", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_URL): str, - vol.Required(CONF_API_KEY): str, + probatio.Required(CONF_URL): str, + probatio.Required(CONF_API_KEY): str, } ), user_input or reconfig_entry.data, @@ -262,9 +262,9 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_ONLY_INCLUDE_FEEDID, default=include_only_feeds ): selector({"select": dropdown}), } diff --git a/homeassistant/components/emoncms_history/__init__.py b/homeassistant/components/emoncms_history/__init__.py index 5394a797272bd..33bae18b97eb6 100644 --- a/homeassistant/components/emoncms_history/__init__.py +++ b/homeassistant/components/emoncms_history/__init__.py @@ -5,8 +5,8 @@ import logging import aiohttp +import probatio from pyemoncms import EmoncmsClient -import voluptuous as vol from homeassistant.const import ( CONF_API_KEY, @@ -27,19 +27,19 @@ DOMAIN = "emoncms_history" CONF_INPUTNODE = "inputnode" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_API_KEY): cv.string, - vol.Required(CONF_URL): cv.string, - vol.Required(CONF_INPUTNODE): cv.positive_int, - vol.Required(CONF_WHITELIST): cv.entity_ids, - vol.Optional(CONF_SCAN_INTERVAL, default=30): cv.positive_int, + probatio.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_URL): cv.string, + probatio.Required(CONF_INPUTNODE): cv.positive_int, + probatio.Required(CONF_WHITELIST): cv.entity_ids, + probatio.Optional(CONF_SCAN_INTERVAL, default=30): cv.positive_int, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/emonitor/config_flow.py b/homeassistant/components/emonitor/config_flow.py index c5057531252e2..bc1b34fb528d5 100644 --- a/homeassistant/components/emonitor/config_flow.py +++ b/homeassistant/components/emonitor/config_flow.py @@ -5,7 +5,7 @@ from aioemonitor import Emonitor import aiohttp -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_NAME @@ -63,8 +63,8 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required("host", default=self.discovered_ip): str} + data_schema=probatio.Schema( + {probatio.Required("host", default=self.discovered_ip): str} ), errors=errors, ) diff --git a/homeassistant/components/emulated_hue/__init__.py b/homeassistant/components/emulated_hue/__init__.py index 014a23cea0a2d..5ea6748b59cf1 100644 --- a/homeassistant/components/emulated_hue/__init__.py +++ b/homeassistant/components/emulated_hue/__init__.py @@ -3,7 +3,7 @@ import logging from aiohttp import web -import voluptuous as vol +import probatio from homeassistant.components.http import KEY_HASS from homeassistant.components.network import async_get_source_ip @@ -53,39 +53,41 @@ _LOGGER = logging.getLogger(__name__) -CONFIG_ENTITY_SCHEMA = vol.Schema( +CONFIG_ENTITY_SCHEMA = probatio.Schema( { - vol.Optional(CONF_ENTITY_NAME): cv.string, - vol.Optional(CONF_ENTITY_HIDDEN): cv.boolean, + probatio.Optional(CONF_ENTITY_NAME): cv.string, + probatio.Optional(CONF_ENTITY_HIDDEN): cv.boolean, } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Optional(CONF_HOST_IP): cv.string, - vol.Optional(CONF_LISTEN_PORT, default=DEFAULT_LISTEN_PORT): cv.port, - vol.Optional(CONF_ADVERTISE_IP): cv.string, - vol.Optional(CONF_ADVERTISE_PORT): cv.port, - vol.Optional(CONF_UPNP_BIND_MULTICAST): cv.boolean, - vol.Optional(CONF_OFF_MAPS_TO_ON_DOMAINS): cv.ensure_list, - vol.Optional(CONF_EXPOSE_BY_DEFAULT): cv.boolean, - vol.Optional(CONF_EXPOSED_DOMAINS): cv.ensure_list, - vol.Optional(CONF_TYPE, default=DEFAULT_TYPE): vol.Any( + probatio.Optional(CONF_HOST_IP): cv.string, + probatio.Optional( + CONF_LISTEN_PORT, default=DEFAULT_LISTEN_PORT + ): cv.port, + probatio.Optional(CONF_ADVERTISE_IP): cv.string, + probatio.Optional(CONF_ADVERTISE_PORT): cv.port, + probatio.Optional(CONF_UPNP_BIND_MULTICAST): cv.boolean, + probatio.Optional(CONF_OFF_MAPS_TO_ON_DOMAINS): cv.ensure_list, + probatio.Optional(CONF_EXPOSE_BY_DEFAULT): cv.boolean, + probatio.Optional(CONF_EXPOSED_DOMAINS): cv.ensure_list, + probatio.Optional(CONF_TYPE, default=DEFAULT_TYPE): probatio.Any( TYPE_ALEXA, TYPE_GOOGLE ), - vol.Optional(CONF_ENTITIES): vol.Schema( + probatio.Optional(CONF_ENTITIES): probatio.Schema( {cv.entity_id: CONFIG_ENTITY_SCHEMA} ), - vol.Optional( + probatio.Optional( CONF_LIGHTS_ALL_DIMMABLE, default=DEFAULT_LIGHTS_ALL_DIMMABLE ): cv.boolean, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/emulated_kasa/__init__.py b/homeassistant/components/emulated_kasa/__init__.py index 7fcf9235c9656..5c190f82f0083 100644 --- a/homeassistant/components/emulated_kasa/__init__.py +++ b/homeassistant/components/emulated_kasa/__init__.py @@ -2,8 +2,8 @@ import logging +import probatio from sense_energy import PlugInstance, SenseLink -import voluptuous as vol from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN from homeassistant.const import ( @@ -23,28 +23,28 @@ _LOGGER = logging.getLogger(__name__) -CONFIG_ENTITY_SCHEMA = vol.Schema( +CONFIG_ENTITY_SCHEMA = probatio.Schema( { - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_POWER): vol.Any( - vol.Coerce(float), + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_POWER): probatio.Any( + probatio.Coerce(float), cv.template, ), - vol.Optional(CONF_POWER_ENTITY): cv.string, + probatio.Optional(CONF_POWER_ENTITY): cv.string, } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_ENTITIES): vol.Schema( + probatio.Required(CONF_ENTITIES): probatio.Schema( {cv.entity_id: CONFIG_ENTITY_SCHEMA} ), } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/emulated_roku/__init__.py b/homeassistant/components/emulated_roku/__init__.py index e8c3a00f09833..1ceff54415468 100644 --- a/homeassistant/components/emulated_roku/__init__.py +++ b/homeassistant/components/emulated_roku/__init__.py @@ -1,6 +1,6 @@ """Support for Roku API emulation.""" -import voluptuous as vol +import probatio from homeassistant import config_entries from homeassistant.components.network import async_get_source_ip @@ -22,28 +22,28 @@ DOMAIN, ) -SERVER_CONFIG_SCHEMA = vol.Schema( +SERVER_CONFIG_SCHEMA = probatio.Schema( { - vol.Required(CONF_NAME): cv.string, - vol.Required(CONF_LISTEN_PORT): cv.port, - vol.Optional(CONF_HOST_IP): cv.string, - vol.Optional(CONF_ADVERTISE_IP): cv.string, - vol.Optional(CONF_ADVERTISE_PORT): cv.port, - vol.Optional(CONF_UPNP_BIND_MULTICAST): cv.boolean, + probatio.Required(CONF_NAME): cv.string, + probatio.Required(CONF_LISTEN_PORT): cv.port, + probatio.Optional(CONF_HOST_IP): cv.string, + probatio.Optional(CONF_ADVERTISE_IP): cv.string, + probatio.Optional(CONF_ADVERTISE_PORT): cv.port, + probatio.Optional(CONF_UPNP_BIND_MULTICAST): cv.boolean, } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_SERVERS): vol.All( + probatio.Required(CONF_SERVERS): probatio.All( cv.ensure_list, [SERVER_CONFIG_SCHEMA] ) } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) type EmulatedRokuConfigEntry = ConfigEntry[EmulatedRoku] diff --git a/homeassistant/components/emulated_roku/config_flow.py b/homeassistant/components/emulated_roku/config_flow.py index 3e7ed956eaaca..020db0a24d5b4 100644 --- a/homeassistant/components/emulated_roku/config_flow.py +++ b/homeassistant/components/emulated_roku/config_flow.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_NAME @@ -46,14 +46,14 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Required(CONF_NAME, default=default_name): str, - vol.Required(CONF_LISTEN_PORT, default=default_port): vol.Coerce( - int - ), + probatio.Required(CONF_NAME, default=default_name): str, + probatio.Required( + CONF_LISTEN_PORT, default=default_port + ): probatio.Coerce(int), } ), errors=errors, diff --git a/homeassistant/components/energenie_power_sockets/config_flow.py b/homeassistant/components/energenie_power_sockets/config_flow.py index c8d1e4ab6df16..17b2e227d0c41 100644 --- a/homeassistant/components/energenie_power_sockets/config_flow.py +++ b/homeassistant/components/energenie_power_sockets/config_flow.py @@ -2,9 +2,9 @@ from typing import Any, override +import probatio from pyegps import get_device, search_for_devices from pyegps.exceptions import MissingLibrary, UsbError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -51,8 +51,10 @@ async def async_step_user( LOGGER.debug("Found %d devices", len(devices)) if len(devices) > 0: options = {d.device_id: f"{d.name} ({d.device_id})" for d in devices} - data_schema = {CONF_DEVICE_API_ID: vol.In(options)} + data_schema = {CONF_DEVICE_API_ID: probatio.In(options)} else: return self.async_abort(reason="no_device") - return self.async_show_form(step_id="user", data_schema=vol.Schema(data_schema)) + return self.async_show_form( + step_id="user", data_schema=probatio.Schema(data_schema) + ) diff --git a/homeassistant/components/energieleser/config_flow.py b/homeassistant/components/energieleser/config_flow.py index 4fccd3beec17c..a60620f638224 100755 --- a/homeassistant/components/energieleser/config_flow.py +++ b/homeassistant/components/energieleser/config_flow.py @@ -8,7 +8,7 @@ EnergieleserError, EnergieleserUnknownDeviceError, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_DEVICE_ID, CONF_HOST @@ -18,9 +18,9 @@ from .const import CONF_SW_VERSION, DOMAIN, device_model_name -STEP_USER_SCHEMA = vol.Schema( +STEP_USER_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): TextSelector(), + probatio.Required(CONF_HOST): TextSelector(), } ) diff --git a/homeassistant/components/energy/data.py b/homeassistant/components/energy/data.py index cd3698c1108f1..b4f33ad7f07f5 100644 --- a/homeassistant/components/energy/data.py +++ b/homeassistant/components/energy/data.py @@ -5,7 +5,7 @@ from collections.abc import Awaitable, Callable from typing import Any, Literal, NotRequired, TypedDict, override -import voluptuous as vol +import probatio from homeassistant.core import HomeAssistant, callback, valid_entity_id from homeassistant.helpers import config_validation as cv, singleton, storage @@ -286,7 +286,7 @@ def validate(val: dict[str, Any]) -> dict[str, Any]: val.get(entity_price_key) is not None or val.get(number_price_key) is not None ): - raise vol.Invalid( + raise probatio.Invalid( "Entity or number price is not supported for external" f" statistics. Use {cost_stat_key} instead" ) @@ -303,20 +303,24 @@ def _flow_from_ensure_single_price( val["entity_energy_price"] is not None and val["number_energy_price"] is not None ): - raise vol.Invalid("Define either an entity or a fixed number for the price") + raise probatio.Invalid( + "Define either an entity or a fixed number for the price" + ) return val -FLOW_FROM_GRID_SOURCE_SCHEMA = vol.All( - vol.Schema( +FLOW_FROM_GRID_SOURCE_SCHEMA = probatio.All( + probatio.Schema( { - vol.Required("stat_energy_from"): str, - vol.Optional("stat_cost"): vol.Any(str, None), + probatio.Required("stat_energy_from"): str, + probatio.Optional("stat_cost"): probatio.Any(str, None), # entity_energy_from was removed in HA Core 2022.10 - vol.Remove("entity_energy_from"): vol.Any(str, None), - vol.Optional("entity_energy_price"): vol.Any(str, None), - vol.Optional("number_energy_price"): vol.Any(vol.Coerce(float), None), + probatio.Remove("entity_energy_from"): probatio.Any(str, None), + probatio.Optional("entity_energy_price"): probatio.Any(str, None), + probatio.Optional("number_energy_price"): probatio.Any( + probatio.Coerce(float), None + ), } ), _reject_price_for_external_stat(stat_key="stat_energy_from"), @@ -324,15 +328,17 @@ def _flow_from_ensure_single_price( ) -FLOW_TO_GRID_SOURCE_SCHEMA = vol.All( - vol.Schema( +FLOW_TO_GRID_SOURCE_SCHEMA = probatio.All( + probatio.Schema( { - vol.Required("stat_energy_to"): str, - vol.Optional("stat_compensation"): vol.Any(str, None), + probatio.Required("stat_energy_to"): str, + probatio.Optional("stat_compensation"): probatio.Any(str, None), # entity_energy_to was removed in HA Core 2022.10 - vol.Remove("entity_energy_to"): vol.Any(str, None), - vol.Optional("entity_energy_price"): vol.Any(str, None), - vol.Optional("number_energy_price"): vol.Any(vol.Coerce(float), None), + probatio.Remove("entity_energy_to"): probatio.Any(str, None), + probatio.Optional("entity_energy_price"): probatio.Any(str, None), + probatio.Optional("number_energy_price"): probatio.Any( + probatio.Coerce(float), None + ), } ), _reject_price_for_external_stat( @@ -344,7 +350,7 @@ def _flow_from_ensure_single_price( def _validate_power_config(val: dict[str, Any]) -> dict[str, Any]: """Validate power_config has exactly one configuration method.""" if not val: - raise vol.Invalid("power_config must have at least one option") + raise probatio.Invalid("power_config must have at least one option") # Ensure only one configuration method is used has_single = "stat_rate" in val @@ -353,7 +359,7 @@ def _validate_power_config(val: dict[str, Any]) -> dict[str, Any]: methods_count = sum([has_single, has_inverted, has_combined]) if methods_count > 1: - raise vol.Invalid( + raise probatio.Invalid( "power_config must use only one configuration method: " "stat_rate, stat_rate_inverted, or stat_rate_from/stat_rate_to" ) @@ -361,30 +367,30 @@ def _validate_power_config(val: dict[str, Any]) -> dict[str, Any]: return val -POWER_CONFIG_SCHEMA = vol.All( - vol.Schema( +POWER_CONFIG_SCHEMA = probatio.All( + probatio.Schema( { - vol.Exclusive("stat_rate", "power_source"): str, - vol.Exclusive("stat_rate_inverted", "power_source"): str, + probatio.Exclusive("stat_rate", "power_source"): str, + probatio.Exclusive("stat_rate_inverted", "power_source"): str, # stat_rate_from/stat_rate_to: two sensors for bidirectional power # Battery: from=discharge (out), to=charge (in) # Grid: from=consumption, to=return - vol.Inclusive("stat_rate_from", "two_sensors"): str, - vol.Inclusive("stat_rate_to", "two_sensors"): str, + probatio.Inclusive("stat_rate_from", "two_sensors"): str, + probatio.Inclusive("stat_rate_to", "two_sensors"): str, } ), _validate_power_config, ) -GRID_POWER_SOURCE_SCHEMA = vol.All( - vol.Schema( +GRID_POWER_SOURCE_SCHEMA = probatio.All( + probatio.Schema( { # stat_rate and power_config are both optional # schema keys, but the validator requires that at # least one is provided; power_config takes precedence - vol.Optional("stat_rate"): str, - vol.Optional("power_config"): POWER_CONFIG_SCHEMA, + probatio.Optional("stat_rate"): str, + probatio.Optional("power_config"): POWER_CONFIG_SCHEMA, } ), cv.has_at_least_one_key("stat_rate", "power_config"), @@ -402,7 +408,7 @@ def validate_uniqueness( for value, count in counts.items(): if count > 1: - raise vol.Invalid(f"Cannot specify {value} more than once") + raise probatio.Invalid(f"Cannot specify {value} more than once") return val @@ -417,7 +423,9 @@ def _grid_ensure_single_price_import( val.get("entity_energy_price") is not None and val.get("number_energy_price") is not None ): - raise vol.Invalid("Define either an entity or a fixed number for import price") + raise probatio.Invalid( + "Define either an entity or a fixed number for import price" + ) return val @@ -429,7 +437,9 @@ def _grid_ensure_single_price_export( val.get("entity_energy_price_export") is not None and val.get("number_energy_price_export") is not None ): - raise vol.Invalid("Define either an entity or a fixed number for export price") + raise probatio.Invalid( + "Define either an entity or a fixed number for export price" + ) return val @@ -443,40 +453,46 @@ def _grid_ensure_at_least_one_stat( and val.get("stat_rate") is None and val.get("power_config") is None ): - raise vol.Invalid( + raise probatio.Invalid( "Grid must have at least one of: import meter," " export meter, or power sensor" ) return val -GRID_SOURCE_SCHEMA = vol.All( - vol.Schema( +GRID_SOURCE_SCHEMA = probatio.All( + probatio.Schema( { - vol.Required("type"): "grid", + probatio.Required("type"): "grid", # Import meter (can be None for export-only grids from legacy migration) - vol.Optional("stat_energy_from", default=None): vol.Any(str, None), + probatio.Optional("stat_energy_from", default=None): probatio.Any( + str, None + ), # Export meter (optional) - vol.Optional("stat_energy_to", default=None): vol.Any(str, None), + probatio.Optional("stat_energy_to", default=None): probatio.Any(str, None), # Import cost tracking - vol.Optional("stat_cost", default=None): vol.Any(str, None), - vol.Optional("entity_energy_price", default=None): vol.Any(str, None), - vol.Optional("number_energy_price", default=None): vol.Any( - vol.Coerce(float), None + probatio.Optional("stat_cost", default=None): probatio.Any(str, None), + probatio.Optional("entity_energy_price", default=None): probatio.Any( + str, None + ), + probatio.Optional("number_energy_price", default=None): probatio.Any( + probatio.Coerce(float), None ), # Export compensation tracking - vol.Optional("stat_compensation", default=None): vol.Any(str, None), - vol.Optional("entity_energy_price_export", default=None): vol.Any( + probatio.Optional("stat_compensation", default=None): probatio.Any( + str, None + ), + probatio.Optional("entity_energy_price_export", default=None): probatio.Any( str, None ), - vol.Optional("number_energy_price_export", default=None): vol.Any( - vol.Coerce(float), None + probatio.Optional("number_energy_price_export", default=None): probatio.Any( + probatio.Coerce(float), None ), # Power measurement (optional) - vol.Optional("stat_rate"): str, - vol.Optional("power_config"): POWER_CONFIG_SCHEMA, - vol.Required("cost_adjustment_day"): vol.Coerce(float), - vol.Optional("name"): str, + probatio.Optional("stat_rate"): str, + probatio.Optional("power_config"): POWER_CONFIG_SCHEMA, + probatio.Required("cost_adjustment_day"): probatio.Coerce(float), + probatio.Optional("name"): str, } ), _reject_price_for_external_stat(stat_key="stat_energy_from"), @@ -490,59 +506,63 @@ def _grid_ensure_at_least_one_stat( _grid_ensure_single_price_export, _grid_ensure_at_least_one_stat, ) -SOLAR_SOURCE_SCHEMA = vol.Schema( +SOLAR_SOURCE_SCHEMA = probatio.Schema( { - vol.Required("type"): "solar", - vol.Required("stat_energy_from"): str, - vol.Optional("stat_rate"): str, - vol.Optional("config_entry_solar_forecast"): vol.Any([str], None), - vol.Optional("name"): str, + probatio.Required("type"): "solar", + probatio.Required("stat_energy_from"): str, + probatio.Optional("stat_rate"): str, + probatio.Optional("config_entry_solar_forecast"): probatio.Any([str], None), + probatio.Optional("name"): str, } ) -BATTERY_SOURCE_SCHEMA = vol.Schema( +BATTERY_SOURCE_SCHEMA = probatio.Schema( { - vol.Required("type"): "battery", - vol.Required("stat_energy_from"): str, - vol.Required("stat_energy_to"): str, + probatio.Required("type"): "battery", + probatio.Required("stat_energy_from"): str, + probatio.Required("stat_energy_to"): str, # Both stat_rate and power_config are optional # If power_config is provided, it takes precedence and stat_rate is overwritten - vol.Optional("stat_rate"): str, - vol.Optional("power_config"): POWER_CONFIG_SCHEMA, - vol.Optional("stat_soc"): str, - vol.Optional("capacity"): vol.All( - vol.Coerce(float), vol.Range(min=0, min_included=False) + probatio.Optional("stat_rate"): str, + probatio.Optional("power_config"): POWER_CONFIG_SCHEMA, + probatio.Optional("stat_soc"): str, + probatio.Optional("capacity"): probatio.All( + probatio.Coerce(float), probatio.Range(min=0, min_included=False) ), - vol.Optional("name"): str, + probatio.Optional("name"): str, } ) -GAS_SOURCE_SCHEMA = vol.All( - vol.Schema( +GAS_SOURCE_SCHEMA = probatio.All( + probatio.Schema( { - vol.Required("type"): "gas", - vol.Required("stat_energy_from"): str, - vol.Optional("stat_rate"): str, - vol.Optional("stat_cost"): vol.Any(str, None), + probatio.Required("type"): "gas", + probatio.Required("stat_energy_from"): str, + probatio.Optional("stat_rate"): str, + probatio.Optional("stat_cost"): probatio.Any(str, None), # entity_energy_from was removed in HA Core 2022.10 - vol.Remove("entity_energy_from"): vol.Any(str, None), - vol.Optional("entity_energy_price"): vol.Any(str, None), - vol.Optional("number_energy_price"): vol.Any(vol.Coerce(float), None), - vol.Optional("name"): str, + probatio.Remove("entity_energy_from"): probatio.Any(str, None), + probatio.Optional("entity_energy_price"): probatio.Any(str, None), + probatio.Optional("number_energy_price"): probatio.Any( + probatio.Coerce(float), None + ), + probatio.Optional("name"): str, } ), _reject_price_for_external_stat(stat_key="stat_energy_from"), ) -WATER_SOURCE_SCHEMA = vol.All( - vol.Schema( +WATER_SOURCE_SCHEMA = probatio.All( + probatio.Schema( { - vol.Required("type"): "water", - vol.Required("stat_energy_from"): str, - vol.Optional("stat_rate"): str, - vol.Optional("stat_cost"): vol.Any(str, None), - vol.Optional("entity_energy_price"): vol.Any(str, None), - vol.Optional("number_energy_price"): vol.Any(vol.Coerce(float), None), - vol.Optional("name"): str, + probatio.Required("type"): "water", + probatio.Required("stat_energy_from"): str, + probatio.Optional("stat_rate"): str, + probatio.Optional("stat_cost"): probatio.Any(str, None), + probatio.Optional("entity_energy_price"): probatio.Any(str, None), + probatio.Optional("number_energy_price"): probatio.Any( + probatio.Coerce(float), None + ), + probatio.Optional("name"): str, } ), _reject_price_for_external_stat(stat_key="stat_energy_from"), @@ -571,7 +591,7 @@ def _validate_grid_stat_uniqueness(value: list[SourceType]) -> list[SourceType]: # Check import meter uniqueness if (stat_from := grid_source.get("stat_energy_from")) is not None: if stat_from in seen_import: - raise vol.Invalid( + raise probatio.Invalid( f"Import meter {stat_from} is used in multiple grid connections" ) seen_import.add(stat_from) @@ -579,7 +599,7 @@ def _validate_grid_stat_uniqueness(value: list[SourceType]) -> list[SourceType]: # Check export meter uniqueness if (stat_to := grid_source.get("stat_energy_to")) is not None: if stat_to in seen_export: - raise vol.Invalid( + raise probatio.Invalid( f"Export meter {stat_to} is used in multiple grid connections" ) seen_export.add(stat_to) @@ -587,7 +607,7 @@ def _validate_grid_stat_uniqueness(value: list[SourceType]) -> list[SourceType]: # Check power stat uniqueness if (stat_rate := grid_source.get("stat_rate")) is not None: if stat_rate in seen_rate: - raise vol.Invalid( + raise probatio.Invalid( f"Power stat {stat_rate} is used in multiple grid connections" ) seen_rate.add(stat_rate) @@ -595,8 +615,8 @@ def _validate_grid_stat_uniqueness(value: list[SourceType]) -> list[SourceType]: return value -ENERGY_SOURCE_SCHEMA = vol.All( - vol.Schema( +ENERGY_SOURCE_SCHEMA = probatio.All( + probatio.Schema( [ cv.key_value_schemas( "type", @@ -614,12 +634,12 @@ def _validate_grid_stat_uniqueness(value: list[SourceType]) -> list[SourceType]: _validate_grid_stat_uniqueness, ) -DEVICE_CONSUMPTION_SCHEMA = vol.Schema( +DEVICE_CONSUMPTION_SCHEMA = probatio.Schema( { - vol.Required("stat_consumption"): str, - vol.Optional("stat_rate"): str, - vol.Optional("name"): str, - vol.Optional("included_in_stat"): str, + probatio.Required("stat_consumption"): str, + probatio.Optional("stat_rate"): str, + probatio.Optional("name"): str, + probatio.Optional("included_in_stat"): str, } ) diff --git a/homeassistant/components/energy/helpers.py b/homeassistant/components/energy/helpers.py index 127e0ef5af97c..6daf477a43bef 100644 --- a/homeassistant/components/energy/helpers.py +++ b/homeassistant/components/energy/helpers.py @@ -15,7 +15,7 @@ def generate_power_sensor_unique_id(source_type: str, config: PowerConfig) -> st from_id = config["stat_rate_from"].replace(".", "_") to_id = config["stat_rate_to"].replace(".", "_") return f"energy_power_{source_type}_combined_{from_id}_{to_id}" - # This case is impossible: schema validation (vol.Inclusive) ensures + # This case is impossible: schema validation (probatio.Inclusive) ensures # stat_rate_from and stat_rate_to are always present together raise RuntimeError("Invalid power config: missing required keys") @@ -35,6 +35,6 @@ def generate_power_sensor_entity_id(source_type: str, config: PowerConfig) -> st from_sensor = config["stat_rate_from"].removeprefix("sensor.") to_sensor = config["stat_rate_to"].removeprefix("sensor.") return f"sensor.energy_{source_type}_{from_sensor}_{to_sensor}_net_power" - # This case is impossible: schema validation (vol.Inclusive) ensures + # This case is impossible: schema validation (probatio.Inclusive) ensures # stat_rate_from and stat_rate_to are always present together raise RuntimeError("Invalid power config: missing required keys") diff --git a/homeassistant/components/energy/websocket_api.py b/homeassistant/components/energy/websocket_api.py index 6d984a49a1687..180218147a4c2 100644 --- a/homeassistant/components/energy/websocket_api.py +++ b/homeassistant/components/energy/websocket_api.py @@ -8,7 +8,7 @@ from itertools import chain from typing import Any, cast -import voluptuous as vol +import probatio from homeassistant.components import recorder, websocket_api from homeassistant.components.recorder.statistics import StatisticsRow @@ -101,7 +101,7 @@ async def with_manager( @websocket_api.websocket_command( { - vol.Required("type"): "energy/get_prefs", + probatio.Required("type"): "energy/get_prefs", } ) @websocket_api.async_response @@ -124,10 +124,10 @@ def ws_get_prefs( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "energy/save_prefs", - vol.Optional("energy_sources"): ENERGY_SOURCE_SCHEMA, - vol.Optional("device_consumption"): [DEVICE_CONSUMPTION_SCHEMA], - vol.Optional("device_consumption_water"): [DEVICE_CONSUMPTION_SCHEMA], + probatio.Required("type"): "energy/save_prefs", + probatio.Optional("energy_sources"): ENERGY_SOURCE_SCHEMA, + probatio.Optional("device_consumption"): [DEVICE_CONSUMPTION_SCHEMA], + probatio.Optional("device_consumption_water"): [DEVICE_CONSUMPTION_SCHEMA], } ) @websocket_api.async_response @@ -147,7 +147,7 @@ async def ws_save_prefs( @websocket_api.websocket_command( { - vol.Required("type"): "energy/info", + probatio.Required("type"): "energy/info", } ) @websocket_api.async_response @@ -169,7 +169,7 @@ async def ws_info( @websocket_api.websocket_command( { - vol.Required("type"): "energy/validate", + probatio.Required("type"): "energy/validate", } ) @websocket_api.async_response @@ -184,7 +184,7 @@ async def ws_validate( @websocket_api.websocket_command( { - vol.Required("type"): "energy/solar_forecast", + probatio.Required("type"): "energy/solar_forecast", } ) @websocket_api.async_response @@ -237,12 +237,12 @@ async def ws_solar_forecast( @websocket_api.websocket_command( { - vol.Required("type"): "energy/fossil_energy_consumption", - vol.Required("start_time"): str, - vol.Required("end_time"): str, - vol.Required("energy_statistic_ids"): [str], - vol.Required("co2_statistic_id"): str, - vol.Required("period"): vol.Any("5minute", "hour", "day", "month"), + probatio.Required("type"): "energy/fossil_energy_consumption", + probatio.Required("start_time"): str, + probatio.Required("end_time"): str, + probatio.Required("energy_statistic_ids"): [str], + probatio.Required("co2_statistic_id"): str, + probatio.Required("period"): probatio.Any("5minute", "hour", "day", "month"), } ) @websocket_api.async_response diff --git a/homeassistant/components/energyid/config_flow.py b/homeassistant/components/energyid/config_flow.py index fa3b371636ba0..3661d6e7ba681 100644 --- a/homeassistant/components/energyid/config_flow.py +++ b/homeassistant/components/energyid/config_flow.py @@ -7,7 +7,7 @@ from aiohttp import ClientError, ClientResponseError from energyid_webhooks.client_v2 import WebhookClient -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -168,10 +168,10 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PROVISIONING_KEY): str, - vol.Required(CONF_PROVISIONING_SECRET): cv.string, + probatio.Required(CONF_PROVISIONING_KEY): str, + probatio.Required(CONF_PROVISIONING_SECRET): cv.string, } ), errors=errors, @@ -274,10 +274,10 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PROVISIONING_KEY): str, - vol.Required(CONF_PROVISIONING_SECRET): cv.string, + probatio.Required(CONF_PROVISIONING_KEY): str, + probatio.Required(CONF_PROVISIONING_SECRET): cv.string, } ), errors=errors, diff --git a/homeassistant/components/energyid/energyid_sensor_mapping_flow.py b/homeassistant/components/energyid/energyid_sensor_mapping_flow.py index 12f1f47620c29..69646f41f8281 100644 --- a/homeassistant/components/energyid/energyid_sensor_mapping_flow.py +++ b/homeassistant/components/energyid/energyid_sensor_mapping_flow.py @@ -3,7 +3,7 @@ import logging from typing import Any -import voluptuous as vol +import probatio from homeassistant.components.sensor import SensorDeviceClass, SensorStateClass from homeassistant.config_entries import ConfigSubentryFlow, SubentryFlowResult @@ -140,9 +140,9 @@ async def async_step_user( suggested_entities = _get_suggested_entities(self.hass) - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required("ha_entity_id"): EntitySelector( + probatio.Required("ha_entity_id"): EntitySelector( EntitySelectorConfig(include_entities=suggested_entities) ), } diff --git a/homeassistant/components/energyzero/config_flow.py b/homeassistant/components/energyzero/config_flow.py index 0dd4368de9693..bc747f842ad85 100644 --- a/homeassistant/components/energyzero/config_flow.py +++ b/homeassistant/components/energyzero/config_flow.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -64,9 +64,9 @@ async def async_step_init( return self.async_show_form( step_id="init", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required( + probatio.Required( CONF_ELECTRICITY_PRICE_INTERVAL, default=DEFAULT_ELECTRICITY_PRICE_INTERVAL, ): SelectSelector( diff --git a/homeassistant/components/energyzero/services.py b/homeassistant/components/energyzero/services.py index ef1b90519e114..247395361e80f 100644 --- a/homeassistant/components/energyzero/services.py +++ b/homeassistant/components/energyzero/services.py @@ -7,7 +7,7 @@ from zoneinfo import ZoneInfo from energyzero import EnergyPrices, EnergyZeroNoDataError, Interval, PriceType -import voluptuous as vol +import probatio from homeassistant.core import ( HomeAssistant, @@ -34,23 +34,25 @@ GAS_SERVICE_NAME: Final = "get_gas_prices" ENERGY_SERVICE_NAME: Final = "get_energy_prices" -SERVICE_SCHEMA: Final = vol.Schema( +SERVICE_SCHEMA: Final = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY): selector.ConfigEntrySelector( + probatio.Required(ATTR_CONFIG_ENTRY): selector.ConfigEntrySelector( { "integration": DOMAIN, } ), - vol.Required(ATTR_INCL_VAT): bool, - vol.Optional(ATTR_START): str, - vol.Optional(ATTR_END): str, + probatio.Required(ATTR_INCL_VAT): bool, + probatio.Optional(ATTR_START): str, + probatio.Optional(ATTR_END): str, } ) ENERGY_SERVICE_SCHEMA: Final = SERVICE_SCHEMA.extend( { - vol.Optional(ATTR_PRICE_TYPE, default="market"): vol.In(("market", "all_in")), - vol.Optional(ATTR_INTERVAL, default="hour"): vol.In(ENERGY_INTERVALS), + probatio.Optional(ATTR_PRICE_TYPE, default="market"): probatio.In( + ("market", "all_in") + ), + probatio.Optional(ATTR_INTERVAL, default="hour"): probatio.In(ENERGY_INTERVALS), } ) diff --git a/homeassistant/components/enigma2/config_flow.py b/homeassistant/components/enigma2/config_flow.py index d591fbf47123d..0dd18eb5d611e 100644 --- a/homeassistant/components/enigma2/config_flow.py +++ b/homeassistant/components/enigma2/config_flow.py @@ -6,7 +6,7 @@ from aiohttp.client_exceptions import ClientError from openwebif.api import OpenWebIfDevice from openwebif.error import InvalidAuthError -import voluptuous as vol +import probatio from yarl import URL from homeassistant.config_entries import ( @@ -42,23 +42,23 @@ DOMAIN, ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): selector.TextSelector(), - vol.Required(CONF_PORT, default=DEFAULT_PORT): vol.All( + probatio.Required(CONF_HOST): selector.TextSelector(), + probatio.Required(CONF_PORT, default=DEFAULT_PORT): probatio.All( selector.NumberSelector( selector.NumberSelectorConfig( min=1, max=65535, mode=selector.NumberSelectorMode.BOX ) ), - vol.Coerce(int), + probatio.Coerce(int), ), - vol.Optional(CONF_USERNAME): selector.TextSelector(), - vol.Optional(CONF_PASSWORD): selector.TextSelector( + probatio.Optional(CONF_USERNAME): selector.TextSelector(), + probatio.Optional(CONF_PASSWORD): selector.TextSelector( selector.TextSelectorConfig(type=selector.TextSelectorType.PASSWORD) ), - vol.Required(CONF_SSL, default=DEFAULT_SSL): selector.BooleanSelector(), - vol.Required( + probatio.Required(CONF_SSL, default=DEFAULT_SSL): selector.BooleanSelector(), + probatio.Required( CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL ): selector.BooleanSelector(), } @@ -67,23 +67,23 @@ _LOGGER = logging.getLogger(__name__) -async def get_options_schema(handler: SchemaCommonFlowHandler) -> vol.Schema: +async def get_options_schema(handler: SchemaCommonFlowHandler) -> probatio.Schema: """Get the options schema.""" entry = cast(SchemaOptionsFlowHandler, handler.parent_handler).config_entry bouquets = [ b[1] for b in (await entry.runtime_data.device.get_all_bouquets())["bouquets"] ] - return vol.Schema( + return probatio.Schema( { - vol.Optional(CONF_DEEP_STANDBY): selector.BooleanSelector(), - vol.Optional(CONF_SOURCE_BOUQUET): selector.SelectSelector( + probatio.Optional(CONF_DEEP_STANDBY): selector.BooleanSelector(), + probatio.Optional(CONF_SOURCE_BOUQUET): selector.SelectSelector( selector.SelectSelectorConfig( options=bouquets, mode=selector.SelectSelectorMode.DROPDOWN, ) ), - vol.Optional(CONF_USE_CHANNEL_ICON): selector.BooleanSelector(), + probatio.Optional(CONF_USE_CHANNEL_ICON): selector.BooleanSelector(), } ) diff --git a/homeassistant/components/enocean/__init__.py b/homeassistant/components/enocean/__init__.py index a7ee93ac5e2ba..c1fd65a65181e 100644 --- a/homeassistant/components/enocean/__init__.py +++ b/homeassistant/components/enocean/__init__.py @@ -1,7 +1,7 @@ """Support for EnOcean devices.""" from enocean_async import Gateway -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry from homeassistant.const import CONF_DEVICE @@ -18,8 +18,9 @@ type EnOceanConfigEntry = ConfigEntry[Gateway] -CONFIG_SCHEMA = vol.Schema( - {DOMAIN: vol.Schema({vol.Required(CONF_DEVICE): cv.string})}, extra=vol.ALLOW_EXTRA +CONFIG_SCHEMA = probatio.Schema( + {DOMAIN: probatio.Schema({probatio.Required(CONF_DEVICE): cv.string})}, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/enocean/binary_sensor.py b/homeassistant/components/enocean/binary_sensor.py index d7a3d6a3df83f..2e65374f7b514 100644 --- a/homeassistant/components/enocean/binary_sensor.py +++ b/homeassistant/components/enocean/binary_sensor.py @@ -3,7 +3,7 @@ from typing import override from enocean_async import ERP1Telegram -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import ( DEVICE_CLASSES_SCHEMA, @@ -25,9 +25,11 @@ PLATFORM_SCHEMA = BINARY_SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ID): vol.All(cv.ensure_list, [vol.Coerce(int)]), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, + probatio.Required(CONF_ID): probatio.All( + cv.ensure_list, [probatio.Coerce(int)] + ), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, } ) diff --git a/homeassistant/components/enocean/config_flow.py b/homeassistant/components/enocean/config_flow.py index 2b82e115a6e42..0c9e686b77ebb 100644 --- a/homeassistant/components/enocean/config_flow.py +++ b/homeassistant/components/enocean/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from enocean_async import Gateway -import voluptuous as vol +import probatio from homeassistant.components import usb from homeassistant.components.usb import ( @@ -23,9 +23,9 @@ from .const import DOMAIN, ERROR_INVALID_DONGLE_PATH, LOGGER, MANUFACTURER -MANUAL_SCHEMA = vol.Schema( +MANUAL_SCHEMA = probatio.Schema( { - vol.Required(CONF_DEVICE): cv.string, + probatio.Required(CONF_DEVICE): cv.string, } ) @@ -135,9 +135,9 @@ async def async_step_detect( return self.async_show_form( step_id="detect", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_DEVICE): SelectSelector( + probatio.Required(CONF_DEVICE): SelectSelector( SelectSelectorConfig( options=devices, translation_key="devices", diff --git a/homeassistant/components/enocean/light.py b/homeassistant/components/enocean/light.py index b86d3508992fa..ea37debac0168 100644 --- a/homeassistant/components/enocean/light.py +++ b/homeassistant/components/enocean/light.py @@ -5,7 +5,7 @@ from enocean_async import ERP1Telegram from enocean_async.esp3.packet import ESP3PacketType -import voluptuous as vol +import probatio from homeassistant.components.light import ( ATTR_BRIGHTNESS, @@ -27,9 +27,13 @@ PLATFORM_SCHEMA = LIGHT_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_ID, default=[]): vol.All(cv.ensure_list, [vol.Coerce(int)]), - vol.Required(CONF_SENDER_ID): vol.All(cv.ensure_list, [vol.Coerce(int)]), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_ID, default=[]): probatio.All( + cv.ensure_list, [probatio.Coerce(int)] + ), + probatio.Required(CONF_SENDER_ID): probatio.All( + cv.ensure_list, [probatio.Coerce(int)] + ), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/enocean/sensor.py b/homeassistant/components/enocean/sensor.py index 304f1c5e80192..d97327a5ec408 100644 --- a/homeassistant/components/enocean/sensor.py +++ b/homeassistant/components/enocean/sensor.py @@ -5,7 +5,7 @@ from typing import override from enocean_async import EEP, EEP_SPECIFICATIONS, EEPHandler, EEPMessage, ERP1Telegram -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -88,13 +88,15 @@ class EnOceanSensorEntityDescription(SensorEntityDescription): PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ID): vol.All(cv.ensure_list, [vol.Coerce(int)]), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_DEVICE_CLASS, default=SENSOR_TYPE_POWER): cv.string, - vol.Optional(CONF_MAX_TEMP, default=40): vol.Coerce(int), - vol.Optional(CONF_MIN_TEMP, default=0): vol.Coerce(int), - vol.Optional(CONF_RANGE_FROM, default=255): cv.positive_int, - vol.Optional(CONF_RANGE_TO, default=0): cv.positive_int, + probatio.Required(CONF_ID): probatio.All( + cv.ensure_list, [probatio.Coerce(int)] + ), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_DEVICE_CLASS, default=SENSOR_TYPE_POWER): cv.string, + probatio.Optional(CONF_MAX_TEMP, default=40): probatio.Coerce(int), + probatio.Optional(CONF_MIN_TEMP, default=0): probatio.Coerce(int), + probatio.Optional(CONF_RANGE_FROM, default=255): cv.positive_int, + probatio.Optional(CONF_RANGE_TO, default=0): cv.positive_int, } ) diff --git a/homeassistant/components/enocean/switch.py b/homeassistant/components/enocean/switch.py index b9d2e90a43d72..d4bf09d49e28a 100644 --- a/homeassistant/components/enocean/switch.py +++ b/homeassistant/components/enocean/switch.py @@ -4,7 +4,7 @@ from enocean_async import EEP, EEP_SPECIFICATIONS, EEPHandler, EEPMessage, ERP1Telegram from enocean_async.esp3.packet import ESP3PacketType -import voluptuous as vol +import probatio from homeassistant.components.switch import ( PLATFORM_SCHEMA as SWITCH_PLATFORM_SCHEMA, @@ -24,9 +24,11 @@ PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ID): vol.All(cv.ensure_list, [vol.Coerce(int)]), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_CHANNEL, default=0): cv.positive_int, + probatio.Required(CONF_ID): probatio.All( + cv.ensure_list, [probatio.Coerce(int)] + ), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_CHANNEL, default=0): cv.positive_int, } ) diff --git a/homeassistant/components/enphase_envoy/config_flow.py b/homeassistant/components/enphase_envoy/config_flow.py index a317cfb121bf3..8ea1b2617f6bf 100644 --- a/homeassistant/components/enphase_envoy/config_flow.py +++ b/homeassistant/components/enphase_envoy/config_flow.py @@ -6,8 +6,8 @@ from awesomeversion import AwesomeVersion import jwt +import probatio from pyenphase import AUTH_TOKEN_MIN_VERSION, Envoy, EnvoyError, EnvoyTokenAuth -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -131,16 +131,16 @@ def async_get_options_flow( return EnvoyOptionsFlowHandler() @callback - def _async_generate_schema(self) -> vol.Schema: + def _async_generate_schema(self) -> probatio.Schema: """Generate schema.""" schema: VolDictType = {} if self.ip_address: - schema[vol.Required(CONF_HOST, default=self.ip_address)] = vol.In( + schema[probatio.Required(CONF_HOST, default=self.ip_address)] = probatio.In( [self.ip_address] ) elif self.source != SOURCE_REAUTH: - schema[vol.Required(CONF_HOST)] = str + schema[probatio.Required(CONF_HOST)] = str default_username = "" if ( @@ -152,18 +152,20 @@ def _async_generate_schema(self) -> vol.Schema: if self.manual_token: # in manual token entry mode show token input field - schema[vol.Optional(CONF_TOKEN, default="")] = str + schema[probatio.Optional(CONF_TOKEN, default="")] = str else: # in automatic token mode show username and password inputs schema[ - vol.Optional(CONF_USERNAME, default=self.username or default_username) + probatio.Optional( + CONF_USERNAME, default=self.username or default_username + ) ] = str - schema[vol.Optional(CONF_PASSWORD, default="")] = str + schema[probatio.Optional(CONF_PASSWORD, default="")] = str # option to switch between automatic and manual token entry modes - schema[vol.Optional(CONF_MANUAL_TOKEN, default=self.manual_token)] = bool + schema[probatio.Optional(CONF_MANUAL_TOKEN, default=self.manual_token)] = bool - return vol.Schema(schema) + return probatio.Schema(schema) @callback def _async_current_hosts(self) -> set[str]: @@ -449,16 +451,16 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( OPTION_DIAGNOSTICS_INCLUDE_FIXTURES, default=self.config_entry.options.get( OPTION_DIAGNOSTICS_INCLUDE_FIXTURES, OPTION_DIAGNOSTICS_INCLUDE_FIXTURES_DEFAULT_VALUE, ), ): bool, - vol.Required( + probatio.Required( OPTION_DISABLE_KEEP_ALIVE, default=self.config_entry.options.get( OPTION_DISABLE_KEEP_ALIVE, diff --git a/homeassistant/components/entur_public_transport/sensor.py b/homeassistant/components/entur_public_transport/sensor.py index 9d128f61c9577..ab2e2abd5dab0 100644 --- a/homeassistant/components/entur_public_transport/sensor.py +++ b/homeassistant/components/entur_public_transport/sensor.py @@ -5,7 +5,7 @@ from typing import override from enturclient import EnturPublicTransportData -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -51,14 +51,14 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_STOP_IDS): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(CONF_EXPAND_PLATFORMS, default=True): cv.boolean, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_SHOW_ON_MAP, default=False): cv.boolean, - vol.Optional(CONF_WHITELIST_LINES, default=[]): cv.ensure_list, - vol.Optional(CONF_OMIT_NON_BOARDING, default=True): cv.boolean, - vol.Optional(CONF_NUMBER_OF_DEPARTURES, default=2): vol.All( - cv.positive_int, vol.Range(min=2, max=10) + probatio.Required(CONF_STOP_IDS): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(CONF_EXPAND_PLATFORMS, default=True): cv.boolean, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_SHOW_ON_MAP, default=False): cv.boolean, + probatio.Optional(CONF_WHITELIST_LINES, default=[]): cv.ensure_list, + probatio.Optional(CONF_OMIT_NON_BOARDING, default=True): cv.boolean, + probatio.Optional(CONF_NUMBER_OF_DEPARTURES, default=2): probatio.All( + cv.positive_int, probatio.Range(min=2, max=10) ), } ) diff --git a/homeassistant/components/envertech_evt800/config_flow.py b/homeassistant/components/envertech_evt800/config_flow.py index dbbf1472dcba5..4f8863ffbf5b3 100644 --- a/homeassistant/components/envertech_evt800/config_flow.py +++ b/homeassistant/components/envertech_evt800/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from pyenvertechevt800 import EnvertechEVT800 -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_IP_ADDRESS, CONF_PORT, CONF_TYPE @@ -11,10 +11,10 @@ from .const import DEFAULT_PORT, DOMAIN, TYPE_TCP_SERVER_MODE -SCHEMA_DEVICE = vol.Schema( +SCHEMA_DEVICE = probatio.Schema( { - vol.Required(CONF_IP_ADDRESS): cv.string, - vol.Required(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Required(CONF_IP_ADDRESS): cv.string, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): cv.port, } ) diff --git a/homeassistant/components/environment_canada/camera.py b/homeassistant/components/environment_canada/camera.py index ec62553d632d1..f6e9fadb9303c 100644 --- a/homeassistant/components/environment_canada/camera.py +++ b/homeassistant/components/environment_canada/camera.py @@ -3,7 +3,7 @@ from typing import override from env_canada import ECMap -import voluptuous as vol +import probatio from homeassistant.components.camera import Camera from homeassistant.core import HomeAssistant @@ -20,7 +20,9 @@ SERVICE_SET_RADAR_TYPE = "set_radar_type" SET_RADAR_TYPE_SCHEMA: VolDictType = { - vol.Required("radar_type"): vol.In(["Auto", "Rain", "Snow", "Precipitation type"]), + probatio.Required("radar_type"): probatio.In( + ["Auto", "Rain", "Snow", "Precipitation type"] + ), } _RADAR_TYPE_TO_LAYER: dict[str, str] = { diff --git a/homeassistant/components/environment_canada/config_flow.py b/homeassistant/components/environment_canada/config_flow.py index f9c1732866e1a..96375d54afc3d 100644 --- a/homeassistant/components/environment_canada/config_flow.py +++ b/homeassistant/components/environment_canada/config_flow.py @@ -7,7 +7,7 @@ import aiohttp from env_canada import ECWeather, ec_exc from env_canada.ec_weather import get_ec_sites_list -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -122,7 +122,7 @@ async def async_step_user( if user_input is not None: try: info = await validate_input(user_input) - except ET.ParseError, vol.MultipleInvalid, ec_exc.UnknownStationId: + except ET.ParseError, probatio.MultipleInvalid, ec_exc.UnknownStationId: errors["base"] = "bad_station_id" except aiohttp.ClientConnectionError: errors["base"] = "cannot_connect" @@ -150,9 +150,9 @@ async def async_step_user( station_codes = await self._get_station_codes() - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Optional(CONF_STATION): SelectSelector( + probatio.Optional(CONF_STATION): SelectSelector( SelectSelectorConfig( options=[ SelectOptionDict( @@ -163,13 +163,13 @@ async def async_step_user( mode=SelectSelectorMode.DROPDOWN, ) ), - vol.Optional( + probatio.Optional( CONF_LATITUDE, default=self.hass.config.latitude ): cv.latitude, - vol.Optional( + probatio.Optional( CONF_LONGITUDE, default=self.hass.config.longitude ): cv.longitude, - vol.Required(CONF_LANGUAGE, default="English"): vol.In( + probatio.Required(CONF_LANGUAGE, default="English"): probatio.In( ["English", "French"] ), } @@ -197,12 +197,12 @@ async def async_step_init( return self.async_create_entry(data=flat_options) options = self.config_entry.options - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(SECTION_MAP): section( - vol.Schema( + probatio.Required(SECTION_MAP): section( + probatio.Schema( { - vol.Required( + probatio.Required( CONF_RADAR_RADIUS, default=options.get( CONF_RADAR_RADIUS, DEFAULT_RADAR_RADIUS @@ -216,10 +216,10 @@ async def async_step_init( ), {"collapsed": False}, ), - vol.Required(SECTION_RADAR): section( - vol.Schema( + probatio.Required(SECTION_RADAR): section( + probatio.Schema( { - vol.Required( + probatio.Required( CONF_RADAR_LAYER, default=options.get( CONF_RADAR_LAYER, DEFAULT_RADAR_LAYER @@ -230,7 +230,7 @@ async def async_step_init( translation_key="radar_layer", ) ), - vol.Required( + probatio.Required( CONF_RADAR_COLORS, default=options.get( CONF_RADAR_COLORS, DEFAULT_RADAR_COLORS @@ -241,7 +241,7 @@ async def async_step_init( translation_key="radar_colors", ) ), - vol.Required( + probatio.Required( CONF_RADAR_OPACITY, default=options.get( CONF_RADAR_OPACITY, DEFAULT_RADAR_OPACITY @@ -254,7 +254,7 @@ async def async_step_init( mode=NumberSelectorMode.SLIDER, ) ), - vol.Required( + probatio.Required( CONF_RADAR_LEGEND, default=options.get( CONF_RADAR_LEGEND, DEFAULT_RADAR_LEGEND @@ -264,10 +264,10 @@ async def async_step_init( ), {"collapsed": False}, ), - vol.Required(SECTION_TIME): section( - vol.Schema( + probatio.Required(SECTION_TIME): section( + probatio.Schema( { - vol.Required( + probatio.Required( CONF_RADAR_DURATION, default=options.get( CONF_RADAR_DURATION, DEFAULT_RADAR_DURATION @@ -277,7 +277,7 @@ async def async_step_init( min=0, max=180, step=5, unit_of_measurement="min" ) ), - vol.Required( + probatio.Required( CONF_RADAR_FUTURE_MINUTES, default=options.get( CONF_RADAR_FUTURE_MINUTES, @@ -288,7 +288,7 @@ async def async_step_init( min=0, max=72, step=1, unit_of_measurement="min" ) ), - vol.Required( + probatio.Required( CONF_RADAR_TIMESTAMP, default=options.get( CONF_RADAR_TIMESTAMP, DEFAULT_RADAR_TIMESTAMP @@ -298,17 +298,17 @@ async def async_step_init( ), {"collapsed": False}, ), - vol.Required(SECTION_IMAGE): section( - vol.Schema( + probatio.Required(SECTION_IMAGE): section( + probatio.Schema( { - vol.Required( + probatio.Required( CONF_RADAR_INTERPOLATION, default=options.get( CONF_RADAR_INTERPOLATION, DEFAULT_RADAR_INTERPOLATION, ), ): BooleanSelector(), - vol.Required( + probatio.Required( CONF_RADAR_FPS, default=options.get(CONF_RADAR_FPS, DEFAULT_RADAR_FPS), ): NumberSelector( diff --git a/homeassistant/components/environment_canada/services.py b/homeassistant/components/environment_canada/services.py index 23e8b3b8ffea8..1d7f6ad138a9f 100644 --- a/homeassistant/components/environment_canada/services.py +++ b/homeassistant/components/environment_canada/services.py @@ -3,7 +3,7 @@ from typing import Any from env_canada import ECWeather -import voluptuous as vol +import probatio from homeassistant.const import ATTR_CONFIG_ENTRY_ID from homeassistant.core import HomeAssistant, ServiceCall, SupportsResponse, callback @@ -13,7 +13,9 @@ from .const import DOMAIN SERVICE_GET_ALERTS = "get_alerts" -SERVICE_GET_ALERTS_SCHEMA = vol.Schema({vol.Required(ATTR_CONFIG_ENTRY_ID): cv.string}) +SERVICE_GET_ALERTS_SCHEMA = probatio.Schema( + {probatio.Required(ATTR_CONFIG_ENTRY_ID): cv.string} +) SNAKE_MAPPING = { "alertColourLevel": "alert_colour_level", diff --git a/homeassistant/components/envisalink/__init__.py b/homeassistant/components/envisalink/__init__.py index f0e8ecd449ddb..86d8e0195310b 100644 --- a/homeassistant/components/envisalink/__init__.py +++ b/homeassistant/components/envisalink/__init__.py @@ -3,8 +3,8 @@ import asyncio import logging +import probatio from pyenvisalink import EnvisalinkAlarmPanel -import voluptuous as vol from homeassistant.const import ( CONF_CODE, @@ -56,54 +56,58 @@ SIGNAL_KEYPAD_UPDATE = "envisalink.keypad_updated" SIGNAL_ZONE_BYPASS_UPDATE = "envisalink.zone_bypass_updated" -ZONE_SCHEMA = vol.Schema( +ZONE_SCHEMA = probatio.Schema( { - vol.Required(CONF_ZONENAME): cv.string, - vol.Optional(CONF_ZONETYPE, default=DEFAULT_ZONETYPE): cv.string, + probatio.Required(CONF_ZONENAME): cv.string, + probatio.Optional(CONF_ZONETYPE, default=DEFAULT_ZONETYPE): cv.string, } ) -PARTITION_SCHEMA = vol.Schema({vol.Required(CONF_PARTITIONNAME): cv.string}) +PARTITION_SCHEMA = probatio.Schema({probatio.Required(CONF_PARTITIONNAME): cv.string}) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_PANEL_TYPE): vol.All( - cv.string, vol.In([PANEL_TYPE_HONEYWELL, PANEL_TYPE_DSC]) + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_PANEL_TYPE): probatio.All( + cv.string, probatio.In([PANEL_TYPE_HONEYWELL, PANEL_TYPE_DSC]) ), - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASS): cv.string, - vol.Optional(CONF_CODE): cv.string, - vol.Optional(CONF_PANIC, default=DEFAULT_PANIC): cv.string, - vol.Optional(CONF_ZONES): {vol.Coerce(int): ZONE_SCHEMA}, - vol.Optional(CONF_PARTITIONS): {vol.Coerce(int): PARTITION_SCHEMA}, - vol.Optional(CONF_EVL_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_EVL_VERSION, default=DEFAULT_EVL_VERSION): vol.All( - vol.Coerce(int), vol.Range(min=3, max=4) - ), - vol.Optional(CONF_EVL_KEEPALIVE, default=DEFAULT_KEEPALIVE): vol.All( - vol.Coerce(int), vol.Range(min=15) - ), - vol.Optional( + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASS): cv.string, + probatio.Optional(CONF_CODE): cv.string, + probatio.Optional(CONF_PANIC, default=DEFAULT_PANIC): cv.string, + probatio.Optional(CONF_ZONES): {probatio.Coerce(int): ZONE_SCHEMA}, + probatio.Optional(CONF_PARTITIONS): { + probatio.Coerce(int): PARTITION_SCHEMA + }, + probatio.Optional(CONF_EVL_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional( + CONF_EVL_VERSION, default=DEFAULT_EVL_VERSION + ): probatio.All(probatio.Coerce(int), probatio.Range(min=3, max=4)), + probatio.Optional( + CONF_EVL_KEEPALIVE, default=DEFAULT_KEEPALIVE + ): probatio.All(probatio.Coerce(int), probatio.Range(min=15)), + probatio.Optional( CONF_ZONEDUMP_INTERVAL, default=DEFAULT_ZONEDUMP_INTERVAL - ): vol.Coerce(int), - vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): vol.Coerce(int), + ): probatio.Coerce(int), + probatio.Optional( + CONF_TIMEOUT, default=DEFAULT_TIMEOUT + ): probatio.Coerce(int), } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) SERVICE_CUSTOM_FUNCTION = "invoke_custom_function" ATTR_CUSTOM_FUNCTION = "pgm" ATTR_PARTITION = "partition" -SERVICE_SCHEMA = vol.Schema( +SERVICE_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CUSTOM_FUNCTION): cv.string, - vol.Required(ATTR_PARTITION): cv.string, + probatio.Required(ATTR_CUSTOM_FUNCTION): cv.string, + probatio.Required(ATTR_PARTITION): cv.string, } ) diff --git a/homeassistant/components/envisalink/alarm_control_panel.py b/homeassistant/components/envisalink/alarm_control_panel.py index 92fb0ded5adbe..51be0daeb94b1 100644 --- a/homeassistant/components/envisalink/alarm_control_panel.py +++ b/homeassistant/components/envisalink/alarm_control_panel.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from pyenvisalink import EnvisalinkAlarmPanel -import voluptuous as vol from homeassistant.components.alarm_control_panel import ( AlarmControlPanelEntity, @@ -35,10 +35,10 @@ SERVICE_ALARM_KEYPRESS = "alarm_keypress" ATTR_KEYPRESS = "keypress" -ALARM_KEYPRESS_SCHEMA = vol.Schema( +ALARM_KEYPRESS_SCHEMA = probatio.Schema( { - vol.Required(ATTR_ENTITY_ID): cv.entity_ids, - vol.Required(ATTR_KEYPRESS): cv.string, + probatio.Required(ATTR_ENTITY_ID): cv.entity_ids, + probatio.Required(ATTR_KEYPRESS): cv.string, } ) diff --git a/homeassistant/components/ephember/climate.py b/homeassistant/components/ephember/climate.py index 11784734a0065..3b64d20f9b507 100644 --- a/homeassistant/components/ephember/climate.py +++ b/homeassistant/components/ephember/climate.py @@ -5,6 +5,7 @@ import logging from typing import Any, override +import probatio from pyephember2.pyephember2 import ( EphEmber, ZoneMode, @@ -15,7 +16,6 @@ zone_name, zone_target_temperature, ) -import voluptuous as vol from homeassistant.components.climate import ( PLATFORM_SCHEMA as CLIMATE_PLATFORM_SCHEMA, @@ -43,7 +43,10 @@ OPERATION_LIST = [HVACMode.HEAT_COOL, HVACMode.HEAT, HVACMode.OFF] PLATFORM_SCHEMA = CLIMATE_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_USERNAME): cv.string, vol.Required(CONF_PASSWORD): cv.string} + { + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + } ) EPH_TO_HA_STATE = { diff --git a/homeassistant/components/epic_games_store/config_flow.py b/homeassistant/components/epic_games_store/config_flow.py index 250bb03e75c3b..c3d2080b72ffd 100644 --- a/homeassistant/components/epic_games_store/config_flow.py +++ b/homeassistant/components/epic_games_store/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from epicstore_api import EpicGamesStoreAPI -import voluptuous as vol +import probatio from homeassistant import config_entries from homeassistant.config_entries import ConfigFlowResult @@ -20,12 +20,12 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_LANGUAGE): LanguageSelector( + probatio.Required(CONF_LANGUAGE): LanguageSelector( LanguageSelectorConfig(languages=SUPPORTED_LANGUAGES) ), - vol.Required(CONF_COUNTRY): CountrySelector(), + probatio.Required(CONF_COUNTRY): CountrySelector(), } ) diff --git a/homeassistant/components/epion/config_flow.py b/homeassistant/components/epion/config_flow.py index 9c0c42dc785a3..5b567fe6d6686 100644 --- a/homeassistant/components/epion/config_flow.py +++ b/homeassistant/components/epion/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from epion import Epion, EpionAuthenticationError, EpionConnectionError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY @@ -44,9 +44,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_API_KEY): str, + probatio.Required(CONF_API_KEY): str, } ), errors=errors, diff --git a/homeassistant/components/epson/config_flow.py b/homeassistant/components/epson/config_flow.py index fd92118fa6322..2f7a6bdbd7205 100644 --- a/homeassistant/components/epson/config_flow.py +++ b/homeassistant/components/epson/config_flow.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PORT @@ -15,17 +15,17 @@ ALLOWED_CONNECTION_TYPE = [HTTP, SERIAL] -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_CONNECTION_TYPE, default=HTTP): SelectSelector( + probatio.Required(CONF_CONNECTION_TYPE, default=HTTP): SelectSelector( SelectSelectorConfig( options=ALLOWED_CONNECTION_TYPE, translation_key="connection_type" ) ), - vol.Required(CONF_HOST): str, + probatio.Required(CONF_HOST): str, # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Required(CONF_NAME, default=DOMAIN): str, + probatio.Required(CONF_NAME, default=DOMAIN): str, } ) diff --git a/homeassistant/components/epson/services.py b/homeassistant/components/epson/services.py index ac6277c512040..2c52fdab86950 100644 --- a/homeassistant/components/epson/services.py +++ b/homeassistant/components/epson/services.py @@ -1,7 +1,7 @@ """Support for Epson projector.""" from epson_projector.const import CMODE_LIST_SET -import voluptuous as vol +import probatio from homeassistant.components.media_player import DOMAIN as MEDIA_PLAYER_DOMAIN from homeassistant.core import HomeAssistant, callback @@ -20,6 +20,10 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, SERVICE_SELECT_CMODE, entity_domain=MEDIA_PLAYER_DOMAIN, - schema={vol.Required(ATTR_CMODE): vol.All(cv.string, vol.Any(*CMODE_LIST_SET))}, + schema={ + probatio.Required(ATTR_CMODE): probatio.All( + cv.string, probatio.Any(*CMODE_LIST_SET) + ) + }, func=SERVICE_SELECT_CMODE, ) diff --git a/homeassistant/components/eq3btsmart/schemas.py b/homeassistant/components/eq3btsmart/schemas.py index daeed5a05e3ca..7387933a90c04 100644 --- a/homeassistant/components/eq3btsmart/schemas.py +++ b/homeassistant/components/eq3btsmart/schemas.py @@ -1,15 +1,15 @@ -"""Voluptuous schemas for eq3btsmart.""" +"""Probatio schemas for eq3btsmart.""" from eq3btsmart.const import EQ3_MAX_TEMP, EQ3_MIN_TEMP -import voluptuous as vol +import probatio from homeassistant.const import CONF_MAC from homeassistant.helpers import config_validation as cv -SCHEMA_TEMPERATURE = vol.Range(min=EQ3_MIN_TEMP, max=EQ3_MAX_TEMP) -SCHEMA_DEVICE = vol.Schema({vol.Required(CONF_MAC): cv.string}) -SCHEMA_MAC = vol.Schema( +SCHEMA_TEMPERATURE = probatio.Range(min=EQ3_MIN_TEMP, max=EQ3_MAX_TEMP) +SCHEMA_DEVICE = probatio.Schema({probatio.Required(CONF_MAC): cv.string}) +SCHEMA_MAC = probatio.Schema( { - vol.Required(CONF_MAC): str, + probatio.Required(CONF_MAC): str, } ) diff --git a/homeassistant/components/esphome/assist_satellite.py b/homeassistant/components/esphome/assist_satellite.py index 0182cacf9cfb7..94ad3438c1e2e 100644 --- a/homeassistant/components/esphome/assist_satellite.py +++ b/homeassistant/components/esphome/assist_satellite.py @@ -22,8 +22,8 @@ VoiceAssistantFeature, VoiceAssistantTimerEventType, ) -import voluptuous as vol -from voluptuous.humanize import humanize_error +import probatio +from probatio.humanize import humanize_error from homeassistant.components import assist_satellite, tts from homeassistant.components.assist_pipeline import ( @@ -115,12 +115,12 @@ _ANNOUNCEMENT_TIMEOUT_SEC = 5 * 60 # 5 minutes _CONFIG_TIMEOUT_SEC = 5 -_WAKE_WORD_CONFIG_SCHEMA = vol.Schema( +_WAKE_WORD_CONFIG_SCHEMA = probatio.Schema( { - vol.Required("type"): str, - vol.Required("wake_word"): str, + probatio.Required("type"): str, + probatio.Required("wake_word"): str, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) _DATA_WAKE_WORDS: HassKey[dict[str, VoiceAssistantExternalWakeWord]] = HassKey( "wake_word_cache" @@ -915,7 +915,7 @@ def _get_custom_wake_words( config_dict = json.load(config_file) try: config = _WAKE_WORD_CONFIG_SCHEMA(config_dict) - except vol.Invalid as err: + except probatio.Invalid as err: # Invalid config _LOGGER.debug( "Invalid wake word config: path=%s, error=%s", diff --git a/homeassistant/components/esphome/config_flow.py b/homeassistant/components/esphome/config_flow.py index b3d2669235384..d32ca29f21a14 100644 --- a/homeassistant/components/esphome/config_flow.py +++ b/homeassistant/components/esphome/config_flow.py @@ -20,7 +20,7 @@ wifi_mac_to_bluetooth_mac, ) import aiohttp -import voluptuous as vol +import probatio from homeassistant.components import zeroconf from homeassistant.components.bluetooth import BluetoothScanningMode @@ -129,8 +129,10 @@ async def _async_step_user_base( return await self._async_try_fetch_device_info() fields: dict[Any, type] = OrderedDict() - fields[vol.Required(CONF_HOST, default=self._host or vol.UNDEFINED)] = str - fields[vol.Optional(CONF_PORT, default=self._port or DEFAULT_PORT)] = int + fields[ + probatio.Required(CONF_HOST, default=self._host or probatio.UNDEFINED) + ] = str + fields[probatio.Optional(CONF_PORT, default=self._port or DEFAULT_PORT)] = int errors = {} if error is not None: @@ -138,7 +140,7 @@ async def _async_step_user_base( return self.async_show_form( step_id="user", - data_schema=vol.Schema(fields), + data_schema=probatio.Schema(fields), errors=errors, ) @@ -235,7 +237,7 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema({vol.Required(CONF_NOISE_PSK): str}), + data_schema=probatio.Schema({probatio.Required(CONF_NOISE_PSK): str}), errors=errors, description_placeholders={"name": self._async_get_human_readable_name()}, ) @@ -774,7 +776,7 @@ async def async_step_encryption_key( return self.async_show_form( step_id="encryption_key", - data_schema=vol.Schema({vol.Required(CONF_NOISE_PSK): str}), + data_schema=probatio.Schema({probatio.Required(CONF_NOISE_PSK): str}), errors=errors, description_placeholders={"name": self._async_get_human_readable_name()}, ) @@ -817,7 +819,7 @@ async def async_step_authenticate( return self.async_show_form( step_id="authenticate", - data_schema=vol.Schema({vol.Required("password"): str}), + data_schema=probatio.Schema({probatio.Required("password"): str}), description_placeholders={"name": self._async_get_human_readable_name()}, errors=errors, ) @@ -1017,27 +1019,27 @@ async def async_step_init( options = self.config_entry.options schema: dict[Any, Any] = { - vol.Required( + probatio.Required( CONF_ALLOW_SERVICE_CALLS, default=options.get( CONF_ALLOW_SERVICE_CALLS, DEFAULT_ALLOW_SERVICE_CALLS ), ): bool, - vol.Required( + probatio.Required( CONF_SUBSCRIBE_LOGS, default=options.get(CONF_SUBSCRIBE_LOGS, False), ): bool, } if _entry_has_bluetooth_scanner(self.config_entry): schema[ - vol.Required( + probatio.Required( CONF_BLUETOOTH_SCANNING_MODE, default=options.get( CONF_BLUETOOTH_SCANNING_MODE, DEFAULT_BLUETOOTH_SCANNING_MODE ), ) ] = _BLUETOOTH_SCANNING_MODE_SELECTOR - return self.async_show_form(step_id="init", data_schema=vol.Schema(schema)) + return self.async_show_form(step_id="init", data_schema=probatio.Schema(schema)) @callback diff --git a/homeassistant/components/esphome/entity.py b/homeassistant/components/esphome/entity.py index 3392556d9b166..4c009704d3248 100644 --- a/homeassistant/components/esphome/entity.py +++ b/homeassistant/components/esphome/entity.py @@ -16,7 +16,7 @@ WaterHeaterInfo, build_device_unique_id, ) -import voluptuous as vol +import probatio from homeassistant.const import EntityCategory, UnitOfTemperature from homeassistant.core import CALLBACK_TYPE, HomeAssistant, callback @@ -456,7 +456,7 @@ async def handler(self: _EntityT, *args: _P.args, **kwargs: _P.kwargs) -> None: return handler -ICON_SCHEMA = vol.Schema(cv.icon) +ICON_SCHEMA = probatio.Schema(cv.icon) ENTITY_CATEGORIES: EsphomeEnumMapper[EsphomeEntityCategory, EntityCategory | None] = ( diff --git a/homeassistant/components/esphome/manager.py b/homeassistant/components/esphome/manager.py index 38014b20bf80d..8926d35b7016d 100644 --- a/homeassistant/components/esphome/manager.py +++ b/homeassistant/components/esphome/manager.py @@ -32,7 +32,7 @@ ) import aiohttp from awesomeversion import AwesomeVersion -import voluptuous as vol +import probatio from homeassistant.components import bluetooth, tag, zeroconf from homeassistant.const import ( @@ -431,7 +431,7 @@ async def _handle_service_call_with_response( except ( ServiceNotFound, ServiceValidationError, - vol.Invalid, + probatio.Invalid, HomeAssistantError, ) as ex: self._send_service_call_response( @@ -455,7 +455,7 @@ async def _handle_service_call_with_notification( await self.hass.services.async_call( domain, service_name, service_data, blocking=True ) - except (ServiceNotFound, ServiceValidationError, vol.Invalid) as ex: + except (ServiceNotFound, ServiceValidationError, probatio.Invalid) as ex: self._send_service_call_response(call_id, False, str(ex), b"") else: self._send_service_call_response(call_id, True, "", b"") @@ -1374,12 +1374,12 @@ class ServiceMetadata(NamedTuple): selector={"boolean": None}, ), UserServiceArgType.INT: ServiceMetadata( - validator=vol.Coerce(int), + validator=probatio.Coerce(int), example="42", selector={"number": {CONF_MODE: "box"}}, ), UserServiceArgType.FLOAT: ServiceMetadata( - validator=vol.Coerce(float), + validator=probatio.Coerce(float), example="12.3", selector={"number": {CONF_MODE: "box", "step": 1e-3}}, ), @@ -1395,13 +1395,13 @@ class ServiceMetadata(NamedTuple): selector={"object": {}}, ), UserServiceArgType.INT_ARRAY: ServiceMetadata( - validator=[vol.Coerce(int)], + validator=[probatio.Coerce(int)], description="A list of integer values.", example="[42, 34]", selector={"object": {}}, ), UserServiceArgType.FLOAT_ARRAY: ServiceMetadata( - validator=[vol.Coerce(float)], + validator=[probatio.Coerce(float)], description="A list of floating point numbers.", example="[ 12.3, 34.5 ]", selector={"object": {}}, @@ -1551,7 +1551,7 @@ def _async_register_service( ) return metadata = ARG_TYPE_METADATA[arg.type] - schema[vol.Required(arg.name)] = metadata.validator + schema[probatio.Required(arg.name)] = metadata.validator fields[arg.name] = { "name": arg.name, "required": True, @@ -1573,7 +1573,7 @@ def _async_register_service( service, supports_response=esphome_supports_response, ), - vol.Schema(schema), + probatio.Schema(schema), supports_response=ha_supports_response, ) async_set_service_schema( diff --git a/homeassistant/components/esphome/repairs.py b/homeassistant/components/esphome/repairs.py index 753eda3ad3bce..67400904ac535 100644 --- a/homeassistant/components/esphome/repairs.py +++ b/homeassistant/components/esphome/repairs.py @@ -2,7 +2,7 @@ from typing import cast -import voluptuous as vol +import probatio from homeassistant.components.repairs import RepairsFlow, RepairsFlowResult from homeassistant.core import HomeAssistant @@ -56,7 +56,7 @@ async def async_step_migrate( if user_input is None: return self.async_show_form( step_id="migrate", - data_schema=vol.Schema({}), + data_schema=probatio.Schema({}), ) entry_id = self.entry_id await async_replace_device(self.hass, entry_id, self.stored_mac, self.mac) @@ -70,7 +70,7 @@ async def async_step_manual( if user_input is None: return self.async_show_form( step_id="manual", - data_schema=vol.Schema({}), + data_schema=probatio.Schema({}), ) self.hass.config_entries.async_schedule_reload(self.entry_id) return self.async_create_entry(data={}) diff --git a/homeassistant/components/esphome/websocket_api.py b/homeassistant/components/esphome/websocket_api.py index 2a25c410a64d3..271bb7718e7a2 100644 --- a/homeassistant/components/esphome/websocket_api.py +++ b/homeassistant/components/esphome/websocket_api.py @@ -3,7 +3,7 @@ import logging from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.core import HomeAssistant, callback @@ -27,8 +27,8 @@ def async_setup(hass: HomeAssistant) -> None: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "esphome/get_encryption_key", - vol.Required(ENTRY_ID): str, + probatio.Required(TYPE): "esphome/get_encryption_key", + probatio.Required(ENTRY_ID): str, } ) def get_encryption_key( diff --git a/homeassistant/components/etherscan/sensor.py b/homeassistant/components/etherscan/sensor.py index 4fb37b4f5b7c7..363060432b7f5 100644 --- a/homeassistant/components/etherscan/sensor.py +++ b/homeassistant/components/etherscan/sensor.py @@ -3,8 +3,8 @@ from datetime import timedelta from typing import override +import probatio from pyetherscan import get_balance -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -22,10 +22,10 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ADDRESS): cv.string, - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_TOKEN): cv.string, - vol.Optional(CONF_TOKEN_ADDRESS): cv.string, + probatio.Required(CONF_ADDRESS): cv.string, + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_TOKEN): cv.string, + probatio.Optional(CONF_TOKEN_ADDRESS): cv.string, } ) diff --git a/homeassistant/components/eufy/__init__.py b/homeassistant/components/eufy/__init__.py index 57f905030499f..adb86a9e62d24 100644 --- a/homeassistant/components/eufy/__init__.py +++ b/homeassistant/components/eufy/__init__.py @@ -1,7 +1,7 @@ """Support for EufyHome devices.""" import lakeside -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_ACCESS_TOKEN, @@ -19,28 +19,28 @@ DOMAIN = "eufy" -DEVICE_SCHEMA = vol.Schema( +DEVICE_SCHEMA = probatio.Schema( { - vol.Required(CONF_ADDRESS): cv.string, - vol.Required(CONF_ACCESS_TOKEN): cv.string, - vol.Required(CONF_TYPE): cv.string, - vol.Optional(CONF_NAME): cv.string, + probatio.Required(CONF_ADDRESS): cv.string, + probatio.Required(CONF_ACCESS_TOKEN): cv.string, + probatio.Required(CONF_TYPE): cv.string, + probatio.Optional(CONF_NAME): cv.string, } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Optional(CONF_DEVICES, default=[]): vol.All( + probatio.Optional(CONF_DEVICES, default=[]): probatio.All( cv.ensure_list, [DEVICE_SCHEMA] ), - vol.Inclusive(CONF_USERNAME, "authentication"): cv.string, - vol.Inclusive(CONF_PASSWORD, "authentication"): cv.string, + probatio.Inclusive(CONF_USERNAME, "authentication"): cv.string, + probatio.Inclusive(CONF_PASSWORD, "authentication"): cv.string, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) PLATFORMS = { diff --git a/homeassistant/components/eufylife_ble/config_flow.py b/homeassistant/components/eufylife_ble/config_flow.py index 3eb4e4a995b36..277a8c9445f13 100644 --- a/homeassistant/components/eufylife_ble/config_flow.py +++ b/homeassistant/components/eufylife_ble/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from eufylife_ble_client import MODEL_TO_NAME -import voluptuous as vol +import probatio from homeassistant.components import bluetooth from homeassistant.components.bluetooth import ( @@ -95,7 +95,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_ADDRESS): vol.In(self._discovered_devices)} + data_schema=probatio.Schema( + {probatio.Required(CONF_ADDRESS): probatio.In(self._discovered_devices)} ), ) diff --git a/homeassistant/components/eurotronic_cometblue/config_flow.py b/homeassistant/components/eurotronic_cometblue/config_flow.py index 658c661ddbc1b..f140bdd7667a5 100644 --- a/homeassistant/components/eurotronic_cometblue/config_flow.py +++ b/homeassistant/components/eurotronic_cometblue/config_flow.py @@ -7,7 +7,7 @@ from eurotronic_cometblue_ha import AsyncCometBlue from eurotronic_cometblue_ha.const import SERVICE from habluetooth import BluetoothServiceInfoBleak -import voluptuous as vol +import probatio from homeassistant.components.bluetooth import ( async_ble_device_from_address, @@ -27,11 +27,11 @@ LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_PIN, default="000000"): vol.All( + probatio.Required(CONF_PIN, default="000000"): probatio.All( TextSelector(TextSelectorConfig(type=TextSelectorType.NUMBER)), - vol.Length(min=6, max=6), + probatio.Length(min=6, max=6), ), } ) @@ -172,8 +172,12 @@ async def async_step_pick_device( return self.async_show_form( step_id="pick_device", - data_schema=vol.Schema( - {vol.Required(CONF_ADDRESS): vol.In(list(self._discovered_devices))} + data_schema=probatio.Schema( + { + probatio.Required(CONF_ADDRESS): probatio.In( + list(self._discovered_devices) + ) + } ), ) diff --git a/homeassistant/components/eurotronic_cometblue/services.py b/homeassistant/components/eurotronic_cometblue/services.py index c3f4ab94986c6..3c666bea27e9f 100644 --- a/homeassistant/components/eurotronic_cometblue/services.py +++ b/homeassistant/components/eurotronic_cometblue/services.py @@ -4,7 +4,7 @@ import logging from typing import Final, TypedDict, cast -import voluptuous as vol +import probatio from homeassistant.components.climate import DOMAIN as CLIMATE_DOMAIN from homeassistant.const import ATTR_TEMPERATURE @@ -118,27 +118,27 @@ def _validate_cometblue_schedule( return normalized_schedule -SCHEDULE_ENTRY_SCHEMA = vol.Schema( +SCHEDULE_ENTRY_SCHEMA = probatio.Schema( { - vol.Optional(ATTR_FROM): cv.time, - vol.Optional(ATTR_TO): cv.time, + probatio.Optional(ATTR_FROM): cv.time, + probatio.Optional(ATTR_TO): cv.time, }, - extra=vol.REMOVE_EXTRA, + extra=probatio.REMOVE_EXTRA, ) -SCHEDULE_DAY_SCHEMA = vol.All( +SCHEDULE_DAY_SCHEMA = probatio.All( [SCHEDULE_ENTRY_SCHEMA], - vol.Length(max=4), + probatio.Length(max=4), _validate_cometblue_schedule, ) SERVICE_SCHEDULE_SCHEMA = { - vol.Optional(day): SCHEDULE_DAY_SCHEMA for day in ATTR_ALL_DAYS + probatio.Optional(day): SCHEDULE_DAY_SCHEMA for day in ATTR_ALL_DAYS } SERVICE_HOLIDAY_SCHEMA = { - vol.Required(ATTR_FROM): cv.datetime, - vol.Required(ATTR_TO): cv.datetime, - vol.Required(ATTR_TEMPERATURE): vol.All( - vol.Coerce(float), - vol.Range(min=MIN_TEMP, max=MAX_TEMP), + probatio.Required(ATTR_FROM): cv.datetime, + probatio.Required(ATTR_TO): cv.datetime, + probatio.Required(ATTR_TEMPERATURE): probatio.All( + probatio.Coerce(float), + probatio.Range(min=MIN_TEMP, max=MAX_TEMP), _validate_half_precision, ), } diff --git a/homeassistant/components/event/trigger.py b/homeassistant/components/event/trigger.py index 730f5e6c00925..ab331ca3998e2 100644 --- a/homeassistant/components/event/trigger.py +++ b/homeassistant/components/event/trigger.py @@ -2,7 +2,7 @@ from typing import override -import voluptuous as vol +import probatio from homeassistant.const import CONF_OPTIONS from homeassistant.core import HomeAssistant, State @@ -22,9 +22,9 @@ EVENT_RECEIVED_TRIGGER_SCHEMA = ENTITY_STATE_TRIGGER_SCHEMA.extend( { - vol.Required(CONF_OPTIONS): { - vol.Required(CONF_EVENT_TYPE): vol.All( - cv.ensure_list, vol.Length(min=1), [cv.string] + probatio.Required(CONF_OPTIONS): { + probatio.Required(CONF_EVENT_TYPE): probatio.All( + cv.ensure_list, probatio.Length(min=1), [cv.string] ), }, } diff --git a/homeassistant/components/everlights/light.py b/homeassistant/components/everlights/light.py index 5d8e4c67b0a3c..06ca497a29ad7 100644 --- a/homeassistant/components/everlights/light.py +++ b/homeassistant/components/everlights/light.py @@ -4,8 +4,8 @@ import logging from typing import Any, cast, override +import probatio import pyeverlights -import voluptuous as vol from homeassistant.components.light import ( ATTR_BRIGHTNESS, @@ -30,7 +30,7 @@ SCAN_INTERVAL = timedelta(minutes=1) PLATFORM_SCHEMA = LIGHT_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_HOSTS): vol.All(cv.ensure_list, [cv.string])} + {probatio.Required(CONF_HOSTS): probatio.All(cv.ensure_list, [cv.string])} ) diff --git a/homeassistant/components/evil_genius_labs/config_flow.py b/homeassistant/components/evil_genius_labs/config_flow.py index 718e03b1352fa..7ad77eb56b17f 100644 --- a/homeassistant/components/evil_genius_labs/config_flow.py +++ b/homeassistant/components/evil_genius_labs/config_flow.py @@ -5,8 +5,8 @@ from typing import Any, override import aiohttp +import probatio import pyevilgenius -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.core import HomeAssistant @@ -51,9 +51,9 @@ async def async_step_user( if user_input is None: return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required("host"): str, + probatio.Required("host"): str, } ), ) @@ -75,9 +75,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required("host", default=user_input["host"]): str, + probatio.Required("host", default=user_input["host"]): str, } ), errors=errors, diff --git a/homeassistant/components/evohome/__init__.py b/homeassistant/components/evohome/__init__.py index 3ab854e9992ba..f2928f4e8fedf 100644 --- a/homeassistant/components/evohome/__init__.py +++ b/homeassistant/components/evohome/__init__.py @@ -12,7 +12,7 @@ import evohomeasync as ec1 import evohomeasync2 as ec2 -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_PASSWORD, @@ -39,20 +39,22 @@ _LOGGER = logging.getLogger(__name__) -CONFIG_SCHEMA: Final = vol.Schema( +CONFIG_SCHEMA: Final = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_LOCATION_IDX, default=0): cv.positive_int, - vol.Optional( + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_LOCATION_IDX, default=0): cv.positive_int, + probatio.Optional( CONF_SCAN_INTERVAL, default=SCAN_INTERVAL_DEFAULT - ): vol.All(cv.time_period, vol.Range(min=SCAN_INTERVAL_MINIMUM)), + ): probatio.All( + cv.time_period, probatio.Range(min=SCAN_INTERVAL_MINIMUM) + ), } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/evohome/services.py b/homeassistant/components/evohome/services.py index 6286b7c51df5b..5717e0928b7f4 100644 --- a/homeassistant/components/evohome/services.py +++ b/homeassistant/components/evohome/services.py @@ -15,7 +15,7 @@ SZ_SYSTEM_MODE, SZ_TIMING_MODE, ) -import voluptuous as vol +import probatio from homeassistant.components.climate import DOMAIN as CLIMATE_DOMAIN from homeassistant.components.water_heater import DOMAIN as WATER_HEATER_DOMAIN @@ -47,35 +47,37 @@ def _as_snake_case(mode: str) -> str: # System service schemas (registered as domain services) -SET_SYSTEM_MODE_SCHEMA: Final[dict[str | vol.Marker, Any]] = { +SET_SYSTEM_MODE_SCHEMA: Final[dict[str | probatio.Marker, Any]] = { # unsupported modes are rejected at runtime with ServiceValidationError - vol.Required(SZ_MODE): cv.string, # ... so, don't use SystemMode enum here - vol.Exclusive(SZ_DURATION, "temporary"): vol.All( + probatio.Required(SZ_MODE): cv.string, # ... so, don't use SystemMode enum here + probatio.Exclusive(SZ_DURATION, "temporary"): probatio.All( cv.time_period, - vol.Range(min=timedelta(hours=0), max=timedelta(hours=24)), + probatio.Range(min=timedelta(hours=0), max=timedelta(hours=24)), ), - vol.Exclusive(SZ_PERIOD, "temporary"): vol.All( + probatio.Exclusive(SZ_PERIOD, "temporary"): probatio.All( cv.time_period, - vol.Range(min=timedelta(days=1), max=timedelta(days=99)), + probatio.Range(min=timedelta(days=1), max=timedelta(days=99)), ), - vol.Optional(ATTR_ENTITY_ID): cv.entity_id, + probatio.Optional(ATTR_ENTITY_ID): cv.entity_id, } # Zone service schemas (registered as entity services) -SET_ZONE_OVERRIDE_SCHEMA: Final[dict[str | vol.Marker, Any]] = { - vol.Required(SZ_SETPOINT): vol.All(vol.Coerce(float), vol.Range(min=4.0, max=35.0)), - vol.Optional(SZ_DURATION): vol.All( +SET_ZONE_OVERRIDE_SCHEMA: Final[dict[str | probatio.Marker, Any]] = { + probatio.Required(SZ_SETPOINT): probatio.All( + probatio.Coerce(float), probatio.Range(min=4.0, max=35.0) + ), + probatio.Optional(SZ_DURATION): probatio.All( cv.time_period, - vol.Range(min=timedelta(days=0), max=timedelta(days=1)), + probatio.Range(min=timedelta(days=0), max=timedelta(days=1)), ), } # DHW service schemas (registered as entity services) -SET_DHW_OVERRIDE_SCHEMA: Final[dict[str | vol.Marker, Any]] = { - vol.Required(SZ_STATE): cv.boolean, - vol.Optional(SZ_DURATION): vol.All( +SET_DHW_OVERRIDE_SCHEMA: Final[dict[str | probatio.Marker, Any]] = { + probatio.Required(SZ_STATE): cv.boolean, + probatio.Optional(SZ_DURATION): probatio.All( cv.time_period, - vol.Range(min=timedelta(days=0), max=timedelta(days=1)), + probatio.Range(min=timedelta(days=0), max=timedelta(days=1)), ), } @@ -175,7 +177,7 @@ def _validate_set_system_mode_params(tcs: ControlSystem, data: dict[str, Any]) - translation_placeholders={SZ_MODE: mode}, ) - # voluptuous schema ensures that duration and period are not both present + # probatio schema ensures that duration and period are not both present if not mode_info[SZ_CAN_BE_TEMPORARY]: if SZ_DURATION in data or SZ_PERIOD in data: @@ -263,7 +265,7 @@ async def set_system_mode(call: ServiceCall) -> None: DOMAIN, EvoService.SET_SYSTEM_MODE, set_system_mode, - schema=vol.Schema(SET_SYSTEM_MODE_SCHEMA), + schema=probatio.Schema(SET_SYSTEM_MODE_SCHEMA), ) _register_zone_entity_services(hass) diff --git a/homeassistant/components/ezviz/config_flow.py b/homeassistant/components/ezviz/config_flow.py index b34a7d5b5cfe0..7bc8648d9dcc0 100644 --- a/homeassistant/components/ezviz/config_flow.py +++ b/homeassistant/components/ezviz/config_flow.py @@ -4,6 +4,7 @@ import logging from typing import TYPE_CHECKING, Any, override +import probatio from pyezvizapi.client import EzvizClient from pyezvizapi.exceptions import ( AuthTestResultFailed, @@ -13,7 +14,6 @@ PyEzvizError, ) from pyezvizapi.test_cam_rtsp import TestRTSPAuth -import voluptuous as vol from homeassistant.config_entries import ( ConfigFlow, @@ -203,11 +203,11 @@ async def async_step_user( options=DEFAULT_OPTIONS, ) - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Required(CONF_URL, default=EU_URL): vol.In( + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Required(CONF_URL, default=EU_URL): probatio.In( [EU_URL, RUSSIA_URL, CONF_CUSTOMIZE] ), } @@ -256,9 +256,9 @@ async def async_step_user_custom_url( options=DEFAULT_OPTIONS, ) - data_schema_custom_url = vol.Schema( + data_schema_custom_url = probatio.Schema( { - vol.Required(CONF_URL, default=EU_URL): str, + probatio.Required(CONF_URL, default=EU_URL): str, } ) @@ -308,10 +308,10 @@ async def async_step_confirm( _LOGGER.exception("Unexpected exception") return self.async_abort(reason="unknown") - discovered_camera_schema = vol.Schema( + discovered_camera_schema = probatio.Schema( { - vol.Required(CONF_USERNAME, default=DEFAULT_CAMERA_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME, default=DEFAULT_CAMERA_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) @@ -375,10 +375,12 @@ async def async_step_reauth_confirm( data=auth_data, ) - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_USERNAME, default=entry.title): vol.In([entry.title]), - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME, default=entry.title): probatio.In( + [entry.title] + ), + probatio.Required(CONF_PASSWORD): str, } ) @@ -399,15 +401,15 @@ async def async_step_init( if user_input is not None: return self.async_create_entry(title="", data=user_input) - options = vol.Schema( + options = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_TIMEOUT, default=self.config_entry.options.get( CONF_TIMEOUT, DEFAULT_TIMEOUT ), ): int, - vol.Optional( + probatio.Optional( CONF_FFMPEG_ARGUMENTS, default=self.config_entry.options.get( CONF_FFMPEG_ARGUMENTS, DEFAULT_FFMPEG_ARGUMENTS diff --git a/homeassistant/components/faa_delays/config_flow.py b/homeassistant/components/faa_delays/config_flow.py index 9080eeb567dad..1506c389959b3 100644 --- a/homeassistant/components/faa_delays/config_flow.py +++ b/homeassistant/components/faa_delays/config_flow.py @@ -5,7 +5,7 @@ from aiohttp import ClientConnectionError import faadelays -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_ID @@ -15,7 +15,7 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema({vol.Required(CONF_ID): str}) +DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_ID): str}) class FAADelaysConfigFlow(ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/components/facebook/notify.py b/homeassistant/components/facebook/notify.py index 7ec23fa4ac279..08b78acba3daa 100644 --- a/homeassistant/components/facebook/notify.py +++ b/homeassistant/components/facebook/notify.py @@ -5,8 +5,8 @@ import logging from typing import Any, override +import probatio import requests -import voluptuous as vol from homeassistant.components.notify import ( ATTR_DATA, @@ -25,7 +25,7 @@ BASE_URL = "https://graph.facebook.com/v2.6/me/messages" PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_PAGE_ACCESS_TOKEN): cv.string} + {probatio.Required(CONF_PAGE_ACCESS_TOKEN): cv.string} ) diff --git a/homeassistant/components/fail2ban/sensor.py b/homeassistant/components/fail2ban/sensor.py index adb0b5d9c7160..00bbd4c7a7bd3 100644 --- a/homeassistant/components/fail2ban/sensor.py +++ b/homeassistant/components/fail2ban/sensor.py @@ -6,7 +6,7 @@ import re from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -31,9 +31,11 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_JAILS): vol.All(cv.ensure_list, vol.Length(min=1)), - vol.Optional(CONF_FILE_PATH): cv.isfile, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_JAILS): probatio.All( + cv.ensure_list, probatio.Length(min=1) + ), + probatio.Optional(CONF_FILE_PATH): cv.isfile, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/familyhub/camera.py b/homeassistant/components/familyhub/camera.py index 659bb452235e2..97448903a35c4 100644 --- a/homeassistant/components/familyhub/camera.py +++ b/homeassistant/components/familyhub/camera.py @@ -2,8 +2,8 @@ from typing import override +import probatio from pyfamilyhublocal import FamilyHubCam -import voluptuous as vol from homeassistant.components.camera import ( PLATFORM_SCHEMA as CAMERA_PLATFORM_SCHEMA, @@ -20,8 +20,8 @@ PLATFORM_SCHEMA = CAMERA_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_IP_ADDRESS): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_IP_ADDRESS): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/fan/__init__.py b/homeassistant/components/fan/__init__.py index 58a95dca030fb..6a578c687d9e8 100644 --- a/homeassistant/components/fan/__init__.py +++ b/homeassistant/components/fan/__init__.py @@ -7,8 +7,8 @@ import math from typing import Any, Final, final, override +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( @@ -107,10 +107,10 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: component.async_register_entity_service( SERVICE_TURN_ON, { - vol.Optional(ATTR_PERCENTAGE): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) + probatio.Optional(ATTR_PERCENTAGE): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) ), - vol.Optional(ATTR_PRESET_MODE): cv.string, + probatio.Optional(ATTR_PRESET_MODE): cv.string, }, "async_handle_turn_on_service", [FanEntityFeature.TURN_ON], @@ -127,8 +127,8 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: component.async_register_entity_service( SERVICE_INCREASE_SPEED, { - vol.Optional(ATTR_PERCENTAGE_STEP): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) + probatio.Optional(ATTR_PERCENTAGE_STEP): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) ) }, "async_increase_speed", @@ -137,8 +137,8 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: component.async_register_entity_service( SERVICE_DECREASE_SPEED, { - vol.Optional(ATTR_PERCENTAGE_STEP): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) + probatio.Optional(ATTR_PERCENTAGE_STEP): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) ) }, "async_decrease_speed", @@ -146,21 +146,21 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: ) component.async_register_entity_service( SERVICE_OSCILLATE, - {vol.Required(ATTR_OSCILLATING): cv.boolean}, + {probatio.Required(ATTR_OSCILLATING): cv.boolean}, "async_oscillate", [FanEntityFeature.OSCILLATE], ) component.async_register_entity_service( SERVICE_SET_DIRECTION, - {vol.Optional(ATTR_DIRECTION): cv.string}, + {probatio.Optional(ATTR_DIRECTION): cv.string}, "async_set_direction", [FanEntityFeature.DIRECTION], ) component.async_register_entity_service( SERVICE_SET_PERCENTAGE, { - vol.Required(ATTR_PERCENTAGE): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) + probatio.Required(ATTR_PERCENTAGE): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) ) }, "async_set_percentage", @@ -168,7 +168,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: ) component.async_register_entity_service( SERVICE_SET_PRESET_MODE, - {vol.Required(ATTR_PRESET_MODE): cv.string}, + {probatio.Required(ATTR_PRESET_MODE): cv.string}, "async_handle_set_preset_mode_service", [FanEntityFeature.SET_SPEED, FanEntityFeature.PRESET_MODE], ) diff --git a/homeassistant/components/fan/device_action.py b/homeassistant/components/fan/device_action.py index fee4764dcd4e9..6ec41af6c110e 100644 --- a/homeassistant/components/fan/device_action.py +++ b/homeassistant/components/fan/device_action.py @@ -1,6 +1,6 @@ """Provides device automations for Fan.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import ( async_validate_entity_schema, @@ -12,7 +12,9 @@ from . import DOMAIN -_ACTION_SCHEMA = toggle_entity.ACTION_SCHEMA.extend({vol.Required(CONF_DOMAIN): DOMAIN}) +_ACTION_SCHEMA = toggle_entity.ACTION_SCHEMA.extend( + {probatio.Required(CONF_DOMAIN): DOMAIN} +) async def async_validate_action_config( diff --git a/homeassistant/components/fan/device_condition.py b/homeassistant/components/fan/device_condition.py index c02120475e848..e6198a043f699 100644 --- a/homeassistant/components/fan/device_condition.py +++ b/homeassistant/components/fan/device_condition.py @@ -1,6 +1,6 @@ """Provide the device automations for Fan.""" -import voluptuous as vol +import probatio from homeassistant.const import ( ATTR_ENTITY_ID, @@ -27,8 +27,8 @@ CONDITION_SCHEMA = DEVICE_CONDITION_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In(CONDITION_TYPES), + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In(CONDITION_TYPES), } ) diff --git a/homeassistant/components/fan/device_trigger.py b/homeassistant/components/fan/device_trigger.py index c3522e84e9eb9..6bcc65b90d832 100644 --- a/homeassistant/components/fan/device_trigger.py +++ b/homeassistant/components/fan/device_trigger.py @@ -1,6 +1,6 @@ """Provides device automations for Fan.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import toggle_entity from homeassistant.const import CONF_DOMAIN @@ -10,9 +10,11 @@ from . import DOMAIN -TRIGGER_SCHEMA = vol.All( +TRIGGER_SCHEMA = probatio.All( toggle_entity.TRIGGER_SCHEMA, - vol.Schema({vol.Required(CONF_DOMAIN): DOMAIN}, extra=vol.ALLOW_EXTRA), + probatio.Schema( + {probatio.Required(CONF_DOMAIN): DOMAIN}, extra=probatio.ALLOW_EXTRA + ), ) @@ -25,7 +27,7 @@ async def async_get_triggers( async def async_get_trigger_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List trigger capabilities.""" return await toggle_entity.async_get_trigger_capabilities(hass, config) diff --git a/homeassistant/components/fan/intent.py b/homeassistant/components/fan/intent.py index ef088a4bba98b..c648af7b1e97c 100644 --- a/homeassistant/components/fan/intent.py +++ b/homeassistant/components/fan/intent.py @@ -1,6 +1,6 @@ """Intents for the fan integration.""" -import voluptuous as vol +import probatio from homeassistant.core import HomeAssistant from homeassistant.helpers import intent @@ -24,7 +24,9 @@ async def async_setup_intents(hass: HomeAssistant) -> None: required_slots={ ATTR_PERCENTAGE: intent.IntentSlotInfo( description="The speed percentage of the fan", - value_schema=vol.All(vol.Coerce(int), vol.Range(min=0, max=100)), + value_schema=probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) + ), ) }, ), diff --git a/homeassistant/components/feedreader/config_flow.py b/homeassistant/components/feedreader/config_flow.py index e7d99d7a938a3..1c3498736389b 100644 --- a/homeassistant/components/feedreader/config_flow.py +++ b/homeassistant/components/feedreader/config_flow.py @@ -6,7 +6,7 @@ import urllib.error import feedparser -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -63,9 +63,9 @@ def show_user_form( user_input = {} return self.async_show_form( step_id=step_id, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_URL, default=user_input.get(CONF_URL, "") ): TextSelector(TextSelectorConfig(type=TextSelectorType.URL)) } @@ -137,9 +137,9 @@ async def async_step_init( if user_input is not None: return self.async_create_entry(title="", data=user_input) - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_MAX_ENTRIES, default=self.config_entry.options.get( CONF_MAX_ENTRIES, DEFAULT_MAX_ENTRIES diff --git a/homeassistant/components/ffmpeg/__init__.py b/homeassistant/components/ffmpeg/__init__.py index 62044af3cbd59..5779aeeedda69 100644 --- a/homeassistant/components/ffmpeg/__init__.py +++ b/homeassistant/components/ffmpeg/__init__.py @@ -6,8 +6,8 @@ from haffmpeg.core import HAFFmpeg from haffmpeg.tools import IMAGE_JPEG, FFVersion, ImageFrame +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.const import ( CONTENT_TYPE_MULTIPART, @@ -45,13 +45,13 @@ # content-type changes again in the future OFFICIAL_IMAGE_VERSION = "6.0" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( - {vol.Optional(CONF_FFMPEG_BIN, default=DEFAULT_BINARY): cv.string} + DOMAIN: probatio.Schema( + {probatio.Optional(CONF_FFMPEG_BIN, default=DEFAULT_BINARY): cv.string} ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/ffmpeg/camera.py b/homeassistant/components/ffmpeg/camera.py index 7c7c652e42f94..bd36bf4184e18 100644 --- a/homeassistant/components/ffmpeg/camera.py +++ b/homeassistant/components/ffmpeg/camera.py @@ -5,7 +5,7 @@ from aiohttp import web from haffmpeg.camera import CameraMjpeg from haffmpeg.tools import IMAGE_JPEG -import voluptuous as vol +import probatio from homeassistant.components.camera import ( PLATFORM_SCHEMA as CAMERA_PLATFORM_SCHEMA, @@ -32,9 +32,9 @@ PLATFORM_SCHEMA = CAMERA_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_INPUT): cv.string, - vol.Optional(CONF_EXTRA_ARGUMENTS, default=DEFAULT_ARGUMENTS): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_INPUT): cv.string, + probatio.Optional(CONF_EXTRA_ARGUMENTS, default=DEFAULT_ARGUMENTS): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/ffmpeg/services.py b/homeassistant/components/ffmpeg/services.py index 512d898159129..c04369e71f58d 100644 --- a/homeassistant/components/ffmpeg/services.py +++ b/homeassistant/components/ffmpeg/services.py @@ -1,6 +1,6 @@ """Support for FFmpeg.""" -import voluptuous as vol +import probatio from homeassistant.const import ATTR_ENTITY_ID from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -18,7 +18,9 @@ SERVICE_STOP = "stop" SERVICE_RESTART = "restart" -SERVICE_FFMPEG_SCHEMA = vol.Schema({vol.Optional(ATTR_ENTITY_ID): cv.entity_ids}) +SERVICE_FFMPEG_SCHEMA = probatio.Schema( + {probatio.Optional(ATTR_ENTITY_ID): cv.entity_ids} +) async def _async_service_handle(service: ServiceCall) -> None: diff --git a/homeassistant/components/ffmpeg_motion/binary_sensor.py b/homeassistant/components/ffmpeg_motion/binary_sensor.py index ff3d91acfa574..7c52ae53d6cb1 100644 --- a/homeassistant/components/ffmpeg_motion/binary_sensor.py +++ b/homeassistant/components/ffmpeg_motion/binary_sensor.py @@ -4,7 +4,7 @@ from haffmpeg.core import HAFFmpeg import haffmpeg.sensor as ffmpeg_sensor -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import ( PLATFORM_SCHEMA as BINARY_SENSOR_PLATFORM_SCHEMA, @@ -34,21 +34,21 @@ PLATFORM_SCHEMA = BINARY_SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_INPUT): cv.string, - vol.Optional(CONF_INITIAL_STATE, default=DEFAULT_INIT_STATE): cv.boolean, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_EXTRA_ARGUMENTS): cv.string, - vol.Optional(CONF_RESET, default=10): vol.All( - vol.Coerce(int), vol.Range(min=1) + probatio.Required(CONF_INPUT): cv.string, + probatio.Optional(CONF_INITIAL_STATE, default=DEFAULT_INIT_STATE): cv.boolean, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_EXTRA_ARGUMENTS): cv.string, + probatio.Optional(CONF_RESET, default=10): probatio.All( + probatio.Coerce(int), probatio.Range(min=1) ), - vol.Optional(CONF_CHANGES, default=10): vol.All( - vol.Coerce(float), vol.Range(min=0, max=99) + probatio.Optional(CONF_CHANGES, default=10): probatio.All( + probatio.Coerce(float), probatio.Range(min=0, max=99) ), - vol.Inclusive(CONF_REPEAT, "repeat"): vol.All( - vol.Coerce(int), vol.Range(min=1) + probatio.Inclusive(CONF_REPEAT, "repeat"): probatio.All( + probatio.Coerce(int), probatio.Range(min=1) ), - vol.Inclusive(CONF_REPEAT_TIME, "repeat"): vol.All( - vol.Coerce(int), vol.Range(min=1) + probatio.Inclusive(CONF_REPEAT_TIME, "repeat"): probatio.All( + probatio.Coerce(int), probatio.Range(min=1) ), } ) diff --git a/homeassistant/components/ffmpeg_noise/binary_sensor.py b/homeassistant/components/ffmpeg_noise/binary_sensor.py index 535a1dab3122e..66afebac0505e 100644 --- a/homeassistant/components/ffmpeg_noise/binary_sensor.py +++ b/homeassistant/components/ffmpeg_noise/binary_sensor.py @@ -3,7 +3,7 @@ from typing import Any, override import haffmpeg.sensor as ffmpeg_sensor -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import ( PLATFORM_SCHEMA as BINARY_SENSOR_PLATFORM_SCHEMA, @@ -35,17 +35,17 @@ PLATFORM_SCHEMA = BINARY_SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_INPUT): cv.string, - vol.Optional(CONF_INITIAL_STATE, default=DEFAULT_INIT_STATE): cv.boolean, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_EXTRA_ARGUMENTS): cv.string, - vol.Optional(CONF_OUTPUT): cv.string, - vol.Optional(CONF_PEAK, default=-30): vol.Coerce(int), - vol.Optional(CONF_DURATION, default=1): vol.All( - vol.Coerce(int), vol.Range(min=1) + probatio.Required(CONF_INPUT): cv.string, + probatio.Optional(CONF_INITIAL_STATE, default=DEFAULT_INIT_STATE): cv.boolean, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_EXTRA_ARGUMENTS): cv.string, + probatio.Optional(CONF_OUTPUT): cv.string, + probatio.Optional(CONF_PEAK, default=-30): probatio.Coerce(int), + probatio.Optional(CONF_DURATION, default=1): probatio.All( + probatio.Coerce(int), probatio.Range(min=1) ), - vol.Optional(CONF_RESET, default=10): vol.All( - vol.Coerce(int), vol.Range(min=1) + probatio.Optional(CONF_RESET, default=10): probatio.All( + probatio.Coerce(int), probatio.Range(min=1) ), } ) diff --git a/homeassistant/components/fibaro/config_flow.py b/homeassistant/components/fibaro/config_flow.py index 9cc54f0c3fd8f..5858d9d664393 100644 --- a/homeassistant/components/fibaro/config_flow.py +++ b/homeassistant/components/fibaro/config_flow.py @@ -4,9 +4,9 @@ import logging from typing import Any, override +import probatio from pyfibaro.fibaro_client import FibaroAuthenticationFailed, FibaroConnectFailed from slugify import slugify -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_NAME, CONF_PASSWORD, CONF_URL, CONF_USERNAME @@ -17,12 +17,12 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_URL): str, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Optional(CONF_IMPORT_PLUGINS, default=False): bool, + probatio.Required(CONF_URL): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Optional(CONF_IMPORT_PLUGINS, default=False): bool, } ) @@ -115,7 +115,7 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema({vol.Required(CONF_PASSWORD): str}), + data_schema=probatio.Schema({probatio.Required(CONF_PASSWORD): str}), errors=errors, description_placeholders={ CONF_USERNAME: reauth_entry.data[CONF_USERNAME], diff --git a/homeassistant/components/fido/sensor.py b/homeassistant/components/fido/sensor.py index 424ddca0910c9..0fec27c8970bb 100644 --- a/homeassistant/components/fido/sensor.py +++ b/homeassistant/components/fido/sensor.py @@ -8,9 +8,9 @@ import logging from typing import Any, override +import probatio from pyfido import FidoClient from pyfido.client import PyFidoError -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -173,12 +173,12 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_MONITORED_VARIABLES): vol.All( - cv.ensure_list, [vol.In(SENSOR_KEYS)] + probatio.Required(CONF_MONITORED_VARIABLES): probatio.All( + cv.ensure_list, [probatio.In(SENSOR_KEYS)] ), - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/file/config_flow.py b/homeassistant/components/file/config_flow.py index f4353a57bb5d9..74e6e7ecbbeb5 100644 --- a/homeassistant/components/file/config_flow.py +++ b/homeassistant/components/file/config_flow.py @@ -3,7 +3,7 @@ from copy import deepcopy from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -37,28 +37,28 @@ TEXT_SELECTOR = TextSelector(TextSelectorConfig(type=TextSelectorType.TEXT)) FILE_OPTIONS_SCHEMAS = { - Platform.SENSOR.value: vol.Schema( + Platform.SENSOR.value: probatio.Schema( { - vol.Optional(CONF_VALUE_TEMPLATE): TEMPLATE_SELECTOR, - vol.Optional(CONF_UNIT_OF_MEASUREMENT): TEXT_SELECTOR, + probatio.Optional(CONF_VALUE_TEMPLATE): TEMPLATE_SELECTOR, + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): TEXT_SELECTOR, } ), - Platform.NOTIFY.value: vol.Schema( + Platform.NOTIFY.value: probatio.Schema( { - vol.Optional(CONF_TIMESTAMP, default=False): BOOLEAN_SELECTOR, + probatio.Optional(CONF_TIMESTAMP, default=False): BOOLEAN_SELECTOR, } ), } FILE_FLOW_SCHEMAS = { - Platform.SENSOR.value: vol.Schema( + Platform.SENSOR.value: probatio.Schema( { - vol.Required(CONF_FILE_PATH): TEXT_SELECTOR, + probatio.Required(CONF_FILE_PATH): TEXT_SELECTOR, } ).extend(FILE_OPTIONS_SCHEMAS[Platform.SENSOR.value].schema), - Platform.NOTIFY.value: vol.Schema( + Platform.NOTIFY.value: probatio.Schema( { - vol.Required(CONF_FILE_PATH): TEXT_SELECTOR, + probatio.Required(CONF_FILE_PATH): TEXT_SELECTOR, } ).extend(FILE_OPTIONS_SCHEMAS[Platform.NOTIFY.value].schema), } diff --git a/homeassistant/components/file/services.py b/homeassistant/components/file/services.py index 9e4033148cf01..6bafefb68f5b7 100644 --- a/homeassistant/components/file/services.py +++ b/homeassistant/components/file/services.py @@ -3,7 +3,7 @@ from collections.abc import Callable import json -import voluptuous as vol +import probatio import yaml from homeassistant.core import HomeAssistant, ServiceCall, SupportsResponse, callback @@ -23,10 +23,10 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, SERVICE_READ_FILE, read_file, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(ATTR_FILE_NAME): cv.string, - vol.Required(ATTR_FILE_ENCODING): cv.string, + probatio.Required(ATTR_FILE_NAME): cv.string, + probatio.Required(ATTR_FILE_ENCODING): cv.string, } ), supports_response=SupportsResponse.ONLY, diff --git a/homeassistant/components/file_upload/__init__.py b/homeassistant/components/file_upload/__init__.py index e884d0362e3ce..2545da9d17186 100644 --- a/homeassistant/components/file_upload/__init__.py +++ b/homeassistant/components/file_upload/__init__.py @@ -10,7 +10,7 @@ import tempfile from aiohttp import BodyPartReader, web -import voluptuous as vol +import probatio from homeassistant.components.http import KEY_HASS, HomeAssistantView from homeassistant.components.http.data_validator import RequestDataValidator @@ -209,7 +209,7 @@ async def _upload_file(self, request: web.Request) -> web.Response: or file_field_reader.name != "file" or (filename := file_field_reader.filename) is None ): - raise vol.Invalid("Expected a file") + raise probatio.Invalid("Expected a file") try: raise_if_invalid_filename(filename) @@ -241,7 +241,7 @@ async def _upload_file(self, request: web.Request) -> web.Response: return self.json({"file_id": file_id}) - @RequestDataValidator({vol.Required("file_id"): str}) + @RequestDataValidator({probatio.Required("file_id"): str}) async def delete(self, request: web.Request, data: dict[str, str]) -> web.Response: """Delete a file.""" hass = request.app[KEY_HASS] diff --git a/homeassistant/components/filesize/config_flow.py b/homeassistant/components/filesize/config_flow.py index 2e6588b90ddca..ae7d8ca4da81f 100644 --- a/homeassistant/components/filesize/config_flow.py +++ b/homeassistant/components/filesize/config_flow.py @@ -4,7 +4,7 @@ import pathlib from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_FILE_PATH @@ -12,7 +12,7 @@ from .const import DOMAIN -DATA_SCHEMA = vol.Schema({vol.Required(CONF_FILE_PATH): str}) +DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_FILE_PATH): str}) _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/filter/config_flow.py b/homeassistant/components/filter/config_flow.py index c179b349d79a5..6f721609c12d6 100644 --- a/homeassistant/components/filter/config_flow.py +++ b/homeassistant/components/filter/config_flow.py @@ -3,7 +3,7 @@ from collections.abc import Mapping from typing import Any, cast, override -import voluptuous as vol +import probatio from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN from homeassistant.const import CONF_ENTITY_ID, CONF_NAME @@ -86,13 +86,13 @@ async def validate_options( return user_input -DATA_SCHEMA_SETUP = vol.Schema( +DATA_SCHEMA_SETUP = probatio.Schema( { - vol.Required(CONF_NAME, default=DEFAULT_NAME): TextSelector(), - vol.Required(CONF_ENTITY_ID): EntitySelector( + probatio.Required(CONF_NAME, default=DEFAULT_NAME): TextSelector(), + probatio.Required(CONF_ENTITY_ID): EntitySelector( EntitySelectorConfig(domain=[SENSOR_DOMAIN]) ), - vol.Required(CONF_FILTER_NAME): SelectSelector( + probatio.Required(CONF_FILTER_NAME): SelectSelector( SelectSelectorConfig( options=FILTERS, mode=SelectSelectorMode.DROPDOWN, @@ -103,8 +103,10 @@ async def validate_options( ) BASE_OPTIONS_SCHEMA = { - vol.Optional(CONF_ENTITY_ID): EntitySelector(EntitySelectorConfig(read_only=True)), - vol.Optional(CONF_FILTER_NAME): SelectSelector( + probatio.Optional(CONF_ENTITY_ID): EntitySelector( + EntitySelectorConfig(read_only=True) + ), + probatio.Optional(CONF_FILTER_NAME): SelectSelector( SelectSelectorConfig( options=FILTERS, mode=SelectSelectorMode.DROPDOWN, @@ -112,32 +114,34 @@ async def validate_options( read_only=True, ) ), - vol.Optional(CONF_FILTER_PRECISION, default=DEFAULT_PRECISION): NumberSelector( + probatio.Optional(CONF_FILTER_PRECISION, default=DEFAULT_PRECISION): NumberSelector( NumberSelectorConfig(min=0, step=1, mode=NumberSelectorMode.BOX) ), } -OUTLIER_SCHEMA = vol.Schema( +OUTLIER_SCHEMA = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_FILTER_WINDOW_SIZE, default=DEFAULT_WINDOW_SIZE ): NumberSelector( NumberSelectorConfig(min=0, step=1, mode=NumberSelectorMode.BOX) ), - vol.Optional(CONF_FILTER_RADIUS, default=DEFAULT_FILTER_RADIUS): NumberSelector( + probatio.Optional( + CONF_FILTER_RADIUS, default=DEFAULT_FILTER_RADIUS + ): NumberSelector( NumberSelectorConfig(min=0, step="any", mode=NumberSelectorMode.BOX) ), } ).extend(BASE_OPTIONS_SCHEMA) -LOWPASS_SCHEMA = vol.Schema( +LOWPASS_SCHEMA = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_FILTER_WINDOW_SIZE, default=DEFAULT_WINDOW_SIZE ): NumberSelector( NumberSelectorConfig(min=0, step=1, mode=NumberSelectorMode.BOX) ), - vol.Optional( + probatio.Optional( CONF_FILTER_TIME_CONSTANT, default=DEFAULT_FILTER_TIME_CONSTANT ): NumberSelector( NumberSelectorConfig(min=0, step=1, mode=NumberSelectorMode.BOX) @@ -145,35 +149,35 @@ async def validate_options( } ).extend(BASE_OPTIONS_SCHEMA) -RANGE_SCHEMA = vol.Schema( +RANGE_SCHEMA = probatio.Schema( { - vol.Optional(CONF_FILTER_LOWER_BOUND): NumberSelector( + probatio.Optional(CONF_FILTER_LOWER_BOUND): NumberSelector( NumberSelectorConfig(min=0, step="any", mode=NumberSelectorMode.BOX) ), - vol.Optional(CONF_FILTER_UPPER_BOUND): NumberSelector( + probatio.Optional(CONF_FILTER_UPPER_BOUND): NumberSelector( NumberSelectorConfig(min=0, step="any", mode=NumberSelectorMode.BOX) ), } ).extend(BASE_OPTIONS_SCHEMA) -TIME_SMA_SCHEMA = vol.Schema( +TIME_SMA_SCHEMA = probatio.Schema( { - vol.Optional(CONF_TIME_SMA_TYPE, default=TIME_SMA_LAST): SelectSelector( + probatio.Optional(CONF_TIME_SMA_TYPE, default=TIME_SMA_LAST): SelectSelector( SelectSelectorConfig( options=[TIME_SMA_LAST], mode=SelectSelectorMode.DROPDOWN, translation_key=CONF_TIME_SMA_TYPE, ) ), - vol.Required(CONF_FILTER_WINDOW_SIZE): DurationSelector( + probatio.Required(CONF_FILTER_WINDOW_SIZE): DurationSelector( DurationSelectorConfig(enable_day=False, allow_negative=False) ), } ).extend(BASE_OPTIONS_SCHEMA) -THROTTLE_SCHEMA = vol.Schema( +THROTTLE_SCHEMA = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_FILTER_WINDOW_SIZE, default=DEFAULT_WINDOW_SIZE ): NumberSelector( NumberSelectorConfig(min=0, step=1, mode=NumberSelectorMode.BOX) @@ -181,9 +185,9 @@ async def validate_options( } ).extend(BASE_OPTIONS_SCHEMA) -TIME_THROTTLE_SCHEMA = vol.Schema( +TIME_THROTTLE_SCHEMA = probatio.Schema( { - vol.Required(CONF_FILTER_WINDOW_SIZE): DurationSelector( + probatio.Required(CONF_FILTER_WINDOW_SIZE): DurationSelector( DurationSelectorConfig(enable_day=False, allow_negative=False) ), } diff --git a/homeassistant/components/filter/sensor.py b/homeassistant/components/filter/sensor.py index f968847249836..6b381b73ac20a 100644 --- a/homeassistant/components/filter/sensor.py +++ b/homeassistant/components/filter/sensor.py @@ -10,7 +10,7 @@ import statistics from typing import Any, cast, override -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import DOMAIN as BINARY_SENSOR_DOMAIN from homeassistant.components.input_number import DOMAIN as INPUT_NUMBER_DOMAIN @@ -84,47 +84,49 @@ ICON = "mdi:chart-line-variant" -FILTER_SCHEMA = vol.Schema({vol.Optional(CONF_FILTER_PRECISION): vol.Coerce(int)}) +FILTER_SCHEMA = probatio.Schema( + {probatio.Optional(CONF_FILTER_PRECISION): probatio.Coerce(int)} +) FILTER_OUTLIER_SCHEMA = FILTER_SCHEMA.extend( { - vol.Required(CONF_FILTER_NAME): FILTER_NAME_OUTLIER, - vol.Optional(CONF_FILTER_WINDOW_SIZE, default=DEFAULT_WINDOW_SIZE): vol.Coerce( - int - ), - vol.Optional(CONF_FILTER_RADIUS, default=DEFAULT_FILTER_RADIUS): vol.Coerce( - float - ), + probatio.Required(CONF_FILTER_NAME): FILTER_NAME_OUTLIER, + probatio.Optional( + CONF_FILTER_WINDOW_SIZE, default=DEFAULT_WINDOW_SIZE + ): probatio.Coerce(int), + probatio.Optional( + CONF_FILTER_RADIUS, default=DEFAULT_FILTER_RADIUS + ): probatio.Coerce(float), } ) FILTER_LOWPASS_SCHEMA = FILTER_SCHEMA.extend( { - vol.Required(CONF_FILTER_NAME): FILTER_NAME_LOWPASS, - vol.Optional(CONF_FILTER_WINDOW_SIZE, default=DEFAULT_WINDOW_SIZE): vol.Coerce( - int - ), - vol.Optional( + probatio.Required(CONF_FILTER_NAME): FILTER_NAME_LOWPASS, + probatio.Optional( + CONF_FILTER_WINDOW_SIZE, default=DEFAULT_WINDOW_SIZE + ): probatio.Coerce(int), + probatio.Optional( CONF_FILTER_TIME_CONSTANT, default=DEFAULT_FILTER_TIME_CONSTANT - ): vol.Coerce(int), + ): probatio.Coerce(int), } ) FILTER_RANGE_SCHEMA = FILTER_SCHEMA.extend( { - vol.Required(CONF_FILTER_NAME): FILTER_NAME_RANGE, - vol.Optional(CONF_FILTER_LOWER_BOUND): vol.Coerce(float), - vol.Optional(CONF_FILTER_UPPER_BOUND): vol.Coerce(float), + probatio.Required(CONF_FILTER_NAME): FILTER_NAME_RANGE, + probatio.Optional(CONF_FILTER_LOWER_BOUND): probatio.Coerce(float), + probatio.Optional(CONF_FILTER_UPPER_BOUND): probatio.Coerce(float), } ) FILTER_TIME_SMA_SCHEMA = FILTER_SCHEMA.extend( { - vol.Required(CONF_FILTER_NAME): FILTER_NAME_TIME_SMA, - vol.Optional(CONF_TIME_SMA_TYPE, default=TIME_SMA_LAST): vol.In( + probatio.Required(CONF_FILTER_NAME): FILTER_NAME_TIME_SMA, + probatio.Optional(CONF_TIME_SMA_TYPE, default=TIME_SMA_LAST): probatio.In( [TIME_SMA_LAST] ), - vol.Required(CONF_FILTER_WINDOW_SIZE): vol.All( + probatio.Required(CONF_FILTER_WINDOW_SIZE): probatio.All( cv.time_period, cv.positive_timedelta ), } @@ -132,17 +134,17 @@ FILTER_THROTTLE_SCHEMA = FILTER_SCHEMA.extend( { - vol.Required(CONF_FILTER_NAME): FILTER_NAME_THROTTLE, - vol.Optional(CONF_FILTER_WINDOW_SIZE, default=DEFAULT_WINDOW_SIZE): vol.Coerce( - int - ), + probatio.Required(CONF_FILTER_NAME): FILTER_NAME_THROTTLE, + probatio.Optional( + CONF_FILTER_WINDOW_SIZE, default=DEFAULT_WINDOW_SIZE + ): probatio.Coerce(int), } ) FILTER_TIME_THROTTLE_SCHEMA = FILTER_SCHEMA.extend( { - vol.Required(CONF_FILTER_NAME): FILTER_NAME_TIME_THROTTLE, - vol.Required(CONF_FILTER_WINDOW_SIZE): vol.All( + probatio.Required(CONF_FILTER_NAME): FILTER_NAME_TIME_THROTTLE, + probatio.Required(CONF_FILTER_WINDOW_SIZE): probatio.All( cv.time_period, cv.positive_timedelta ), } @@ -150,17 +152,17 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): vol.Any( + probatio.Required(CONF_ENTITY_ID): probatio.Any( cv.entity_domain(SENSOR_DOMAIN), cv.entity_domain(BINARY_SENSOR_DOMAIN), cv.entity_domain(INPUT_NUMBER_DOMAIN), ), - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_UNIQUE_ID): cv.string, - vol.Required(CONF_FILTERS): vol.All( + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Required(CONF_FILTERS): probatio.All( cv.ensure_list, [ - vol.Any( + probatio.Any( FILTER_OUTLIER_SCHEMA, FILTER_LOWPASS_SCHEMA, FILTER_TIME_SMA_SCHEMA, diff --git a/homeassistant/components/fing/config_flow.py b/homeassistant/components/fing/config_flow.py index ca2a0dc6a98d1..04bc61856d8f8 100644 --- a/homeassistant/components/fing/config_flow.py +++ b/homeassistant/components/fing/config_flow.py @@ -6,7 +6,7 @@ from fing_agent_api import FingAgent import httpx -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY, CONF_IP_ADDRESS, CONF_PORT @@ -106,11 +106,11 @@ async def async_step_user( return self.async_show_form( step_id="user", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_IP_ADDRESS): str, - vol.Required(CONF_PORT, default="49090"): str, - vol.Required(CONF_API_KEY): str, + probatio.Required(CONF_IP_ADDRESS): str, + probatio.Required(CONF_PORT, default="49090"): str, + probatio.Required(CONF_API_KEY): str, } ), user_input, diff --git a/homeassistant/components/fints/sensor.py b/homeassistant/components/fints/sensor.py index 161405a549175..c1afe9e3b7f4c 100644 --- a/homeassistant/components/fints/sensor.py +++ b/homeassistant/components/fints/sensor.py @@ -7,8 +7,8 @@ from fints.client import FinTS3PinTanClient from fints.models import SEPAAccount +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -37,22 +37,22 @@ ATTR_BANK = "bank" ATTR_ACCOUNT_TYPE = "account_type" -SCHEMA_ACCOUNTS = vol.Schema( +SCHEMA_ACCOUNTS = probatio.Schema( { - vol.Required(CONF_ACCOUNT): cv.string, - vol.Optional(CONF_NAME, default=None): vol.Any(None, cv.string), + probatio.Required(CONF_ACCOUNT): cv.string, + probatio.Optional(CONF_NAME, default=None): probatio.Any(None, cv.string), } ) PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_BIN): cv.string, - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PIN): cv.string, - vol.Required(CONF_URL): cv.string, - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_ACCOUNTS, default=[]): cv.ensure_list(SCHEMA_ACCOUNTS), - vol.Optional(CONF_HOLDINGS, default=[]): cv.ensure_list(SCHEMA_ACCOUNTS), + probatio.Required(CONF_BIN): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PIN): cv.string, + probatio.Required(CONF_URL): cv.string, + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_ACCOUNTS, default=[]): cv.ensure_list(SCHEMA_ACCOUNTS), + probatio.Optional(CONF_HOLDINGS, default=[]): cv.ensure_list(SCHEMA_ACCOUNTS), } ) diff --git a/homeassistant/components/firefly_iii/config_flow.py b/homeassistant/components/firefly_iii/config_flow.py index f3684930bef0a..d3cd0026c563f 100644 --- a/homeassistant/components/firefly_iii/config_flow.py +++ b/homeassistant/components/firefly_iii/config_flow.py @@ -4,13 +4,13 @@ import logging from typing import Any, override +import probatio from pyfirefly import ( Firefly, FireflyAuthenticationError, FireflyConnectionError, FireflyTimeoutError, ) -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY, CONF_URL, CONF_VERIFY_SSL @@ -21,11 +21,11 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_URL): str, - vol.Optional(CONF_VERIFY_SSL, default=True): bool, - vol.Required(CONF_API_KEY): str, + probatio.Required(CONF_URL): str, + probatio.Optional(CONF_VERIFY_SSL, default=True): bool, + probatio.Required(CONF_API_KEY): str, } ) @@ -123,7 +123,7 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema({vol.Required(CONF_API_KEY): str}), + data_schema=probatio.Schema({probatio.Required(CONF_API_KEY): str}), errors=errors, ) diff --git a/homeassistant/components/fireservicerota/config_flow.py b/homeassistant/components/fireservicerota/config_flow.py index 320b0ea35a0f5..d64ca3f0e8c14 100644 --- a/homeassistant/components/fireservicerota/config_flow.py +++ b/homeassistant/components/fireservicerota/config_flow.py @@ -3,19 +3,21 @@ from collections.abc import Mapping from typing import Any, override +import probatio from pyfireservicerota import FireServiceRota, InvalidAuthError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_TOKEN, CONF_URL, CONF_USERNAME from .const import DOMAIN, URL_LIST -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_URL, default="www.brandweerrooster.nl"): vol.In(URL_LIST), - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_URL, default="www.brandweerrooster.nl"): probatio.In( + URL_LIST + ), + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) @@ -101,18 +103,18 @@ def _show_setup_form(self, user_input=None, errors=None, step_id="user"): if step_id == "user": schema = { - vol.Required(CONF_URL, default="www.brandweerrooster.nl"): vol.In( - URL_LIST - ), - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required( + CONF_URL, default="www.brandweerrooster.nl" + ): probatio.In(URL_LIST), + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } else: - schema = {vol.Required(CONF_PASSWORD): str} + schema = {probatio.Required(CONF_PASSWORD): str} return self.async_show_form( step_id=step_id, - data_schema=vol.Schema(schema), + data_schema=probatio.Schema(schema), errors=errors or {}, description_placeholders=self._description_placeholders, ) diff --git a/homeassistant/components/firmata/__init__.py b/homeassistant/components/firmata/__init__.py index 45cae2769674c..e19c78723d8d1 100644 --- a/homeassistant/components/firmata/__init__.py +++ b/homeassistant/components/firmata/__init__.py @@ -3,7 +3,7 @@ from copy import copy import logging -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry from homeassistant.const import ( @@ -47,79 +47,80 @@ DATA_CONFIGS = "board_configs" -ANALOG_PIN_SCHEMA = vol.All(cv.string, vol.Match(r"^A[0-9]+$")) +ANALOG_PIN_SCHEMA = probatio.All(cv.string, probatio.Match(r"^A[0-9]+$")) -SWITCH_SCHEMA = vol.Schema( +SWITCH_SCHEMA = probatio.Schema( { - vol.Required(CONF_NAME): cv.string, + probatio.Required(CONF_NAME): cv.string, # Both digital and analog pins may be used as digital output - vol.Required(CONF_PIN): vol.Any(cv.positive_int, ANALOG_PIN_SCHEMA), - vol.Required(CONF_PIN_MODE): PIN_MODE_OUTPUT, - vol.Optional(CONF_INITIAL_STATE, default=False): cv.boolean, - vol.Optional(CONF_NEGATE_STATE, default=False): cv.boolean, + probatio.Required(CONF_PIN): probatio.Any(cv.positive_int, ANALOG_PIN_SCHEMA), + probatio.Required(CONF_PIN_MODE): PIN_MODE_OUTPUT, + probatio.Optional(CONF_INITIAL_STATE, default=False): cv.boolean, + probatio.Optional(CONF_NEGATE_STATE, default=False): cv.boolean, }, required=True, ) -LIGHT_SCHEMA = vol.Schema( +LIGHT_SCHEMA = probatio.Schema( { - vol.Required(CONF_NAME): cv.string, + probatio.Required(CONF_NAME): cv.string, # Both digital and analog pins may be used as PWM/analog output - vol.Required(CONF_PIN): vol.Any(cv.positive_int, ANALOG_PIN_SCHEMA), - vol.Required(CONF_PIN_MODE): PIN_MODE_PWM, - vol.Optional(CONF_INITIAL_STATE, default=0): cv.positive_int, - vol.Optional(CONF_MINIMUM, default=0): cv.positive_int, - vol.Optional(CONF_MAXIMUM, default=255): cv.positive_int, + probatio.Required(CONF_PIN): probatio.Any(cv.positive_int, ANALOG_PIN_SCHEMA), + probatio.Required(CONF_PIN_MODE): PIN_MODE_PWM, + probatio.Optional(CONF_INITIAL_STATE, default=0): cv.positive_int, + probatio.Optional(CONF_MINIMUM, default=0): cv.positive_int, + probatio.Optional(CONF_MAXIMUM, default=255): cv.positive_int, }, required=True, ) -BINARY_SENSOR_SCHEMA = vol.Schema( +BINARY_SENSOR_SCHEMA = probatio.Schema( { - vol.Required(CONF_NAME): cv.string, + probatio.Required(CONF_NAME): cv.string, # Both digital and analog pins may be used as digital input - vol.Required(CONF_PIN): vol.Any(cv.positive_int, ANALOG_PIN_SCHEMA), - vol.Required(CONF_PIN_MODE): vol.Any(PIN_MODE_INPUT, PIN_MODE_PULLUP), - vol.Optional(CONF_NEGATE_STATE, default=False): cv.boolean, + probatio.Required(CONF_PIN): probatio.Any(cv.positive_int, ANALOG_PIN_SCHEMA), + probatio.Required(CONF_PIN_MODE): probatio.Any(PIN_MODE_INPUT, PIN_MODE_PULLUP), + probatio.Optional(CONF_NEGATE_STATE, default=False): cv.boolean, }, required=True, ) -SENSOR_SCHEMA = vol.Schema( +SENSOR_SCHEMA = probatio.Schema( { - vol.Required(CONF_NAME): cv.string, + probatio.Required(CONF_NAME): cv.string, # Currently only analog input sensor is implemented - vol.Required(CONF_PIN): ANALOG_PIN_SCHEMA, - vol.Required(CONF_PIN_MODE): PIN_MODE_ANALOG, + probatio.Required(CONF_PIN): ANALOG_PIN_SCHEMA, + probatio.Required(CONF_PIN_MODE): PIN_MODE_ANALOG, # Default differential is 40 to avoid a flood of messages on initial setup # in case pin is unplugged. Firmata responds really really fast - vol.Optional(CONF_DIFFERENTIAL, default=40): vol.All( - cv.positive_int, vol.Range(min=1) + probatio.Optional(CONF_DIFFERENTIAL, default=40): probatio.All( + cv.positive_int, probatio.Range(min=1) ), }, required=True, ) -BOARD_CONFIG_SCHEMA = vol.Schema( +BOARD_CONFIG_SCHEMA = probatio.Schema( { - vol.Required(CONF_SERIAL_PORT): cv.string, - vol.Optional(CONF_SERIAL_BAUD_RATE): cv.positive_int, - vol.Optional(CONF_ARDUINO_INSTANCE_ID): cv.positive_int, - vol.Optional(CONF_ARDUINO_WAIT): cv.positive_int, - vol.Optional(CONF_SLEEP_TUNE): vol.All( - vol.Coerce(float), vol.Range(min=0.0001) + probatio.Required(CONF_SERIAL_PORT): cv.string, + probatio.Optional(CONF_SERIAL_BAUD_RATE): cv.positive_int, + probatio.Optional(CONF_ARDUINO_INSTANCE_ID): cv.positive_int, + probatio.Optional(CONF_ARDUINO_WAIT): cv.positive_int, + probatio.Optional(CONF_SLEEP_TUNE): probatio.All( + probatio.Coerce(float), probatio.Range(min=0.0001) ), - vol.Optional(CONF_SAMPLING_INTERVAL): cv.positive_int, - vol.Optional(CONF_SWITCHES): [SWITCH_SCHEMA], - vol.Optional(CONF_LIGHTS): [LIGHT_SCHEMA], - vol.Optional(CONF_BINARY_SENSORS): [BINARY_SENSOR_SCHEMA], - vol.Optional(CONF_SENSORS): [SENSOR_SCHEMA], + probatio.Optional(CONF_SAMPLING_INTERVAL): cv.positive_int, + probatio.Optional(CONF_SWITCHES): [SWITCH_SCHEMA], + probatio.Optional(CONF_LIGHTS): [LIGHT_SCHEMA], + probatio.Optional(CONF_BINARY_SENSORS): [BINARY_SENSOR_SCHEMA], + probatio.Optional(CONF_SENSORS): [SENSOR_SCHEMA], }, required=True, ) -CONFIG_SCHEMA = vol.Schema( - {DOMAIN: vol.All(cv.ensure_list, [BOARD_CONFIG_SCHEMA])}, extra=vol.ALLOW_EXTRA +CONFIG_SCHEMA = probatio.Schema( + {DOMAIN: probatio.All(cv.ensure_list, [BOARD_CONFIG_SCHEMA])}, + extra=probatio.ALLOW_EXTRA, ) type FirmataConfigEntry = ConfigEntry[FirmataBoard] diff --git a/homeassistant/components/fish_audio/config_flow.py b/homeassistant/components/fish_audio/config_flow.py index cd49c1f50ca5a..b9e1a50e123bc 100644 --- a/homeassistant/components/fish_audio/config_flow.py +++ b/homeassistant/components/fish_audio/config_flow.py @@ -5,7 +5,7 @@ from fishaudio import AsyncFishAudio from fishaudio.exceptions import AuthenticationError, FishAudioError -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_USER, @@ -61,26 +61,26 @@ _LOGGER = logging.getLogger(__name__) -def get_api_key_schema(default: str | None = None) -> vol.Schema: +def get_api_key_schema(default: str | None = None) -> probatio.Schema: """Return the schema for API key input.""" - return vol.Schema( - {vol.Required(CONF_API_KEY, default=default or vol.UNDEFINED): str} + return probatio.Schema( + {probatio.Required(CONF_API_KEY, default=default or probatio.UNDEFINED): str} ) -def get_filter_schema(options: dict[str, Any]) -> vol.Schema: +def get_filter_schema(options: dict[str, Any]) -> probatio.Schema: """Return the schema for the filter step.""" - return vol.Schema( + return probatio.Schema( { - vol.Optional(CONF_TITLE, default=options.get(CONF_TITLE, "")): str, - vol.Optional( + probatio.Optional(CONF_TITLE, default=options.get(CONF_TITLE, "")): str, + probatio.Optional( CONF_LANGUAGE, default=options.get(CONF_LANGUAGE, "Any") ): LanguageSelector( LanguageSelectorConfig( languages=TTS_SUPPORTED_LANGUAGES, ) ), - vol.Optional( + probatio.Optional( CONF_SORT_BY, default=options.get(CONF_SORT_BY, "task_count") ): SelectSelector( SelectSelectorConfig( @@ -89,7 +89,7 @@ def get_filter_schema(options: dict[str, Any]) -> vol.Schema: translation_key="sort_by", ) ), - vol.Optional( + probatio.Optional( CONF_SELF_ONLY, default=options.get(CONF_SELF_ONLY, False) ): bool, } @@ -99,11 +99,11 @@ def get_filter_schema(options: dict[str, Any]) -> vol.Schema: def get_model_selection_schema( options: dict[str, Any], model_options: list[SelectOptionDict], -) -> vol.Schema: +) -> probatio.Schema: """Return the schema for the model selection step.""" - return vol.Schema( + return probatio.Schema( { - vol.Required( + probatio.Required( CONF_VOICE_ID, default=options.get(CONF_VOICE_ID, ""), ): SelectSelector( @@ -113,7 +113,7 @@ def get_model_selection_schema( custom_value=True, ) ), - vol.Required( + probatio.Required( CONF_BACKEND, default=options.get(CONF_BACKEND, "s2-pro"), ): SelectSelector( @@ -124,7 +124,7 @@ def get_model_selection_schema( mode=SelectSelectorMode.DROPDOWN, ) ), - vol.Required( + probatio.Required( CONF_LATENCY, default=options.get(CONF_LATENCY, "balanced"), ): SelectSelector( @@ -136,7 +136,7 @@ def get_model_selection_schema( mode=SelectSelectorMode.DROPDOWN, ) ), - vol.Optional( + probatio.Optional( CONF_SPEED, default=options.get(CONF_SPEED, DEFAULT_SPEED), ): NumberSelector( @@ -149,9 +149,9 @@ def get_model_selection_schema( ), # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Required( + probatio.Required( CONF_NAME, - default=options.get(CONF_NAME) or vol.UNDEFINED, + default=options.get(CONF_NAME) or probatio.UNDEFINED, ): str, } ) diff --git a/homeassistant/components/fivem/config_flow.py b/homeassistant/components/fivem/config_flow.py index 6883565aabe7a..3537529af7065 100644 --- a/homeassistant/components/fivem/config_flow.py +++ b/homeassistant/components/fivem/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from fivem import FiveM, FiveMServerOfflineError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PORT @@ -16,10 +16,10 @@ DEFAULT_PORT = 30120 -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, } ) diff --git a/homeassistant/components/fixer/sensor.py b/homeassistant/components/fixer/sensor.py index aa05610fb7988..b5537ea4b0fc3 100644 --- a/homeassistant/components/fixer/sensor.py +++ b/homeassistant/components/fixer/sensor.py @@ -6,7 +6,7 @@ from fixerio import Fixerio from fixerio.exceptions import FixerioException -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -31,9 +31,9 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_API_KEY): cv.string, - vol.Required(CONF_TARGET): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_TARGET): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/fleetgo/device_tracker.py b/homeassistant/components/fleetgo/device_tracker.py index 340581564e0ed..cb38d269e2f0d 100644 --- a/homeassistant/components/fleetgo/device_tracker.py +++ b/homeassistant/components/fleetgo/device_tracker.py @@ -2,9 +2,9 @@ import logging +import probatio import requests from ritassist import API -import voluptuous as vol from homeassistant.components.device_tracker import ( PLATFORM_SCHEMA as DEVICE_TRACKER_PLATFORM_SCHEMA, @@ -26,11 +26,13 @@ PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Required(CONF_CLIENT_ID): cv.string, - vol.Required(CONF_CLIENT_SECRET): cv.string, - vol.Optional(CONF_INCLUDE, default=[]): vol.All(cv.ensure_list, [cv.string]), + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_CLIENT_ID): cv.string, + probatio.Required(CONF_CLIENT_SECRET): cv.string, + probatio.Optional(CONF_INCLUDE, default=[]): probatio.All( + cv.ensure_list, [cv.string] + ), } ) diff --git a/homeassistant/components/flexit/climate.py b/homeassistant/components/flexit/climate.py index 532e4351c2f4b..39a8f95935779 100644 --- a/homeassistant/components/flexit/climate.py +++ b/homeassistant/components/flexit/climate.py @@ -5,7 +5,7 @@ from flexit_modbus import MAX_TEMPERATURE, MIN_TEMPERATURE, FanMode, SystemActivity from modbus_connection import ModbusError -import voluptuous as vol +import probatio from homeassistant.components.climate import ( PLATFORM_SCHEMA as CLIMATE_PLATFORM_SCHEMA, @@ -48,9 +48,9 @@ CONF_HUB = "hub" PLATFORM_SCHEMA = CLIMATE_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_HUB, default=DEFAULT_HUB): cv.string, - vol.Required(CONF_SLAVE): vol.All(int, vol.Range(min=0, max=32)), - vol.Optional(CONF_NAME, default=DEVICE_DEFAULT_NAME): cv.string, + probatio.Optional(CONF_HUB, default=DEFAULT_HUB): cv.string, + probatio.Required(CONF_SLAVE): probatio.All(int, probatio.Range(min=0, max=32)), + probatio.Optional(CONF_NAME, default=DEVICE_DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/flexit/config_flow.py b/homeassistant/components/flexit/config_flow.py index 493cd02525169..84ca43b123e7a 100644 --- a/homeassistant/components/flexit/config_flow.py +++ b/homeassistant/components/flexit/config_flow.py @@ -5,7 +5,7 @@ from flexit_modbus import Flexit from modbus_connection import ModbusError -import voluptuous as vol +import probatio from homeassistant.components.modbus import async_get_temporary_unit from homeassistant.config_entries import ConfigEntryState, ConfigFlow, ConfigFlowResult @@ -33,32 +33,32 @@ _LOGGER = logging.getLogger(__name__) -UNIT_SELECTOR = vol.All( +UNIT_SELECTOR = probatio.All( NumberSelector(NumberSelectorConfig(min=1, max=31, mode=NumberSelectorMode.BOX)), - vol.Coerce(int), + probatio.Coerce(int), ) -STEP_TCP_DATA_SCHEMA = vol.Schema( +STEP_TCP_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): TextSelector(), - vol.Required(CONF_PORT, default=DEFAULT_PORT): vol.All( + probatio.Required(CONF_HOST): TextSelector(), + probatio.Required(CONF_PORT, default=DEFAULT_PORT): probatio.All( NumberSelector( NumberSelectorConfig(min=1, max=65535, mode=NumberSelectorMode.BOX) ), - vol.Coerce(int), + probatio.Coerce(int), ), - vol.Required(CONF_UNIT): UNIT_SELECTOR, + probatio.Required(CONF_UNIT): UNIT_SELECTOR, } ) -STEP_SERIAL_DATA_SCHEMA = vol.Schema( +STEP_SERIAL_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_DEVICE): SerialPortSelector(), - vol.Required(CONF_BAUDRATE, default=DEFAULT_BAUDRATE): vol.All( + probatio.Required(CONF_DEVICE): SerialPortSelector(), + probatio.Required(CONF_BAUDRATE, default=DEFAULT_BAUDRATE): probatio.All( NumberSelector(NumberSelectorConfig(min=1, mode=NumberSelectorMode.BOX)), - vol.Coerce(int), + probatio.Coerce(int), ), - vol.Required(CONF_UNIT): UNIT_SELECTOR, + probatio.Required(CONF_UNIT): UNIT_SELECTOR, } ) @@ -110,7 +110,7 @@ async def async_step_serial( async def _async_step_connection( self, connection_type: str, - schema: vol.Schema, + schema: probatio.Schema, user_input: dict[str, Any] | None, ) -> ConfigFlowResult: """Handle a connection-type-specific step.""" diff --git a/homeassistant/components/flexit_bacnet/config_flow.py b/homeassistant/components/flexit_bacnet/config_flow.py index c2ceec6da2c26..f53b1e57322fd 100644 --- a/homeassistant/components/flexit_bacnet/config_flow.py +++ b/homeassistant/components/flexit_bacnet/config_flow.py @@ -6,7 +6,7 @@ from flexit_bacnet import FlexitBACnet from flexit_bacnet.bacnet import DecodingError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_DEVICE_ID, CONF_IP_ADDRESS @@ -17,10 +17,10 @@ DEFAULT_DEVICE_ID = 2 -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_IP_ADDRESS): str, - vol.Required(CONF_DEVICE_ID, default=DEFAULT_DEVICE_ID): int, + probatio.Required(CONF_IP_ADDRESS): str, + probatio.Required(CONF_DEVICE_ID, default=DEFAULT_DEVICE_ID): int, } ) diff --git a/homeassistant/components/flic/binary_sensor.py b/homeassistant/components/flic/binary_sensor.py index 5ade4ac41a0eb..fb8aa7cd3689f 100644 --- a/homeassistant/components/flic/binary_sensor.py +++ b/homeassistant/components/flic/binary_sensor.py @@ -3,8 +3,8 @@ import logging import threading +import probatio import pyflic -import voluptuous as vol from homeassistant.components.binary_sensor import ( PLATFORM_SCHEMA as BINARY_SENSOR_PLATFORM_SCHEMA, @@ -45,12 +45,12 @@ PLATFORM_SCHEMA = BINARY_SENSOR_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_DISCOVERY, default=True): cv.boolean, - vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, - vol.Optional(CONF_IGNORED_CLICK_TYPES): vol.All( - cv.ensure_list, [vol.In(CLICK_TYPES)] + probatio.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_DISCOVERY, default=True): cv.boolean, + probatio.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, + probatio.Optional(CONF_IGNORED_CLICK_TYPES): probatio.All( + cv.ensure_list, [probatio.In(CLICK_TYPES)] ), } ) diff --git a/homeassistant/components/flipr/config_flow.py b/homeassistant/components/flipr/config_flow.py index 04729ac80673a..e62a611eab981 100644 --- a/homeassistant/components/flipr/config_flow.py +++ b/homeassistant/components/flipr/config_flow.py @@ -4,8 +4,8 @@ from typing import Any, override from flipr_api import FliprAPIRestClient +import probatio from requests.exceptions import HTTPError, Timeout -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_EMAIL, CONF_PASSWORD @@ -14,10 +14,10 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_EMAIL): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_EMAIL): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/flo/config_flow.py b/homeassistant/components/flo/config_flow.py index 3b6f7b4aa9167..e9c93b9b005b4 100644 --- a/homeassistant/components/flo/config_flow.py +++ b/homeassistant/components/flo/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from aioflo.errors import RequestError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -13,8 +13,8 @@ from . import async_get_flo_api from .const import CONF_USE_SSO, DOMAIN, LOGGER -DATA_SCHEMA = vol.Schema( - {vol.Required(CONF_USERNAME): str, vol.Required(CONF_PASSWORD): str} +DATA_SCHEMA = probatio.Schema( + {probatio.Required(CONF_USERNAME): str, probatio.Required(CONF_PASSWORD): str} ) diff --git a/homeassistant/components/flo/switch.py b/homeassistant/components/flo/switch.py index ffe6d512882f1..dcba434db62e9 100644 --- a/homeassistant/components/flo/switch.py +++ b/homeassistant/components/flo/switch.py @@ -3,7 +3,7 @@ from typing import Any, override from aioflo.location import SLEEP_MINUTE_OPTIONS, SYSTEM_MODE_HOME, SYSTEM_REVERT_MODES -import voluptuous as vol +import probatio from homeassistant.components.switch import SwitchEntity from homeassistant.core import HomeAssistant, callback @@ -47,13 +47,13 @@ async def async_setup_entry( platform.async_register_entity_service( SERVICE_SET_SLEEP_MODE, { - vol.Required(ATTR_SLEEP_MINUTES, default=120): vol.All( - vol.Coerce(int), - vol.In(SLEEP_MINUTE_OPTIONS), - ), - vol.Required(ATTR_REVERT_TO_MODE, default=SYSTEM_MODE_HOME): vol.In( - SYSTEM_REVERT_MODES + probatio.Required(ATTR_SLEEP_MINUTES, default=120): probatio.All( + probatio.Coerce(int), + probatio.In(SLEEP_MINUTE_OPTIONS), ), + probatio.Required( + ATTR_REVERT_TO_MODE, default=SYSTEM_MODE_HOME + ): probatio.In(SYSTEM_REVERT_MODES), }, "async_set_mode_sleep", ) diff --git a/homeassistant/components/flock/notify.py b/homeassistant/components/flock/notify.py index dfa2095105c8a..5a7240ec3c3aa 100644 --- a/homeassistant/components/flock/notify.py +++ b/homeassistant/components/flock/notify.py @@ -5,7 +5,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.notify import ( PLATFORM_SCHEMA as NOTIFY_PLATFORM_SCHEMA, @@ -21,7 +21,7 @@ _RESOURCE = "https://api.flock.com/hooks/sendMessage/" PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_ACCESS_TOKEN): cv.string} + {probatio.Required(CONF_ACCESS_TOKEN): cv.string} ) diff --git a/homeassistant/components/flow_it/config_flow.py b/homeassistant/components/flow_it/config_flow.py index 43a7f49264cc4..c46f140f9d8fd 100644 --- a/homeassistant/components/flow_it/config_flow.py +++ b/homeassistant/components/flow_it/config_flow.py @@ -5,7 +5,7 @@ from flow_it_api.client import FlowItVMCMachine from flow_it_api.exceptions import FlowItAuthError, FlowItConnectionError -import voluptuous as vol +import probatio from yarl import URL from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -78,15 +78,17 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_USERNAME, default=DEFAULT_USERNAME): TextSelector( + probatio.Required(CONF_HOST): str, + probatio.Required( + CONF_USERNAME, default=DEFAULT_USERNAME + ): TextSelector( TextSelectorConfig( type=TextSelectorType.TEXT, autocomplete="username" ) ), - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", @@ -130,14 +132,16 @@ async def async_step_zeroconf_confirm( data=data, ) - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_USERNAME, default=DEFAULT_USERNAME): TextSelector( + probatio.Required( + CONF_USERNAME, default=DEFAULT_USERNAME + ): TextSelector( TextSelectorConfig( type=TextSelectorType.TEXT, autocomplete="username" ) ), - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password" ) diff --git a/homeassistant/components/flume/config_flow.py b/homeassistant/components/flume/config_flow.py index 833ab6fcb388b..dfb5875bb39fb 100644 --- a/homeassistant/components/flume/config_flow.py +++ b/homeassistant/components/flume/config_flow.py @@ -5,9 +5,9 @@ import os from typing import Any, override +import probatio from pyflume import FlumeAuth, FlumeDeviceList from requests.exceptions import RequestException -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -28,12 +28,12 @@ # # Currently they only implement the token endpoint # -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Required(CONF_CLIENT_ID): str, - vol.Required(CONF_CLIENT_SECRET): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Required(CONF_CLIENT_ID): str, + probatio.Required(CONF_CLIENT_SECRET): str, } ) @@ -152,9 +152,9 @@ async def async_step_reauth_confirm( CONF_USERNAME: existing_entry.data[CONF_USERNAME] }, step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, diff --git a/homeassistant/components/flume/services.py b/homeassistant/components/flume/services.py index 194d2e8b35272..87fb093eddc2f 100644 --- a/homeassistant/components/flume/services.py +++ b/homeassistant/components/flume/services.py @@ -1,6 +1,6 @@ """Services for flume.""" -import voluptuous as vol +import probatio from homeassistant.core import ( HomeAssistant, @@ -17,9 +17,11 @@ SERVICE_LIST_NOTIFICATIONS = "list_notifications" CONF_CONFIG_ENTRY = "config_entry" -LIST_NOTIFICATIONS_SERVICE_SCHEMA = vol.All( +LIST_NOTIFICATIONS_SERVICE_SCHEMA = probatio.All( { - vol.Required(CONF_CONFIG_ENTRY): ConfigEntrySelector({"integration": DOMAIN}), + probatio.Required(CONF_CONFIG_ENTRY): ConfigEntrySelector( + {"integration": DOMAIN} + ), }, ) diff --git a/homeassistant/components/fluss/config_flow.py b/homeassistant/components/fluss/config_flow.py index 3a55700a1f788..a6883cb979669 100644 --- a/homeassistant/components/fluss/config_flow.py +++ b/homeassistant/components/fluss/config_flow.py @@ -8,7 +8,7 @@ FlussApiClientAuthenticationError, FlussApiClientCommunicationError, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY @@ -17,7 +17,7 @@ from .const import DOMAIN, LOGGER -STEP_USER_DATA_SCHEMA = vol.Schema({vol.Required(CONF_API_KEY): cv.string}) +STEP_USER_DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_API_KEY): cv.string}) class FlussConfigFlow(ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/components/flux/switch.py b/homeassistant/components/flux/switch.py index 4bb227ff89afe..9dfa354bd4551 100644 --- a/homeassistant/components/flux/switch.py +++ b/homeassistant/components/flux/switch.py @@ -7,7 +7,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.light import ( ATTR_BRIGHTNESS, @@ -62,32 +62,32 @@ MODE_RGB = "rgb" DEFAULT_MODE = MODE_XY -PLATFORM_SCHEMA = vol.Schema( +PLATFORM_SCHEMA = probatio.Schema( { - vol.Required(CONF_PLATFORM): "flux", - vol.Required(CONF_LIGHTS): cv.entity_ids, - vol.Optional(CONF_NAME, default="Flux"): cv.string, - vol.Optional(CONF_START_TIME): cv.time, - vol.Optional(CONF_STOP_TIME): cv.time, - vol.Optional(CONF_START_CT, default=4000): vol.All( - vol.Coerce(int), vol.Range(min=1000, max=40000) + probatio.Required(CONF_PLATFORM): "flux", + probatio.Required(CONF_LIGHTS): cv.entity_ids, + probatio.Optional(CONF_NAME, default="Flux"): cv.string, + probatio.Optional(CONF_START_TIME): cv.time, + probatio.Optional(CONF_STOP_TIME): cv.time, + probatio.Optional(CONF_START_CT, default=4000): probatio.All( + probatio.Coerce(int), probatio.Range(min=1000, max=40000) ), - vol.Optional(CONF_SUNSET_CT, default=3000): vol.All( - vol.Coerce(int), vol.Range(min=1000, max=40000) + probatio.Optional(CONF_SUNSET_CT, default=3000): probatio.All( + probatio.Coerce(int), probatio.Range(min=1000, max=40000) ), - vol.Optional(CONF_STOP_CT, default=1900): vol.All( - vol.Coerce(int), vol.Range(min=1000, max=40000) + probatio.Optional(CONF_STOP_CT, default=1900): probatio.All( + probatio.Coerce(int), probatio.Range(min=1000, max=40000) ), - vol.Optional(CONF_BRIGHTNESS): vol.All( - vol.Coerce(int), vol.Range(min=0, max=255) + probatio.Optional(CONF_BRIGHTNESS): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=255) ), - vol.Optional(CONF_DISABLE_BRIGHTNESS_ADJUST): cv.boolean, - vol.Optional(CONF_MODE, default=DEFAULT_MODE): vol.Any( + probatio.Optional(CONF_DISABLE_BRIGHTNESS_ADJUST): cv.boolean, + probatio.Optional(CONF_MODE, default=DEFAULT_MODE): probatio.Any( MODE_XY, MODE_MIRED, MODE_RGB ), - vol.Optional(CONF_INTERVAL, default=30): cv.positive_int, - vol.Optional(ATTR_TRANSITION, default=30): VALID_TRANSITION, - vol.Optional(ATTR_UNIQUE_ID): cv.string, + probatio.Optional(CONF_INTERVAL, default=30): cv.positive_int, + probatio.Optional(ATTR_TRANSITION, default=30): VALID_TRANSITION, + probatio.Optional(ATTR_UNIQUE_ID): cv.string, } ) diff --git a/homeassistant/components/flux_led/config_flow.py b/homeassistant/components/flux_led/config_flow.py index 10b9ac1ca9ea6..239b7ceaf5e66 100644 --- a/homeassistant/components/flux_led/config_flow.py +++ b/homeassistant/components/flux_led/config_flow.py @@ -12,7 +12,7 @@ ATTR_VERSION_NUM, ) from flux_led.scanner import FluxLEDDiscovery -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_IGNORE, @@ -243,7 +243,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Optional(CONF_HOST, default=""): str}), + data_schema=probatio.Schema( + {probatio.Optional(CONF_HOST, default=""): str} + ), errors=errors, ) @@ -284,7 +286,9 @@ async def async_step_pick_device( return self.async_abort(reason="no_devices_found") return self.async_show_form( step_id="pick_device", - data_schema=vol.Schema({vol.Required(CONF_DEVICE): vol.In(devices_name)}), + data_schema=probatio.Schema( + {probatio.Required(CONF_DEVICE): probatio.In(devices_name)} + ), ) async def _async_try_connect( @@ -334,24 +338,26 @@ async def async_step_init( return self.async_create_entry(title="", data=user_input) options = self.config_entry.options - options_schema = vol.Schema( + options_schema = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_CUSTOM_EFFECT_COLORS, default=options.get(CONF_CUSTOM_EFFECT_COLORS, ""), ): str, - vol.Optional( + probatio.Optional( CONF_CUSTOM_EFFECT_SPEED_PCT, default=options.get( CONF_CUSTOM_EFFECT_SPEED_PCT, DEFAULT_EFFECT_SPEED ), - ): vol.All(vol.Coerce(int), vol.Range(min=1, max=100)), - vol.Optional( + ): probatio.All(probatio.Coerce(int), probatio.Range(min=1, max=100)), + probatio.Optional( CONF_CUSTOM_EFFECT_TRANSITION, default=options.get( CONF_CUSTOM_EFFECT_TRANSITION, TRANSITION_GRADUAL ), - ): vol.In([TRANSITION_GRADUAL, TRANSITION_JUMP, TRANSITION_STROBE]), + ): probatio.In( + [TRANSITION_GRADUAL, TRANSITION_JUMP, TRANSITION_STROBE] + ), } ) diff --git a/homeassistant/components/flux_led/light.py b/homeassistant/components/flux_led/light.py index 0b7c7935dd5b3..bbb3cfc1ad83c 100644 --- a/homeassistant/components/flux_led/light.py +++ b/homeassistant/components/flux_led/light.py @@ -7,7 +7,7 @@ from flux_led.const import MultiColorEffects from flux_led.protocol import MusicMode from flux_led.utils import rgbcw_brightness, rgbcw_to_rgbwc, rgbw_brightness -import voluptuous as vol +import probatio from homeassistant.components.light import ( ATTR_BRIGHTNESS, @@ -82,49 +82,61 @@ SERVICE_SET_MUSIC_MODE: Final = "set_music_mode" CUSTOM_EFFECT_DICT: VolDictType = { - vol.Required(CONF_COLORS): vol.All( + probatio.Required(CONF_COLORS): probatio.All( cv.ensure_list, - vol.Length(min=1, max=16), - [vol.All(vol.Coerce(tuple), vol.ExactSequence((cv.byte, cv.byte, cv.byte)))], + probatio.Length(min=1, max=16), + [ + probatio.All( + probatio.Coerce(tuple), + probatio.ExactSequence((cv.byte, cv.byte, cv.byte)), + ) + ], ), - vol.Optional(CONF_SPEED_PCT, default=50): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) + probatio.Optional(CONF_SPEED_PCT, default=50): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) ), - vol.Optional(CONF_TRANSITION, default=TRANSITION_GRADUAL): vol.All( - cv.string, vol.In([TRANSITION_GRADUAL, TRANSITION_JUMP, TRANSITION_STROBE]) + probatio.Optional(CONF_TRANSITION, default=TRANSITION_GRADUAL): probatio.All( + cv.string, probatio.In([TRANSITION_GRADUAL, TRANSITION_JUMP, TRANSITION_STROBE]) ), } SET_MUSIC_MODE_DICT: VolDictType = { - vol.Optional(ATTR_SENSITIVITY, default=100): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) + probatio.Optional(ATTR_SENSITIVITY, default=100): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) ), - vol.Optional(ATTR_BRIGHTNESS, default=100): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) + probatio.Optional(ATTR_BRIGHTNESS, default=100): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) ), - vol.Optional(ATTR_EFFECT, default=1): vol.All( - vol.Coerce(int), vol.Range(min=0, max=16) + probatio.Optional(ATTR_EFFECT, default=1): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=16) ), - vol.Optional(ATTR_LIGHT_SCREEN, default=False): bool, - vol.Optional(ATTR_FOREGROUND_COLOR): vol.All( - vol.Coerce(tuple), vol.ExactSequence((cv.byte,) * 3) + probatio.Optional(ATTR_LIGHT_SCREEN, default=False): bool, + probatio.Optional(ATTR_FOREGROUND_COLOR): probatio.All( + probatio.Coerce(tuple), probatio.ExactSequence((cv.byte,) * 3) ), - vol.Optional(ATTR_BACKGROUND_COLOR): vol.All( - vol.Coerce(tuple), vol.ExactSequence((cv.byte,) * 3) + probatio.Optional(ATTR_BACKGROUND_COLOR): probatio.All( + probatio.Coerce(tuple), probatio.ExactSequence((cv.byte,) * 3) ), } SET_ZONES_DICT: VolDictType = { - vol.Required(CONF_COLORS): vol.All( + probatio.Required(CONF_COLORS): probatio.All( cv.ensure_list, - vol.Length(min=1, max=2048), - [vol.All(vol.Coerce(tuple), vol.ExactSequence((cv.byte, cv.byte, cv.byte)))], + probatio.Length(min=1, max=2048), + [ + probatio.All( + probatio.Coerce(tuple), + probatio.ExactSequence((cv.byte, cv.byte, cv.byte)), + ) + ], ), - vol.Optional(CONF_SPEED_PCT, default=50): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) + probatio.Optional(CONF_SPEED_PCT, default=50): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) ), - vol.Optional(CONF_EFFECT, default=MultiColorEffects.STATIC.name.lower()): vol.All( - cv.string, vol.In([effect.name.lower() for effect in MultiColorEffects]) + probatio.Optional( + CONF_EFFECT, default=MultiColorEffects.STATIC.name.lower() + ): probatio.All( + cv.string, probatio.In([effect.name.lower() for effect in MultiColorEffects]) ), } diff --git a/homeassistant/components/folder/sensor.py b/homeassistant/components/folder/sensor.py index ac53c9f1a88b5..1821c245f85c2 100644 --- a/homeassistant/components/folder/sensor.py +++ b/homeassistant/components/folder/sensor.py @@ -5,7 +5,7 @@ import logging import os -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -28,8 +28,8 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_FOLDER_PATHS): cv.isdir, - vol.Optional(CONF_FILTER, default=DEFAULT_FILTER): cv.string, + probatio.Required(CONF_FOLDER_PATHS): cv.isdir, + probatio.Optional(CONF_FILTER, default=DEFAULT_FILTER): cv.string, } ) diff --git a/homeassistant/components/folder_watcher/config_flow.py b/homeassistant/components/folder_watcher/config_flow.py index c4501be171011..3973921fddacb 100644 --- a/homeassistant/components/folder_watcher/config_flow.py +++ b/homeassistant/components/folder_watcher/config_flow.py @@ -4,7 +4,7 @@ import os from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlowResult from homeassistant.core import callback @@ -42,9 +42,9 @@ async def validate_setup( return user_input -OPTIONS_SCHEMA = vol.Schema( +OPTIONS_SCHEMA = probatio.Schema( { - vol.Optional(CONF_PATTERNS, default=[DEFAULT_PATTERN]): SelectSelector( + probatio.Optional(CONF_PATTERNS, default=[DEFAULT_PATTERN]): SelectSelector( SelectSelectorConfig( options=[DEFAULT_PATTERN], multiple=True, @@ -54,9 +54,9 @@ async def validate_setup( ), } ) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_FOLDER): TextSelector(), + probatio.Required(CONF_FOLDER): TextSelector(), } ).extend(OPTIONS_SCHEMA.schema) diff --git a/homeassistant/components/foobot/sensor.py b/homeassistant/components/foobot/sensor.py index a98ca998b5f47..13c355a00129d 100644 --- a/homeassistant/components/foobot/sensor.py +++ b/homeassistant/components/foobot/sensor.py @@ -6,7 +6,7 @@ import aiohttp from foobot_async import FoobotClient -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -83,7 +83,10 @@ TIMEOUT = 10 PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_TOKEN): cv.string, vol.Required(CONF_USERNAME): cv.string} + { + probatio.Required(CONF_TOKEN): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + } ) diff --git a/homeassistant/components/forecast_solar/config_flow.py b/homeassistant/components/forecast_solar/config_flow.py index 9b32aa8c21250..8200ce81c5337 100644 --- a/homeassistant/components/forecast_solar/config_flow.py +++ b/homeassistant/components/forecast_solar/config_flow.py @@ -3,7 +3,7 @@ import re from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -35,31 +35,31 @@ RE_API_KEY = re.compile(r"^[a-zA-Z0-9]{16}$") -PLANE_SCHEMA = vol.Schema( +PLANE_SCHEMA = probatio.Schema( { - vol.Required(CONF_DECLINATION): vol.All( + probatio.Required(CONF_DECLINATION): probatio.All( selector.NumberSelector( selector.NumberSelectorConfig( min=0, max=90, step=1, mode=selector.NumberSelectorMode.BOX ), ), - vol.Coerce(int), + probatio.Coerce(int), ), - vol.Required(CONF_AZIMUTH): vol.All( + probatio.Required(CONF_AZIMUTH): probatio.All( selector.NumberSelector( selector.NumberSelectorConfig( min=0, max=360, step=1, mode=selector.NumberSelectorMode.BOX ), ), - vol.Coerce(int), + probatio.Coerce(int), ), - vol.Required(CONF_MODULES_POWER): vol.All( + probatio.Required(CONF_MODULES_POWER): probatio.All( selector.NumberSelector( selector.NumberSelectorConfig( min=1, step=1, mode=selector.NumberSelectorMode.BOX ), ), - vol.Coerce(int), + probatio.Coerce(int), ), } ) @@ -121,10 +121,10 @@ async def async_step_user( return self.async_show_form( step_id="user", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_LATITUDE): cv.latitude, - vol.Required(CONF_LONGITUDE): cv.longitude, + probatio.Required(CONF_LATITUDE): cv.latitude, + probatio.Required(CONF_LONGITUDE): cv.longitude, } ).extend(PLANE_SCHEMA.schema), { @@ -165,23 +165,23 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_API_KEY, default=suggested_api_key, ) if planes_count > 1 - else vol.Optional( + else probatio.Optional( CONF_API_KEY, description={"suggested_value": suggested_api_key}, ): str, - vol.Optional( + probatio.Optional( CONF_DAMPING_MORNING, default=self.config_entry.options.get( CONF_DAMPING_MORNING, DEFAULT_DAMPING ), - ): vol.All( + ): probatio.All( selector.NumberSelector( selector.NumberSelectorConfig( min=0, @@ -190,14 +190,14 @@ async def async_step_init( mode=selector.NumberSelectorMode.BOX, ), ), - vol.Coerce(float), + probatio.Coerce(float), ), - vol.Optional( + probatio.Optional( CONF_DAMPING_EVENING, default=self.config_entry.options.get( CONF_DAMPING_EVENING, DEFAULT_DAMPING ), - ): vol.All( + ): probatio.All( selector.NumberSelector( selector.NumberSelectorConfig( min=0, @@ -206,16 +206,16 @@ async def async_step_init( mode=selector.NumberSelectorMode.BOX, ), ), - vol.Coerce(float), + probatio.Coerce(float), ), - vol.Optional( + probatio.Optional( CONF_INVERTER_SIZE, description={ "suggested_value": self.config_entry.options.get( CONF_INVERTER_SIZE ) }, - ): vol.All( + ): probatio.All( selector.NumberSelector( selector.NumberSelectorConfig( min=1, @@ -223,7 +223,7 @@ async def async_step_init( mode=selector.NumberSelectorMode.BOX, ), ), - vol.Coerce(int), + probatio.Coerce(int), ), } ), diff --git a/homeassistant/components/forecast_solar/services.py b/homeassistant/components/forecast_solar/services.py index 79312d77f162d..1b6e97adffc8e 100644 --- a/homeassistant/components/forecast_solar/services.py +++ b/homeassistant/components/forecast_solar/services.py @@ -3,7 +3,7 @@ from datetime import datetime from typing import TYPE_CHECKING -import voluptuous as vol +import probatio from homeassistant.core import ( HomeAssistant, @@ -33,12 +33,14 @@ SERVICE_GET_FORECAST = "get_forecast" -GET_FORECAST_SCHEMA = vol.Schema( +GET_FORECAST_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY): ConfigEntrySelector({"integration": DOMAIN}), - vol.Optional(ATTR_START): cv.datetime, - vol.Optional(ATTR_END): cv.datetime, - vol.Optional(ATTR_RESOLUTION, default=RESOLUTION_RAW): vol.In( + probatio.Required(ATTR_CONFIG_ENTRY): ConfigEntrySelector( + {"integration": DOMAIN} + ), + probatio.Optional(ATTR_START): cv.datetime, + probatio.Optional(ATTR_END): cv.datetime, + probatio.Optional(ATTR_RESOLUTION, default=RESOLUTION_RAW): probatio.In( (RESOLUTION_RAW, RESOLUTION_HOURLY) ), } diff --git a/homeassistant/components/forked_daapd/config_flow.py b/homeassistant/components/forked_daapd/config_flow.py index 0cd2144015903..8faea069e962b 100644 --- a/homeassistant/components/forked_daapd/config_flow.py +++ b/homeassistant/components/forked_daapd/config_flow.py @@ -4,8 +4,8 @@ import logging from typing import Any, override +import probatio from pyforked_daapd import ForkedDaapdAPI -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, OptionsFlow from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PASSWORD, CONF_PORT @@ -28,11 +28,11 @@ _LOGGER = logging.getLogger(__name__) -# Can't use all vol types: https://github.com/home-assistant/core/issues/32819 +# Can't use all probatio types: https://github.com/home-assistant/core/issues/32819 DATA_SCHEMA_DICT = { - vol.Required(CONF_HOST): str, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): int, - vol.Optional(CONF_PASSWORD, default=""): str, + probatio.Required(CONF_HOST): str, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Optional(CONF_PASSWORD, default=""): str, } TEST_CONNECTION_ERROR_DICT = { @@ -57,27 +57,27 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_TTS_PAUSE_TIME, default=self.config_entry.options.get( CONF_TTS_PAUSE_TIME, DEFAULT_TTS_PAUSE_TIME ), ): float, - vol.Optional( + probatio.Optional( CONF_TTS_VOLUME, default=self.config_entry.options.get( CONF_TTS_VOLUME, DEFAULT_TTS_VOLUME ), ): float, - vol.Optional( + probatio.Optional( CONF_LIBRESPOT_JAVA_PORT, default=self.config_entry.options.get( CONF_LIBRESPOT_JAVA_PORT, 24879 ), ): int, - vol.Optional( + probatio.Optional( CONF_MAX_PLAYLISTS, default=self.config_entry.options.get(CONF_MAX_PLAYLISTS, 10), ): int, @@ -91,9 +91,9 @@ def fill_in_schema_dict(some_input): schema_dict = {} for field, _type in DATA_SCHEMA_DICT.items(): if some_input.get(str(field)): - schema_dict[vol.Optional(str(field), default=some_input[str(field)])] = ( - _type - ) + schema_dict[ + probatio.Optional(str(field), default=some_input[str(field)]) + ] = _type else: schema_dict[field] = _type return schema_dict @@ -106,7 +106,7 @@ class ForkedDaapdFlowHandler(ConfigFlow, domain=DOMAIN): def __init__(self) -> None: """Initialize.""" - self.discovery_schema: vol.Schema | None = None + self.discovery_schema: probatio.Schema | None = None @staticmethod @callback @@ -150,7 +150,7 @@ async def async_step_user( ) return self.async_show_form( step_id="user", - data_schema=vol.Schema(fill_in_schema_dict(user_input)), + data_schema=probatio.Schema(fill_in_schema_dict(user_input)), errors={"base": validate_result[0]}, ) if self.discovery_schema: # stop at form to allow user to set up manually @@ -158,7 +158,7 @@ async def async_step_user( step_id="user", data_schema=self.discovery_schema, errors={} ) return self.async_show_form( - step_id="user", data_schema=vol.Schema(DATA_SCHEMA_DICT), errors={} + step_id="user", data_schema=probatio.Schema(DATA_SCHEMA_DICT), errors={} ) @override @@ -193,6 +193,6 @@ async def async_step_zeroconf( CONF_PORT: discovery_info.port, CONF_NAME: zeroconf_properties["Machine Name"], } - self.discovery_schema = vol.Schema(fill_in_schema_dict(zeroconf_data)) + self.discovery_schema = probatio.Schema(fill_in_schema_dict(zeroconf_data)) self.context.update({"title_placeholders": zeroconf_data}) return await self.async_step_user() diff --git a/homeassistant/components/fortios/device_tracker.py b/homeassistant/components/fortios/device_tracker.py index 284f38c17e276..7b33d839493e2 100644 --- a/homeassistant/components/fortios/device_tracker.py +++ b/homeassistant/components/fortios/device_tracker.py @@ -8,7 +8,7 @@ from awesomeversion import AwesomeVersion from fortiosapi import FortiOSAPI -import voluptuous as vol +import probatio from homeassistant.components.device_tracker import ( DOMAIN as DEVICE_TRACKER_DOMAIN, @@ -26,9 +26,9 @@ PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_TOKEN): cv.string, - vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_TOKEN): cv.string, + probatio.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, } ) diff --git a/homeassistant/components/foscam/camera.py b/homeassistant/components/foscam/camera.py index cfe8f18742873..4afa6c195a371 100644 --- a/homeassistant/components/foscam/camera.py +++ b/homeassistant/components/foscam/camera.py @@ -4,7 +4,7 @@ from typing import override from urllib.parse import quote -import voluptuous as vol +import probatio from homeassistant.components.camera import Camera, CameraEntityFeature from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -56,7 +56,7 @@ async def async_setup_entry( platform.async_register_entity_service( SERVICE_PTZ, { - vol.Required(ATTR_MOVEMENT): vol.In( + probatio.Required(ATTR_MOVEMENT): probatio.In( [ DIR_UP, DIR_DOWN, @@ -68,7 +68,9 @@ async def async_setup_entry( DIR_BOTTOMRIGHT, ] ), - vol.Optional(ATTR_TRAVELTIME, default=DEFAULT_TRAVELTIME): cv.small_float, + probatio.Optional( + ATTR_TRAVELTIME, default=DEFAULT_TRAVELTIME + ): cv.small_float, }, "async_perform_ptz", ) @@ -76,7 +78,7 @@ async def async_setup_entry( platform.async_register_entity_service( SERVICE_PTZ_PRESET, { - vol.Required(ATTR_PRESET_NAME): cv.string, + probatio.Required(ATTR_PRESET_NAME): cv.string, }, "async_perform_ptz_preset", ) diff --git a/homeassistant/components/foscam/config_flow.py b/homeassistant/components/foscam/config_flow.py index bab46a55e9e4f..c705b195ad152 100644 --- a/homeassistant/components/foscam/config_flow.py +++ b/homeassistant/components/foscam/config_flow.py @@ -8,7 +8,7 @@ ERROR_FOSCAM_UNAVAILABLE, FOSCAM_SUCCESS, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -29,14 +29,14 @@ DEFAULT_RTSP_PORT = 88 -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Required(CONF_STREAM, default=STREAMS[0]): vol.In(STREAMS), - vol.Required(CONF_RTSP_PORT, default=DEFAULT_RTSP_PORT): int, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Required(CONF_STREAM, default=STREAMS[0]): probatio.In(STREAMS), + probatio.Required(CONF_RTSP_PORT, default=DEFAULT_RTSP_PORT): int, } ) diff --git a/homeassistant/components/foursquare/__init__.py b/homeassistant/components/foursquare/__init__.py index 25effac073d26..9e34771094388 100644 --- a/homeassistant/components/foursquare/__init__.py +++ b/homeassistant/components/foursquare/__init__.py @@ -4,8 +4,8 @@ import logging from aiohttp import web +import probatio import requests -import voluptuous as vol from homeassistant.components.http import KEY_HASS, HomeAssistantView from homeassistant.const import CONF_ACCESS_TOKEN @@ -24,30 +24,30 @@ SERVICE_CHECKIN = "checkin" -CHECKIN_SERVICE_SCHEMA = vol.Schema( +CHECKIN_SERVICE_SCHEMA = probatio.Schema( { - vol.Optional("alt"): cv.string, - vol.Optional("altAcc"): cv.string, - vol.Optional("broadcast"): cv.string, - vol.Optional("eventId"): cv.string, - vol.Optional("ll"): cv.string, - vol.Optional("llAcc"): cv.string, - vol.Optional("mentions"): cv.string, - vol.Optional("shout"): cv.string, - vol.Required("venueId"): cv.string, + probatio.Optional("alt"): cv.string, + probatio.Optional("altAcc"): cv.string, + probatio.Optional("broadcast"): cv.string, + probatio.Optional("eventId"): cv.string, + probatio.Optional("ll"): cv.string, + probatio.Optional("llAcc"): cv.string, + probatio.Optional("mentions"): cv.string, + probatio.Optional("shout"): cv.string, + probatio.Required("venueId"): cv.string, } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_ACCESS_TOKEN): cv.string, - vol.Required(CONF_PUSH_SECRET): cv.string, + probatio.Required(CONF_ACCESS_TOKEN): cv.string, + probatio.Required(CONF_PUSH_SECRET): cv.string, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/free_mobile/notify.py b/homeassistant/components/free_mobile/notify.py index dcf785cfac4c1..f237052ce2119 100644 --- a/homeassistant/components/free_mobile/notify.py +++ b/homeassistant/components/free_mobile/notify.py @@ -5,7 +5,7 @@ from typing import Any, override from freesms import FreeClient -import voluptuous as vol +import probatio from homeassistant.components.notify import ( PLATFORM_SCHEMA as NOTIFY_PLATFORM_SCHEMA, @@ -19,7 +19,10 @@ _LOGGER = logging.getLogger(__name__) PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_USERNAME): cv.string, vol.Required(CONF_ACCESS_TOKEN): cv.string} + { + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_ACCESS_TOKEN): cv.string, + } ) diff --git a/homeassistant/components/freebox/config_flow.py b/homeassistant/components/freebox/config_flow.py index 54e28d3aea0ef..3a4a20c25039e 100644 --- a/homeassistant/components/freebox/config_flow.py +++ b/homeassistant/components/freebox/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from freebox_api.exceptions import AuthorizationError, HttpRequestError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PORT @@ -33,10 +33,10 @@ async def async_step_user( if user_input is None: return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT): int, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT): int, } ), errors={}, diff --git a/homeassistant/components/freedns/__init__.py b/homeassistant/components/freedns/__init__.py index 460ad163f61dc..f67a08b521d58 100644 --- a/homeassistant/components/freedns/__init__.py +++ b/homeassistant/components/freedns/__init__.py @@ -5,7 +5,7 @@ import logging import aiohttp -import voluptuous as vol +import probatio from homeassistant.const import CONF_ACCESS_TOKEN, CONF_SCAN_INTERVAL, CONF_URL from homeassistant.core import HomeAssistant @@ -23,19 +23,19 @@ TIMEOUT = 10 UPDATE_URL = "https://freedns.afraid.org/dynamic/update.php" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Exclusive(CONF_URL, DOMAIN): cv.string, - vol.Exclusive(CONF_ACCESS_TOKEN, DOMAIN): cv.string, - vol.Optional(CONF_SCAN_INTERVAL, default=DEFAULT_INTERVAL): vol.All( - cv.time_period, cv.positive_timedelta - ), + probatio.Exclusive(CONF_URL, DOMAIN): cv.string, + probatio.Exclusive(CONF_ACCESS_TOKEN, DOMAIN): cv.string, + probatio.Optional( + CONF_SCAN_INTERVAL, default=DEFAULT_INTERVAL + ): probatio.All(cv.time_period, cv.positive_timedelta), } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/freedompro/config_flow.py b/homeassistant/components/freedompro/config_flow.py index 75f9c3ec5580b..7ee577431fddc 100644 --- a/homeassistant/components/freedompro/config_flow.py +++ b/homeassistant/components/freedompro/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from pyfreedompro import get_list -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY @@ -13,7 +13,7 @@ from .const import DOMAIN -STEP_USER_DATA_SCHEMA = vol.Schema({vol.Required(CONF_API_KEY): str}) +STEP_USER_DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_API_KEY): str}) API_KEY_URL = "https://freedompro.eu/" diff --git a/homeassistant/components/freshr/config_flow.py b/homeassistant/components/freshr/config_flow.py index a68bf01cefa96..93c4bfc764546 100644 --- a/homeassistant/components/freshr/config_flow.py +++ b/homeassistant/components/freshr/config_flow.py @@ -4,9 +4,9 @@ from typing import Any, override from aiohttp import ClientError +import probatio from pyfreshr import FreshrClient from pyfreshr.exceptions import LoginError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -14,10 +14,10 @@ from .const import DOMAIN, LOGGER -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) @@ -87,7 +87,7 @@ async def async_step_reconfigure( return self.async_show_form( step_id="reconfigure", - data_schema=vol.Schema({vol.Required(CONF_PASSWORD): str}), + data_schema=probatio.Schema({probatio.Required(CONF_PASSWORD): str}), description_placeholders={ CONF_USERNAME: reconfigure_entry.data[CONF_USERNAME] }, @@ -121,7 +121,7 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema({vol.Required(CONF_PASSWORD): str}), + data_schema=probatio.Schema({probatio.Required(CONF_PASSWORD): str}), description_placeholders={CONF_USERNAME: reauth_entry.data[CONF_USERNAME]}, errors=errors, ) diff --git a/homeassistant/components/fressnapf_tracker/config_flow.py b/homeassistant/components/fressnapf_tracker/config_flow.py index 0c5289993f64d..cc42ae8123129 100644 --- a/homeassistant/components/fressnapf_tracker/config_flow.py +++ b/homeassistant/components/fressnapf_tracker/config_flow.py @@ -9,7 +9,7 @@ FressnapfTrackerInvalidPhoneNumberError, FressnapfTrackerInvalidTokenError, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -24,14 +24,14 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_PHONE_NUMBER): str, + probatio.Required(CONF_PHONE_NUMBER): str, } ) -STEP_SMS_CODE_DATA_SCHEMA = vol.Schema( +STEP_SMS_CODE_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_SMS_CODE): str, + probatio.Required(CONF_SMS_CODE): str, } ) diff --git a/homeassistant/components/fritz/config_flow.py b/homeassistant/components/fritz/config_flow.py index e553817613df2..b5012cb0b40a4 100644 --- a/homeassistant/components/fritz/config_flow.py +++ b/homeassistant/components/fritz/config_flow.py @@ -8,7 +8,7 @@ from fritzconnection import FritzConnection from fritzconnection.core.exceptions import FritzConnectionException -import voluptuous as vol +import probatio from homeassistant.components.device_tracker import ( CONF_CONSIDER_HOME, @@ -228,14 +228,14 @@ def _show_setup_form_init( """Show the setup form to the user.""" return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional(CONF_HOST, default=DEFAULT_HOST): str, - vol.Optional(CONF_PORT): vol.Coerce(int), - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Optional(CONF_SSL, default=DEFAULT_SSL): bool, - vol.Required( + probatio.Optional(CONF_HOST, default=DEFAULT_HOST): str, + probatio.Optional(CONF_PORT): probatio.Coerce(int), + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Optional(CONF_SSL, default=DEFAULT_SSL): bool, + probatio.Required( CONF_FEATURE_DEVICE_TRACKING, default=DEFAULT_CONF_FEATURE_DEVICE_TRACKING, ): bool, @@ -250,12 +250,12 @@ def _show_setup_form_confirm( """Show the setup form to the user.""" return self.async_show_form( step_id="confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Optional(CONF_SSL, default=DEFAULT_SSL): bool, - vol.Required( + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Optional(CONF_SSL, default=DEFAULT_SSL): bool, + probatio.Required( CONF_FEATURE_DEVICE_TRACKING, default=DEFAULT_CONF_FEATURE_DEVICE_TRACKING, ): bool, @@ -310,10 +310,10 @@ def _show_setup_form_reauth_confirm( default_username = user_input.get(CONF_USERNAME) return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_USERNAME, default=default_username): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME, default=default_username): str, + probatio.Required(CONF_PASSWORD): str, } ), description_placeholders={"host": self._host}, @@ -354,13 +354,13 @@ def _show_setup_form_reconfigure( """Show the reconfigure form to the user.""" return self.async_show_form( step_id="reconfigure", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST, default=user_input[CONF_HOST]): str, - vol.Optional(CONF_PORT, default=user_input[CONF_PORT]): vol.Coerce( - int - ), - vol.Required(CONF_SSL, default=user_input[CONF_SSL]): bool, + probatio.Required(CONF_HOST, default=user_input[CONF_HOST]): str, + probatio.Optional( + CONF_PORT, default=user_input[CONF_PORT] + ): probatio.Coerce(int), + probatio.Required(CONF_SSL, default=user_input[CONF_SSL]): bool, } ), description_placeholders={"host": user_input[CONF_HOST]}, @@ -383,7 +383,7 @@ async def async_step_reconfigure( # as they are determined by ssl value # this allows the user to toggle ssl # without having to change the port - port = vol.UNDEFINED + port = probatio.UNDEFINED return self._show_setup_form_reconfigure( { @@ -427,19 +427,19 @@ async def async_step_init( return self.async_create_entry(data=user_input) options = self.config_entry.options - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_CONSIDER_HOME, default=options.get( CONF_CONSIDER_HOME, DEFAULT_CONSIDER_HOME.total_seconds() ), - ): vol.All(vol.Coerce(int), vol.Clamp(min=0, max=900)), - vol.Optional( + ): probatio.All(probatio.Coerce(int), probatio.Clamp(min=0, max=900)), + probatio.Optional( CONF_OLD_DISCOVERY, default=options.get(CONF_OLD_DISCOVERY, DEFAULT_CONF_OLD_DISCOVERY), ): bool, - vol.Optional( + probatio.Optional( CONF_FEATURE_DEVICE_TRACKING, default=options.get( CONF_FEATURE_DEVICE_TRACKING, diff --git a/homeassistant/components/fritz/services.py b/homeassistant/components/fritz/services.py index ea8d1055c8239..0401a26642ce3 100644 --- a/homeassistant/components/fritz/services.py +++ b/homeassistant/components/fritz/services.py @@ -7,7 +7,7 @@ FritzServiceError, ) from fritzconnection.lib.fritzwlan import DEFAULT_PASSWORD_LENGTH -import voluptuous as vol +import probatio from homeassistant.core import HomeAssistant, ServiceCall, callback from homeassistant.exceptions import HomeAssistantError, ServiceValidationError @@ -20,19 +20,19 @@ from .coordinator import FritzConfigEntry SERVICE_SET_GUEST_WIFI_PW = "set_guest_wifi_password" -SERVICE_SCHEMA_SET_GUEST_WIFI_PW = vol.Schema( +SERVICE_SCHEMA_SET_GUEST_WIFI_PW = probatio.Schema( { - vol.Required("device_id"): str, - vol.Optional("password"): vol.Length(min=8, max=63), - vol.Optional("length"): vol.Range(min=8, max=63), + probatio.Required("device_id"): str, + probatio.Optional("password"): probatio.Length(min=8, max=63), + probatio.Optional("length"): probatio.Range(min=8, max=63), } ) SERVICE_DIAL = "dial" -SERVICE_SCHEMA_DIAL = vol.Schema( +SERVICE_SCHEMA_DIAL = probatio.Schema( { - vol.Required("device_id"): str, - vol.Required("number"): str, - vol.Required("max_ring_seconds"): vol.Range(min=1, max=300), + probatio.Required("device_id"): str, + probatio.Required("number"): str, + probatio.Required("max_ring_seconds"): probatio.Range(min=1, max=300), } ) diff --git a/homeassistant/components/fritzbox/config_flow.py b/homeassistant/components/fritzbox/config_flow.py index 25087d19bc415..57713ef429599 100644 --- a/homeassistant/components/fritzbox/config_flow.py +++ b/homeassistant/components/fritzbox/config_flow.py @@ -4,9 +4,9 @@ import ipaddress from typing import TYPE_CHECKING, Any, Self, override +import probatio from pyfritzhome import Fritzhome, LoginError from requests.exceptions import HTTPError -import voluptuous as vol from yarl import URL from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -31,23 +31,23 @@ from .const import DEFAULT_URL, DEFAULT_USERNAME, DEFAULT_VERIFY_SSL, DOMAIN -DATA_SCHEMA_USER = vol.Schema( +DATA_SCHEMA_USER = probatio.Schema( { - vol.Required(CONF_URL, default=DEFAULT_URL): TextSelector( + probatio.Required(CONF_URL, default=DEFAULT_URL): TextSelector( config=TextSelectorConfig(type=TextSelectorType.URL) ), - vol.Required(CONF_USERNAME, default=DEFAULT_USERNAME): str, - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_USERNAME, default=DEFAULT_USERNAME): str, + probatio.Required(CONF_PASSWORD): TextSelector( config=TextSelectorConfig(type=TextSelectorType.PASSWORD) ), - vol.Required(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): bool, + probatio.Required(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): bool, } ) -DATA_SCHEMA_CONFIRM = vol.Schema( +DATA_SCHEMA_CONFIRM = probatio.Schema( { - vol.Required(CONF_USERNAME, default=DEFAULT_USERNAME): str, - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_USERNAME, default=DEFAULT_USERNAME): str, + probatio.Required(CONF_PASSWORD): TextSelector( config=TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } @@ -246,10 +246,10 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_USERNAME, default=self._username): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME, default=self._username): str, + probatio.Required(CONF_PASSWORD): str, } ), description_placeholders={"name": self._name}, @@ -286,12 +286,12 @@ async def async_step_reconfigure( return self.async_show_form( step_id="reconfigure", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_URL, default=self._url): TextSelector( + probatio.Required(CONF_URL, default=self._url): TextSelector( config=TextSelectorConfig(type=TextSelectorType.URL) ), - vol.Required(CONF_VERIFY_SSL, default=self._verify_ssl): bool, + probatio.Required(CONF_VERIFY_SSL, default=self._verify_ssl): bool, } ), description_placeholders={"name": self._url}, diff --git a/homeassistant/components/fritzbox_callmonitor/config_flow.py b/homeassistant/components/fritzbox_callmonitor/config_flow.py index 246750f8d6d6c..bd1d780b3b734 100644 --- a/homeassistant/components/fritzbox_callmonitor/config_flow.py +++ b/homeassistant/components/fritzbox_callmonitor/config_flow.py @@ -6,8 +6,8 @@ from fritzconnection import FritzConnection from fritzconnection.core.exceptions import FritzConnectionException, FritzSecurityError +import probatio from requests.exceptions import ConnectionError as RequestsConnectionError -import voluptuous as vol from homeassistant.config_entries import ( ConfigEntry, @@ -32,12 +32,12 @@ SERIAL_NUMBER, ) -DATA_SCHEMA_USER = vol.Schema( +DATA_SCHEMA_USER = probatio.Schema( { - vol.Required(CONF_HOST, default=DEFAULT_HOST): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): vol.Coerce(int), - vol.Required(CONF_USERNAME, default=DEFAULT_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_HOST, default=DEFAULT_HOST): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): probatio.Coerce(int), + probatio.Required(CONF_USERNAME, default=DEFAULT_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) @@ -185,8 +185,12 @@ async def async_step_phonebook( if user_input is None: return self.async_show_form( step_id="phonebook", - data_schema=vol.Schema( - {vol.Required(CONF_PHONEBOOK): vol.In(self._phonebook_names)} + data_schema=probatio.Schema( + { + probatio.Required(CONF_PHONEBOOK): probatio.In( + self._phonebook_names + ) + } ), errors={}, ) @@ -219,10 +223,10 @@ def _show_setup_form_reauth_confirm( default_username = user_input.get(CONF_USERNAME) return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_USERNAME, default=default_username): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME, default=default_username): str, + probatio.Required(CONF_PASSWORD): str, } ), description_placeholders={"host": self._host}, @@ -278,11 +282,11 @@ def _get_list_of_prefixes(cls, prefixes: str | None) -> list[str] | None: return None return [prefix.strip() for prefix in prefixes.split(",")] - def _get_option_schema_prefixes(self) -> vol.Schema: + def _get_option_schema_prefixes(self) -> probatio.Schema: """Get option schema for entering prefixes.""" - return vol.Schema( + return probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_PREFIXES, description={ "suggested_value": self.config_entry.options.get(CONF_PREFIXES) diff --git a/homeassistant/components/fronius/config_flow.py b/homeassistant/components/fronius/config_flow.py index f237198a95997..9a2fa8270cc40 100644 --- a/homeassistant/components/fronius/config_flow.py +++ b/homeassistant/components/fronius/config_flow.py @@ -4,8 +4,8 @@ import logging from typing import Any, Final, override +import probatio from pyfronius import Fronius, FroniusError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST @@ -20,7 +20,9 @@ DHCP_REQUEST_DELAY: Final = 60 -MODBUS_PORT_SELECTOR: Final = vol.All(vol.Coerce(int), vol.Range(min=1, max=65535)) +MODBUS_PORT_SELECTOR: Final = probatio.All( + probatio.Coerce(int), probatio.Range(min=1, max=65535) +) def create_title(info: FroniusConfigEntryData) -> str: @@ -101,10 +103,10 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required( + probatio.Required(CONF_HOST): str, + probatio.Required( CONF_MODBUS_PORT, default=DEFAULT_MODBUS_PORT ): MODBUS_PORT_SELECTOR, } @@ -182,10 +184,10 @@ async def async_step_reconfigure( modbus_port = reconfigure_entry.data.get(CONF_MODBUS_PORT, DEFAULT_MODBUS_PORT) return self.async_show_form( step_id="reconfigure", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST, default=host): str, - vol.Required( + probatio.Required(CONF_HOST, default=host): str, + probatio.Required( CONF_MODBUS_PORT, default=modbus_port ): MODBUS_PORT_SELECTOR, } diff --git a/homeassistant/components/frontend/__init__.py b/homeassistant/components/frontend/__init__.py index 6e80b63402a0e..b8ee6f43bb638 100644 --- a/homeassistant/components/frontend/__init__.py +++ b/homeassistant/components/frontend/__init__.py @@ -10,8 +10,8 @@ from aiohttp import hdrs, web, web_urldispatcher import jinja2 +import probatio from propcache.api import cached_property -import voluptuous as vol from yarl import URL from homeassistant.components import onboarding, websocket_api @@ -94,7 +94,7 @@ PRIMARY_COLOR = "primary-color" -LEGACY_THEME_SCHEMA = vol.Any( +LEGACY_THEME_SCHEMA = probatio.Any( # Legacy theme scheme {cv.string: cv.string}, # New extended schema with mode support @@ -102,24 +102,32 @@ # Theme variables that apply to all modes cv.string: cv.string, # Mode specific theme variables - vol.Optional(CONF_THEMES_MODES): vol.Schema( + probatio.Optional(CONF_THEMES_MODES): probatio.Schema( { - vol.Optional(CONF_THEMES_LIGHT): vol.Schema({cv.string: cv.string}), - vol.Optional(CONF_THEMES_DARK): vol.Schema({cv.string: cv.string}), + probatio.Optional(CONF_THEMES_LIGHT): probatio.Schema( + {cv.string: cv.string} + ), + probatio.Optional(CONF_THEMES_DARK): probatio.Schema( + {cv.string: cv.string} + ), } ), }, ) -THEME_SCHEMA = vol.Schema( +THEME_SCHEMA = probatio.Schema( { # Theme variables that apply to all modes cv.string: cv.string, # Mode specific theme variables - vol.Optional(CONF_THEMES_MODES): vol.All( + probatio.Optional(CONF_THEMES_MODES): probatio.All( { - vol.Optional(CONF_THEMES_LIGHT): vol.Schema({cv.string: cv.string}), - vol.Optional(CONF_THEMES_DARK): vol.Schema({cv.string: cv.string}), + probatio.Optional(CONF_THEMES_LIGHT): probatio.Schema( + {cv.string: cv.string} + ), + probatio.Optional(CONF_THEMES_DARK): probatio.Schema( + {cv.string: cv.string} + ), }, cv.has_at_least_one_key(CONF_THEMES_LIGHT, CONF_THEMES_DARK), ), @@ -136,34 +144,36 @@ def _validate_themes(themes: dict) -> dict[str, Any]: try: validated_themes[theme_name] = THEME_SCHEMA(theme) - except vol.Invalid as err: + except probatio.Invalid as err: _LOGGER.error("Theme %s is invalid: %s", theme_name, err) return validated_themes -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Optional(CONF_FRONTEND_REPO): cv.isdir, - vol.Inclusive(CONF_DEVELOPMENT_PR, "development_pr"): cv.positive_int, - vol.Inclusive(CONF_GITHUB_TOKEN, "development_pr"): cv.string, - vol.Optional(CONF_THEMES): vol.All(dict, _validate_themes), - vol.Optional(CONF_EXTRA_MODULE_URL): vol.All( + probatio.Optional(CONF_FRONTEND_REPO): cv.isdir, + probatio.Inclusive( + CONF_DEVELOPMENT_PR, "development_pr" + ): cv.positive_int, + probatio.Inclusive(CONF_GITHUB_TOKEN, "development_pr"): cv.string, + probatio.Optional(CONF_THEMES): probatio.All(dict, _validate_themes), + probatio.Optional(CONF_EXTRA_MODULE_URL): probatio.All( cv.ensure_list, [cv.string] ), - vol.Optional(CONF_EXTRA_JS_URL_ES5): vol.All( + probatio.Optional(CONF_EXTRA_JS_URL_ES5): probatio.All( cv.ensure_list, [cv.string] ), # We no longer use these options. - vol.Optional(CONF_EXTRA_HTML_URL): cv.match_all, - vol.Optional(CONF_EXTRA_HTML_URL_ES5): cv.match_all, - vol.Optional(CONF_JS_VERSION): cv.match_all, + probatio.Optional(CONF_EXTRA_HTML_URL): cv.match_all, + probatio.Optional(CONF_EXTRA_HTML_URL_ES5): cv.match_all, + probatio.Optional(CONF_JS_VERSION): cv.match_all, }, ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) SERVICE_SET_THEME = "set_theme" @@ -656,7 +666,7 @@ def _validate_selected_theme(theme: str) -> str: return theme hass = async_get_hass() if theme not in hass.data[DATA_THEMES]: - raise vol.Invalid(f"Theme {theme} not found") + raise probatio.Invalid(f"Theme {theme} not found") return theme @@ -745,7 +755,7 @@ async def reload_themes(_: ServiceCall) -> None: try: new_themes = _validate_themes(new_themes) - except vol.Invalid as err: + except probatio.Invalid as err: raise HomeAssistantError(f"Failed to reload themes: {err}") from err hass.data[DATA_THEMES] = new_themes @@ -763,11 +773,15 @@ async def reload_themes(_: ServiceCall) -> None: DOMAIN, SERVICE_SET_THEME, set_theme, - vol.All( + probatio.All( { - vol.Optional(CONF_NAME): _validate_selected_theme, - vol.Exclusive(CONF_NAME_DARK, "dark_modes"): _validate_selected_theme, - vol.Exclusive(CONF_MODE, "dark_modes"): vol.Any("dark", "light"), + probatio.Optional(CONF_NAME): _validate_selected_theme, + probatio.Exclusive( + CONF_NAME_DARK, "dark_modes" + ): _validate_selected_theme, + probatio.Exclusive(CONF_MODE, "dark_modes"): probatio.Any( + "dark", "light" + ), }, cv.has_at_least_one_key(CONF_NAME, CONF_NAME_DARK), ), @@ -930,10 +944,10 @@ def get(self, request: web.Request) -> web.Response: @websocket_api.websocket_command( { "type": "frontend/get_icons", - vol.Required("category"): vol.In( + probatio.Required("category"): probatio.In( {"conditions", "entity", "entity_component", "services", "triggers"} ), - vol.Optional("integration"): vol.All(cv.ensure_list, [str]), + probatio.Optional("integration"): probatio.All(cv.ensure_list, [str]), } ) @websocket_api.async_response @@ -1007,10 +1021,10 @@ def websocket_get_themes( @websocket_api.websocket_command( { "type": "frontend/get_translations", - vol.Required("language"): str, - vol.Required("category"): str, - vol.Optional("integration"): vol.All(cv.ensure_list, [str]), - vol.Optional("config_flow"): bool, + probatio.Required("language"): str, + probatio.Required("category"): str, + probatio.Optional("integration"): probatio.All(cv.ensure_list, [str]), + probatio.Optional("config_flow"): bool, } ) @websocket_api.async_response @@ -1070,12 +1084,12 @@ def cancel_subscription() -> None: @websocket_api.websocket_command( { - vol.Required("type"): "frontend/update_panel", - vol.Required("url_path"): str, - vol.Optional("title"): vol.Any(cv.string, None), - vol.Optional("icon"): vol.Any(cv.icon, None), - vol.Optional("require_admin"): vol.Any(cv.boolean, None), - vol.Optional("show_in_sidebar"): vol.Any(cv.boolean, None), + probatio.Required("type"): "frontend/update_panel", + probatio.Required("url_path"): str, + probatio.Optional("title"): probatio.Any(cv.string, None), + probatio.Optional("icon"): probatio.Any(cv.icon, None), + probatio.Optional("require_admin"): probatio.Any(cv.boolean, None), + probatio.Optional("show_in_sidebar"): probatio.Any(cv.boolean, None), } ) @websocket_api.require_admin diff --git a/homeassistant/components/frontend/storage.py b/homeassistant/components/frontend/storage.py index e60ef66ac7f35..9ecfc8089f153 100644 --- a/homeassistant/components/frontend/storage.py +++ b/homeassistant/components/frontend/storage.py @@ -5,7 +5,7 @@ from functools import wraps from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.components.websocket_api import ActiveConnection @@ -195,9 +195,11 @@ async def with_system_store_func( @websocket_api.websocket_command( { - vol.Required("type"): "frontend/set_user_data", - vol.Required("key"): str, - vol.Required("value"): vol.Any(bool, str, int, float, dict, list, None), + probatio.Required("type"): "frontend/set_user_data", + probatio.Required("key"): str, + probatio.Required("value"): probatio.Any( + bool, str, int, float, dict, list, None + ), } ) @websocket_api.async_response @@ -214,7 +216,7 @@ async def websocket_set_user_data( @websocket_api.websocket_command( - {vol.Required("type"): "frontend/get_user_data", vol.Optional("key"): str} + {probatio.Required("type"): "frontend/get_user_data", probatio.Optional("key"): str} ) @websocket_api.async_response @with_user_store @@ -232,7 +234,10 @@ async def websocket_get_user_data( @websocket_api.websocket_command( - {vol.Required("type"): "frontend/subscribe_user_data", vol.Optional("key"): str} + { + probatio.Required("type"): "frontend/subscribe_user_data", + probatio.Optional("key"): str, + } ) @websocket_api.async_response @with_user_store @@ -259,9 +264,11 @@ def on_data_update() -> None: @websocket_api.websocket_command( { - vol.Required("type"): "frontend/set_system_data", - vol.Required("key"): str, - vol.Required("value"): vol.Any(bool, str, int, float, dict, list, None), + probatio.Required("type"): "frontend/set_system_data", + probatio.Required("key"): str, + probatio.Required("value"): probatio.Any( + bool, str, int, float, dict, list, None + ), } ) @websocket_api.require_admin @@ -279,7 +286,10 @@ async def websocket_set_system_data( @websocket_api.websocket_command( - {vol.Required("type"): "frontend/get_system_data", vol.Required("key"): str} + { + probatio.Required("type"): "frontend/get_system_data", + probatio.Required("key"): str, + } ) @websocket_api.async_response @with_system_store @@ -295,8 +305,8 @@ async def websocket_get_system_data( @websocket_api.websocket_command( { - vol.Required("type"): "frontend/subscribe_system_data", - vol.Required("key"): str, + probatio.Required("type"): "frontend/subscribe_system_data", + probatio.Required("key"): str, } ) @websocket_api.async_response diff --git a/homeassistant/components/frontier_silicon/config_flow.py b/homeassistant/components/frontier_silicon/config_flow.py index 18cd5788b92ac..aa8dfe0d84d94 100644 --- a/homeassistant/components/frontier_silicon/config_flow.py +++ b/homeassistant/components/frontier_silicon/config_flow.py @@ -6,7 +6,7 @@ from urllib.parse import urlparse from afsapi import AFSAPI, FSConnectionError, FSNotImplementedError, InvalidPinError -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PIN, CONF_PORT @@ -22,16 +22,16 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, } ) -STEP_DEVICE_CONFIG_DATA_SCHEMA = vol.Schema( +STEP_DEVICE_CONFIG_DATA_SCHEMA = probatio.Schema( { - vol.Required( + probatio.Required( CONF_PIN, default=DEFAULT_PIN, ): str, diff --git a/homeassistant/components/fuelprices_dk/config_flow.py b/homeassistant/components/fuelprices_dk/config_flow.py index e3acf6563bebb..272099b3fb172 100644 --- a/homeassistant/components/fuelprices_dk/config_flow.py +++ b/homeassistant/components/fuelprices_dk/config_flow.py @@ -4,8 +4,8 @@ from typing import Any, override from aiohttp import ClientResponseError +import probatio from pybraendstofpriser import Braendstofpriser -import voluptuous as vol from homeassistant.config_entries import ( ConfigEntry, @@ -82,11 +82,11 @@ def _show_company_selection_form(self, errors: dict[str, str]) -> ConfigFlowResu """Show the company selection form.""" return self.async_show_form( step_id="company_selection", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_COMPANY, default=self.company_name): vol.In( - [c["company"] for c in self.companies] - ), + probatio.Required( + CONF_COMPANY, default=self.company_name + ): probatio.In([c["company"] for c in self.companies]), } ), errors=errors, @@ -115,9 +115,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_API_KEY): str, + probatio.Required(CONF_API_KEY): str, } ), errors=errors, @@ -180,9 +180,9 @@ async def async_step_station_selection( return self.async_show_form( step_id="station_selection", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_STATION): vol.In(stations), + probatio.Required(CONF_STATION): probatio.In(stations), } ), ) @@ -220,7 +220,7 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema({vol.Required(CONF_API_KEY): str}), + data_schema=probatio.Schema({probatio.Required(CONF_API_KEY): str}), errors=errors, ) @@ -255,16 +255,16 @@ def _show_company_selection_form( """Show the company selection form.""" default_company = self.user_input.get(CONF_COMPANY) company_field = ( - vol.Required(CONF_COMPANY, default=default_company) + probatio.Required(CONF_COMPANY, default=default_company) if default_company - else vol.Required(CONF_COMPANY) + else probatio.Required(CONF_COMPANY) ) return self.async_show_form( step_id="company_selection", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - company_field: vol.In([c["company"] for c in self.companies]), + company_field: probatio.In([c["company"] for c in self.companies]), } ), errors=errors or {}, @@ -339,9 +339,9 @@ async def async_step_station_selection( return self.async_show_form( step_id="station_selection", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_STATION): vol.In(stations), + probatio.Required(CONF_STATION): probatio.In(stations), } ), errors=self._errors, diff --git a/homeassistant/components/fujitsu_fglair/config_flow.py b/homeassistant/components/fujitsu_fglair/config_flow.py index 34ad70b130996..a04ad5aeee7db 100644 --- a/homeassistant/components/fujitsu_fglair/config_flow.py +++ b/homeassistant/components/fujitsu_fglair/config_flow.py @@ -6,7 +6,7 @@ from ayla_iot_unofficial import AylaAuthError, new_ayla_api from ayla_iot_unofficial.fujitsu_consts import FGLAIR_APP_CREDENTIALS -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_REGION, CONF_USERNAME @@ -18,11 +18,11 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Required(CONF_REGION, default=REGION_DEFAULT): SelectSelector( + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Required(CONF_REGION, default=REGION_DEFAULT): SelectSelector( SelectSelectorConfig( options=[region.lower() for region in FGLAIR_APP_CREDENTIALS], translation_key=CONF_REGION, @@ -30,9 +30,9 @@ ), } ) -STEP_REAUTH_DATA_SCHEMA = vol.Schema( +STEP_REAUTH_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/fully_kiosk/config_flow.py b/homeassistant/components/fully_kiosk/config_flow.py index 0e61abaee0c0b..6d95f5cf63e8d 100644 --- a/homeassistant/components/fully_kiosk/config_flow.py +++ b/homeassistant/components/fully_kiosk/config_flow.py @@ -7,7 +7,7 @@ from aiohttp.client_exceptions import ClientConnectorError from fullykiosk import FullyKiosk from fullykiosk.exceptions import FullyKioskError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -113,12 +113,12 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PASSWORD): str, - vol.Optional(CONF_SSL, default=False): bool, - vol.Optional(CONF_VERIFY_SSL, default=False): bool, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Optional(CONF_SSL, default=False): bool, + probatio.Optional(CONF_VERIFY_SSL, default=False): bool, } ), errors=errors, @@ -161,11 +161,11 @@ async def async_step_discovery_confirm( self.context["title_placeholders"] = placeholders return self.async_show_form( step_id="discovery_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PASSWORD): str, - vol.Optional(CONF_SSL, default=False): bool, - vol.Optional(CONF_VERIFY_SSL, default=False): bool, + probatio.Required(CONF_PASSWORD): str, + probatio.Optional(CONF_SSL, default=False): bool, + probatio.Optional(CONF_VERIFY_SSL, default=False): bool, } ), description_placeholders=placeholders, @@ -228,12 +228,12 @@ async def async_step_reconfigure( return self.async_show_form( step_id="reconfigure", data_schema=self.add_suggested_values_to_schema( - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PASSWORD): str, - vol.Optional(CONF_SSL, default=False): bool, - vol.Optional(CONF_VERIFY_SSL, default=False): bool, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Optional(CONF_SSL, default=False): bool, + probatio.Optional(CONF_VERIFY_SSL, default=False): bool, } ), suggested_values=user_input or suggested_values, diff --git a/homeassistant/components/fully_kiosk/services.py b/homeassistant/components/fully_kiosk/services.py index 593faf1c6f15a..f40884f7e8c98 100644 --- a/homeassistant/components/fully_kiosk/services.py +++ b/homeassistant/components/fully_kiosk/services.py @@ -1,6 +1,6 @@ """Services for the Fully Kiosk Browser integration.""" -import voluptuous as vol +import probatio from homeassistant.const import ATTR_DEVICE_ID from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -77,11 +77,11 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, service_name, service_handler, - schema=vol.Schema( - vol.All( + schema=probatio.Schema( + probatio.All( { - vol.Required(ATTR_DEVICE_ID): cv.ensure_list, - vol.Required(attrib): cv.string, + probatio.Required(ATTR_DEVICE_ID): cv.ensure_list, + probatio.Required(attrib): cv.string, } ) ), @@ -91,12 +91,12 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, SERVICE_SET_CONFIG, _async_set_config, - schema=vol.Schema( - vol.All( + schema=probatio.Schema( + probatio.All( { - vol.Required(ATTR_DEVICE_ID): cv.ensure_list, - vol.Required(ATTR_KEY): cv.string, - vol.Required(ATTR_VALUE): vol.Any(str, bool, int), + probatio.Required(ATTR_DEVICE_ID): cv.ensure_list, + probatio.Required(ATTR_KEY): cv.string, + probatio.Required(ATTR_VALUE): probatio.Any(str, bool, int), } ) ), diff --git a/homeassistant/components/fumis/config_flow.py b/homeassistant/components/fumis/config_flow.py index 2f146aad8d4ab..298b4dddfa1cd 100644 --- a/homeassistant/components/fumis/config_flow.py +++ b/homeassistant/components/fumis/config_flow.py @@ -10,7 +10,7 @@ FumisInfo, FumisStoveOfflineError, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_MAC, CONF_PIN @@ -65,9 +65,9 @@ async def async_step_dhcp_confirm( return self.async_show_form( step_id="dhcp_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PIN): TextSelector( + probatio.Required(CONF_PIN): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } @@ -99,12 +99,12 @@ async def async_step_user( return self.async_show_form( step_id="user", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_MAC): TextSelector( + probatio.Required(CONF_MAC): TextSelector( TextSelectorConfig(autocomplete="off") ), - vol.Required(CONF_PIN): TextSelector( + probatio.Required(CONF_PIN): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } @@ -133,9 +133,9 @@ async def async_step_reconfigure( return self.async_show_form( step_id="reconfigure", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PIN): TextSelector( + probatio.Required(CONF_PIN): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } @@ -168,9 +168,9 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PIN): TextSelector( + probatio.Required(CONF_PIN): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } diff --git a/homeassistant/components/futurenow/light.py b/homeassistant/components/futurenow/light.py index 2324b581dffa2..3b5687c577fc7 100644 --- a/homeassistant/components/futurenow/light.py +++ b/homeassistant/components/futurenow/light.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio import pyfnip -import voluptuous as vol from homeassistant.components.light import ( ATTR_BRIGHTNESS, @@ -22,19 +22,19 @@ CONF_DRIVER_FNIP8X10A = "FNIP8x10a" CONF_DRIVER_TYPES = [CONF_DRIVER_FNIP6X10AD, CONF_DRIVER_FNIP8X10A] -DEVICE_SCHEMA = vol.Schema( +DEVICE_SCHEMA = probatio.Schema( { - vol.Required(CONF_NAME): cv.string, - vol.Optional("dimmable", default=False): cv.boolean, + probatio.Required(CONF_NAME): cv.string, + probatio.Optional("dimmable", default=False): cv.boolean, } ) PLATFORM_SCHEMA = LIGHT_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_DRIVER): vol.In(CONF_DRIVER_TYPES), - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_PORT): cv.port, - vol.Required(CONF_DEVICES): {cv.string: DEVICE_SCHEMA}, + probatio.Required(CONF_DRIVER): probatio.In(CONF_DRIVER_TYPES), + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_PORT): cv.port, + probatio.Required(CONF_DEVICES): {cv.string: DEVICE_SCHEMA}, } ) diff --git a/homeassistant/components/fyta/config_flow.py b/homeassistant/components/fyta/config_flow.py index 5b7fa2c507c94..0284c35f08c3a 100644 --- a/homeassistant/components/fyta/config_flow.py +++ b/homeassistant/components/fyta/config_flow.py @@ -11,7 +11,7 @@ FytaPasswordError, ) from fyta_cli.fyta_models import Credentials -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_ACCESS_TOKEN, CONF_PASSWORD, CONF_USERNAME @@ -26,15 +26,15 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): TextSelector( + probatio.Required(CONF_USERNAME): TextSelector( TextSelectorConfig( type=TextSelectorType.TEXT, autocomplete="username", ), ), - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", diff --git a/homeassistant/components/garadget/cover.py b/homeassistant/components/garadget/cover.py index bbfdd7042340d..5bb9bff2b6a7a 100644 --- a/homeassistant/components/garadget/cover.py +++ b/homeassistant/components/garadget/cover.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio import requests -import voluptuous as vol from homeassistant.components.cover import ( PLATFORM_SCHEMA as COVER_PLATFORM_SCHEMA, @@ -46,18 +46,18 @@ "stopped": STATE_STOPPED, } -COVER_SCHEMA = vol.Schema( +COVER_SCHEMA = probatio.Schema( { - vol.Optional(CONF_ACCESS_TOKEN): cv.string, - vol.Optional(CONF_DEVICE): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_PASSWORD): cv.string, - vol.Optional(CONF_USERNAME): cv.string, + probatio.Optional(CONF_ACCESS_TOKEN): cv.string, + probatio.Optional(CONF_DEVICE): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_USERNAME): cv.string, } ) PLATFORM_SCHEMA = COVER_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_COVERS): cv.schema_with_slug_keys(COVER_SCHEMA)} + {probatio.Required(CONF_COVERS): cv.schema_with_slug_keys(COVER_SCHEMA)} ) diff --git a/homeassistant/components/garages_amsterdam/config_flow.py b/homeassistant/components/garages_amsterdam/config_flow.py index b9de9eff332fc..1253f1545f1f7 100644 --- a/homeassistant/components/garages_amsterdam/config_flow.py +++ b/homeassistant/components/garages_amsterdam/config_flow.py @@ -5,7 +5,7 @@ from aiohttp import ClientResponseError from odp_amsterdam import ODPAmsterdam, VehicleType -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.helpers import aiohttp_client @@ -51,7 +51,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required("garage_name"): vol.In(self._options)} + data_schema=probatio.Schema( + {probatio.Required("garage_name"): probatio.In(self._options)} ), ) diff --git a/homeassistant/components/gardena_bluetooth/config_flow.py b/homeassistant/components/gardena_bluetooth/config_flow.py index 84a929181fe21..822edfa5f1ecb 100644 --- a/homeassistant/components/gardena_bluetooth/config_flow.py +++ b/homeassistant/components/gardena_bluetooth/config_flow.py @@ -7,7 +7,7 @@ from gardena_bluetooth.const import PRODUCT_NAMES, DeviceInformation from gardena_bluetooth.exceptions import CharacteristicNotFound, CommunicationFailure from gardena_bluetooth.parse import ManufacturerData, ProductType -import voluptuous as vol +import probatio from homeassistant.components.bluetooth import BluetoothServiceInfo from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -136,9 +136,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_ADDRESS): vol.In(devices), + probatio.Required(CONF_ADDRESS): probatio.In(devices), }, ), ) diff --git a/homeassistant/components/gatus/config_flow.py b/homeassistant/components/gatus/config_flow.py index 926a4ee2f3ed4..471252d200a1f 100644 --- a/homeassistant/components/gatus/config_flow.py +++ b/homeassistant/components/gatus/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from gatus_api import GatusAuthError, GatusClient, GatusClientError -import voluptuous as vol +import probatio from yarl import URL from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -23,27 +23,27 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_URL): TextSelector( + probatio.Required(CONF_URL): TextSelector( TextSelectorConfig( type=TextSelectorType.URL, autocomplete="url", ), ), - vol.Optional(CONF_USERNAME): TextSelector( + probatio.Optional(CONF_USERNAME): TextSelector( TextSelectorConfig( type=TextSelectorType.TEXT, autocomplete="username", ), ), - vol.Optional(CONF_PASSWORD): TextSelector( + probatio.Optional(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", ), ), - vol.Optional(CONF_TOKEN): TextSelector( + probatio.Optional(CONF_TOKEN): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, ), @@ -195,21 +195,21 @@ async def async_step_reauth_confirm( data_updates=user_input, ) - schema = vol.Schema( + schema = probatio.Schema( { - vol.Optional(CONF_USERNAME): TextSelector( + probatio.Optional(CONF_USERNAME): TextSelector( TextSelectorConfig( type=TextSelectorType.TEXT, autocomplete="username", ), ), - vol.Optional(CONF_PASSWORD): TextSelector( + probatio.Optional(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", ), ), - vol.Optional(CONF_TOKEN): TextSelector( + probatio.Optional(CONF_TOKEN): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, ), diff --git a/homeassistant/components/gc100/__init__.py b/homeassistant/components/gc100/__init__.py index 7830ed2372848..1e646ea8edd02 100644 --- a/homeassistant/components/gc100/__init__.py +++ b/homeassistant/components/gc100/__init__.py @@ -1,7 +1,7 @@ """Support for controlling Global Cache gc100.""" import gc100 -import voluptuous as vol +import probatio from homeassistant.const import CONF_HOST, CONF_PORT, EVENT_HOMEASSISTANT_STOP from homeassistant.core import HomeAssistant @@ -16,16 +16,16 @@ DATA_GC100: HassKey[GC100Device] = HassKey("gc100") -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/gc100/binary_sensor.py b/homeassistant/components/gc100/binary_sensor.py index 9ebe4b4677807..03e6510e49d73 100644 --- a/homeassistant/components/gc100/binary_sensor.py +++ b/homeassistant/components/gc100/binary_sensor.py @@ -2,7 +2,7 @@ from typing import override -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import ( PLATFORM_SCHEMA as BINARY_SENSOR_PLATFORM_SCHEMA, @@ -16,10 +16,10 @@ from . import CONF_PORTS, DATA_GC100, GC100Device -_SENSORS_SCHEMA = vol.Schema({cv.string: cv.string}) +_SENSORS_SCHEMA = probatio.Schema({cv.string: cv.string}) PLATFORM_SCHEMA = BINARY_SENSOR_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_PORTS): vol.All(cv.ensure_list, [_SENSORS_SCHEMA])} + {probatio.Required(CONF_PORTS): probatio.All(cv.ensure_list, [_SENSORS_SCHEMA])} ) diff --git a/homeassistant/components/gc100/switch.py b/homeassistant/components/gc100/switch.py index 6a3425c62f84f..926ac5e786cf0 100644 --- a/homeassistant/components/gc100/switch.py +++ b/homeassistant/components/gc100/switch.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.switch import ( PLATFORM_SCHEMA as SWITCH_PLATFORM_SCHEMA, @@ -16,10 +16,10 @@ from . import CONF_PORTS, DATA_GC100, GC100Device -_SWITCH_SCHEMA = vol.Schema({cv.string: cv.string}) +_SWITCH_SCHEMA = probatio.Schema({cv.string: cv.string}) PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_PORTS): vol.All(cv.ensure_list, [_SWITCH_SCHEMA])} + {probatio.Required(CONF_PORTS): probatio.All(cv.ensure_list, [_SWITCH_SCHEMA])} ) diff --git a/homeassistant/components/gdacs/config_flow.py b/homeassistant/components/gdacs/config_flow.py index 2262d5ad6bfd0..a8e9baf5b316e 100644 --- a/homeassistant/components/gdacs/config_flow.py +++ b/homeassistant/components/gdacs/config_flow.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -16,8 +16,8 @@ from .const import CONF_CATEGORIES, DEFAULT_RADIUS, DEFAULT_SCAN_INTERVAL, DOMAIN -DATA_SCHEMA = vol.Schema( - {vol.Optional(CONF_RADIUS, default=DEFAULT_RADIUS): cv.positive_int} +DATA_SCHEMA = probatio.Schema( + {probatio.Optional(CONF_RADIUS, default=DEFAULT_RADIUS): cv.positive_int} ) _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/generic/camera.py b/homeassistant/components/generic/camera.py index 704aa908818c5..5068121ef89c3 100644 --- a/homeassistant/components/generic/camera.py +++ b/homeassistant/components/generic/camera.py @@ -7,7 +7,7 @@ from typing import Any, override import httpx -import voluptuous as vol +import probatio import yarl from homeassistant.components.camera import Camera, CameraEntityFeature @@ -143,8 +143,8 @@ async def async_camera_image( return self._last_image try: - vol.Schema(vol.Url())(url) - except vol.Invalid as err: + probatio.Schema(probatio.Url())(url) + except probatio.Invalid as err: _LOGGER.warning("Invalid URL '%s': %s, returning last image", url, err) return self._last_image diff --git a/homeassistant/components/generic/config_flow.py b/homeassistant/components/generic/config_flow.py index c2198627d8e79..050e95c673d15 100644 --- a/homeassistant/components/generic/config_flow.py +++ b/homeassistant/components/generic/config_flow.py @@ -12,7 +12,7 @@ from aiohttp import web from httpx import HTTPStatusError, RequestError, TimeoutException import PIL.Image -import voluptuous as vol +import probatio import yarl from homeassistant.components import websocket_api @@ -104,7 +104,7 @@ def __init__(self, error: str, details: str | None = None) -> None: def build_schema( is_options_flow: bool = False, -) -> vol.Schema: +) -> probatio.Schema: """Create schema for camera config setup.""" rtsp_options = [ SelectOptionDict( @@ -115,34 +115,34 @@ def build_schema( ] advanced_section = { - vol.Required(CONF_FRAMERATE): vol.All( - vol.Range(min=0, min_included=False), cv.positive_float + probatio.Required(CONF_FRAMERATE): probatio.All( + probatio.Range(min=0, min_included=False), cv.positive_float ), - vol.Required(CONF_VERIFY_SSL): bool, - vol.Optional(CONF_RTSP_TRANSPORT): SelectSelector( + probatio.Required(CONF_VERIFY_SSL): bool, + probatio.Optional(CONF_RTSP_TRANSPORT): SelectSelector( SelectSelectorConfig( options=rtsp_options, mode=SelectSelectorMode.DROPDOWN, ) ), - vol.Optional(CONF_AUTHENTICATION): vol.In( + probatio.Optional(CONF_AUTHENTICATION): probatio.In( [HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION] ), } spec = { - vol.Optional(CONF_STREAM_SOURCE): str, - vol.Optional(CONF_STILL_IMAGE_URL): str, - vol.Optional(CONF_USERNAME): str, - vol.Optional(CONF_PASSWORD): str, - vol.Required(SECTION_ADVANCED): section( - vol.Schema(advanced_section), {"collapsed": True} + probatio.Optional(CONF_STREAM_SOURCE): str, + probatio.Optional(CONF_STILL_IMAGE_URL): str, + probatio.Optional(CONF_USERNAME): str, + probatio.Optional(CONF_PASSWORD): str, + probatio.Required(SECTION_ADVANCED): section( + probatio.Schema(advanced_section), {"collapsed": True} ), } if is_options_flow: - advanced_section[vol.Optional(CONF_LIMIT_REFETCH_TO_URL_CHANGE)] = bool - advanced_section[vol.Optional(CONF_USE_WALLCLOCK_AS_TIMESTAMPS)] = bool + advanced_section[probatio.Optional(CONF_LIMIT_REFETCH_TO_URL_CHANGE)] = bool + advanced_section[probatio.Optional(CONF_USE_WALLCLOCK_AS_TIMESTAMPS)] = bool - return vol.Schema(spec) + return probatio.Schema(spec) def get_image_type(image: bytes) -> str | None: @@ -347,7 +347,7 @@ async def async_step_user( errors = {} hass = self.hass if user_input: - # Secondary validation because serialised vol can't + # Secondary validation because serialised probatio can't # seem to handle this complexity: if not user_input.get(CONF_STILL_IMAGE_URL) and not user_input.get( CONF_STREAM_SOURCE @@ -400,9 +400,9 @@ async def async_step_user_confirm( register_still_preview(self.hass) return self.async_show_form( step_id="user_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_CONFIRMED_OK, default=False): bool, + probatio.Required(CONF_CONFIRMED_OK, default=False): bool, } ), errors=None, @@ -433,7 +433,7 @@ async def async_step_init( hass = self.hass if user_input: - # Secondary validation because serialised vol can't + # Secondary validation because serialised probatio can't # seem to handle this complexity: if not user_input.get(CONF_STILL_IMAGE_URL) and not user_input.get( CONF_STREAM_SOURCE @@ -495,9 +495,9 @@ async def async_step_user_confirm( register_still_preview(self.hass) return self.async_show_form( step_id="user_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_CONFIRMED_OK, default=False): bool, + probatio.Required(CONF_CONFIRMED_OK, default=False): bool, } ), errors=None, @@ -549,10 +549,10 @@ async def get(self, request: web.Request, flow_id: str) -> web.Response: @websocket_api.websocket_command( { - vol.Required("type"): "generic_camera/start_preview", - vol.Required("flow_id"): str, - vol.Optional("flow_type"): vol.Any("config_flow", "options_flow"), - vol.Optional("user_input"): dict, + probatio.Required("type"): "generic_camera/start_preview", + probatio.Required("flow_id"): str, + probatio.Optional("flow_type"): probatio.Any("config_flow", "options_flow"), + probatio.Optional("user_input"): dict, } ) @websocket_api.async_response diff --git a/homeassistant/components/generic_hygrostat/__init__.py b/homeassistant/components/generic_hygrostat/__init__.py index 4686833a3da10..6fb27a00c5565 100644 --- a/homeassistant/components/generic_hygrostat/__init__.py +++ b/homeassistant/components/generic_hygrostat/__init__.py @@ -2,7 +2,7 @@ import logging -import voluptuous as vol +import probatio from homeassistant.components.humidifier import HumidifierDeviceClass from homeassistant.config_entries import ConfigEntry @@ -41,34 +41,42 @@ DEFAULT_TOLERANCE = 3 DEFAULT_NAME = "Generic Hygrostat" -HYGROSTAT_SCHEMA = vol.Schema( +HYGROSTAT_SCHEMA = probatio.Schema( { - vol.Required(CONF_HUMIDIFIER): cv.entity_id, - vol.Required(CONF_SENSOR): cv.entity_id, - vol.Optional(CONF_DEVICE_CLASS): vol.In( + probatio.Required(CONF_HUMIDIFIER): cv.entity_id, + probatio.Required(CONF_SENSOR): cv.entity_id, + probatio.Optional(CONF_DEVICE_CLASS): probatio.In( [HumidifierDeviceClass.HUMIDIFIER, HumidifierDeviceClass.DEHUMIDIFIER] ), - vol.Optional(CONF_MAX_HUMIDITY): vol.Coerce(float), - vol.Optional(CONF_MIN_DUR): vol.All(cv.time_period, cv.positive_timedelta), - vol.Optional(CONF_MIN_HUMIDITY): vol.Coerce(float), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_DRY_TOLERANCE, default=DEFAULT_TOLERANCE): vol.Coerce(float), - vol.Optional(CONF_WET_TOLERANCE, default=DEFAULT_TOLERANCE): vol.Coerce(float), - vol.Optional(CONF_TARGET_HUMIDITY): vol.Coerce(float), - vol.Optional(CONF_KEEP_ALIVE): vol.All(cv.time_period, cv.positive_timedelta), - vol.Optional(CONF_INITIAL_STATE): cv.boolean, - vol.Optional(CONF_AWAY_HUMIDITY): vol.Coerce(int), - vol.Optional(CONF_AWAY_FIXED): cv.boolean, - vol.Optional(CONF_STALE_DURATION): vol.All( + probatio.Optional(CONF_MAX_HUMIDITY): probatio.Coerce(float), + probatio.Optional(CONF_MIN_DUR): probatio.All( cv.time_period, cv.positive_timedelta ), - vol.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Optional(CONF_MIN_HUMIDITY): probatio.Coerce(float), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional( + CONF_DRY_TOLERANCE, default=DEFAULT_TOLERANCE + ): probatio.Coerce(float), + probatio.Optional( + CONF_WET_TOLERANCE, default=DEFAULT_TOLERANCE + ): probatio.Coerce(float), + probatio.Optional(CONF_TARGET_HUMIDITY): probatio.Coerce(float), + probatio.Optional(CONF_KEEP_ALIVE): probatio.All( + cv.time_period, cv.positive_timedelta + ), + probatio.Optional(CONF_INITIAL_STATE): cv.boolean, + probatio.Optional(CONF_AWAY_HUMIDITY): probatio.Coerce(int), + probatio.Optional(CONF_AWAY_FIXED): cv.boolean, + probatio.Optional(CONF_STALE_DURATION): probatio.All( + cv.time_period, cv.positive_timedelta + ), + probatio.Optional(CONF_UNIQUE_ID): cv.string, } ) -CONFIG_SCHEMA = vol.Schema( - {DOMAIN: vol.All(cv.ensure_list, [HYGROSTAT_SCHEMA])}, - extra=vol.ALLOW_EXTRA, +CONFIG_SCHEMA = probatio.Schema( + {DOMAIN: probatio.All(cv.ensure_list, [HYGROSTAT_SCHEMA])}, + extra=probatio.ALLOW_EXTRA, ) _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/generic_hygrostat/config_flow.py b/homeassistant/components/generic_hygrostat/config_flow.py index bdd4cb6942697..ca27cba02641d 100644 --- a/homeassistant/components/generic_hygrostat/config_flow.py +++ b/homeassistant/components/generic_hygrostat/config_flow.py @@ -3,7 +3,7 @@ from collections.abc import Mapping from typing import Any, cast, override -import voluptuous as vol +import probatio from homeassistant.components import fan, switch from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN, SensorDeviceClass @@ -25,18 +25,18 @@ ) OPTIONS_SCHEMA = { - vol.Required(CONF_DEVICE_CLASS): selector.DeviceClassSelector( + probatio.Required(CONF_DEVICE_CLASS): selector.DeviceClassSelector( selector.DeviceClassSelectorConfig(domain=Platform.HUMIDIFIER) ), - vol.Required(CONF_SENSOR): selector.EntitySelector( + probatio.Required(CONF_SENSOR): selector.EntitySelector( selector.EntitySelectorConfig( domain=SENSOR_DOMAIN, device_class=SensorDeviceClass.HUMIDITY ) ), - vol.Required(CONF_HUMIDIFIER): selector.EntitySelector( + probatio.Required(CONF_HUMIDIFIER): selector.EntitySelector( selector.EntitySelectorConfig(domain=[switch.DOMAIN, fan.DOMAIN]) ), - vol.Required( + probatio.Required( CONF_DRY_TOLERANCE, default=DEFAULT_TOLERANCE ): selector.NumberSelector( selector.NumberSelectorConfig( @@ -47,7 +47,7 @@ mode=selector.NumberSelectorMode.BOX, ) ), - vol.Required( + probatio.Required( CONF_WET_TOLERANCE, default=DEFAULT_TOLERANCE ): selector.NumberSelector( selector.NumberSelectorConfig( @@ -58,23 +58,23 @@ mode=selector.NumberSelectorMode.BOX, ) ), - vol.Optional(CONF_MIN_DUR): selector.DurationSelector( + probatio.Optional(CONF_MIN_DUR): selector.DurationSelector( selector.DurationSelectorConfig(allow_negative=False) ), } CONFIG_SCHEMA = { - vol.Required(CONF_NAME): selector.TextSelector(), + probatio.Required(CONF_NAME): selector.TextSelector(), **OPTIONS_SCHEMA, } CONFIG_FLOW = { - "user": SchemaFlowFormStep(vol.Schema(CONFIG_SCHEMA)), + "user": SchemaFlowFormStep(probatio.Schema(CONFIG_SCHEMA)), } OPTIONS_FLOW = { - "init": SchemaFlowFormStep(vol.Schema(OPTIONS_SCHEMA)), + "init": SchemaFlowFormStep(probatio.Schema(OPTIONS_SCHEMA)), } diff --git a/homeassistant/components/generic_thermostat/climate.py b/homeassistant/components/generic_thermostat/climate.py index 4f50a4d7df3f2..3f0013cb352b8 100644 --- a/homeassistant/components/generic_thermostat/climate.py +++ b/homeassistant/components/generic_thermostat/climate.py @@ -9,7 +9,7 @@ import time from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.climate import ( ATTR_HVAC_MODE, @@ -96,35 +96,39 @@ PRESETS_SCHEMA: VolDictType = { - vol.Optional(v): vol.Coerce(float) for v in CONF_PRESETS.values() + probatio.Optional(v): probatio.Coerce(float) for v in CONF_PRESETS.values() } -PLATFORM_SCHEMA_COMMON = vol.Schema( +PLATFORM_SCHEMA_COMMON = probatio.Schema( { - vol.Required(CONF_HEATER): cv.entity_id, - vol.Required(CONF_SENSOR): cv.entity_id, - vol.Optional(CONF_AC_MODE): cv.boolean, - vol.Optional(CONF_MAX_TEMP): vol.Coerce(float), - vol.Optional(CONF_MIN_DUR): cv.positive_time_period, - vol.Optional(CONF_MAX_DUR): cv.positive_time_period, - vol.Optional(CONF_DUR_COOLDOWN): cv.positive_time_period, - vol.Optional(CONF_MIN_TEMP): vol.Coerce(float), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_COLD_TOLERANCE, default=DEFAULT_TOLERANCE): vol.Coerce(float), - vol.Optional(CONF_HOT_TOLERANCE, default=DEFAULT_TOLERANCE): vol.Coerce(float), - vol.Optional(CONF_TARGET_TEMP): vol.Coerce(float), - vol.Optional(CONF_KEEP_ALIVE): cv.positive_time_period, - vol.Optional(CONF_INITIAL_HVAC_MODE): vol.In( + probatio.Required(CONF_HEATER): cv.entity_id, + probatio.Required(CONF_SENSOR): cv.entity_id, + probatio.Optional(CONF_AC_MODE): cv.boolean, + probatio.Optional(CONF_MAX_TEMP): probatio.Coerce(float), + probatio.Optional(CONF_MIN_DUR): cv.positive_time_period, + probatio.Optional(CONF_MAX_DUR): cv.positive_time_period, + probatio.Optional(CONF_DUR_COOLDOWN): cv.positive_time_period, + probatio.Optional(CONF_MIN_TEMP): probatio.Coerce(float), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional( + CONF_COLD_TOLERANCE, default=DEFAULT_TOLERANCE + ): probatio.Coerce(float), + probatio.Optional( + CONF_HOT_TOLERANCE, default=DEFAULT_TOLERANCE + ): probatio.Coerce(float), + probatio.Optional(CONF_TARGET_TEMP): probatio.Coerce(float), + probatio.Optional(CONF_KEEP_ALIVE): cv.positive_time_period, + probatio.Optional(CONF_INITIAL_HVAC_MODE): probatio.In( [HVACMode.COOL, HVACMode.HEAT, HVACMode.OFF] ), - vol.Optional(CONF_PRECISION): vol.All( - vol.Coerce(float), - vol.In([PRECISION_TENTHS, PRECISION_HALVES, PRECISION_WHOLE]), + probatio.Optional(CONF_PRECISION): probatio.All( + probatio.Coerce(float), + probatio.In([PRECISION_TENTHS, PRECISION_HALVES, PRECISION_WHOLE]), ), - vol.Optional(CONF_TEMP_STEP): vol.All( - vol.In([PRECISION_TENTHS, PRECISION_HALVES, PRECISION_WHOLE]) + probatio.Optional(CONF_TEMP_STEP): probatio.All( + probatio.In([PRECISION_TENTHS, PRECISION_HALVES, PRECISION_WHOLE]) ), - vol.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Optional(CONF_UNIQUE_ID): cv.string, **PRESETS_SCHEMA, } ) diff --git a/homeassistant/components/generic_thermostat/config_flow.py b/homeassistant/components/generic_thermostat/config_flow.py index b6c5c456b9ec7..e779fb368fa71 100644 --- a/homeassistant/components/generic_thermostat/config_flow.py +++ b/homeassistant/components/generic_thermostat/config_flow.py @@ -4,7 +4,7 @@ from datetime import timedelta from typing import Any, cast, override -import voluptuous as vol +import probatio from homeassistant.components import fan, switch from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN, SensorDeviceClass @@ -35,49 +35,49 @@ ) OPTIONS_SCHEMA = { - vol.Required(CONF_AC_MODE): selector.BooleanSelector( + probatio.Required(CONF_AC_MODE): selector.BooleanSelector( selector.BooleanSelectorConfig(), ), - vol.Required(CONF_SENSOR): selector.EntitySelector( + probatio.Required(CONF_SENSOR): selector.EntitySelector( selector.EntitySelectorConfig( domain=SENSOR_DOMAIN, device_class=SensorDeviceClass.TEMPERATURE ) ), - vol.Required(CONF_HEATER): selector.EntitySelector( + probatio.Required(CONF_HEATER): selector.EntitySelector( selector.EntitySelectorConfig(domain=[fan.DOMAIN, switch.DOMAIN]) ), - vol.Required( + probatio.Required( CONF_COLD_TOLERANCE, default=DEFAULT_TOLERANCE ): selector.NumberSelector( selector.NumberSelectorConfig( mode=selector.NumberSelectorMode.BOX, unit_of_measurement=DEGREE, step=0.1 ) ), - vol.Required( + probatio.Required( CONF_HOT_TOLERANCE, default=DEFAULT_TOLERANCE ): selector.NumberSelector( selector.NumberSelectorConfig( mode=selector.NumberSelectorMode.BOX, unit_of_measurement=DEGREE, step=0.1 ) ), - vol.Optional(CONF_MIN_DUR): selector.DurationSelector( + probatio.Optional(CONF_MIN_DUR): selector.DurationSelector( selector.DurationSelectorConfig(allow_negative=False) ), - vol.Optional(CONF_KEEP_ALIVE): selector.DurationSelector( + probatio.Optional(CONF_KEEP_ALIVE): selector.DurationSelector( selector.DurationSelectorConfig(allow_negative=False) ), - vol.Optional(CONF_MAX_DUR): selector.DurationSelector( + probatio.Optional(CONF_MAX_DUR): selector.DurationSelector( selector.DurationSelectorConfig(allow_negative=False) ), - vol.Optional(CONF_DUR_COOLDOWN): selector.DurationSelector( + probatio.Optional(CONF_DUR_COOLDOWN): selector.DurationSelector( selector.DurationSelectorConfig(allow_negative=False) ), - vol.Optional(CONF_MIN_TEMP): selector.NumberSelector( + probatio.Optional(CONF_MIN_TEMP): selector.NumberSelector( selector.NumberSelectorConfig( mode=selector.NumberSelectorMode.BOX, unit_of_measurement=DEGREE, step=0.1 ) ), - vol.Optional(CONF_MAX_TEMP): selector.NumberSelector( + probatio.Optional(CONF_MAX_TEMP): selector.NumberSelector( selector.NumberSelectorConfig( mode=selector.NumberSelectorMode.BOX, unit_of_measurement=DEGREE, step=0.1 ) @@ -85,7 +85,7 @@ } PRESETS_SCHEMA = { - vol.Optional(v): selector.NumberSelector( + probatio.Optional(v): selector.NumberSelector( selector.NumberSelectorConfig( mode=selector.NumberSelectorMode.BOX, unit_of_measurement=DEGREE, step=0.1 ) @@ -94,7 +94,7 @@ } CONFIG_SCHEMA = { - vol.Required(CONF_NAME): selector.TextSelector(), + probatio.Required(CONF_NAME): selector.TextSelector(), **OPTIONS_SCHEMA, } @@ -115,20 +115,20 @@ async def _validate_config( CONFIG_FLOW = { "user": SchemaFlowFormStep( - vol.Schema(CONFIG_SCHEMA), + probatio.Schema(CONFIG_SCHEMA), validate_user_input=_validate_config, next_step="presets", ), - "presets": SchemaFlowFormStep(vol.Schema(PRESETS_SCHEMA)), + "presets": SchemaFlowFormStep(probatio.Schema(PRESETS_SCHEMA)), } OPTIONS_FLOW = { "init": SchemaFlowFormStep( - vol.Schema(OPTIONS_SCHEMA), + probatio.Schema(OPTIONS_SCHEMA), validate_user_input=_validate_config, next_step="presets", ), - "presets": SchemaFlowFormStep(vol.Schema(PRESETS_SCHEMA)), + "presets": SchemaFlowFormStep(probatio.Schema(PRESETS_SCHEMA)), } diff --git a/homeassistant/components/geniushub/config_flow.py b/homeassistant/components/geniushub/config_flow.py index 121892ec3efb7..6a999ef2e3958 100644 --- a/homeassistant/components/geniushub/config_flow.py +++ b/homeassistant/components/geniushub/config_flow.py @@ -7,7 +7,7 @@ import aiohttp from geniushubclient import GeniusService -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_TOKEN, CONF_USERNAME @@ -17,18 +17,18 @@ _LOGGER = logging.getLogger(__name__) -CLOUD_API_SCHEMA = vol.Schema( +CLOUD_API_SCHEMA = probatio.Schema( { - vol.Required(CONF_TOKEN): str, + probatio.Required(CONF_TOKEN): str, } ) -LOCAL_API_SCHEMA = vol.Schema( +LOCAL_API_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/geniushub/services.py b/homeassistant/components/geniushub/services.py index f21b0bd2276fa..621b7eb8d6cff 100644 --- a/homeassistant/components/geniushub/services.py +++ b/homeassistant/components/geniushub/services.py @@ -2,7 +2,7 @@ from datetime import timedelta -import voluptuous as vol +import probatio from homeassistant.components.climate import DOMAIN as CLIMATE_DOMAIN from homeassistant.const import ATTR_ENTITY_ID, ATTR_TEMPERATURE @@ -20,21 +20,21 @@ SVC_SET_ZONE_OVERRIDE, ) -SET_ZONE_MODE_SCHEMA = vol.Schema( +SET_ZONE_MODE_SCHEMA = probatio.Schema( { - vol.Required(ATTR_ENTITY_ID): cv.entity_id, - vol.Required(ATTR_ZONE_MODE): vol.In(["off", "timer", "footprint"]), + probatio.Required(ATTR_ENTITY_ID): cv.entity_id, + probatio.Required(ATTR_ZONE_MODE): probatio.In(["off", "timer", "footprint"]), } ) -SET_ZONE_OVERRIDE_SCHEMA = vol.Schema( +SET_ZONE_OVERRIDE_SCHEMA = probatio.Schema( { - vol.Required(ATTR_ENTITY_ID): cv.entity_id, - vol.Required(ATTR_TEMPERATURE): vol.All( - vol.Coerce(float), vol.Range(min=4, max=28) + probatio.Required(ATTR_ENTITY_ID): cv.entity_id, + probatio.Required(ATTR_TEMPERATURE): probatio.All( + probatio.Coerce(float), probatio.Range(min=4, max=28) ), - vol.Optional(ATTR_DURATION): vol.All( + probatio.Optional(ATTR_DURATION): probatio.All( cv.time_period, - vol.Range(min=timedelta(minutes=5), max=timedelta(days=1)), + probatio.Range(min=timedelta(minutes=5), max=timedelta(days=1)), ), } ) diff --git a/homeassistant/components/geniushub/switch.py b/homeassistant/components/geniushub/switch.py index d22ec6c6c8334..d24c699d96b4e 100644 --- a/homeassistant/components/geniushub/switch.py +++ b/homeassistant/components/geniushub/switch.py @@ -3,7 +3,7 @@ from datetime import timedelta from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.switch import SwitchDeviceClass, SwitchEntity from homeassistant.core import HomeAssistant @@ -20,9 +20,9 @@ SVC_SET_SWITCH_OVERRIDE = "set_switch_override" SET_SWITCH_OVERRIDE_SCHEMA: VolDictType = { - vol.Optional(ATTR_DURATION): vol.All( + probatio.Optional(ATTR_DURATION): probatio.All( cv.time_period, - vol.Range(min=timedelta(minutes=5), max=timedelta(days=1)), + probatio.Range(min=timedelta(minutes=5), max=timedelta(days=1)), ), } diff --git a/homeassistant/components/gentex_homelink/config_flow.py b/homeassistant/components/gentex_homelink/config_flow.py index 208e5c55e22d5..38681ed513034 100644 --- a/homeassistant/components/gentex_homelink/config_flow.py +++ b/homeassistant/components/gentex_homelink/config_flow.py @@ -7,7 +7,7 @@ import botocore.exceptions from homelink.auth.srp_auth import SRPAuth import jwt -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlowResult from homeassistant.const import CONF_EMAIL, CONF_PASSWORD, CONF_UNIQUE_ID @@ -70,8 +70,11 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_EMAIL): str, vol.Required(CONF_PASSWORD): str} + data_schema=probatio.Schema( + { + probatio.Required(CONF_EMAIL): str, + probatio.Required(CONF_PASSWORD): str, + } ), errors=errors, ) @@ -89,8 +92,11 @@ async def async_step_reauth_confirm( if user_input is None: return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( - {vol.Required(CONF_EMAIL): str, vol.Required(CONF_PASSWORD): str} + data_schema=probatio.Schema( + { + probatio.Required(CONF_EMAIL): str, + probatio.Required(CONF_PASSWORD): str, + } ), ) return await self.async_step_user(user_input) diff --git a/homeassistant/components/geo_json_events/config_flow.py b/homeassistant/components/geo_json_events/config_flow.py index 5c638c3bff011..845ca23a99501 100644 --- a/homeassistant/components/geo_json_events/config_flow.py +++ b/homeassistant/components/geo_json_events/config_flow.py @@ -3,7 +3,7 @@ from collections.abc import Mapping from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -19,10 +19,10 @@ from .const import DEFAULT_RADIUS_IN_M, DOMAIN -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_URL): cv.string, - vol.Required(CONF_LOCATION): selector.LocationSelector( + probatio.Required(CONF_URL): cv.string, + probatio.Required(CONF_LOCATION): selector.LocationSelector( selector.LocationSelectorConfig(radius=True, icon="") ), } diff --git a/homeassistant/components/geo_location/trigger.py b/homeassistant/components/geo_location/trigger.py index 500ce5745c24a..c461b1f48fe68 100644 --- a/homeassistant/components/geo_location/trigger.py +++ b/homeassistant/components/geo_location/trigger.py @@ -3,7 +3,7 @@ import logging from typing import Final -import voluptuous as vol +import probatio from homeassistant.components.zone import condition as zone_condition from homeassistant.const import CONF_EVENT, CONF_PLATFORM, CONF_SOURCE, CONF_ZONE @@ -33,10 +33,10 @@ TRIGGER_SCHEMA = cv.TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_PLATFORM): "geo_location", - vol.Required(CONF_SOURCE): cv.string, - vol.Required(CONF_ZONE): entity_domain("zone"), - vol.Required(CONF_EVENT, default=DEFAULT_EVENT): vol.Any( + probatio.Required(CONF_PLATFORM): "geo_location", + probatio.Required(CONF_SOURCE): cv.string, + probatio.Required(CONF_ZONE): entity_domain("zone"), + probatio.Required(CONF_EVENT, default=DEFAULT_EVENT): probatio.Any( EVENT_ENTER, EVENT_LEAVE ), } diff --git a/homeassistant/components/geo_rss_events/sensor.py b/homeassistant/components/geo_rss_events/sensor.py index 959093c279e77..6690bc1353979 100644 --- a/homeassistant/components/geo_rss_events/sensor.py +++ b/homeassistant/components/geo_rss_events/sensor.py @@ -10,7 +10,7 @@ from georss_client import UPDATE_OK, UPDATE_OK_NO_DATA from georss_generic_client import GenericFeed -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -48,13 +48,17 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_URL): cv.string, - vol.Optional(CONF_LATITUDE): cv.latitude, - vol.Optional(CONF_LONGITUDE): cv.longitude, - vol.Optional(CONF_RADIUS, default=DEFAULT_RADIUS_IN_KM): vol.Coerce(float), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_CATEGORIES, default=[]): vol.All(cv.ensure_list, [cv.string]), - vol.Optional( + probatio.Required(CONF_URL): cv.string, + probatio.Optional(CONF_LATITUDE): cv.latitude, + probatio.Optional(CONF_LONGITUDE): cv.longitude, + probatio.Optional(CONF_RADIUS, default=DEFAULT_RADIUS_IN_KM): probatio.Coerce( + float + ), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_CATEGORIES, default=[]): probatio.All( + cv.ensure_list, [cv.string] + ), + probatio.Optional( CONF_UNIT_OF_MEASUREMENT, default=DEFAULT_UNIT_OF_MEASUREMENT ): cv.string, } diff --git a/homeassistant/components/geofency/__init__.py b/homeassistant/components/geofency/__init__.py index 6ced8af8bc6a6..f5c4e7021cc07 100644 --- a/homeassistant/components/geofency/__init__.py +++ b/homeassistant/components/geofency/__init__.py @@ -3,7 +3,7 @@ from http import HTTPStatus from aiohttp import web -import voluptuous as vol +import probatio from homeassistant.components import webhook from homeassistant.config_entries import ConfigEntry @@ -30,17 +30,17 @@ CONF_MOBILE_BEACONS = "mobile_beacons" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Optional(DOMAIN): vol.Schema( + probatio.Optional(DOMAIN): probatio.Schema( { - vol.Optional(CONF_MOBILE_BEACONS, default=[]): vol.All( + probatio.Optional(CONF_MOBILE_BEACONS, default=[]): probatio.All( cv.ensure_list, [cv.string] ) } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) ATTR_ADDRESS = "address" @@ -63,19 +63,19 @@ def _address(value: str) -> str: return value.replace("\n", " ") -WEBHOOK_SCHEMA = vol.Schema( +WEBHOOK_SCHEMA = probatio.Schema( { - vol.Required(ATTR_ADDRESS): vol.All(cv.string, _address), - vol.Required(ATTR_DEVICE): vol.All(cv.string, slugify), - vol.Required(ATTR_ENTRY): vol.Any(LOCATION_ENTRY, LOCATION_EXIT), - vol.Required(ATTR_LATITUDE): cv.latitude, - vol.Required(ATTR_LONGITUDE): cv.longitude, - vol.Required(ATTR_NAME): vol.All(cv.string, slugify), - vol.Optional(ATTR_CURRENT_LATITUDE): cv.latitude, - vol.Optional(ATTR_CURRENT_LONGITUDE): cv.longitude, - vol.Optional(ATTR_BEACON_ID): cv.string, + probatio.Required(ATTR_ADDRESS): probatio.All(cv.string, _address), + probatio.Required(ATTR_DEVICE): probatio.All(cv.string, slugify), + probatio.Required(ATTR_ENTRY): probatio.Any(LOCATION_ENTRY, LOCATION_EXIT), + probatio.Required(ATTR_LATITUDE): cv.latitude, + probatio.Required(ATTR_LONGITUDE): cv.longitude, + probatio.Required(ATTR_NAME): probatio.All(cv.string, slugify), + probatio.Optional(ATTR_CURRENT_LATITUDE): cv.latitude, + probatio.Optional(ATTR_CURRENT_LONGITUDE): cv.longitude, + probatio.Optional(ATTR_BEACON_ID): cv.string, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) _DATA_GEOFENCY: HassKey[list[str]] = HassKey(DOMAIN) @@ -94,7 +94,7 @@ async def handle_webhook( """Handle incoming webhook from Geofency.""" try: data = WEBHOOK_SCHEMA(dict(await request.post())) - except vol.MultipleInvalid as error: + except probatio.MultipleInvalid as error: return web.Response( text=error.error_message, status=HTTPStatus.UNPROCESSABLE_ENTITY ) diff --git a/homeassistant/components/geonetnz_quakes/__init__.py b/homeassistant/components/geonetnz_quakes/__init__.py index a1522862dca08..ddff671cd66a8 100644 --- a/homeassistant/components/geonetnz_quakes/__init__.py +++ b/homeassistant/components/geonetnz_quakes/__init__.py @@ -4,7 +4,7 @@ import logging from aio_geojson_geonetnz_quakes import GeonetnzQuakesFeedManager -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry from homeassistant.const import ( @@ -36,26 +36,28 @@ _LOGGER = logging.getLogger(__name__) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Inclusive(CONF_LATITUDE, "coordinates"): cv.latitude, - vol.Inclusive(CONF_LONGITUDE, "coordinates"): cv.longitude, - vol.Optional(CONF_MMI, default=DEFAULT_MMI): vol.All( - vol.Coerce(int), vol.Range(min=-1, max=8) + probatio.Inclusive(CONF_LATITUDE, "coordinates"): cv.latitude, + probatio.Inclusive(CONF_LONGITUDE, "coordinates"): cv.longitude, + probatio.Optional(CONF_MMI, default=DEFAULT_MMI): probatio.All( + probatio.Coerce(int), probatio.Range(min=-1, max=8) ), - vol.Optional(CONF_RADIUS, default=DEFAULT_RADIUS): vol.Coerce(float), - vol.Optional( + probatio.Optional(CONF_RADIUS, default=DEFAULT_RADIUS): probatio.Coerce( + float + ), + probatio.Optional( CONF_MINIMUM_MAGNITUDE, default=DEFAULT_MINIMUM_MAGNITUDE ): cv.positive_float, - vol.Optional( + probatio.Optional( CONF_SCAN_INTERVAL, default=DEFAULT_SCAN_INTERVAL ): cv.time_period, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) type GeonetnzQuakesConfigEntry = ConfigEntry[GeonetnzQuakesFeedEntityManager] diff --git a/homeassistant/components/geonetnz_quakes/config_flow.py b/homeassistant/components/geonetnz_quakes/config_flow.py index 751e7f918c023..6232735bd7625 100644 --- a/homeassistant/components/geonetnz_quakes/config_flow.py +++ b/homeassistant/components/geonetnz_quakes/config_flow.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -24,12 +24,12 @@ DOMAIN, ) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Optional(CONF_MMI, default=DEFAULT_MMI): vol.All( - vol.Coerce(int), vol.Range(min=-1, max=8) + probatio.Optional(CONF_MMI, default=DEFAULT_MMI): probatio.All( + probatio.Coerce(int), probatio.Range(min=-1, max=8) ), - vol.Optional(CONF_RADIUS, default=DEFAULT_RADIUS): cv.positive_int, + probatio.Optional(CONF_RADIUS, default=DEFAULT_RADIUS): cv.positive_int, } ) diff --git a/homeassistant/components/geonetnz_volcano/__init__.py b/homeassistant/components/geonetnz_volcano/__init__.py index 380ea31d85251..99a75ec1b43a6 100644 --- a/homeassistant/components/geonetnz_volcano/__init__.py +++ b/homeassistant/components/geonetnz_volcano/__init__.py @@ -4,7 +4,7 @@ import logging from aio_geojson_geonetnz_volcano import GeonetnzVolcanoFeedManager -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry from homeassistant.const import ( @@ -33,20 +33,22 @@ _LOGGER = logging.getLogger(__name__) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Optional(CONF_LATITUDE): cv.latitude, - vol.Optional(CONF_LONGITUDE): cv.longitude, - vol.Optional(CONF_RADIUS, default=DEFAULT_RADIUS): vol.Coerce(float), - vol.Optional( + probatio.Optional(CONF_LATITUDE): cv.latitude, + probatio.Optional(CONF_LONGITUDE): cv.longitude, + probatio.Optional(CONF_RADIUS, default=DEFAULT_RADIUS): probatio.Coerce( + float + ), + probatio.Optional( CONF_SCAN_INTERVAL, default=DEFAULT_SCAN_INTERVAL ): cv.time_period, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) type GeonetnzVolcanoConfigEntry = ConfigEntry[GeonetnzVolcanoFeedEntityManager] diff --git a/homeassistant/components/geonetnz_volcano/config_flow.py b/homeassistant/components/geonetnz_volcano/config_flow.py index e52607820f227..3a027fee113de 100644 --- a/homeassistant/components/geonetnz_volcano/config_flow.py +++ b/homeassistant/components/geonetnz_volcano/config_flow.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -39,8 +39,8 @@ class GeonetnzVolcanoFlowHandler(ConfigFlow, domain=DOMAIN): async def _show_form(self, errors=None): """Show the form to the user.""" - data_schema = vol.Schema( - {vol.Optional(CONF_RADIUS, default=DEFAULT_RADIUS): cv.positive_int} + data_schema = probatio.Schema( + {probatio.Optional(CONF_RADIUS, default=DEFAULT_RADIUS): cv.positive_int} ) return self.async_show_form( diff --git a/homeassistant/components/geosphere_austria_warnings/config_flow.py b/homeassistant/components/geosphere_austria_warnings/config_flow.py index 34e2f62af8550..3cb4255691384 100644 --- a/homeassistant/components/geosphere_austria_warnings/config_flow.py +++ b/homeassistant/components/geosphere_austria_warnings/config_flow.py @@ -2,13 +2,13 @@ from typing import Any, override +import probatio from pygeosphere_warnings import ( GeoSphereMunicipalityNotFoundError, GeoSphereWarningsClient, GeoSphereWarningsError, Municipality, ) -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_LATITUDE, CONF_LOCATION, CONF_LONGITUDE @@ -19,11 +19,11 @@ from .const import DOMAIN, LOGGER -def _build_schema(hass: HomeAssistant) -> vol.Schema: +def _build_schema(hass: HomeAssistant) -> probatio.Schema: """Return the user step schema defaulting to the Home Assistant location.""" - return vol.Schema( + return probatio.Schema( { - vol.Required( + probatio.Required( CONF_LOCATION, default={ CONF_LATITUDE: hass.config.latitude, diff --git a/homeassistant/components/ghost/config_flow.py b/homeassistant/components/ghost/config_flow.py index 007cb3ec2e5fd..12796168df5b0 100644 --- a/homeassistant/components/ghost/config_flow.py +++ b/homeassistant/components/ghost/config_flow.py @@ -6,7 +6,7 @@ from aioghost import GhostAdminAPI from aioghost.exceptions import GhostAuthError, GhostError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.helpers.aiohttp_client import async_get_clientsession @@ -17,16 +17,16 @@ GHOST_INTEGRATION_SETUP_URL = "https://account.ghost.org/?r=settings/integrations/new" -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_URL): str, - vol.Required(CONF_ADMIN_API_KEY): str, + probatio.Required(CONF_API_URL): str, + probatio.Required(CONF_ADMIN_API_KEY): str, } ) -STEP_REAUTH_DATA_SCHEMA = vol.Schema( +STEP_REAUTH_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_ADMIN_API_KEY): str, + probatio.Required(CONF_ADMIN_API_KEY): str, } ) diff --git a/homeassistant/components/gios/config_flow.py b/homeassistant/components/gios/config_flow.py index fdd6d4f454952..e79c5e48e2702 100644 --- a/homeassistant/components/gios/config_flow.py +++ b/homeassistant/components/gios/config_flow.py @@ -5,7 +5,7 @@ from aiohttp.client_exceptions import ClientConnectorError from gios import ApiError, Gios, InvalidSensorsDataError, NoStationError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_NAME @@ -74,9 +74,9 @@ async def async_step_user( for station in gios.measurement_stations.values() ] - schema: vol.Schema = vol.Schema( + schema: probatio.Schema = probatio.Schema( { - vol.Required(CONF_STATION_ID): SelectSelector( + probatio.Required(CONF_STATION_ID): SelectSelector( SelectSelectorConfig( options=options, sort=True, diff --git a/homeassistant/components/github/config_flow.py b/homeassistant/components/github/config_flow.py index de065735aebc2..76ea46ae94d56 100644 --- a/homeassistant/components/github/config_flow.py +++ b/homeassistant/components/github/config_flow.py @@ -11,7 +11,7 @@ GitHubLoginOauthModel, ) from aiogithubapi.const import OAUTH_USER_LOGIN -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -227,9 +227,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_REPOSITORY): SelectSelector( + probatio.Required(CONF_REPOSITORY): SelectSelector( SelectSelectorConfig(sort=True, options=repositories) ), } diff --git a/homeassistant/components/gitlab_ci/sensor.py b/homeassistant/components/gitlab_ci/sensor.py index e03b125f3a614..a5ea3bd7ce17e 100644 --- a/homeassistant/components/gitlab_ci/sensor.py +++ b/homeassistant/components/gitlab_ci/sensor.py @@ -5,7 +5,7 @@ from typing import override from gitlab import Gitlab, GitlabAuthenticationError, GitlabGetError -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -43,10 +43,10 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_GITLAB_ID): cv.string, - vol.Required(CONF_TOKEN): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_URL, default=DEFAULT_URL): cv.string, + probatio.Required(CONF_GITLAB_ID): cv.string, + probatio.Required(CONF_TOKEN): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_URL, default=DEFAULT_URL): cv.string, } ) diff --git a/homeassistant/components/glances/config_flow.py b/homeassistant/components/glances/config_flow.py index 203b959e21305..20738ee927176 100644 --- a/homeassistant/components/glances/config_flow.py +++ b/homeassistant/components/glances/config_flow.py @@ -7,7 +7,7 @@ GlancesApiAuthorizationError, GlancesApiConnectionError, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -22,14 +22,14 @@ from . import ServerVersionMismatch, get_api from .const import DEFAULT_HOST, DEFAULT_PORT, DOMAIN -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST, default=DEFAULT_HOST): str, - vol.Optional(CONF_USERNAME): str, - vol.Optional(CONF_PASSWORD): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, - vol.Optional(CONF_SSL, default=False): bool, - vol.Optional(CONF_VERIFY_SSL, default=False): bool, + probatio.Required(CONF_HOST, default=DEFAULT_HOST): str, + probatio.Optional(CONF_USERNAME): str, + probatio.Optional(CONF_PASSWORD): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Optional(CONF_SSL, default=False): bool, + probatio.Optional(CONF_VERIFY_SSL, default=False): bool, } ) @@ -70,9 +70,9 @@ async def async_step_reauth_confirm( return self.async_show_form( description_placeholders={CONF_USERNAME: reauth_entry.data[CONF_USERNAME]}, step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, diff --git a/homeassistant/components/go2rtc/__init__.py b/homeassistant/components/go2rtc/__init__.py index 9a8604e449d29..8ab40c0fd2a2d 100644 --- a/homeassistant/components/go2rtc/__init__.py +++ b/homeassistant/components/go2rtc/__init__.py @@ -20,7 +20,7 @@ WebRTCOffer, WsError, ) -import voluptuous as vol +import probatio from webrtc_models import RTCIceCandidateInit from homeassistant.components.camera import ( @@ -80,10 +80,12 @@ def _validate_auth(config: dict) -> dict: debug_ui_enabled = config.get(CONF_DEBUG_UI, False) if debug_ui_enabled and not auth_exists: - raise vol.Invalid("Username and password must be set when debug_ui is true") + raise probatio.Invalid( + "Username and password must be set when debug_ui is true" + ) if auth_exists and CONF_URL not in config and not debug_ui_enabled: - raise vol.Invalid( + raise probatio.Invalid( "Username and password can only be set when a URL is" " configured or debug_ui is true" ) @@ -91,27 +93,27 @@ def _validate_auth(config: dict) -> dict: return config -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.All( - vol.Schema( + DOMAIN: probatio.All( + probatio.Schema( { - vol.Exclusive(CONF_URL, DOMAIN, DEBUG_UI_URL_MESSAGE): cv.url, - vol.Exclusive( + probatio.Exclusive(CONF_URL, DOMAIN, DEBUG_UI_URL_MESSAGE): cv.url, + probatio.Exclusive( CONF_DEBUG_UI, DOMAIN, DEBUG_UI_URL_MESSAGE ): cv.boolean, - vol.Inclusive(CONF_USERNAME, _AUTH): vol.All( - cv.string, vol.Length(min=1) + probatio.Inclusive(CONF_USERNAME, _AUTH): probatio.All( + cv.string, probatio.Length(min=1) ), - vol.Inclusive(CONF_PASSWORD, _AUTH): vol.All( - cv.string, vol.Length(min=1) + probatio.Inclusive(CONF_PASSWORD, _AUTH): probatio.All( + cv.string, probatio.Length(min=1) ), } ), _validate_auth, ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) _DATA_GO2RTC: HassKey[Go2RtcConfig] = HassKey(DOMAIN) diff --git a/homeassistant/components/goalzero/config_flow.py b/homeassistant/components/goalzero/config_flow.py index 1257d677321f0..27e45c9e81c68 100644 --- a/homeassistant/components/goalzero/config_flow.py +++ b/homeassistant/components/goalzero/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from goalzero import Yeti, exceptions -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_NAME @@ -87,14 +87,14 @@ async def async_step_user( user_input = user_input or {} return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_HOST, default=user_input.get(CONF_HOST) or "" ): str, # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Optional( + probatio.Optional( CONF_NAME, default=user_input.get(CONF_NAME) or DEFAULT_NAME ): str, } diff --git a/homeassistant/components/gogogate2/config_flow.py b/homeassistant/components/gogogate2/config_flow.py index d01933da22bcb..eb40465137dfb 100644 --- a/homeassistant/components/gogogate2/config_flow.py +++ b/homeassistant/components/gogogate2/config_flow.py @@ -7,7 +7,7 @@ from ismartgate.common import AbstractInfoResponse, ApiError from ismartgate.const import GogoGate2ApiErrorCode, ISmartGateApiErrorCode -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -131,21 +131,21 @@ async def async_step_user( } return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_DEVICE, default=self._device_type or user_input.get(CONF_DEVICE, DEVICE_TYPE_GOGOGATE2), - ): vol.In((DEVICE_TYPE_GOGOGATE2, DEVICE_TYPE_ISMARTGATE)), - vol.Required( + ): probatio.In((DEVICE_TYPE_GOGOGATE2, DEVICE_TYPE_ISMARTGATE)), + probatio.Required( CONF_IP_ADDRESS, default=user_input.get(CONF_IP_ADDRESS, self._ip_address), ): str, - vol.Required( + probatio.Required( CONF_USERNAME, default=user_input.get(CONF_USERNAME, "") ): str, - vol.Required( + probatio.Required( CONF_PASSWORD, default=user_input.get(CONF_PASSWORD, "") ): str, } diff --git a/homeassistant/components/goodwe/config_flow.py b/homeassistant/components/goodwe/config_flow.py index 301c6cf8baf08..15bda36c7334f 100644 --- a/homeassistant/components/goodwe/config_flow.py +++ b/homeassistant/components/goodwe/config_flow.py @@ -5,16 +5,16 @@ from goodwe import Inverter, InverterError, connect from goodwe.const import GOODWE_TCP_PORT, GOODWE_UDP_PORT -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PORT from .const import CONF_MODEL_FAMILY, DEFAULT_NAME, DOMAIN -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, + probatio.Required(CONF_HOST): str, } ) diff --git a/homeassistant/components/google/__init__.py b/homeassistant/components/google/__init__.py index c0e32f4f3c38d..15c904cf41c07 100644 --- a/homeassistant/components/google/__init__.py +++ b/homeassistant/components/google/__init__.py @@ -8,7 +8,7 @@ from gcal_sync.api import GoogleCalendarService from gcal_sync.exceptions import ApiException, AuthException -import voluptuous as vol +import probatio import yaml from homeassistant.const import ( @@ -47,32 +47,32 @@ PLATFORMS = [Platform.CALENDAR] -CONFIG_SCHEMA = vol.Schema(cv.removed(DOMAIN), extra=vol.ALLOW_EXTRA) +CONFIG_SCHEMA = probatio.Schema(cv.removed(DOMAIN), extra=probatio.ALLOW_EXTRA) -_SINGLE_CALSEARCH_CONFIG = vol.All( +_SINGLE_CALSEARCH_CONFIG = probatio.All( cv.deprecated(CONF_MAX_RESULTS), - vol.Schema( + probatio.Schema( { - vol.Required(CONF_NAME): cv.string, - vol.Required(CONF_DEVICE_ID): cv.string, - vol.Optional(CONF_IGNORE_AVAILABILITY, default=True): cv.boolean, - vol.Optional(CONF_OFFSET): cv.string, - vol.Optional(CONF_SEARCH): cv.string, - vol.Optional(CONF_TRACK): cv.boolean, - vol.Optional(CONF_MAX_RESULTS): cv.positive_int, # Now unused + probatio.Required(CONF_NAME): cv.string, + probatio.Required(CONF_DEVICE_ID): cv.string, + probatio.Optional(CONF_IGNORE_AVAILABILITY, default=True): cv.boolean, + probatio.Optional(CONF_OFFSET): cv.string, + probatio.Optional(CONF_SEARCH): cv.string, + probatio.Optional(CONF_TRACK): cv.boolean, + probatio.Optional(CONF_MAX_RESULTS): cv.positive_int, # Now unused } ), ) -DEVICE_SCHEMA = vol.Schema( +DEVICE_SCHEMA = probatio.Schema( { - vol.Required(CONF_CAL_ID): cv.string, - vol.Required(CONF_ENTITIES, None): vol.All( + probatio.Required(CONF_CAL_ID): cv.string, + probatio.Required(CONF_ENTITIES, None): probatio.All( cv.ensure_list, [_SINGLE_CALSEARCH_CONFIG] ), }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) @@ -82,7 +82,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: GoogleConfigEntry) -> bo # helpful error messages. try: await hass.async_add_executor_job(load_config, hass.config.path(YAML_DEVICES)) - except vol.Invalid as err: + except probatio.Invalid as err: _LOGGER.error("Configuration error in %s: %s", YAML_DEVICES, str(err)) return False diff --git a/homeassistant/components/google/config_flow.py b/homeassistant/components/google/config_flow.py index c7ee25f4869cb..e730951f4d431 100644 --- a/homeassistant/components/google/config_flow.py +++ b/homeassistant/components/google/config_flow.py @@ -7,7 +7,7 @@ from gcal_sync.api import GoogleCalendarService from gcal_sync.exceptions import ApiException, ApiForbiddenException -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -268,12 +268,12 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_CALENDAR_ACCESS, default=self.config_entry.options.get(CONF_CALENDAR_ACCESS), - ): vol.In( + ): probatio.In( { "read_write": "Read/Write access (can create events)", "read_only": "Read-only access", diff --git a/homeassistant/components/google_air_quality/config_flow.py b/homeassistant/components/google_air_quality/config_flow.py index 70a955dfa54d1..203f4131fca3e 100644 --- a/homeassistant/components/google_air_quality/config_flow.py +++ b/homeassistant/components/google_air_quality/config_flow.py @@ -10,7 +10,7 @@ InvalidCustomLAQIConfigurationError, ) from google_air_quality_api.mapping import AQICategoryMapping -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -54,11 +54,11 @@ "https://developers.google.com/maps/documentation/air-quality/coverage" ) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_KEY): str, - vol.Optional(SECTION_API_KEY_OPTIONS): section( - vol.Schema({vol.Optional(CONF_REFERRER): str}), + probatio.Required(CONF_API_KEY): str, + probatio.Optional(SECTION_API_KEY_OPTIONS): section( + probatio.Schema({probatio.Optional(CONF_REFERRER): str}), SectionConfig(collapsed=True), ), } @@ -108,28 +108,28 @@ async def _validate_input( return False -def _get_location_schema(hass: HomeAssistant) -> vol.Schema: +def _get_location_schema(hass: HomeAssistant) -> probatio.Schema: """Return the schema for a location with default values from the hass config.""" - return vol.Schema( + return probatio.Schema( { # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Required(CONF_NAME, default=hass.config.location_name): str, - vol.Required( + probatio.Required(CONF_NAME, default=hass.config.location_name): str, + probatio.Required( CONF_LOCATION, default={ CONF_LATITUDE: hass.config.latitude, CONF_LONGITUDE: hass.config.longitude, }, ): LocationSelector(LocationSelectorConfig(radius=False)), - vol.Optional(CUSTOM_LOCAL_AQI_OPTIONS): section( - vol.Schema( + probatio.Optional(CUSTOM_LOCAL_AQI_OPTIONS): section( + probatio.Schema( { - vol.Required(CONF_ENABLE_CUSTOM_LAQI, default=False): bool, - vol.Optional( + probatio.Required(CONF_ENABLE_CUSTOM_LAQI, default=False): bool, + probatio.Optional( CONF_COUNTRY, default=hass.config.country ): CountrySelector(), - vol.Optional(CUSTOM_LAQI): SelectSelector( + probatio.Optional(CUSTOM_LAQI): SelectSelector( SelectSelectorConfig( options=sorted( AQICategoryMapping.get_all_laq_indices() @@ -225,7 +225,7 @@ async def async_step_user( return self.async_show_form( step_id="user", data_schema=self.add_suggested_values_to_schema( - vol.Schema(schema), user_input + probatio.Schema(schema), user_input ), errors=errors, description_placeholders=description_placeholders, diff --git a/homeassistant/components/google_air_quality/services.py b/homeassistant/components/google_air_quality/services.py index 460c57d86bb80..18b79cbd089ef 100644 --- a/homeassistant/components/google_air_quality/services.py +++ b/homeassistant/components/google_air_quality/services.py @@ -4,7 +4,7 @@ from typing import Final, cast from google_air_quality_api.exceptions import GoogleAirQualityApiError -import voluptuous as vol +import probatio from homeassistant.const import ATTR_DEVICE_ID from homeassistant.core import ( @@ -26,11 +26,13 @@ SERVICE_GET_FORECAST: Final = "get_forecast" -SERVICE_GET_FORECAST_SCHEMA: Final = vol.Schema( +SERVICE_GET_FORECAST_SCHEMA: Final = probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): selector.DeviceSelector({"integration": DOMAIN}), - vol.Required(ATTR_HOURS): vol.All( - vol.Coerce(int), vol.Range(min=1, max=FORECAST_HOURS_MAX) + probatio.Required(ATTR_DEVICE_ID): selector.DeviceSelector( + {"integration": DOMAIN} + ), + probatio.Required(ATTR_HOURS): probatio.All( + probatio.Coerce(int), probatio.Range(min=1, max=FORECAST_HOURS_MAX) ), } ) diff --git a/homeassistant/components/google_assistant/__init__.py b/homeassistant/components/google_assistant/__init__.py index e0ec33c7a0be0..d2059a498a39c 100644 --- a/homeassistant/components/google_assistant/__init__.py +++ b/homeassistant/components/google_assistant/__init__.py @@ -1,7 +1,7 @@ """Support for Actions on Google Assistant Smart Home Control.""" # pylint: disable=home-assistant-use-runtime-data # Uses legacy hass.data[DOMAIN] pattern -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry from homeassistant.const import CONF_API_KEY, CONF_NAME, Platform @@ -38,56 +38,58 @@ PLATFORMS = [Platform.BUTTON] -ENTITY_SCHEMA = vol.Schema( +ENTITY_SCHEMA = probatio.Schema( { - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_EXPOSE, default=True): cv.boolean, - vol.Optional(CONF_ALIASES): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(CONF_ROOM_HINT): cv.string, + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_EXPOSE, default=True): cv.boolean, + probatio.Optional(CONF_ALIASES): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(CONF_ROOM_HINT): cv.string, } ) -GOOGLE_SERVICE_ACCOUNT = vol.Schema( +GOOGLE_SERVICE_ACCOUNT = probatio.Schema( { - vol.Required(CONF_PRIVATE_KEY): cv.string, - vol.Required(CONF_CLIENT_EMAIL): cv.string, + probatio.Required(CONF_PRIVATE_KEY): cv.string, + probatio.Required(CONF_CLIENT_EMAIL): cv.string, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) def _check_report_state(data): if data[CONF_REPORT_STATE] and CONF_SERVICE_ACCOUNT not in data: - raise vol.Invalid("If report state is enabled, a service account must exist") + raise probatio.Invalid( + "If report state is enabled, a service account must exist" + ) return data -GOOGLE_ASSISTANT_SCHEMA = vol.All( - vol.Schema( +GOOGLE_ASSISTANT_SCHEMA = probatio.All( + probatio.Schema( { - vol.Required(CONF_PROJECT_ID): cv.string, - vol.Optional( + probatio.Required(CONF_PROJECT_ID): cv.string, + probatio.Optional( CONF_EXPOSE_BY_DEFAULT, default=DEFAULT_EXPOSE_BY_DEFAULT ): cv.boolean, - vol.Optional( + probatio.Optional( CONF_EXPOSED_DOMAINS, default=DEFAULT_EXPOSED_DOMAINS ): cv.ensure_list, - vol.Optional(CONF_ENTITY_CONFIG): {cv.entity_id: ENTITY_SCHEMA}, + probatio.Optional(CONF_ENTITY_CONFIG): {cv.entity_id: ENTITY_SCHEMA}, # str on purpose, makes sure it is configured correctly. - vol.Optional(CONF_SECURE_DEVICES_PIN): str, - vol.Optional(CONF_REPORT_STATE, default=False): cv.boolean, - vol.Optional(CONF_SERVICE_ACCOUNT): GOOGLE_SERVICE_ACCOUNT, + probatio.Optional(CONF_SECURE_DEVICES_PIN): str, + probatio.Optional(CONF_REPORT_STATE, default=False): cv.boolean, + probatio.Optional(CONF_SERVICE_ACCOUNT): GOOGLE_SERVICE_ACCOUNT, # deprecated configuration options - vol.Remove(CONF_ALLOW_UNLOCK): cv.boolean, - vol.Remove(CONF_API_KEY): cv.string, + probatio.Remove(CONF_ALLOW_UNLOCK): cv.boolean, + probatio.Remove(CONF_API_KEY): cv.string, }, - extra=vol.PREVENT_EXTRA, + extra=probatio.PREVENT_EXTRA, ), _check_report_state, ) -CONFIG_SCHEMA = vol.Schema( - {vol.Optional(DOMAIN): GOOGLE_ASSISTANT_SCHEMA}, extra=vol.ALLOW_EXTRA +CONFIG_SCHEMA = probatio.Schema( + {probatio.Optional(DOMAIN): GOOGLE_ASSISTANT_SCHEMA}, extra=probatio.ALLOW_EXTRA ) type GoogleConfigEntry = ConfigEntry[GoogleConfig] diff --git a/homeassistant/components/google_assistant_sdk/config_flow.py b/homeassistant/components/google_assistant_sdk/config_flow.py index 23c0719281066..fb28c0e06c49f 100644 --- a/homeassistant/components/google_assistant_sdk/config_flow.py +++ b/homeassistant/components/google_assistant_sdk/config_flow.py @@ -4,7 +4,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -107,12 +107,12 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_LANGUAGE_CODE, default=self.config_entry.options.get(CONF_LANGUAGE_CODE), - ): vol.In(SUPPORTED_LANGUAGE_CODES), + ): probatio.In(SUPPORTED_LANGUAGE_CODES), } ), ) diff --git a/homeassistant/components/google_assistant_sdk/services.py b/homeassistant/components/google_assistant_sdk/services.py index bb1b053ec8aa0..9a473575170ac 100644 --- a/homeassistant/components/google_assistant_sdk/services.py +++ b/homeassistant/components/google_assistant_sdk/services.py @@ -2,7 +2,7 @@ import dataclasses -import voluptuous as vol +import probatio from homeassistant.core import ( HomeAssistant, @@ -19,12 +19,14 @@ SERVICE_SEND_TEXT_COMMAND = "send_text_command" SERVICE_SEND_TEXT_COMMAND_FIELD_COMMAND = "command" SERVICE_SEND_TEXT_COMMAND_FIELD_MEDIA_PLAYER = "media_player" -SERVICE_SEND_TEXT_COMMAND_SCHEMA = vol.All( +SERVICE_SEND_TEXT_COMMAND_SCHEMA = probatio.All( { - vol.Required(SERVICE_SEND_TEXT_COMMAND_FIELD_COMMAND): vol.All( - cv.ensure_list, [vol.All(str, vol.Length(min=1))] + probatio.Required(SERVICE_SEND_TEXT_COMMAND_FIELD_COMMAND): probatio.All( + cv.ensure_list, [probatio.All(str, probatio.Length(min=1))] ), - vol.Optional(SERVICE_SEND_TEXT_COMMAND_FIELD_MEDIA_PLAYER): cv.comp_entity_ids, + probatio.Optional( + SERVICE_SEND_TEXT_COMMAND_FIELD_MEDIA_PLAYER + ): cv.comp_entity_ids, }, ) diff --git a/homeassistant/components/google_cloud/config_flow.py b/homeassistant/components/google_cloud/config_flow.py index a3018e45dbc35..fd710e0f6e241 100644 --- a/homeassistant/components/google_cloud/config_flow.py +++ b/homeassistant/components/google_cloud/config_flow.py @@ -5,7 +5,7 @@ from typing import TYPE_CHECKING, Any, cast, override from google.cloud import texttospeech -import voluptuous as vol +import probatio from homeassistant.components.file_upload import process_uploaded_file from homeassistant.components.tts import CONF_LANG @@ -45,9 +45,9 @@ UPLOADED_KEY_FILE = "uploaded_key_file" -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(UPLOADED_KEY_FILE): FileSelector( + probatio.Required(UPLOADED_KEY_FILE): FileSelector( FileSelectorConfig(accept=".json,application/json") ) } @@ -158,9 +158,9 @@ async def async_step_init( return self.async_show_form( step_id="init", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_LANG, default=DEFAULT_LANG, ): SelectSelector( @@ -171,7 +171,7 @@ async def async_step_init( **tts_options_schema( self.config_entry.options, voices, from_config_flow=True ).schema, - vol.Optional( + probatio.Optional( CONF_STT_MODEL, default=DEFAULT_STT_MODEL, ): SelectSelector( diff --git a/homeassistant/components/google_cloud/helpers.py b/homeassistant/components/google_cloud/helpers.py index 8dae604a1cc49..e4a9b6e872c5c 100644 --- a/homeassistant/components/google_cloud/helpers.py +++ b/homeassistant/components/google_cloud/helpers.py @@ -7,7 +7,7 @@ from google.cloud import texttospeech from google.oauth2.service_account import Credentials -import voluptuous as vol +import probatio from homeassistant.components.tts import CONF_LANG from homeassistant.helpers import config_validation as cv @@ -58,23 +58,23 @@ def tts_options_schema( config_options: Mapping[str, Any], voices: dict[str, list[str]], from_config_flow: bool = False, -) -> vol.Schema: +) -> probatio.Schema: """Return schema for TTS options with default values from config or constants.""" # If we are called from the config flow we want the defaults to be from constants # to allow clearing the current value (passed as suggested_value) in the UI. # If we aren't called from the config flow we want the # defaults to be from the config. defaults = {} if from_config_flow else config_options - return vol.Schema( + return probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_GENDER, default=defaults.get( CONF_GENDER, texttospeech.SsmlVoiceGender.NEUTRAL.name, # type: ignore[attr-defined] ), - ): vol.All( - vol.Upper, + ): probatio.All( + probatio.Upper, SelectSelector( SelectSelectorConfig( mode=SelectSelectorMode.DROPDOWN, @@ -82,7 +82,7 @@ def tts_options_schema( ) ), ), - vol.Optional( + probatio.Optional( CONF_VOICE, default=defaults.get(CONF_VOICE, DEFAULT_VOICE), ): SelectSelector( @@ -91,14 +91,14 @@ def tts_options_schema( options=["", *functools.reduce(operator.iadd, voices.values(), [])], ) ), - vol.Optional( + probatio.Optional( CONF_ENCODING, default=defaults.get( CONF_ENCODING, texttospeech.AudioEncoding.MP3.name, # type: ignore[attr-defined] ), - ): vol.All( - vol.Upper, + ): probatio.All( + probatio.Upper, SelectSelector( SelectSelectorConfig( mode=SelectSelectorMode.DROPDOWN, @@ -106,19 +106,19 @@ def tts_options_schema( ) ), ), - vol.Optional( + probatio.Optional( CONF_SPEED, default=defaults.get(CONF_SPEED, DEFAULT_SPEED), ): NumberSelector(NumberSelectorConfig(min=0.25, max=4.0, step=0.01)), - vol.Optional( + probatio.Optional( CONF_PITCH, default=defaults.get(CONF_PITCH, DEFAULT_PITCH), ): NumberSelector(NumberSelectorConfig(min=-20.0, max=20.0, step=0.1)), - vol.Optional( + probatio.Optional( CONF_GAIN, default=defaults.get(CONF_GAIN, DEFAULT_GAIN), ): NumberSelector(NumberSelectorConfig(min=-96.0, max=16.0, step=0.1)), - vol.Optional( + probatio.Optional( CONF_PROFILES, default=defaults.get(CONF_PROFILES, []), ): SelectSelector( @@ -139,11 +139,11 @@ def tts_options_schema( sort=False, ) ), - vol.Optional( + probatio.Optional( CONF_TEXT_TYPE, default=defaults.get(CONF_TEXT_TYPE, "text"), - ): vol.All( - vol.Lower, + ): probatio.All( + probatio.Lower, SelectSelector( SelectSelectorConfig( mode=SelectSelectorMode.DROPDOWN, @@ -155,16 +155,16 @@ def tts_options_schema( ) -def tts_platform_schema() -> vol.Schema: +def tts_platform_schema() -> probatio.Schema: """Return schema for TTS platform.""" - return vol.Schema( + return probatio.Schema( { - vol.Optional(CONF_KEY_FILE): cv.string, - vol.Optional(CONF_LANG, default=DEFAULT_LANG): cv.matches_regex( + probatio.Optional(CONF_KEY_FILE): cv.string, + probatio.Optional(CONF_LANG, default=DEFAULT_LANG): cv.matches_regex( r"[a-z]{2,3}-[A-Z]{2}|" ), **tts_options_schema({}, {}).schema, - vol.Optional(CONF_VOICE, default=DEFAULT_VOICE): cv.matches_regex( + probatio.Optional(CONF_VOICE, default=DEFAULT_VOICE): cv.matches_regex( r"[a-z]{2,3}-[A-Z]{2}-.*-[A-Z]|" ), } diff --git a/homeassistant/components/google_cloud/tts.py b/homeassistant/components/google_cloud/tts.py index a1a89582dfc33..d0098a771fbff 100644 --- a/homeassistant/components/google_cloud/tts.py +++ b/homeassistant/components/google_cloud/tts.py @@ -7,7 +7,7 @@ from google.api_core.exceptions import GoogleAPIError, Unauthenticated from google.api_core.retry import AsyncRetry from google.cloud import texttospeech -import voluptuous as vol +import probatio from homeassistant.components.tts import ( CONF_LANG, @@ -126,7 +126,7 @@ def __init__( client: texttospeech.TextToSpeechAsyncClient, voices: dict[str, list[str]], language: str, - options_schema: vol.Schema, + options_schema: probatio.Schema, ) -> None: """Init Google Cloud TTS base provider.""" self._client = client @@ -170,7 +170,7 @@ async def _async_get_tts_audio( """Load TTS from Google Cloud.""" try: options = self._options_schema(options) - except vol.Invalid as err: + except probatio.Invalid as err: _LOGGER.error("Error: %s when validating options: %s", err, options) return None, None @@ -240,7 +240,7 @@ def __init__( client: texttospeech.TextToSpeechAsyncClient, voices: dict[str, list[str]], language: str, - options_schema: vol.Schema, + options_schema: probatio.Schema, ) -> None: """Init Google Cloud TTS entity.""" super().__init__(client, voices, language, options_schema) @@ -276,7 +276,7 @@ def __init__( client: texttospeech.TextToSpeechAsyncClient, voices: dict[str, list[str]], language: str, - options_schema: vol.Schema, + options_schema: probatio.Schema, ) -> None: """Init Google Cloud TTS service.""" super().__init__(client, voices, language, options_schema) diff --git a/homeassistant/components/google_generative_ai_conversation/config_flow.py b/homeassistant/components/google_generative_ai_conversation/config_flow.py index f578a8da7ab1e..1d44f817fcf45 100644 --- a/homeassistant/components/google_generative_ai_conversation/config_flow.py +++ b/homeassistant/components/google_generative_ai_conversation/config_flow.py @@ -7,8 +7,8 @@ from google import genai from google.genai.errors import APIError, ClientError +import probatio from requests.exceptions import Timeout -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -74,9 +74,9 @@ _LOGGER = logging.getLogger(__name__) -STEP_API_DATA_SCHEMA = vol.Schema( +STEP_API_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_KEY): str, + probatio.Required(CONF_API_KEY): str, } ) @@ -288,7 +288,7 @@ async def async_step_set_options( self.hass, self._is_new, self._subentry_type, options, self._genai_client ) return self.async_show_form( - step_id="set_options", data_schema=vol.Schema(schema), errors=errors + step_id="set_options", data_schema=probatio.Schema(schema), errors=errors ) async_step_reconfigure = async_step_set_options @@ -327,10 +327,10 @@ async def google_generative_ai_config_option_schema( default_name = DEFAULT_STT_NAME else: default_name = DEFAULT_CONVERSATION_NAME - schema: dict[vol.Required | vol.Optional, Any] = { + schema: dict[probatio.Required | probatio.Optional, Any] = { # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Required(CONF_NAME, default=default_name): str, + probatio.Required(CONF_NAME, default=default_name): str, } else: schema = {} @@ -338,7 +338,7 @@ async def google_generative_ai_config_option_schema( if subentry_type == "conversation": schema.update( { - vol.Optional( + probatio.Optional( CONF_PROMPT, description={ "suggested_value": options.get( @@ -346,7 +346,7 @@ async def google_generative_ai_config_option_schema( ) }, ): TemplateSelector(), - vol.Optional( + probatio.Optional( CONF_LLM_HASS_API, description={"suggested_value": suggested_llm_apis}, ): SelectSelector( @@ -357,7 +357,7 @@ async def google_generative_ai_config_option_schema( elif subentry_type == "stt": schema.update( { - vol.Optional( + probatio.Optional( CONF_PROMPT, description={ "suggested_value": options.get(CONF_PROMPT, DEFAULT_STT_PROMPT) @@ -368,7 +368,7 @@ async def google_generative_ai_config_option_schema( schema.update( { - vol.Required( + probatio.Required( CONF_RECOMMENDED, default=options.get(CONF_RECOMMENDED, False) ): bool, } @@ -429,14 +429,14 @@ async def google_generative_ai_config_option_schema( schema.update( { - vol.Optional( + probatio.Optional( CONF_CHAT_MODEL, description={"suggested_value": options.get(CONF_CHAT_MODEL)}, default=default_model, ): SelectSelector( SelectSelectorConfig(mode=SelectSelectorMode.DROPDOWN, options=models) ), - vol.Optional( + probatio.Optional( CONF_TEMPERATURE, description={"suggested_value": options.get(CONF_TEMPERATURE)}, default=RECOMMENDED_TEMPERATURE, @@ -447,34 +447,34 @@ async def google_generative_ai_config_option_schema( if subentry_type != "tts": schema.update( { - vol.Optional( + probatio.Optional( CONF_TOP_P, description={"suggested_value": options.get(CONF_TOP_P)}, default=RECOMMENDED_TOP_P, ): NumberSelector(NumberSelectorConfig(min=0, max=1, step=0.05)), - vol.Optional( + probatio.Optional( CONF_TOP_K, description={"suggested_value": options.get(CONF_TOP_K)}, default=RECOMMENDED_TOP_K, ): int, - vol.Optional( + probatio.Optional( CONF_MAX_TOKENS, description={"suggested_value": options.get(CONF_MAX_TOKENS)}, default=RECOMMENDED_MAX_TOKENS, ): int, - vol.Optional( + probatio.Optional( CONF_THINKING_BUDGET, description={"suggested_value": options.get(CONF_THINKING_BUDGET)}, default=RECOMMENDED_THINKING_BUDGET, - ): vol.All( + ): probatio.All( NumberSelector( NumberSelectorConfig( min=-1, max=24576, step=1, mode=NumberSelectorMode.BOX ) ), - vol.Coerce(int), + probatio.Coerce(int), ), - vol.Optional( + probatio.Optional( CONF_THINKING_LEVEL, description={"suggested_value": options.get(CONF_THINKING_LEVEL)}, default=RECOMMENDED_THINKING_LEVEL, @@ -491,28 +491,28 @@ async def google_generative_ai_config_option_schema( ], ) ), - vol.Optional( + probatio.Optional( CONF_HARASSMENT_BLOCK_THRESHOLD, description={ "suggested_value": options.get(CONF_HARASSMENT_BLOCK_THRESHOLD) }, default=RECOMMENDED_HARM_BLOCK_THRESHOLD, ): harm_block_thresholds_selector, - vol.Optional( + probatio.Optional( CONF_HATE_BLOCK_THRESHOLD, description={ "suggested_value": options.get(CONF_HATE_BLOCK_THRESHOLD) }, default=RECOMMENDED_HARM_BLOCK_THRESHOLD, ): harm_block_thresholds_selector, - vol.Optional( + probatio.Optional( CONF_SEXUAL_BLOCK_THRESHOLD, description={ "suggested_value": options.get(CONF_SEXUAL_BLOCK_THRESHOLD) }, default=RECOMMENDED_HARM_BLOCK_THRESHOLD, ): harm_block_thresholds_selector, - vol.Optional( + probatio.Optional( CONF_DANGEROUS_BLOCK_THRESHOLD, description={ "suggested_value": options.get(CONF_DANGEROUS_BLOCK_THRESHOLD) @@ -524,7 +524,7 @@ async def google_generative_ai_config_option_schema( if subentry_type == "conversation": schema.update( { - vol.Optional( + probatio.Optional( CONF_USE_GOOGLE_SEARCH_TOOL, description={ "suggested_value": options.get(CONF_USE_GOOGLE_SEARCH_TOOL), diff --git a/homeassistant/components/google_generative_ai_conversation/entity.py b/homeassistant/components/google_generative_ai_conversation/entity.py index be0ef46295951..cfbe08a8fe776 100644 --- a/homeassistant/components/google_generative_ai_conversation/entity.py +++ b/homeassistant/components/google_generative_ai_conversation/entity.py @@ -32,8 +32,7 @@ Tool, ToolListUnion, ) -from probatio import to_openapi -import voluptuous as vol +import probatio from homeassistant.components import conversation from homeassistant.config_entries import ConfigSubentry @@ -206,8 +205,8 @@ def _format_schema(schema: dict[str, Any]) -> Schema: if result.get("enum") and result.get("type") != "STRING": # enum is only allowed for STRING type. This is safe as long as the schema - # contains vol.Coerce for the respective type, for example: - # vol.All(vol.Coerce(int), vol.In([1, 2, 3])) + # contains probatio.Coerce for the respective type, for example: + # probatio.All(probatio.Coerce(int), probatio.In([1, 2, 3])) result["type"] = "STRING" result["enum"] = [str(item) for item in result["enum"]] @@ -227,7 +226,7 @@ def _format_tool( if tool.parameters.schema: parameters = _format_schema( - to_openapi(tool.parameters, custom_serializer=custom_serializer) + probatio.to_openapi(tool.parameters, custom_serializer=custom_serializer) ) else: parameters = None @@ -573,7 +572,7 @@ def __init__( async def _async_handle_chat_log( self, chat_log: conversation.ChatLog, - structure: vol.Schema | None = None, + structure: probatio.Schema | None = None, default_max_tokens: int | None = None, max_iterations: int = MAX_TOOL_ITERATIONS, ) -> None: @@ -665,7 +664,7 @@ async def _async_handle_chat_log( if structure: generate_content_config.response_mime_type = "application/json" generate_content_config.response_schema = _format_schema( - to_openapi( + probatio.to_openapi( structure, custom_serializer=( chat_log.llm_api.custom_serializer diff --git a/homeassistant/components/google_mail/services.py b/homeassistant/components/google_mail/services.py index 3421ab4072f21..6e7600bbccf35 100644 --- a/homeassistant/components/google_mail/services.py +++ b/homeassistant/components/google_mail/services.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING from googleapiclient.http import HttpRequest -import voluptuous as vol +import probatio from homeassistant.core import HomeAssistant, ServiceCall, callback from homeassistant.helpers import config_validation as cv @@ -28,17 +28,17 @@ SERVICE_SET_VACATION = "set_vacation" -SERVICE_VACATION_SCHEMA = vol.All( +SERVICE_VACATION_SCHEMA = probatio.All( cv.make_entity_service_schema( { - vol.Required(ATTR_ENABLED, default=True): cv.boolean, - vol.Optional(ATTR_TITLE): cv.string, - vol.Required(ATTR_MESSAGE): cv.string, - vol.Optional(ATTR_PLAIN_TEXT, default=True): cv.boolean, - vol.Optional(ATTR_RESTRICT_CONTACTS): cv.boolean, - vol.Optional(ATTR_RESTRICT_DOMAIN): cv.boolean, - vol.Optional(ATTR_START): cv.date, - vol.Optional(ATTR_END): cv.date, + probatio.Required(ATTR_ENABLED, default=True): cv.boolean, + probatio.Optional(ATTR_TITLE): cv.string, + probatio.Required(ATTR_MESSAGE): cv.string, + probatio.Optional(ATTR_PLAIN_TEXT, default=True): cv.boolean, + probatio.Optional(ATTR_RESTRICT_CONTACTS): cv.boolean, + probatio.Optional(ATTR_RESTRICT_DOMAIN): cv.boolean, + probatio.Optional(ATTR_START): cv.date, + probatio.Optional(ATTR_END): cv.date, }, ) ) diff --git a/homeassistant/components/google_maps/device_tracker.py b/homeassistant/components/google_maps/device_tracker.py index 2cb88d6bd958a..44fbdea810f52 100644 --- a/homeassistant/components/google_maps/device_tracker.py +++ b/homeassistant/components/google_maps/device_tracker.py @@ -5,7 +5,7 @@ from locationsharinglib import Service from locationsharinglib.locationsharinglibexceptions import InvalidCookies -import voluptuous as vol +import probatio from homeassistant.components.device_tracker import ( PLATFORM_SCHEMA as DEVICE_TRACKER_PLATFORM_SCHEMA, @@ -40,8 +40,10 @@ # need to be refactored as part of a bigger rewrite. PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_USERNAME): cv.string, - vol.Optional(CONF_MAX_GPS_ACCURACY, default=100000): vol.Coerce(float), + probatio.Required(CONF_USERNAME): cv.string, + probatio.Optional(CONF_MAX_GPS_ACCURACY, default=100000): probatio.Coerce( + float + ), } ) diff --git a/homeassistant/components/google_photos/services.py b/homeassistant/components/google_photos/services.py index e6aee974cb204..13233063290bb 100644 --- a/homeassistant/components/google_photos/services.py +++ b/homeassistant/components/google_photos/services.py @@ -6,7 +6,7 @@ from google_photos_library_api.exceptions import GooglePhotosApiError from google_photos_library_api.model import NewMediaItem, SimpleMediaItem -import voluptuous as vol +import probatio from homeassistant.const import CONF_FILENAME from homeassistant.core import ( @@ -26,11 +26,11 @@ CONF_ALBUM = "album" UPLOAD_SERVICE = "upload" -UPLOAD_SERVICE_SCHEMA = vol.Schema( +UPLOAD_SERVICE_SCHEMA = probatio.Schema( { - vol.Required(CONF_CONFIG_ENTRY_ID): cv.string, - vol.Required(CONF_FILENAME): vol.All(cv.ensure_list, [cv.string]), - vol.Required(CONF_ALBUM): cv.string, + probatio.Required(CONF_CONFIG_ENTRY_ID): cv.string, + probatio.Required(CONF_FILENAME): probatio.All(cv.ensure_list, [cv.string]), + probatio.Required(CONF_ALBUM): cv.string, } ) CONTENT_SIZE_LIMIT = 20 * 1024 * 1024 diff --git a/homeassistant/components/google_pubsub/__init__.py b/homeassistant/components/google_pubsub/__init__.py index 9e1b04ed411ef..1eb3440257773 100644 --- a/homeassistant/components/google_pubsub/__init__.py +++ b/homeassistant/components/google_pubsub/__init__.py @@ -7,7 +7,7 @@ from typing import override from google.cloud.pubsub_v1 import PublisherClient -import voluptuous as vol +import probatio from homeassistant.const import EVENT_STATE_CHANGED, STATE_UNAVAILABLE, STATE_UNKNOWN from homeassistant.core import Event, EventStateChangedData, HomeAssistant @@ -24,18 +24,18 @@ CONF_SERVICE_PRINCIPAL = "credentials_json" CONF_FILTER = "filter" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_PROJECT_ID): cv.string, - vol.Required(CONF_TOPIC_NAME): cv.string, - vol.Required(CONF_SERVICE_PRINCIPAL): cv.string, - vol.Required(CONF_FILTER): FILTER_SCHEMA, + probatio.Required(CONF_PROJECT_ID): cv.string, + probatio.Required(CONF_TOPIC_NAME): cv.string, + probatio.Required(CONF_SERVICE_PRINCIPAL): cv.string, + probatio.Required(CONF_FILTER): FILTER_SCHEMA, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/google_sheets/services.py b/homeassistant/components/google_sheets/services.py index 5faf6bdc13e4f..0147bf28cacbc 100644 --- a/homeassistant/components/google_sheets/services.py +++ b/homeassistant/components/google_sheets/services.py @@ -6,7 +6,7 @@ from google.oauth2.credentials import Credentials from gspread import Client, GSpreadException, Spreadsheet, Worksheet from gspread.utils import ValueInputOption -import voluptuous as vol +import probatio from homeassistant.const import CONF_ACCESS_TOKEN, CONF_TOKEN from homeassistant.core import ( @@ -36,20 +36,24 @@ SERVICE_APPEND_SHEET = "append_sheet" SERVICE_GET_SHEET = "get_sheet" -SHEET_SERVICE_SCHEMA = vol.All( +SHEET_SERVICE_SCHEMA = probatio.All( { - vol.Required(DATA_CONFIG_ENTRY): ConfigEntrySelector({"integration": DOMAIN}), - vol.Optional(WORKSHEET): cv.string, - vol.Optional(ADD_CREATED_COLUMN, default=True): cv.boolean, - vol.Required(DATA): vol.Any(cv.ensure_list, [dict]), + probatio.Required(DATA_CONFIG_ENTRY): ConfigEntrySelector( + {"integration": DOMAIN} + ), + probatio.Optional(WORKSHEET): cv.string, + probatio.Optional(ADD_CREATED_COLUMN, default=True): cv.boolean, + probatio.Required(DATA): probatio.Any(cv.ensure_list, [dict]), }, ) -get_SHEET_SERVICE_SCHEMA = vol.All( +get_SHEET_SERVICE_SCHEMA = probatio.All( { - vol.Required(DATA_CONFIG_ENTRY): ConfigEntrySelector({"integration": DOMAIN}), - vol.Optional(WORKSHEET): cv.string, - vol.Required(ROWS): cv.positive_int, + probatio.Required(DATA_CONFIG_ENTRY): ConfigEntrySelector( + {"integration": DOMAIN} + ), + probatio.Optional(WORKSHEET): cv.string, + probatio.Required(ROWS): cv.positive_int, }, ) diff --git a/homeassistant/components/google_translate/config_flow.py b/homeassistant/components/google_translate/config_flow.py index 00381a5b85678..87b2291735b0b 100644 --- a/homeassistant/components/google_translate/config_flow.py +++ b/homeassistant/components/google_translate/config_flow.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.tts import CONF_LANG from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -16,10 +16,12 @@ SUPPORT_TLD, ) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Optional(CONF_LANG, default=DEFAULT_LANG): vol.In(SUPPORT_LANGUAGES), - vol.Optional(CONF_TLD, default=DEFAULT_TLD): vol.In(SUPPORT_TLD), + probatio.Optional(CONF_LANG, default=DEFAULT_LANG): probatio.In( + SUPPORT_LANGUAGES + ), + probatio.Optional(CONF_TLD, default=DEFAULT_TLD): probatio.In(SUPPORT_TLD), } ) diff --git a/homeassistant/components/google_translate/tts.py b/homeassistant/components/google_translate/tts.py index 90bf56fb55664..f5c028debe15f 100644 --- a/homeassistant/components/google_translate/tts.py +++ b/homeassistant/components/google_translate/tts.py @@ -5,7 +5,7 @@ from typing import Any, override from gtts import gTTS, gTTSError -import voluptuous as vol +import probatio from homeassistant.components.tts import ( CONF_LANG, @@ -37,8 +37,10 @@ PLATFORM_SCHEMA = TTS_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_LANG, default=DEFAULT_LANG): vol.In(SUPPORT_LANGUAGES), - vol.Optional(CONF_TLD, default=DEFAULT_TLD): vol.In(SUPPORT_TLD), + probatio.Optional(CONF_LANG, default=DEFAULT_LANG): probatio.In( + SUPPORT_LANGUAGES + ), + probatio.Optional(CONF_TLD, default=DEFAULT_TLD): probatio.In(SUPPORT_TLD), } ) diff --git a/homeassistant/components/google_travel_time/config_flow.py b/homeassistant/components/google_travel_time/config_flow.py index c3ae0c0382cfc..d9e0d0d1bc0cb 100644 --- a/homeassistant/components/google_travel_time/config_flow.py +++ b/homeassistant/components/google_travel_time/config_flow.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -57,24 +57,24 @@ UNITS_SELECTOR, ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_KEY): cv.string, - vol.Required(CONF_DESTINATION): cv.string, - vol.Required(CONF_ORIGIN): cv.string, + probatio.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_DESTINATION): cv.string, + probatio.Required(CONF_ORIGIN): cv.string, } ) -OPTIONS_SCHEMA = vol.Schema( +OPTIONS_SCHEMA = probatio.Schema( { - vol.Optional(CONF_LANGUAGE): LANGUAGE_SELECTOR, - vol.Optional(CONF_AVOID): AVOID_SELECTOR, - vol.Optional(CONF_TRAFFIC_MODEL): TRAFFIC_MODEL_SELECTOR, - vol.Optional(CONF_TRANSIT_MODE): TRANSIT_MODE_SELECTOR, - vol.Optional( + probatio.Optional(CONF_LANGUAGE): LANGUAGE_SELECTOR, + probatio.Optional(CONF_AVOID): AVOID_SELECTOR, + probatio.Optional(CONF_TRAFFIC_MODEL): TRAFFIC_MODEL_SELECTOR, + probatio.Optional(CONF_TRANSIT_MODE): TRANSIT_MODE_SELECTOR, + probatio.Optional( CONF_TRANSIT_ROUTING_PREFERENCE ): TRANSIT_ROUTING_PREFERENCE_SELECTOR, - vol.Required(CONF_MODE): SelectSelector( + probatio.Required(CONF_MODE): SelectSelector( SelectSelectorConfig( options=TRAVEL_MODES, sort=True, @@ -82,9 +82,9 @@ translation_key=CONF_MODE, ) ), - vol.Required(CONF_UNITS): UNITS_SELECTOR, - vol.Required(CONF_TIME_TYPE): TIME_TYPE_SELECTOR, - vol.Optional(CONF_TIME): TimeSelector(), + probatio.Required(CONF_UNITS): UNITS_SELECTOR, + probatio.Required(CONF_TIME_TYPE): TIME_TYPE_SELECTOR, + probatio.Optional(CONF_TIME): TimeSelector(), } ) diff --git a/homeassistant/components/google_travel_time/helpers.py b/homeassistant/components/google_travel_time/helpers.py index 90a4604084515..fcc3b31b5df78 100644 --- a/homeassistant/components/google_travel_time/helpers.py +++ b/homeassistant/components/google_travel_time/helpers.py @@ -24,7 +24,7 @@ ) from google.protobuf import timestamp_pb2 from google.type import latlng_pb2 -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant @@ -79,8 +79,8 @@ def convert_to_waypoint(hass: HomeAssistant, location: str) -> Waypoint | None: return None try: formatted_coordinates = coordinates.split(",") - vol.Schema(cv.gps(formatted_coordinates)) - except AttributeError, vol.Invalid: + probatio.Schema(cv.gps(formatted_coordinates)) + except AttributeError, probatio.Invalid: return Waypoint(address=location) return Waypoint( location=Location( diff --git a/homeassistant/components/google_travel_time/schemas.py b/homeassistant/components/google_travel_time/schemas.py index 3ed79125561f0..46f791677b299 100644 --- a/homeassistant/components/google_travel_time/schemas.py +++ b/homeassistant/components/google_travel_time/schemas.py @@ -1,6 +1,6 @@ """Schemas for the Google Travel Time integration.""" -import voluptuous as vol +import probatio from homeassistant.const import ATTR_CONFIG_ENTRY_ID, CONF_LANGUAGE, CONF_MODE from homeassistant.helpers.selector import ( @@ -97,21 +97,21 @@ ) ) -_SERVICE_BASE_SCHEMA = vol.Schema( +_SERVICE_BASE_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): ConfigEntrySelector( + probatio.Required(ATTR_CONFIG_ENTRY_ID): ConfigEntrySelector( {"integration": DOMAIN} ), - vol.Required(CONF_ORIGIN): TextSelector(), - vol.Required(CONF_DESTINATION): TextSelector(), - vol.Optional(CONF_UNITS, default=UNITS_METRIC): UNITS_SELECTOR, - vol.Optional(CONF_LANGUAGE): LANGUAGE_SELECTOR, + probatio.Required(CONF_ORIGIN): TextSelector(), + probatio.Required(CONF_DESTINATION): TextSelector(), + probatio.Optional(CONF_UNITS, default=UNITS_METRIC): UNITS_SELECTOR, + probatio.Optional(CONF_LANGUAGE): LANGUAGE_SELECTOR, } ) SERVICE_GET_TRAVEL_TIMES_SCHEMA = _SERVICE_BASE_SCHEMA.extend( { - vol.Optional(CONF_MODE, default="driving"): SelectSelector( + probatio.Optional(CONF_MODE, default="driving"): SelectSelector( SelectSelectorConfig( options=TRAVEL_MODES_WITHOUT_TRANSIT, sort=True, @@ -119,19 +119,19 @@ translation_key=CONF_MODE, ) ), - vol.Optional(CONF_AVOID): AVOID_SELECTOR, - vol.Optional(CONF_TRAFFIC_MODEL): TRAFFIC_MODEL_SELECTOR, - vol.Optional(CONF_DEPARTURE_TIME): TimeSelector(), + probatio.Optional(CONF_AVOID): AVOID_SELECTOR, + probatio.Optional(CONF_TRAFFIC_MODEL): TRAFFIC_MODEL_SELECTOR, + probatio.Optional(CONF_DEPARTURE_TIME): TimeSelector(), } ) SERVICE_GET_TRANSIT_TIMES_SCHEMA = _SERVICE_BASE_SCHEMA.extend( { - vol.Optional(CONF_TRANSIT_MODE): TRANSIT_MODE_SELECTOR, - vol.Optional( + probatio.Optional(CONF_TRANSIT_MODE): TRANSIT_MODE_SELECTOR, + probatio.Optional( CONF_TRANSIT_ROUTING_PREFERENCE ): TRANSIT_ROUTING_PREFERENCE_SELECTOR, - vol.Exclusive(CONF_DEPARTURE_TIME, "time"): TimeSelector(), - vol.Exclusive(CONF_ARRIVAL_TIME, "time"): TimeSelector(), + probatio.Exclusive(CONF_DEPARTURE_TIME, "time"): TimeSelector(), + probatio.Exclusive(CONF_ARRIVAL_TIME, "time"): TimeSelector(), } ) diff --git a/homeassistant/components/google_weather/config_flow.py b/homeassistant/components/google_weather/config_flow.py index 22ac5b62aea4b..da3ec4dc34030 100644 --- a/homeassistant/components/google_weather/config_flow.py +++ b/homeassistant/components/google_weather/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from google_weather_api import GoogleWeatherApi, GoogleWeatherApiError -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -34,11 +34,12 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_KEY): str, - vol.Optional(SECTION_API_KEY_OPTIONS): section( - vol.Schema({vol.Optional(CONF_REFERRER): str}), {"collapsed": True} + probatio.Required(CONF_API_KEY): str, + probatio.Optional(SECTION_API_KEY_OPTIONS): section( + probatio.Schema({probatio.Optional(CONF_REFERRER): str}), + {"collapsed": True}, ), } ) @@ -66,14 +67,14 @@ async def _validate_input( return False -def _get_location_schema(hass: HomeAssistant) -> vol.Schema: +def _get_location_schema(hass: HomeAssistant) -> probatio.Schema: """Return the schema for a location with default values from the hass config.""" - return vol.Schema( + return probatio.Schema( { # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Required(CONF_NAME, default=hass.config.location_name): str, - vol.Required( + probatio.Required(CONF_NAME, default=hass.config.location_name): str, + probatio.Required( CONF_LOCATION, default={ CONF_LATITUDE: hass.config.latitude, @@ -195,7 +196,7 @@ async def async_step_user( user_input = {} schema_dict = STEP_USER_DATA_SCHEMA.schema.copy() schema_dict.update(_get_location_schema(self.hass).schema) - schema = vol.Schema(schema_dict) + schema = probatio.Schema(schema_dict) return self.async_show_form( step_id="user", diff --git a/homeassistant/components/google_wifi/sensor.py b/homeassistant/components/google_wifi/sensor.py index 54568dbbf1702..359bd67daf143 100644 --- a/homeassistant/components/google_wifi/sensor.py +++ b/homeassistant/components/google_wifi/sensor.py @@ -4,8 +4,8 @@ from datetime import timedelta from typing import override +import probatio import requests -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -90,11 +90,11 @@ class GoogleWifiSensorEntityDescription(SensorEntityDescription): SENSOR_KEYS: list[str] = [desc.key for desc in SENSOR_TYPES] PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, - vol.Optional(CONF_MONITORED_CONDITIONS, default=SENSOR_KEYS): vol.All( - cv.ensure_list, [vol.In(SENSOR_KEYS)] + probatio.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, + probatio.Optional(CONF_MONITORED_CONDITIONS, default=SENSOR_KEYS): probatio.All( + cv.ensure_list, [probatio.In(SENSOR_KEYS)] ), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/govee_ble/config_flow.py b/homeassistant/components/govee_ble/config_flow.py index 33b3266d4ae32..bf5fdcae00d7a 100644 --- a/homeassistant/components/govee_ble/config_flow.py +++ b/homeassistant/components/govee_ble/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from govee_ble import GoveeBluetoothDeviceData as DeviceData -import voluptuous as vol +import probatio from homeassistant.components import bluetooth from homeassistant.components.bluetooth import ( @@ -94,9 +94,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_ADDRESS): vol.In( + probatio.Required(CONF_ADDRESS): probatio.In( { address: ( f"{device.get_device_name(None) or discovery_info.name}" diff --git a/homeassistant/components/gpsd/config_flow.py b/homeassistant/components/gpsd/config_flow.py index 4b3868cb14367..2e44874cb3244 100644 --- a/homeassistant/components/gpsd/config_flow.py +++ b/homeassistant/components/gpsd/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from gps3.agps3threaded import GPSD_PORT as DEFAULT_PORT, HOST as DEFAULT_HOST -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PORT @@ -12,10 +12,10 @@ from .const import DOMAIN -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Optional(CONF_HOST, default=DEFAULT_HOST): str, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_HOST, default=DEFAULT_HOST): str, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, } ) diff --git a/homeassistant/components/gpslogger/__init__.py b/homeassistant/components/gpslogger/__init__.py index 37493ed24fad3..ea6ef76157295 100644 --- a/homeassistant/components/gpslogger/__init__.py +++ b/homeassistant/components/gpslogger/__init__.py @@ -3,7 +3,7 @@ from http import HTTPStatus from aiohttp import web -import voluptuous as vol +import probatio from homeassistant.components import webhook from homeassistant.components.device_tracker import ATTR_BATTERY @@ -40,18 +40,22 @@ def _id(value: str) -> str: return value.replace("-", "") -WEBHOOK_SCHEMA = vol.Schema( +WEBHOOK_SCHEMA = probatio.Schema( { - vol.Required(ATTR_DEVICE): _id, - vol.Required(ATTR_LATITUDE): cv.latitude, - vol.Required(ATTR_LONGITUDE): cv.longitude, - vol.Optional(ATTR_ACCURACY, default=DEFAULT_ACCURACY): vol.Coerce(float), - vol.Optional(ATTR_ACTIVITY): cv.string, - vol.Optional(ATTR_ALTITUDE): vol.Coerce(float), - vol.Optional(ATTR_BATTERY, default=DEFAULT_BATTERY): vol.Coerce(float), - vol.Optional(ATTR_DIRECTION): vol.Coerce(float), - vol.Optional(ATTR_PROVIDER): cv.string, - vol.Optional(ATTR_SPEED): vol.Coerce(float), + probatio.Required(ATTR_DEVICE): _id, + probatio.Required(ATTR_LATITUDE): cv.latitude, + probatio.Required(ATTR_LONGITUDE): cv.longitude, + probatio.Optional(ATTR_ACCURACY, default=DEFAULT_ACCURACY): probatio.Coerce( + float + ), + probatio.Optional(ATTR_ACTIVITY): cv.string, + probatio.Optional(ATTR_ALTITUDE): probatio.Coerce(float), + probatio.Optional(ATTR_BATTERY, default=DEFAULT_BATTERY): probatio.Coerce( + float + ), + probatio.Optional(ATTR_DIRECTION): probatio.Coerce(float), + probatio.Optional(ATTR_PROVIDER): cv.string, + probatio.Optional(ATTR_SPEED): probatio.Coerce(float), } ) @@ -62,7 +66,7 @@ async def handle_webhook( """Handle incoming webhook with GPSLogger request.""" try: data = WEBHOOK_SCHEMA(dict(await request.post())) - except vol.MultipleInvalid as error: + except probatio.MultipleInvalid as error: return web.Response( text=error.error_message, status=HTTPStatus.UNPROCESSABLE_ENTITY ) diff --git a/homeassistant/components/graphite/__init__.py b/homeassistant/components/graphite/__init__.py index 61672748fc9a7..c9b3151b038aa 100644 --- a/homeassistant/components/graphite/__init__.py +++ b/homeassistant/components/graphite/__init__.py @@ -8,7 +8,7 @@ import time from typing import override -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_HOST, @@ -33,20 +33,20 @@ DEFAULT_PREFIX = "ha" DOMAIN = "graphite" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_PROTOCOL, default=DEFAULT_PROTOCOL): vol.Any( - PROTOCOL_TCP, PROTOCOL_UDP - ), - vol.Optional(CONF_PREFIX, default=DEFAULT_PREFIX): cv.string, + probatio.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional( + CONF_PROTOCOL, default=DEFAULT_PROTOCOL + ): probatio.Any(PROTOCOL_TCP, PROTOCOL_UDP), + probatio.Optional(CONF_PREFIX, default=DEFAULT_PREFIX): cv.string, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/green_planet_energy/services.py b/homeassistant/components/green_planet_energy/services.py index 0e8260fa99ee1..89811ec5a9f28 100644 --- a/homeassistant/components/green_planet_energy/services.py +++ b/homeassistant/components/green_planet_energy/services.py @@ -2,7 +2,7 @@ from datetime import timedelta -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigEntryState from homeassistant.const import ATTR_CONFIG_ENTRY_ID @@ -36,29 +36,29 @@ def _validate_hours(v: float) -> float: """Validate that hours is a multiple of 0.25 (15 minutes).""" if abs(v * 4 - round(v * 4)) >= 1e-9: - raise vol.Invalid("hours must be a multiple of 0.25 (15 minutes)") + raise probatio.Invalid("hours must be a multiple of 0.25 (15 minutes)") return v -SERVICE_GET_PRICES_SCHEMA = vol.Schema( +SERVICE_GET_PRICES_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): ConfigEntrySelector( + probatio.Required(ATTR_CONFIG_ENTRY_ID): ConfigEntrySelector( {"integration": DOMAIN} ), - vol.Required(ATTR_HOURS): vol.All( - vol.Coerce(float), - vol.Range(min=0.25, max=24), + probatio.Required(ATTR_HOURS): probatio.All( + probatio.Coerce(float), + probatio.Range(min=0.25, max=24), _validate_hours, ), } ) -SERVICE_GET_CHEAPEST_DURATION_SCHEMA = vol.Schema( +SERVICE_GET_CHEAPEST_DURATION_SCHEMA = probatio.Schema( { - vol.Required(ATTR_DURATION): vol.All( - vol.Coerce(float), vol.Range(min=0.5, max=24) + probatio.Required(ATTR_DURATION): probatio.All( + probatio.Coerce(float), probatio.Range(min=0.5, max=24) ), - vol.Optional(ATTR_TIME_RANGE, default=TIME_RANGE_FULL_DAY): vol.In( + probatio.Optional(ATTR_TIME_RANGE, default=TIME_RANGE_FULL_DAY): probatio.In( [TIME_RANGE_DAY, TIME_RANGE_NIGHT, TIME_RANGE_FULL_DAY] ), } diff --git a/homeassistant/components/greencell/config_flow.py b/homeassistant/components/greencell/config_flow.py index f3623c4b986f7..f43c9877ac152 100644 --- a/homeassistant/components/greencell/config_flow.py +++ b/homeassistant/components/greencell/config_flow.py @@ -7,7 +7,7 @@ from typing import Any, override from greencell_client.utils import GreencellUtils -import voluptuous as vol +import probatio from homeassistant import config_entries from homeassistant.components import mqtt @@ -168,9 +168,9 @@ async def async_step_select( return self.async_show_form( step_id="select", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_SERIAL_NUMBER): vol.In( + probatio.Required(CONF_SERIAL_NUMBER): probatio.In( list(self._discovered.keys()) ) } diff --git a/homeassistant/components/greeneye_monitor/__init__.py b/homeassistant/components/greeneye_monitor/__init__.py index 6b95dca6eeda6..7510a3fa38495 100644 --- a/homeassistant/components/greeneye_monitor/__init__.py +++ b/homeassistant/components/greeneye_monitor/__init__.py @@ -3,7 +3,7 @@ import logging import greeneye -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_NAME, @@ -38,54 +38,62 @@ _LOGGER = logging.getLogger(__name__) -TEMPERATURE_SENSOR_SCHEMA = vol.Schema( - {vol.Required(CONF_NUMBER): vol.Range(1, 8), vol.Required(CONF_NAME): cv.string} +TEMPERATURE_SENSOR_SCHEMA = probatio.Schema( + { + probatio.Required(CONF_NUMBER): probatio.Range(1, 8), + probatio.Required(CONF_NAME): cv.string, + } ) -TEMPERATURE_SENSORS_SCHEMA = vol.Schema( +TEMPERATURE_SENSORS_SCHEMA = probatio.Schema( { - vol.Required(CONF_TEMPERATURE_UNIT): cv.temperature_unit, - vol.Required(CONF_SENSORS): vol.All( + probatio.Required(CONF_TEMPERATURE_UNIT): cv.temperature_unit, + probatio.Required(CONF_SENSORS): probatio.All( cv.ensure_list, [TEMPERATURE_SENSOR_SCHEMA] ), } ) -VOLTAGE_SENSOR_SCHEMA = vol.Schema( - {vol.Required(CONF_NUMBER): vol.Range(1, 48), vol.Required(CONF_NAME): cv.string} +VOLTAGE_SENSOR_SCHEMA = probatio.Schema( + { + probatio.Required(CONF_NUMBER): probatio.Range(1, 48), + probatio.Required(CONF_NAME): cv.string, + } ) -VOLTAGE_SENSORS_SCHEMA = vol.All(cv.ensure_list, [VOLTAGE_SENSOR_SCHEMA]) +VOLTAGE_SENSORS_SCHEMA = probatio.All(cv.ensure_list, [VOLTAGE_SENSOR_SCHEMA]) -PULSE_COUNTER_SCHEMA = vol.Schema( +PULSE_COUNTER_SCHEMA = probatio.Schema( { - vol.Required(CONF_NUMBER): vol.Range(1, 4), - vol.Required(CONF_NAME): cv.string, - vol.Required(CONF_COUNTED_QUANTITY): cv.string, - vol.Optional(CONF_COUNTED_QUANTITY_PER_PULSE, default=1.0): vol.Coerce(float), - vol.Optional(CONF_TIME_UNIT, default=UnitOfTime.SECONDS): vol.Any( + probatio.Required(CONF_NUMBER): probatio.Range(1, 4), + probatio.Required(CONF_NAME): cv.string, + probatio.Required(CONF_COUNTED_QUANTITY): cv.string, + probatio.Optional( + CONF_COUNTED_QUANTITY_PER_PULSE, default=1.0 + ): probatio.Coerce(float), + probatio.Optional(CONF_TIME_UNIT, default=UnitOfTime.SECONDS): probatio.Any( UnitOfTime.SECONDS.value, UnitOfTime.MINUTES.value, UnitOfTime.HOURS.value ), } ) -PULSE_COUNTERS_SCHEMA = vol.All(cv.ensure_list, [PULSE_COUNTER_SCHEMA]) +PULSE_COUNTERS_SCHEMA = probatio.All(cv.ensure_list, [PULSE_COUNTER_SCHEMA]) -CHANNEL_SCHEMA = vol.Schema( +CHANNEL_SCHEMA = probatio.Schema( { - vol.Required(CONF_NUMBER): vol.Range(1, 48), - vol.Required(CONF_NAME): cv.string, - vol.Optional(CONF_NET_METERING, default=False): cv.boolean, + probatio.Required(CONF_NUMBER): probatio.Range(1, 48), + probatio.Required(CONF_NAME): cv.string, + probatio.Optional(CONF_NET_METERING, default=False): cv.boolean, } ) -CHANNELS_SCHEMA = vol.All(cv.ensure_list, [CHANNEL_SCHEMA]) +CHANNELS_SCHEMA = probatio.All(cv.ensure_list, [CHANNEL_SCHEMA]) -MONITOR_SCHEMA = vol.Schema( +MONITOR_SCHEMA = probatio.Schema( { - vol.Required(CONF_SERIAL_NUMBER): vol.All( + probatio.Required(CONF_SERIAL_NUMBER): probatio.All( cv.string, - vol.Length( + probatio.Length( min=8, max=8, msg=( @@ -93,25 +101,28 @@ "string (including leading zeroes)." ), ), - vol.Coerce(int), + probatio.Coerce(int), ), - vol.Optional(CONF_CHANNELS, default=[]): CHANNELS_SCHEMA, - vol.Optional( + probatio.Optional(CONF_CHANNELS, default=[]): CHANNELS_SCHEMA, + probatio.Optional( CONF_TEMPERATURE_SENSORS, default={CONF_TEMPERATURE_UNIT: TEMPERATURE_UNIT_CELSIUS, CONF_SENSORS: []}, ): TEMPERATURE_SENSORS_SCHEMA, - vol.Optional(CONF_PULSE_COUNTERS, default=[]): PULSE_COUNTERS_SCHEMA, - vol.Optional(CONF_VOLTAGE_SENSORS, default=[]): VOLTAGE_SENSORS_SCHEMA, + probatio.Optional(CONF_PULSE_COUNTERS, default=[]): PULSE_COUNTERS_SCHEMA, + probatio.Optional(CONF_VOLTAGE_SENSORS, default=[]): VOLTAGE_SENSORS_SCHEMA, } ) -MONITORS_SCHEMA = vol.All(cv.ensure_list, [MONITOR_SCHEMA]) +MONITORS_SCHEMA = probatio.All(cv.ensure_list, [MONITOR_SCHEMA]) -COMPONENT_SCHEMA = vol.Schema( - {vol.Required(CONF_PORT): cv.port, vol.Required(CONF_MONITORS): MONITORS_SCHEMA} +COMPONENT_SCHEMA = probatio.Schema( + { + probatio.Required(CONF_PORT): cv.port, + probatio.Required(CONF_MONITORS): MONITORS_SCHEMA, + } ) -CONFIG_SCHEMA = vol.Schema({DOMAIN: COMPONENT_SCHEMA}, extra=vol.ALLOW_EXTRA) +CONFIG_SCHEMA = probatio.Schema({DOMAIN: COMPONENT_SCHEMA}, extra=probatio.ALLOW_EXTRA) async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: diff --git a/homeassistant/components/group/__init__.py b/homeassistant/components/group/__init__.py index 7cb68028d6432..bb67a92cb3368 100644 --- a/homeassistant/components/group/__init__.py +++ b/homeassistant/components/group/__init__.py @@ -5,7 +5,7 @@ import logging from typing import Any -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( @@ -84,10 +84,10 @@ def _conf_preprocess(value: Any) -> dict[str, Any]: return value -GROUP_SCHEMA = vol.All( - vol.Schema( +GROUP_SCHEMA = probatio.All( + probatio.Schema( { - vol.Optional(CONF_ENTITIES): vol.Any(cv.entity_ids, None), + probatio.Optional(CONF_ENTITIES): probatio.Any(cv.entity_ids, None), CONF_NAME: cv.string, CONF_ICON: cv.icon, CONF_ALL: cv.boolean, @@ -95,9 +95,13 @@ def _conf_preprocess(value: Any) -> dict[str, Any]: ) ) -CONFIG_SCHEMA = vol.Schema( - {DOMAIN: vol.Schema({cv.match_all: vol.All(_conf_preprocess, GROUP_SCHEMA)})}, - extra=vol.ALLOW_EXTRA, +CONFIG_SCHEMA = probatio.Schema( + { + DOMAIN: probatio.Schema( + {cv.match_all: probatio.All(_conf_preprocess, GROUP_SCHEMA)} + ) + }, + extra=probatio.ALLOW_EXTRA, ) @@ -232,7 +236,7 @@ async def reload_service_handler(service: ServiceCall) -> None: await async_reload_integration_platforms(hass, DOMAIN, PLATFORMS) hass.services.async_register( - DOMAIN, SERVICE_RELOAD, reload_service_handler, schema=vol.Schema({}) + DOMAIN, SERVICE_RELOAD, reload_service_handler, schema=probatio.Schema({}) ) service_lock = asyncio.Lock() @@ -318,16 +322,16 @@ async def groups_service_handler(service: ServiceCall) -> None: DOMAIN, SERVICE_SET, locked_service_handler, - schema=vol.All( - vol.Schema( + schema=probatio.All( + probatio.Schema( { - vol.Required(ATTR_OBJECT_ID): cv.slug, - vol.Optional(ATTR_NAME): cv.string, - vol.Optional(ATTR_ICON): cv.string, - vol.Optional(ATTR_ALL): cv.boolean, - vol.Exclusive(ATTR_ENTITIES, "entities"): cv.entity_ids, - vol.Exclusive(ATTR_ADD_ENTITIES, "entities"): cv.entity_ids, - vol.Exclusive(ATTR_REMOVE_ENTITIES, "entities"): cv.entity_ids, + probatio.Required(ATTR_OBJECT_ID): cv.slug, + probatio.Optional(ATTR_NAME): cv.string, + probatio.Optional(ATTR_ICON): cv.string, + probatio.Optional(ATTR_ALL): cv.boolean, + probatio.Exclusive(ATTR_ENTITIES, "entities"): cv.entity_ids, + probatio.Exclusive(ATTR_ADD_ENTITIES, "entities"): cv.entity_ids, + probatio.Exclusive(ATTR_REMOVE_ENTITIES, "entities"): cv.entity_ids, } ) ), @@ -337,7 +341,7 @@ async def groups_service_handler(service: ServiceCall) -> None: DOMAIN, SERVICE_REMOVE, groups_service_handler, - schema=vol.Schema({vol.Required(ATTR_OBJECT_ID): cv.slug}), + schema=probatio.Schema({probatio.Required(ATTR_OBJECT_ID): cv.slug}), ) return True diff --git a/homeassistant/components/group/binary_sensor.py b/homeassistant/components/group/binary_sensor.py index eb129fcdfe086..160498bb7bdf3 100644 --- a/homeassistant/components/group/binary_sensor.py +++ b/homeassistant/components/group/binary_sensor.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import ( DEVICE_CLASSES_SCHEMA, @@ -39,11 +39,11 @@ PLATFORM_SCHEMA = BINARY_SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ENTITIES): cv.entities_domain(BINARY_SENSOR_DOMAIN), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_UNIQUE_ID): cv.string, - vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, - vol.Optional(CONF_ALL): cv.boolean, + probatio.Required(CONF_ENTITIES): cv.entities_domain(BINARY_SENSOR_DOMAIN), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_ALL): cv.boolean, } ) diff --git a/homeassistant/components/group/button.py b/homeassistant/components/group/button.py index 7dd37af2b2afb..a6f352fc8c9da 100644 --- a/homeassistant/components/group/button.py +++ b/homeassistant/components/group/button.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.button import ( DOMAIN as BUTTON_DOMAIN, @@ -35,9 +35,9 @@ PLATFORM_SCHEMA = BUTTON_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ENTITIES): cv.entities_domain(BUTTON_DOMAIN), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Required(CONF_ENTITIES): cv.entities_domain(BUTTON_DOMAIN), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_UNIQUE_ID): cv.string, } ) diff --git a/homeassistant/components/group/config_flow.py b/homeassistant/components/group/config_flow.py index 9e8ccb293070d..06112fe5c4699 100644 --- a/homeassistant/components/group/config_flow.py +++ b/homeassistant/components/group/config_flow.py @@ -4,7 +4,7 @@ from functools import partial from typing import Any, cast, override -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.const import CONF_ENTITIES, CONF_TYPE @@ -51,9 +51,9 @@ async def basic_group_options_schema( domain: str | list[str], handler: SchemaCommonFlowHandler | None -) -> vol.Schema: +) -> probatio.Schema: """Generate options schema.""" - entity_selector: selector.Selector[Any] | vol.Schema + entity_selector: selector.Selector[Any] | probatio.Schema if handler is None: entity_selector = selector.selector( {"entity": {"domain": domain, "multiple": True, "reorder": True}} @@ -64,56 +64,62 @@ async def basic_group_options_schema( selector.EntitySelectorConfig(domain=domain, multiple=True, reorder=True), ) - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_ENTITIES): entity_selector, - vol.Required(CONF_HIDE_MEMBERS, default=False): selector.BooleanSelector(), + probatio.Required(CONF_ENTITIES): entity_selector, + probatio.Required( + CONF_HIDE_MEMBERS, default=False + ): selector.BooleanSelector(), } ) -def basic_group_config_schema(domain: str | list[str]) -> vol.Schema: +def basic_group_config_schema(domain: str | list[str]) -> probatio.Schema: """Generate config schema.""" - return vol.Schema( + return probatio.Schema( { - vol.Required("name"): selector.TextSelector(), - vol.Required(CONF_ENTITIES): selector.EntitySelector( + probatio.Required("name"): selector.TextSelector(), + probatio.Required(CONF_ENTITIES): selector.EntitySelector( selector.EntitySelectorConfig( domain=domain, multiple=True, reorder=True ), ), - vol.Required(CONF_HIDE_MEMBERS, default=False): selector.BooleanSelector(), + probatio.Required( + CONF_HIDE_MEMBERS, default=False + ): selector.BooleanSelector(), } ) async def binary_sensor_options_schema( handler: SchemaCommonFlowHandler | None, -) -> vol.Schema: +) -> probatio.Schema: """Generate options schema.""" return (await basic_group_options_schema("binary_sensor", handler)).extend( { - vol.Required(CONF_ALL, default=False): selector.BooleanSelector(), + probatio.Required(CONF_ALL, default=False): selector.BooleanSelector(), } ) BINARY_SENSOR_CONFIG_SCHEMA = basic_group_config_schema("binary_sensor").extend( { - vol.Required(CONF_ALL, default=False): selector.BooleanSelector(), + probatio.Required(CONF_ALL, default=False): selector.BooleanSelector(), } ) SENSOR_CONFIG_EXTENDS = { - vol.Required(CONF_TYPE): selector.SelectSelector( + probatio.Required(CONF_TYPE): selector.SelectSelector( selector.SelectSelectorConfig( options=_STATISTIC_MEASURES, translation_key=CONF_TYPE ), ), } SENSOR_OPTIONS = { - vol.Optional(CONF_IGNORE_NON_NUMERIC, default=False): selector.BooleanSelector(), - vol.Required(CONF_TYPE): selector.SelectSelector( + probatio.Optional( + CONF_IGNORE_NON_NUMERIC, default=False + ): selector.BooleanSelector(), + probatio.Required(CONF_TYPE): selector.SelectSelector( selector.SelectSelectorConfig( options=_STATISTIC_MEASURES, translation_key=CONF_TYPE ), @@ -123,7 +129,7 @@ async def binary_sensor_options_schema( async def sensor_options_schema( domain: str, handler: SchemaCommonFlowHandler | None -) -> vol.Schema: +) -> probatio.Schema: """Generate options schema.""" return ( await basic_group_options_schema(["sensor", "number", "input_number"], handler) @@ -137,25 +143,25 @@ async def sensor_options_schema( async def light_switch_options_schema( domain: str, handler: SchemaCommonFlowHandler | None -) -> vol.Schema: +) -> probatio.Schema: """Generate options schema.""" return (await basic_group_options_schema(domain, handler)).extend( { - vol.Required(CONF_ALL, default=False): selector.BooleanSelector(), + probatio.Required(CONF_ALL, default=False): selector.BooleanSelector(), } ) LIGHT_CONFIG_SCHEMA = basic_group_config_schema("light").extend( { - vol.Required(CONF_ALL, default=False): selector.BooleanSelector(), + probatio.Required(CONF_ALL, default=False): selector.BooleanSelector(), } ) SWITCH_CONFIG_SCHEMA = basic_group_config_schema("switch").extend( { - vol.Required(CONF_ALL, default=False): selector.BooleanSelector(), + probatio.Required(CONF_ALL, default=False): selector.BooleanSelector(), } ) @@ -314,7 +320,7 @@ async def _set_group_type( ), } -PREVIEW_OPTIONS_SCHEMA: dict[str, vol.Schema] = {} +PREVIEW_OPTIONS_SCHEMA: dict[str, probatio.Schema] = {} CREATE_PREVIEW_ENTITY: dict[ str, @@ -382,7 +388,8 @@ async def async_setup_preview(hass: HomeAssistant) -> None: continue schema = cast( Callable[ - [SchemaCommonFlowHandler | None], Coroutine[Any, Any, vol.Schema] + [SchemaCommonFlowHandler | None], + Coroutine[Any, Any, probatio.Schema], ], form_step.schema, ) @@ -405,10 +412,10 @@ def _async_hide_members( @websocket_api.websocket_command( { - vol.Required("type"): "group/start_preview", - vol.Required("flow_id"): str, - vol.Required("flow_type"): vol.Any("config_flow", "options_flow"), - vol.Required("user_input"): dict, + probatio.Required("type"): "group/start_preview", + probatio.Required("flow_id"): str, + probatio.Required("flow_type"): probatio.Any("config_flow", "options_flow"), + probatio.Required("user_input"): dict, } ) @callback @@ -423,7 +430,7 @@ def ws_start_preview( flow_status = hass.config_entries.flow.async_get(msg["flow_id"]) group_type = flow_status["step_id"] form_step = cast(SchemaFlowFormStep, CONFIG_FLOW[group_type]) - schema = cast(vol.Schema, form_step.schema) + schema = cast(probatio.Schema, form_step.schema) validated = schema(msg["user_input"]) name = validated["name"] else: diff --git a/homeassistant/components/group/cover.py b/homeassistant/components/group/cover.py index 3800589fbfe37..4c454bf6e5354 100644 --- a/homeassistant/components/group/cover.py +++ b/homeassistant/components/group/cover.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.cover import ( ATTR_POSITION, @@ -54,9 +54,9 @@ PLATFORM_SCHEMA = COVER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ENTITIES): cv.entities_domain(COVER_DOMAIN), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Required(CONF_ENTITIES): cv.entities_domain(COVER_DOMAIN), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_UNIQUE_ID): cv.string, } ) diff --git a/homeassistant/components/group/event.py b/homeassistant/components/group/event.py index 2303242dab4d0..b860825d78f84 100644 --- a/homeassistant/components/group/event.py +++ b/homeassistant/components/group/event.py @@ -3,7 +3,7 @@ import itertools from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.event import ( DOMAIN as EVENT_DOMAIN, @@ -40,9 +40,9 @@ PLATFORM_SCHEMA = EVENT_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ENTITIES): cv.entities_domain(EVENT_DOMAIN), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Required(CONF_ENTITIES): cv.entities_domain(EVENT_DOMAIN), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_UNIQUE_ID): cv.string, } ) diff --git a/homeassistant/components/group/fan.py b/homeassistant/components/group/fan.py index 14f1ad6ac3475..8a7bf00de1418 100644 --- a/homeassistant/components/group/fan.py +++ b/homeassistant/components/group/fan.py @@ -5,7 +5,7 @@ from operator import ior from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.fan import ( ATTR_DIRECTION, @@ -59,9 +59,9 @@ PLATFORM_SCHEMA = FAN_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ENTITIES): cv.entities_domain(FAN_DOMAIN), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Required(CONF_ENTITIES): cv.entities_domain(FAN_DOMAIN), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_UNIQUE_ID): cv.string, } ) diff --git a/homeassistant/components/group/light.py b/homeassistant/components/group/light.py index 2877d60d8a096..b9a2ddaaab3e0 100644 --- a/homeassistant/components/group/light.py +++ b/homeassistant/components/group/light.py @@ -5,7 +5,7 @@ import logging from typing import Any, cast, override -import voluptuous as vol +import probatio from homeassistant.components import light from homeassistant.components.light import ( @@ -60,10 +60,10 @@ PLATFORM_SCHEMA = LIGHT_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_UNIQUE_ID): cv.string, - vol.Required(CONF_ENTITIES): cv.entities_domain(light.DOMAIN), - vol.Optional(CONF_ALL): cv.boolean, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Required(CONF_ENTITIES): cv.entities_domain(light.DOMAIN), + probatio.Optional(CONF_ALL): cv.boolean, } ) diff --git a/homeassistant/components/group/lock.py b/homeassistant/components/group/lock.py index 1cf5a8dbf4297..e240ad24b4bfe 100644 --- a/homeassistant/components/group/lock.py +++ b/homeassistant/components/group/lock.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.lock import ( DOMAIN as LOCK_DOMAIN, @@ -39,9 +39,9 @@ PLATFORM_SCHEMA = LOCK_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ENTITIES): cv.entities_domain(LOCK_DOMAIN), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Required(CONF_ENTITIES): cv.entities_domain(LOCK_DOMAIN), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_UNIQUE_ID): cv.string, } ) diff --git a/homeassistant/components/group/media_player.py b/homeassistant/components/group/media_player.py index e554fc4c2d990..1421082277c64 100644 --- a/homeassistant/components/group/media_player.py +++ b/homeassistant/components/group/media_player.py @@ -4,7 +4,7 @@ from contextlib import suppress from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.media_player import ( ATTR_MEDIA_CONTENT_ID, @@ -75,9 +75,9 @@ PLATFORM_SCHEMA = MEDIA_PLAYER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ENTITIES): cv.entities_domain(MEDIA_PLAYER_DOMAIN), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Required(CONF_ENTITIES): cv.entities_domain(MEDIA_PLAYER_DOMAIN), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_UNIQUE_ID): cv.string, } ) diff --git a/homeassistant/components/group/notify.py b/homeassistant/components/group/notify.py index f0fab28356c38..27e60110921dc 100644 --- a/homeassistant/components/group/notify.py +++ b/homeassistant/components/group/notify.py @@ -5,7 +5,7 @@ from copy import deepcopy from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.notify import ( ATTR_DATA, @@ -46,7 +46,7 @@ def _backward_compat_schema(value: Any | None) -> Any: # `service` has been renamed to `action` if CONF_SERVICE in value: if CONF_ACTION in value: - raise vol.Invalid( + raise probatio.Invalid( "Cannot specify both 'service' and 'action'. Please use 'action' only." ) value[CONF_ACTION] = value.pop(CONF_SERVICE) @@ -56,14 +56,14 @@ def _backward_compat_schema(value: Any | None) -> Any: PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_SERVICES): vol.All( + probatio.Required(CONF_SERVICES): probatio.All( cv.ensure_list, [ - vol.All( + probatio.All( _backward_compat_schema, { - vol.Required(CONF_ACTION): cv.slug, - vol.Optional(ATTR_DATA): dict, + probatio.Required(CONF_ACTION): cv.slug, + probatio.Optional(ATTR_DATA): dict, }, ) ], diff --git a/homeassistant/components/group/sensor.py b/homeassistant/components/group/sensor.py index 134af6b9953bf..bfd653d63df6e 100644 --- a/homeassistant/components/group/sensor.py +++ b/homeassistant/components/group/sensor.py @@ -9,7 +9,7 @@ import statistics from typing import TYPE_CHECKING, Any, override -import voluptuous as vol +import probatio from homeassistant.components.input_number import DOMAIN as INPUT_NUMBER_DOMAIN from homeassistant.components.number import DOMAIN as NUMBER_DOMAIN @@ -95,16 +95,18 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ENTITIES): cv.entities_domain( + probatio.Required(CONF_ENTITIES): cv.entities_domain( [SENSOR_DOMAIN, NUMBER_DOMAIN, INPUT_NUMBER_DOMAIN] ), - vol.Required(CONF_TYPE): vol.All(cv.string, vol.In(SENSOR_TYPES.values())), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_UNIQUE_ID): cv.string, - vol.Optional(CONF_IGNORE_NON_NUMERIC, default=False): cv.boolean, - vol.Optional(CONF_UNIT_OF_MEASUREMENT): str, - vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, - vol.Optional(CONF_STATE_CLASS): STATE_CLASSES_SCHEMA, + probatio.Required(CONF_TYPE): probatio.All( + cv.string, probatio.In(SENSOR_TYPES.values()) + ), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Optional(CONF_IGNORE_NON_NUMERIC, default=False): cv.boolean, + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): str, + probatio.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_STATE_CLASS): STATE_CLASSES_SCHEMA, } ) diff --git a/homeassistant/components/group/switch.py b/homeassistant/components/group/switch.py index f6bd811af9f1b..0ffa616fb6998 100644 --- a/homeassistant/components/group/switch.py +++ b/homeassistant/components/group/switch.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.switch import ( DOMAIN as SWITCH_DOMAIN, @@ -40,10 +40,10 @@ PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ENTITIES): cv.entities_domain(SWITCH_DOMAIN), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_UNIQUE_ID): cv.string, - vol.Optional(CONF_ALL, default=False): cv.boolean, + probatio.Required(CONF_ENTITIES): cv.entities_domain(SWITCH_DOMAIN), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Optional(CONF_ALL, default=False): cv.boolean, } ) diff --git a/homeassistant/components/group/valve.py b/homeassistant/components/group/valve.py index d9524fb46c74c..3d10cc32a2f25 100644 --- a/homeassistant/components/group/valve.py +++ b/homeassistant/components/group/valve.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.valve import ( ATTR_POSITION, @@ -49,9 +49,9 @@ PLATFORM_SCHEMA = VALVE_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ENTITIES): cv.entities_domain(VALVE_DOMAIN), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Required(CONF_ENTITIES): cv.entities_domain(VALVE_DOMAIN), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_UNIQUE_ID): cv.string, } ) diff --git a/homeassistant/components/growatt_server/config_flow.py b/homeassistant/components/growatt_server/config_flow.py index b80c2ce89f0ca..5288937b4f196 100644 --- a/homeassistant/components/growatt_server/config_flow.py +++ b/homeassistant/components/growatt_server/config_flow.py @@ -6,8 +6,8 @@ import growattServer from growattServer import GrowattV1ApiErrorCode +import probatio import requests -import voluptuous as vol from homeassistant.config_entries import ConfigEntry, ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -183,14 +183,16 @@ async def _async_step_credentials( auth_type = entry.data.get(CONF_AUTH_TYPE) if auth_type == AUTH_PASSWORD: - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required( + probatio.Required( CONF_USERNAME, default=entry.data.get(CONF_USERNAME), ): str, - vol.Required(CONF_PASSWORD): str, - vol.Required(CONF_REGION, default=current_region): SelectSelector( + probatio.Required(CONF_PASSWORD): str, + probatio.Required( + CONF_REGION, default=current_region + ): SelectSelector( SelectSelectorConfig( options=list(SERVER_URLS_NAMES.keys()), translation_key="region", @@ -199,10 +201,12 @@ async def _async_step_credentials( } ) elif auth_type == AUTH_API_TOKEN: - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_TOKEN): str, - vol.Required(CONF_REGION, default=current_region): SelectSelector( + probatio.Required(CONF_TOKEN): str, + probatio.Required( + CONF_REGION, default=current_region + ): SelectSelector( SelectSelectorConfig( options=list(SERVER_URLS_NAMES.keys()), translation_key="region", @@ -239,7 +243,7 @@ async def async_step_password_auth( self.auth_type = AUTH_PASSWORD # Traditional username/password authentication - # Convert region name to URL - guaranteed to exist since vol.In validates it + # Convert region name to URL - guaranteed to exist since probatio.In validates it server_url = SERVER_URLS_NAMES[user_input[CONF_REGION]] self.api = growattServer.GrowattApi( @@ -283,7 +287,7 @@ async def async_step_token_auth( self.auth_type = AUTH_API_TOKEN # Using token authentication - # Convert region name to URL - guaranteed to exist since vol.In validates it + # Convert region name to URL - guaranteed to exist since probatio.In validates it server_url = SERVER_URLS_NAMES[user_input[CONF_REGION]] self.api = growattServer.OpenApiV1(token=user_input[CONF_TOKEN]) @@ -321,11 +325,11 @@ def _async_show_password_form( self, errors: dict[str, Any] | None = None ) -> ConfigFlowResult: """Show the username/password form to the user.""" - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Required(CONF_REGION, default=DEFAULT_URL): SelectSelector( + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Required(CONF_REGION, default=DEFAULT_URL): SelectSelector( SelectSelectorConfig( options=list(SERVER_URLS_NAMES.keys()), translation_key="region", @@ -343,10 +347,10 @@ def _async_show_token_form( self, errors: dict[str, Any] | None = None ) -> ConfigFlowResult: """Show the API token form to the user.""" - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_TOKEN): str, - vol.Required(CONF_REGION, default=DEFAULT_URL): SelectSelector( + probatio.Required(CONF_TOKEN): str, + probatio.Required(CONF_REGION, default=DEFAULT_URL): SelectSelector( SelectSelectorConfig( options=list(SERVER_URLS_NAMES.keys()), translation_key="region", @@ -377,8 +381,8 @@ async def async_step_plant( } if user_input is None and len(plant_dict) > 1: - data_schema = vol.Schema( - {vol.Required(CONF_PLANT_ID): vol.In(plant_dict)} + data_schema = probatio.Schema( + {probatio.Required(CONF_PLANT_ID): probatio.In(plant_dict)} ) return self.async_show_form(step_id="plant", data_schema=data_schema) @@ -414,7 +418,9 @@ async def async_step_plant( plants = {plant["plantId"]: plant["plantName"] for plant in plant_data} if user_input is None and len(plant_data) > 1: - data_schema = vol.Schema({vol.Required(CONF_PLANT_ID): vol.In(plants)}) + data_schema = probatio.Schema( + {probatio.Required(CONF_PLANT_ID): probatio.In(plants)} + ) return self.async_show_form(step_id="plant", data_schema=data_schema) if user_input is None: diff --git a/homeassistant/components/gtfs/sensor.py b/homeassistant/components/gtfs/sensor.py index 142cac59453ea..1dfccce5276f4 100644 --- a/homeassistant/components/gtfs/sensor.py +++ b/homeassistant/components/gtfs/sensor.py @@ -6,9 +6,9 @@ import threading from typing import Any, override +import probatio import pygtfs from sqlalchemy.sql import text -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -253,12 +253,12 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ORIGIN): cv.string, - vol.Required(CONF_DESTINATION): cv.string, - vol.Required(CONF_DATA): cv.string, - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_OFFSET, default=0): cv.time_period, - vol.Optional(CONF_TOMORROW, default=False): cv.boolean, + probatio.Required(CONF_ORIGIN): cv.string, + probatio.Required(CONF_DESTINATION): cv.string, + probatio.Required(CONF_DATA): cv.string, + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_OFFSET, default=0): cv.time_period, + probatio.Optional(CONF_TOMORROW, default=False): cv.boolean, } ) diff --git a/homeassistant/components/guardian/config_flow.py b/homeassistant/components/guardian/config_flow.py index 3ebe10306126c..a14e7a8a1d52e 100644 --- a/homeassistant/components/guardian/config_flow.py +++ b/homeassistant/components/guardian/config_flow.py @@ -4,7 +4,7 @@ from aioguardian import Client from aioguardian.errors import GuardianError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_IP_ADDRESS, CONF_PORT @@ -16,10 +16,10 @@ DEFAULT_PORT = 7777 -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_IP_ADDRESS): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Required(CONF_IP_ADDRESS): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, } ) diff --git a/homeassistant/components/guardian/services.py b/homeassistant/components/guardian/services.py index b8e6ff0599c45..e694eb9501fd8 100644 --- a/homeassistant/components/guardian/services.py +++ b/homeassistant/components/guardian/services.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING, Any from aioguardian.errors import GuardianError -import voluptuous as vol +import probatio from homeassistant.const import ( ATTR_DEVICE_ID, @@ -32,25 +32,25 @@ SERVICE_NAME_UPGRADE_FIRMWARE, ) -SERVICE_BASE_SCHEMA = vol.Schema( +SERVICE_BASE_SCHEMA = probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): cv.string, + probatio.Required(ATTR_DEVICE_ID): cv.string, } ) -SERVICE_PAIR_UNPAIR_SENSOR_SCHEMA = vol.Schema( +SERVICE_PAIR_UNPAIR_SENSOR_SCHEMA = probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): cv.string, - vol.Required(CONF_UID): cv.string, + probatio.Required(ATTR_DEVICE_ID): cv.string, + probatio.Required(CONF_UID): cv.string, } ) -SERVICE_UPGRADE_FIRMWARE_SCHEMA = vol.Schema( +SERVICE_UPGRADE_FIRMWARE_SCHEMA = probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): cv.string, - vol.Optional(CONF_URL): cv.url, - vol.Optional(CONF_PORT): cv.port, - vol.Optional(CONF_FILENAME): cv.string, + probatio.Required(ATTR_DEVICE_ID): cv.string, + probatio.Optional(CONF_URL): cv.url, + probatio.Optional(CONF_PORT): cv.port, + probatio.Optional(CONF_FILENAME): cv.string, }, ) diff --git a/homeassistant/components/guntamatic/config_flow.py b/homeassistant/components/guntamatic/config_flow.py index 1218941b856d0..37f7c4593c727 100644 --- a/homeassistant/components/guntamatic/config_flow.py +++ b/homeassistant/components/guntamatic/config_flow.py @@ -4,8 +4,8 @@ from typing import Any, override from guntamatic.heater import Heater, NoSerialException +import probatio import requests -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST @@ -15,9 +15,9 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, + probatio.Required(CONF_HOST): str, } ) diff --git a/homeassistant/components/habitica/config_flow.py b/homeassistant/components/habitica/config_flow.py index e17550cb5d37e..bb5dfbadf590e 100644 --- a/homeassistant/components/habitica/config_flow.py +++ b/homeassistant/components/habitica/config_flow.py @@ -13,7 +13,7 @@ NotAuthorizedError, UserData, ) -import voluptuous as vol +import probatio from homeassistant import data_entry_flow from homeassistant.config_entries import ( @@ -60,24 +60,24 @@ ) from .coordinator import HabiticaConfigEntry -STEP_ADVANCED_DATA_SCHEMA = vol.Schema( +STEP_ADVANCED_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_USER): str, - vol.Required(CONF_API_KEY): str, - vol.Optional(CONF_URL, default=DEFAULT_URL): str, - vol.Required(CONF_VERIFY_SSL, default=True): bool, + probatio.Required(CONF_API_USER): str, + probatio.Required(CONF_API_KEY): str, + probatio.Optional(CONF_URL, default=DEFAULT_URL): str, + probatio.Required(CONF_VERIFY_SSL, default=True): bool, } ) -STEP_LOGIN_DATA_SCHEMA = vol.Schema( +STEP_LOGIN_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): TextSelector( + probatio.Required(CONF_USERNAME): TextSelector( TextSelectorConfig( type=TextSelectorType.EMAIL, autocomplete="email", ) ), - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", @@ -86,18 +86,18 @@ } ) -STEP_REAUTH_DATA_SCHEMA = vol.Schema( +STEP_REAUTH_DATA_SCHEMA = probatio.Schema( { - vol.Required(SECTION_REAUTH_LOGIN): data_entry_flow.section( - vol.Schema( + probatio.Required(SECTION_REAUTH_LOGIN): data_entry_flow.section( + probatio.Schema( { - vol.Optional(CONF_USERNAME): TextSelector( + probatio.Optional(CONF_USERNAME): TextSelector( TextSelectorConfig( type=TextSelectorType.EMAIL, autocomplete="email", ) ), - vol.Optional(CONF_PASSWORD): TextSelector( + probatio.Optional(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", @@ -107,10 +107,10 @@ ), {"collapsed": False}, ), - vol.Required(SECTION_REAUTH_API_KEY): data_entry_flow.section( - vol.Schema( + probatio.Required(SECTION_REAUTH_API_KEY): data_entry_flow.section( + probatio.Schema( { - vol.Optional(CONF_API_KEY): str, + probatio.Optional(CONF_API_KEY): str, }, ), {"collapsed": True}, @@ -118,14 +118,14 @@ } ) -STEP_RECONF_DATA_SCHEMA = vol.Schema( +STEP_RECONF_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_KEY): str, - vol.Required(SECTION_DANGER_ZONE): data_entry_flow.section( - vol.Schema( + probatio.Required(CONF_API_KEY): str, + probatio.Required(SECTION_DANGER_ZONE): data_entry_flow.section( + probatio.Schema( { - vol.Required(CONF_URL): str, - vol.Required(CONF_VERIFY_SSL): bool, + probatio.Required(CONF_URL): str, + probatio.Required(CONF_VERIFY_SSL): bool, }, ), {"collapsed": True}, @@ -443,9 +443,9 @@ async def async_step_user( ] return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PARTY_MEMBER): SelectSelector( + probatio.Required(CONF_PARTY_MEMBER): SelectSelector( SelectSelectorConfig(options=options) ) } diff --git a/homeassistant/components/habitica/services.py b/homeassistant/components/habitica/services.py index f394883e1f00a..15a3808887493 100644 --- a/homeassistant/components/habitica/services.py +++ b/homeassistant/components/habitica/services.py @@ -23,7 +23,7 @@ TaskType, TooManyRequestsError, ) -import voluptuous as vol +import probatio from homeassistant.components.todo import ATTR_RENAME from homeassistant.const import ATTR_DATE, ATTR_NAME @@ -99,32 +99,40 @@ _LOGGER = logging.getLogger(__name__) -SERVICE_CAST_SKILL_SCHEMA = vol.Schema( +SERVICE_CAST_SKILL_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY): ConfigEntrySelector({"integration": DOMAIN}), - vol.Required(ATTR_SKILL): cv.string, - vol.Optional(ATTR_TASK): cv.string, + probatio.Required(ATTR_CONFIG_ENTRY): ConfigEntrySelector( + {"integration": DOMAIN} + ), + probatio.Required(ATTR_SKILL): cv.string, + probatio.Optional(ATTR_TASK): cv.string, } ) -SERVICE_MANAGE_QUEST_SCHEMA = vol.Schema( +SERVICE_MANAGE_QUEST_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY): ConfigEntrySelector({"integration": DOMAIN}), + probatio.Required(ATTR_CONFIG_ENTRY): ConfigEntrySelector( + {"integration": DOMAIN} + ), } ) -SERVICE_SCORE_TASK_SCHEMA = vol.Schema( +SERVICE_SCORE_TASK_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY): ConfigEntrySelector({"integration": DOMAIN}), - vol.Required(ATTR_TASK): cv.string, - vol.Optional(ATTR_DIRECTION): cv.string, + probatio.Required(ATTR_CONFIG_ENTRY): ConfigEntrySelector( + {"integration": DOMAIN} + ), + probatio.Required(ATTR_TASK): cv.string, + probatio.Optional(ATTR_DIRECTION): cv.string, } ) -SERVICE_TRANSFORMATION_SCHEMA = vol.Schema( +SERVICE_TRANSFORMATION_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY): ConfigEntrySelector({"integration": DOMAIN}), - vol.Required(ATTR_ITEM): cv.string, - vol.Required(ATTR_TARGET): cv.string, + probatio.Required(ATTR_CONFIG_ENTRY): ConfigEntrySelector( + {"integration": DOMAIN} + ), + probatio.Required(ATTR_ITEM): cv.string, + probatio.Required(ATTR_TARGET): cv.string, } ) @@ -133,78 +141,92 @@ "expanded": False, } -BASE_TASK_SCHEMA = vol.Schema( +BASE_TASK_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY): ConfigEntrySelector(), - vol.Optional(ATTR_RENAME): cv.string, - vol.Optional(ATTR_NOTES): cv.string, - vol.Optional(ATTR_TAG): vol.All(cv.ensure_list, [str]), - vol.Optional(ATTR_ALIAS): vol.All( + probatio.Required(ATTR_CONFIG_ENTRY): ConfigEntrySelector(), + probatio.Optional(ATTR_RENAME): cv.string, + probatio.Optional(ATTR_NOTES): cv.string, + probatio.Optional(ATTR_TAG): probatio.All(cv.ensure_list, [str]), + probatio.Optional(ATTR_ALIAS): probatio.All( cv.string, cv.matches_regex("^[a-zA-Z0-9-_]*$") ), - vol.Optional(ATTR_COST): vol.All(vol.Coerce(float), vol.Range(0)), - vol.Optional(ATTR_PRIORITY): vol.All( - vol.Upper, vol.In(TaskPriority._member_names_) + probatio.Optional(ATTR_COST): probatio.All( + probatio.Coerce(float), probatio.Range(0) + ), + probatio.Optional(ATTR_PRIORITY): probatio.All( + probatio.Upper, probatio.In(TaskPriority._member_names_) ), - vol.Optional(ATTR_UP_DOWN): vol.All(cv.ensure_list, [str]), - vol.Optional(ATTR_COUNTER_UP): vol.All(int, vol.Range(0)), - vol.Optional(ATTR_COUNTER_DOWN): vol.All(int, vol.Range(0)), - vol.Optional(ATTR_FREQUENCY): vol.Coerce(Frequency), - vol.Optional(ATTR_DATE): cv.date, - vol.Optional(ATTR_CLEAR_DATE): cv.boolean, - vol.Optional(ATTR_REMINDER): vol.All( - cv.ensure_list, [vol.Any(cv.datetime, cv.time)] + probatio.Optional(ATTR_UP_DOWN): probatio.All(cv.ensure_list, [str]), + probatio.Optional(ATTR_COUNTER_UP): probatio.All(int, probatio.Range(0)), + probatio.Optional(ATTR_COUNTER_DOWN): probatio.All(int, probatio.Range(0)), + probatio.Optional(ATTR_FREQUENCY): probatio.Coerce(Frequency), + probatio.Optional(ATTR_DATE): cv.date, + probatio.Optional(ATTR_CLEAR_DATE): cv.boolean, + probatio.Optional(ATTR_REMINDER): probatio.All( + cv.ensure_list, [probatio.Any(cv.datetime, cv.time)] ), - vol.Optional(ATTR_REMOVE_REMINDER): vol.All( - cv.ensure_list, [vol.Any(cv.datetime, cv.time)] + probatio.Optional(ATTR_REMOVE_REMINDER): probatio.All( + cv.ensure_list, [probatio.Any(cv.datetime, cv.time)] ), - vol.Optional(ATTR_CLEAR_REMINDER): cv.boolean, - vol.Optional(ATTR_ADD_CHECKLIST_ITEM): vol.All(cv.ensure_list, [str]), - vol.Optional(ATTR_REMOVE_CHECKLIST_ITEM): vol.All(cv.ensure_list, [str]), - vol.Optional(ATTR_SCORE_CHECKLIST_ITEM): vol.All(cv.ensure_list, [str]), - vol.Optional(ATTR_UNSCORE_CHECKLIST_ITEM): vol.All(cv.ensure_list, [str]), - vol.Optional(ATTR_COLLAPSE_CHECKLIST): vol.In(COLLAPSE_CHECKLIST_MAP), - vol.Optional(ATTR_START_DATE): cv.date, - vol.Optional(ATTR_INTERVAL): vol.All(int, vol.Range(0)), - vol.Optional(ATTR_REPEAT): vol.All(cv.ensure_list, [vol.In(WEEK_DAYS)]), - vol.Optional(ATTR_REPEAT_MONTHLY): vol.All( - cv.string, vol.In({"day_of_month", "day_of_week"}) + probatio.Optional(ATTR_CLEAR_REMINDER): cv.boolean, + probatio.Optional(ATTR_ADD_CHECKLIST_ITEM): probatio.All(cv.ensure_list, [str]), + probatio.Optional(ATTR_REMOVE_CHECKLIST_ITEM): probatio.All( + cv.ensure_list, [str] ), - vol.Optional(ATTR_STREAK): vol.All(int, vol.Range(0)), + probatio.Optional(ATTR_SCORE_CHECKLIST_ITEM): probatio.All( + cv.ensure_list, [str] + ), + probatio.Optional(ATTR_UNSCORE_CHECKLIST_ITEM): probatio.All( + cv.ensure_list, [str] + ), + probatio.Optional(ATTR_COLLAPSE_CHECKLIST): probatio.In(COLLAPSE_CHECKLIST_MAP), + probatio.Optional(ATTR_START_DATE): cv.date, + probatio.Optional(ATTR_INTERVAL): probatio.All(int, probatio.Range(0)), + probatio.Optional(ATTR_REPEAT): probatio.All( + cv.ensure_list, [probatio.In(WEEK_DAYS)] + ), + probatio.Optional(ATTR_REPEAT_MONTHLY): probatio.All( + cv.string, probatio.In({"day_of_month", "day_of_week"}) + ), + probatio.Optional(ATTR_STREAK): probatio.All(int, probatio.Range(0)), } ) SERVICE_UPDATE_TASK_SCHEMA = BASE_TASK_SCHEMA.extend( { - vol.Required(ATTR_TASK): cv.string, - vol.Optional(ATTR_REMOVE_TAG): vol.All(cv.ensure_list, [str]), + probatio.Required(ATTR_TASK): cv.string, + probatio.Optional(ATTR_REMOVE_TAG): probatio.All(cv.ensure_list, [str]), } ) SERVICE_CREATE_TASK_SCHEMA = BASE_TASK_SCHEMA.extend( { - vol.Required(ATTR_NAME): cv.string, + probatio.Required(ATTR_NAME): cv.string, } ) SERVICE_DAILY_SCHEMA = { - vol.Optional(ATTR_REMINDER): vol.All(cv.ensure_list, [cv.time]), - vol.Optional(ATTR_REMOVE_REMINDER): vol.All(cv.ensure_list, [cv.time]), + probatio.Optional(ATTR_REMINDER): probatio.All(cv.ensure_list, [cv.time]), + probatio.Optional(ATTR_REMOVE_REMINDER): probatio.All(cv.ensure_list, [cv.time]), } -SERVICE_GET_TASKS_SCHEMA = vol.Schema( +SERVICE_GET_TASKS_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY): ConfigEntrySelector({"integration": DOMAIN}), - vol.Optional(ATTR_TYPE): vol.All( - cv.ensure_list, [vol.All(vol.Upper, vol.In({x.name for x in TaskType}))] + probatio.Required(ATTR_CONFIG_ENTRY): ConfigEntrySelector( + {"integration": DOMAIN} + ), + probatio.Optional(ATTR_TYPE): probatio.All( + cv.ensure_list, + [probatio.All(probatio.Upper, probatio.In({x.name for x in TaskType}))], ), - vol.Optional(ATTR_PRIORITY): vol.All( - cv.ensure_list, [vol.All(vol.Upper, vol.In({x.name for x in TaskPriority}))] + probatio.Optional(ATTR_PRIORITY): probatio.All( + cv.ensure_list, + [probatio.All(probatio.Upper, probatio.In({x.name for x in TaskPriority}))], ), - vol.Optional(ATTR_TASK): vol.All(cv.ensure_list, [str]), - vol.Optional(ATTR_TAG): vol.All(cv.ensure_list, [str]), - vol.Optional(ATTR_KEYWORD): cv.string, + probatio.Optional(ATTR_TASK): probatio.All(cv.ensure_list, [str]), + probatio.Optional(ATTR_TAG): probatio.All(cv.ensure_list, [str]), + probatio.Optional(ATTR_KEYWORD): cv.string, } ) diff --git a/homeassistant/components/hanna/config_flow.py b/homeassistant/components/hanna/config_flow.py index f6aa293e013da..71ecbd09850e5 100644 --- a/homeassistant/components/hanna/config_flow.py +++ b/homeassistant/components/hanna/config_flow.py @@ -4,8 +4,8 @@ from typing import Any, override from hanna_cloud import AuthenticationError, HannaCloudClient +import probatio from requests.exceptions import ConnectionError as RequestsConnectionError, Timeout -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_EMAIL, CONF_PASSWORD @@ -19,8 +19,8 @@ class HannaConfigFlow(ConfigFlow, domain=DOMAIN): """Handle a config flow for Hanna Instruments.""" VERSION = 1 - data_schema = vol.Schema( - {vol.Required(CONF_EMAIL): str, vol.Required(CONF_PASSWORD): str} + data_schema = probatio.Schema( + {probatio.Required(CONF_EMAIL): str, probatio.Required(CONF_PASSWORD): str} ) @override diff --git a/homeassistant/components/harbor/config_flow.py b/homeassistant/components/harbor/config_flow.py index a34294f2c6b12..8246fc99926f6 100644 --- a/homeassistant/components/harbor/config_flow.py +++ b/homeassistant/components/harbor/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from harbor.config import HarborCameraConfig -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_IP_ADDRESS @@ -19,19 +19,19 @@ TEXT_SELECTOR = selector.TextSelector(selector.TextSelectorConfig()) PEM_SELECTOR = selector.TextSelector(selector.TextSelectorConfig(multiline=True)) -STEP_USER_SCHEMA = vol.Schema( +STEP_USER_SCHEMA = probatio.Schema( { - vol.Required(CONF_SERIAL): TEXT_SELECTOR, - vol.Required(CONF_CERT_PEM): PEM_SELECTOR, - vol.Required(CONF_KEY_PEM): PEM_SELECTOR, - vol.Required(CONF_IP_ADDRESS): TEXT_SELECTOR, + probatio.Required(CONF_SERIAL): TEXT_SELECTOR, + probatio.Required(CONF_CERT_PEM): PEM_SELECTOR, + probatio.Required(CONF_KEY_PEM): PEM_SELECTOR, + probatio.Required(CONF_IP_ADDRESS): TEXT_SELECTOR, } ) -STEP_DISCOVERY_CONFIRM_SCHEMA = vol.Schema( +STEP_DISCOVERY_CONFIRM_SCHEMA = probatio.Schema( { - vol.Required(CONF_CERT_PEM): PEM_SELECTOR, - vol.Required(CONF_KEY_PEM): PEM_SELECTOR, + probatio.Required(CONF_CERT_PEM): PEM_SELECTOR, + probatio.Required(CONF_KEY_PEM): PEM_SELECTOR, } ) diff --git a/homeassistant/components/hardware/websocket_api.py b/homeassistant/components/hardware/websocket_api.py index ac7605ce8d496..6f7841ba3fb51 100644 --- a/homeassistant/components/hardware/websocket_api.py +++ b/homeassistant/components/hardware/websocket_api.py @@ -5,7 +5,7 @@ from datetime import datetime, timedelta from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.core import HomeAssistant, callback @@ -24,7 +24,7 @@ async def async_setup(hass: HomeAssistant) -> None: @websocket_api.websocket_command( { - vol.Required("type"): "hardware/info", + probatio.Required("type"): "hardware/info", } ) @websocket_api.async_response @@ -46,7 +46,7 @@ async def ws_info( @callback @websocket_api.websocket_command( { - vol.Required("type"): "hardware/subscribe_system_status", + probatio.Required("type"): "hardware/subscribe_system_status", } ) def ws_subscribe_system_status( diff --git a/homeassistant/components/harman_kardon_avr/media_player.py b/homeassistant/components/harman_kardon_avr/media_player.py index 1233f5d3c9651..422d39b4c71ec 100644 --- a/homeassistant/components/harman_kardon_avr/media_player.py +++ b/homeassistant/components/harman_kardon_avr/media_player.py @@ -3,7 +3,7 @@ from typing import override import hkavr -import voluptuous as vol +import probatio from homeassistant.components.media_player import ( PLATFORM_SCHEMA as MEDIA_PLAYER_PLATFORM_SCHEMA, @@ -22,9 +22,9 @@ PLATFORM_SCHEMA = MEDIA_PLAYER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, } ) diff --git a/homeassistant/components/harman_luxury/config_flow.py b/homeassistant/components/harman_luxury/config_flow.py index 9008d164257da..fff301fd6dfa5 100644 --- a/homeassistant/components/harman_luxury/config_flow.py +++ b/homeassistant/components/harman_luxury/config_flow.py @@ -4,7 +4,7 @@ from urllib.parse import urlparse from aioharmanluxury import DeviceInfo, HarmanLuxuryClient, HarmanLuxuryError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST @@ -13,7 +13,7 @@ from .const import DOMAIN -STEP_USER_DATA_SCHEMA = vol.Schema({vol.Required(CONF_HOST): str}) +STEP_USER_DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_HOST): str}) class HarmanLuxuryConfigFlow(ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/components/harmony/config_flow.py b/homeassistant/components/harmony/config_flow.py index f1f27c862bc3b..589c1bd4e6bbc 100644 --- a/homeassistant/components/harmony/config_flow.py +++ b/homeassistant/components/harmony/config_flow.py @@ -7,7 +7,7 @@ from aioharmony.hubconnector_websocket import HubConnector import aiohttp -import voluptuous as vol +import probatio from homeassistant.components.remote import ( ATTR_ACTIVITY, @@ -37,9 +37,9 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( - {vol.Required(CONF_HOST): str}, - extra=vol.ALLOW_EXTRA, +DATA_SCHEMA = probatio.Schema( + {probatio.Required(CONF_HOST): str}, + extra=probatio.ALLOW_EXTRA, ) @@ -198,20 +198,20 @@ async def async_step_init( return self.async_create_entry(title="", data=user_input) remote = self.config_entry.runtime_data - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Optional( + probatio.Optional( ATTR_DELAY_SECS, default=self.config_entry.options.get( ATTR_DELAY_SECS, DEFAULT_DELAY_SECS ), - ): vol.Coerce(float), - vol.Optional( + ): probatio.Coerce(float), + probatio.Optional( ATTR_ACTIVITY, default=self.config_entry.options.get( ATTR_ACTIVITY, PREVIOUS_ACTIVE_ACTIVITY ), - ): vol.In([PREVIOUS_ACTIVE_ACTIVITY, *remote.activity_names]), + ): probatio.In([PREVIOUS_ACTIVE_ACTIVITY, *remote.activity_names]), } ) return self.async_show_form(step_id="init", data_schema=data_schema) diff --git a/homeassistant/components/harmony/remote.py b/homeassistant/components/harmony/remote.py index 557b5ffbe0ee2..e456f0536ad51 100644 --- a/homeassistant/components/harmony/remote.py +++ b/homeassistant/components/harmony/remote.py @@ -5,7 +5,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.remote import ( ATTR_ACTIVITY, @@ -47,7 +47,7 @@ ATTR_CHANNEL = "channel" HARMONY_CHANGE_CHANNEL_SCHEMA: VolDictType = { - vol.Required(ATTR_CHANNEL): cv.positive_int, + probatio.Required(ATTR_CHANNEL): cv.positive_int, } diff --git a/homeassistant/components/hassio/auth.py b/homeassistant/components/hassio/auth.py index c64fe7db79fab..03065b0b4c852 100644 --- a/homeassistant/components/hassio/auth.py +++ b/homeassistant/components/hassio/auth.py @@ -11,7 +11,7 @@ HTTPServiceUnavailable, HTTPUnauthorized, ) -import voluptuous as vol +import probatio from homeassistant.auth.providers import homeassistant as auth_ha from homeassistant.components.http import KEY_HASS, KEY_HASS_USER, HomeAssistantView @@ -71,13 +71,13 @@ class HassIOAuth(HassIOBaseAuth): url = "/api/hassio_auth" @RequestDataValidator( - vol.Schema( + probatio.Schema( { - vol.Required(ATTR_USERNAME): cv.string, - vol.Required(ATTR_PASSWORD): cv.string, - vol.Required(ATTR_ADDON): cv.string, + probatio.Required(ATTR_USERNAME): cv.string, + probatio.Required(ATTR_PASSWORD): cv.string, + probatio.Required(ATTR_ADDON): cv.string, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) ) async def post(self, request: web.Request, data: dict[str, str]) -> web.Response: @@ -102,12 +102,12 @@ class HassIOPasswordReset(HassIOBaseAuth): url = "/api/hassio_auth/password_reset" @RequestDataValidator( - vol.Schema( + probatio.Schema( { - vol.Required(ATTR_USERNAME): cv.string, - vol.Required(ATTR_PASSWORD): cv.string, + probatio.Required(ATTR_USERNAME): cv.string, + probatio.Required(ATTR_PASSWORD): cv.string, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) ) async def post(self, request: web.Request, data: dict[str, str]) -> web.Response: diff --git a/homeassistant/components/hassio/repairs.py b/homeassistant/components/hassio/repairs.py index 4f4b64b1c6c33..163e5a34b99c0 100644 --- a/homeassistant/components/hassio/repairs.py +++ b/homeassistant/components/hassio/repairs.py @@ -6,7 +6,7 @@ from aiohasupervisor import SupervisorError from aiohasupervisor.models import ContextType -import voluptuous as vol +import probatio from homeassistant.components.repairs import ( ConfirmRepairFlow, @@ -90,7 +90,7 @@ def _async_form_for_suggestion(self, suggestion: Suggestion) -> RepairsFlowResul """Return form for suggestion.""" return self.async_show_form( step_id=suggestion.key, - data_schema=vol.Schema({}), + data_schema=probatio.Schema({}), description_placeholders=self.description_placeholders, last_step=True, ) diff --git a/homeassistant/components/hassio/services.py b/homeassistant/components/hassio/services.py index 079e63454caf6..04ff8843ee90a 100644 --- a/homeassistant/components/hassio/services.py +++ b/homeassistant/components/hassio/services.py @@ -13,7 +13,7 @@ PartialBackupOptions, PartialRestoreOptions, ) -import voluptuous as vol +import probatio from homeassistant.const import ATTR_DEVICE_ID, ATTR_LOCATION, ATTR_NAME from homeassistant.core import ( @@ -70,7 +70,7 @@ SERVICE_MOUNT_RELOAD = "mount_reload" -VALID_ADDON_SLUG = vol.Match(re.compile(r"^[-_.A-Za-z0-9]+$")) +VALID_ADDON_SLUG = probatio.Match(re.compile(r"^[-_.A-Za-z0-9]+$")) # Legacy alias used by the Supervisor API for the homeassistant flag, kept # for backwards compatibility with existing automations. @@ -110,82 +110,82 @@ def _normalize_partial_options_data( return data -SCHEMA_NO_DATA = vol.Schema({}) +SCHEMA_NO_DATA = probatio.Schema({}) -SCHEMA_ADDON = vol.Schema({vol.Required(ATTR_ADDON): VALID_ADDON_SLUG}) +SCHEMA_ADDON = probatio.Schema({probatio.Required(ATTR_ADDON): VALID_ADDON_SLUG}) SCHEMA_ADDON_STDIN = SCHEMA_ADDON.extend( - {vol.Required(ATTR_INPUT): vol.Any(dict, cv.string)} + {probatio.Required(ATTR_INPUT): probatio.Any(dict, cv.string)} ) -SCHEMA_APP = vol.Schema({vol.Required(ATTR_APP): VALID_ADDON_SLUG}) +SCHEMA_APP = probatio.Schema({probatio.Required(ATTR_APP): VALID_ADDON_SLUG}) SCHEMA_APP_STDIN = SCHEMA_APP.extend( - {vol.Required(ATTR_INPUT): vol.Any(dict, cv.string)} + {probatio.Required(ATTR_INPUT): probatio.Any(dict, cv.string)} ) -SCHEMA_BACKUP_FULL = vol.Schema( +SCHEMA_BACKUP_FULL = probatio.Schema( { - vol.Optional( + probatio.Optional( ATTR_NAME, default=lambda: now().strftime("%Y-%m-%d %H:%M:%S") ): cv.string, - vol.Optional(ATTR_PASSWORD): cv.string, - vol.Optional(ATTR_COMPRESSED): cv.boolean, - vol.Optional(ATTR_LOCATION): vol.All( + probatio.Optional(ATTR_PASSWORD): cv.string, + probatio.Optional(ATTR_COMPRESSED): cv.boolean, + probatio.Optional(ATTR_LOCATION): probatio.All( cv.string, lambda v: None if v == "/backup" else v ), - vol.Optional(ATTR_HOMEASSISTANT_EXCLUDE_DATABASE): cv.boolean, + probatio.Optional(ATTR_HOMEASSISTANT_EXCLUDE_DATABASE): cv.boolean, } ) SCHEMA_BACKUP_PARTIAL = SCHEMA_BACKUP_FULL.extend( { - vol.Optional(ATTR_HOMEASSISTANT): cv.boolean, - vol.Optional(ATTR_FOLDERS): vol.All( + probatio.Optional(ATTR_HOMEASSISTANT): cv.boolean, + probatio.Optional(ATTR_FOLDERS): probatio.All( cv.ensure_list, - [vol.Any(LEGACY_FOLDER_HOMEASSISTANT, vol.Coerce(Folder))], - vol.Unique(), - vol.Coerce(set), + [probatio.Any(LEGACY_FOLDER_HOMEASSISTANT, probatio.Coerce(Folder))], + probatio.Unique(), + probatio.Coerce(set), ), - vol.Exclusive(ATTR_APPS, "apps_or_addons"): vol.All( - cv.ensure_list, [VALID_ADDON_SLUG], vol.Unique(), vol.Coerce(set) + probatio.Exclusive(ATTR_APPS, "apps_or_addons"): probatio.All( + cv.ensure_list, [VALID_ADDON_SLUG], probatio.Unique(), probatio.Coerce(set) ), # Legacy "addons", "apps" is preferred - vol.Exclusive(ATTR_ADDONS, "apps_or_addons"): vol.All( - cv.ensure_list, [VALID_ADDON_SLUG], vol.Unique(), vol.Coerce(set) + probatio.Exclusive(ATTR_ADDONS, "apps_or_addons"): probatio.All( + cv.ensure_list, [VALID_ADDON_SLUG], probatio.Unique(), probatio.Coerce(set) ), } ) -SCHEMA_RESTORE_FULL = vol.Schema( +SCHEMA_RESTORE_FULL = probatio.Schema( { - vol.Required(ATTR_SLUG): cv.slug, - vol.Optional(ATTR_PASSWORD): cv.string, + probatio.Required(ATTR_SLUG): cv.slug, + probatio.Optional(ATTR_PASSWORD): cv.string, } ) SCHEMA_RESTORE_PARTIAL = SCHEMA_RESTORE_FULL.extend( { - vol.Optional(ATTR_HOMEASSISTANT): cv.boolean, - vol.Optional(ATTR_FOLDERS): vol.All( + probatio.Optional(ATTR_HOMEASSISTANT): cv.boolean, + probatio.Optional(ATTR_FOLDERS): probatio.All( cv.ensure_list, - [vol.Any(LEGACY_FOLDER_HOMEASSISTANT, vol.Coerce(Folder))], - vol.Unique(), - vol.Coerce(set), + [probatio.Any(LEGACY_FOLDER_HOMEASSISTANT, probatio.Coerce(Folder))], + probatio.Unique(), + probatio.Coerce(set), ), - vol.Exclusive(ATTR_APPS, "apps_or_addons"): vol.All( - cv.ensure_list, [VALID_ADDON_SLUG], vol.Unique(), vol.Coerce(set) + probatio.Exclusive(ATTR_APPS, "apps_or_addons"): probatio.All( + cv.ensure_list, [VALID_ADDON_SLUG], probatio.Unique(), probatio.Coerce(set) ), # Legacy "addons", "apps" is preferred - vol.Exclusive(ATTR_ADDONS, "apps_or_addons"): vol.All( - cv.ensure_list, [VALID_ADDON_SLUG], vol.Unique(), vol.Coerce(set) + probatio.Exclusive(ATTR_ADDONS, "apps_or_addons"): probatio.All( + cv.ensure_list, [VALID_ADDON_SLUG], probatio.Unique(), probatio.Coerce(set) ), } ) -SCHEMA_MOUNT_RELOAD = vol.Schema( +SCHEMA_MOUNT_RELOAD = probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): selector.DeviceSelector( + probatio.Required(ATTR_DEVICE_ID): selector.DeviceSelector( selector.DeviceSelectorConfig( filter=selector.DeviceFilterSelectorConfig( integration=DOMAIN, diff --git a/homeassistant/components/hassio/websocket_api.py b/homeassistant/components/hassio/websocket_api.py index 3f945f75c3219..26b51eb003dbb 100644 --- a/homeassistant/components/hassio/websocket_api.py +++ b/homeassistant/components/hassio/websocket_api.py @@ -5,7 +5,7 @@ import re from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.components.websocket_api import ActiveConnection @@ -42,9 +42,9 @@ from .handler import HassioAPIError from .update_helper import update_addon, update_core -SCHEMA_WEBSOCKET_EVENT = vol.Schema( - {vol.Required(ATTR_WS_EVENT): cv.string}, - extra=vol.ALLOW_EXTRA, +SCHEMA_WEBSOCKET_EVENT = probatio.Schema( + {probatio.Required(ATTR_WS_EVENT): cv.string}, + extra=probatio.ALLOW_EXTRA, ) # Endpoints needed for ingress can't require admin because @@ -75,7 +75,7 @@ def async_load_websocket_api(hass: HomeAssistant) -> None: @callback @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required(WS_TYPE): WS_TYPE_SUBSCRIBE}) +@websocket_api.websocket_command({probatio.Required(WS_TYPE): WS_TYPE_SUBSCRIBE}) def websocket_subscribe( hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any] ) -> None: @@ -96,8 +96,8 @@ def forward_messages(data: dict[str, str]) -> None: @websocket_api.ws_require_user(only_supervisor=True) @websocket_api.websocket_command( { - vol.Required(WS_TYPE): WS_TYPE_EVENT, - vol.Required(ATTR_DATA): SCHEMA_WEBSOCKET_EVENT, + probatio.Required(WS_TYPE): WS_TYPE_EVENT, + probatio.Required(ATTR_DATA): SCHEMA_WEBSOCKET_EVENT, } ) def websocket_supervisor_event( @@ -110,12 +110,12 @@ def websocket_supervisor_event( @websocket_api.websocket_command( { - vol.Required(WS_TYPE): WS_TYPE_API, - vol.Required(ATTR_ENDPOINT): cv.string, - vol.Required(ATTR_METHOD): cv.string, - vol.Optional(ATTR_DATA): dict, - vol.Optional(ATTR_PARAMS): dict, - vol.Optional(ATTR_TIMEOUT): vol.Any(Number, None), + probatio.Required(WS_TYPE): WS_TYPE_API, + probatio.Required(ATTR_ENDPOINT): cv.string, + probatio.Required(ATTR_METHOD): cv.string, + probatio.Optional(ATTR_DATA): dict, + probatio.Optional(ATTR_PARAMS): dict, + probatio.Optional(ATTR_TIMEOUT): probatio.Any(Number, None), } ) @websocket_api.async_response @@ -164,9 +164,9 @@ async def websocket_supervisor_api( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(WS_TYPE): "hassio/update/addon", - vol.Required("addon"): str, - vol.Required("backup"): bool, + probatio.Required(WS_TYPE): "hassio/update/addon", + probatio.Required("addon"): str, + probatio.Required("backup"): bool, } ) @websocket_api.async_response @@ -202,8 +202,8 @@ async def websocket_update_addon( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(WS_TYPE): "hassio/update/core", - vol.Required("backup"): bool, + probatio.Required(WS_TYPE): "hassio/update/core", + probatio.Required("backup"): bool, } ) @websocket_api.async_response @@ -217,7 +217,9 @@ async def websocket_update_core( @callback @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required("type"): "hassio/update/config/info"}) +@websocket_api.websocket_command( + {probatio.Required("type"): "hassio/update/config/info"} +) def websocket_update_config_info( hass: HomeAssistant, connection: websocket_api.ActiveConnection, @@ -231,10 +233,12 @@ def websocket_update_config_info( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "hassio/update/config/update", - vol.Optional("add_on_backup_before_update"): bool, - vol.Optional("add_on_backup_retain_copies"): vol.All(int, vol.Range(min=1)), - vol.Optional("core_backup_before_update"): bool, + probatio.Required("type"): "hassio/update/config/update", + probatio.Optional("add_on_backup_before_update"): bool, + probatio.Optional("add_on_backup_retain_copies"): probatio.All( + int, probatio.Range(min=1) + ), + probatio.Optional("core_backup_before_update"): bool, } ) def websocket_update_config_update( diff --git a/homeassistant/components/haveibeenpwned/sensor.py b/homeassistant/components/haveibeenpwned/sensor.py index 9a019578fcecd..9ab0f55d3d4b1 100644 --- a/homeassistant/components/haveibeenpwned/sensor.py +++ b/homeassistant/components/haveibeenpwned/sensor.py @@ -5,8 +5,8 @@ import logging from typing import TYPE_CHECKING, Any, override +import probatio import requests -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -33,8 +33,8 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_EMAIL): vol.All(cv.ensure_list, [cv.string]), - vol.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_EMAIL): probatio.All(cv.ensure_list, [cv.string]), + probatio.Required(CONF_API_KEY): cv.string, } ) diff --git a/homeassistant/components/hddtemp/sensor.py b/homeassistant/components/hddtemp/sensor.py index 079bb0b4e0cbd..1403854d31542 100644 --- a/homeassistant/components/hddtemp/sensor.py +++ b/homeassistant/components/hddtemp/sensor.py @@ -5,8 +5,8 @@ import socket from typing import Any, override +import probatio from telnetlib import Telnet # pylint: disable=deprecated-module -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -39,10 +39,12 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_DISKS, default=[]): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_DISKS, default=[]): probatio.All( + cv.ensure_list, [cv.string] + ), + probatio.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/hdfury/config_flow.py b/homeassistant/components/hdfury/config_flow.py index b6d1849c11990..621de9d8218a4 100644 --- a/homeassistant/components/hdfury/config_flow.py +++ b/homeassistant/components/hdfury/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from hdfury import HDFuryAPI, HDFuryError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST @@ -81,7 +81,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_HOST): str}), + data_schema=probatio.Schema({probatio.Required(CONF_HOST): str}), errors=errors, ) @@ -108,9 +108,9 @@ async def async_step_reconfigure( return self.async_show_form( step_id="reconfigure", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_HOST, default=reconfigure_entry.data.get(CONF_HOST), ): str diff --git a/homeassistant/components/hdmi_cec/__init__.py b/homeassistant/components/hdmi_cec/__init__.py index 140596319b394..4f920bf40097a 100644 --- a/homeassistant/components/hdmi_cec/__init__.py +++ b/homeassistant/components/hdmi_cec/__init__.py @@ -5,6 +5,7 @@ import multiprocessing from typing import Any +import probatio from pycec.cec import CecAdapter from pycec.commands import CecCommand, KeyPressCommand, KeyReleaseCommand from pycec.const import ( @@ -19,7 +20,6 @@ ) from pycec.network import HDMINetwork, PhysicalAddress from pycec.tcp import TcpAdapter -import voluptuous as vol from homeassistant.components.media_player import DOMAIN as MEDIA_PLAYER_DOMAIN from homeassistant.components.switch import DOMAIN as SWITCH_DOMAIN @@ -67,33 +67,37 @@ ATTR_OFF = "off" ATTR_TOGGLE = "toggle" -_VOL_HEX = vol.Any(vol.Coerce(int), lambda x: int(x, 16)) +_VOL_HEX = probatio.Any(probatio.Coerce(int), lambda x: int(x, 16)) SERVICE_SEND_COMMAND = "send_command" -SERVICE_SEND_COMMAND_SCHEMA = vol.Schema( +SERVICE_SEND_COMMAND_SCHEMA = probatio.Schema( { - vol.Optional(ATTR_CMD): _VOL_HEX, - vol.Optional(ATTR_SRC): _VOL_HEX, - vol.Optional(ATTR_DST): _VOL_HEX, - vol.Optional(ATTR_ATT): _VOL_HEX, - vol.Optional(ATTR_RAW): vol.Coerce(str), + probatio.Optional(ATTR_CMD): _VOL_HEX, + probatio.Optional(ATTR_SRC): _VOL_HEX, + probatio.Optional(ATTR_DST): _VOL_HEX, + probatio.Optional(ATTR_ATT): _VOL_HEX, + probatio.Optional(ATTR_RAW): probatio.Coerce(str), }, - extra=vol.PREVENT_EXTRA, + extra=probatio.PREVENT_EXTRA, ) SERVICE_VOLUME = "volume" -SERVICE_VOLUME_SCHEMA = vol.Schema( +SERVICE_VOLUME_SCHEMA = probatio.Schema( { - vol.Optional(CMD_UP): vol.Any(CMD_PRESS, CMD_RELEASE, vol.Coerce(int)), - vol.Optional(CMD_DOWN): vol.Any(CMD_PRESS, CMD_RELEASE, vol.Coerce(int)), - vol.Optional(CMD_MUTE): vol.Any(ATTR_ON, ATTR_OFF, ATTR_TOGGLE), + probatio.Optional(CMD_UP): probatio.Any( + CMD_PRESS, CMD_RELEASE, probatio.Coerce(int) + ), + probatio.Optional(CMD_DOWN): probatio.Any( + CMD_PRESS, CMD_RELEASE, probatio.Coerce(int) + ), + probatio.Optional(CMD_MUTE): probatio.Any(ATTR_ON, ATTR_OFF, ATTR_TOGGLE), }, - extra=vol.PREVENT_EXTRA, + extra=probatio.PREVENT_EXTRA, ) SERVICE_UPDATE_DEVICES = "update" -SERVICE_UPDATE_DEVICES_SCHEMA = vol.Schema( - {DOMAIN: vol.Schema({})}, extra=vol.PREVENT_EXTRA +SERVICE_UPDATE_DEVICES_SCHEMA = probatio.Schema( + {DOMAIN: probatio.Schema({})}, extra=probatio.PREVENT_EXTRA ) SERVICE_SELECT_DEVICE = "select_device" @@ -101,9 +105,9 @@ SERVICE_POWER_ON = "power_on" SERVICE_STANDBY = "standby" -DEVICE_SCHEMA: vol.Schema = vol.Schema( +DEVICE_SCHEMA: probatio.Schema = probatio.Schema( { - vol.All(cv.positive_int): vol.Any( + probatio.All(cv.positive_int): probatio.Any( # pylint: disable-next=unnecessary-lambda lambda devices: DEVICE_SCHEMA(devices), cv.string, @@ -113,25 +117,26 @@ CONF_DISPLAY_NAME = "osd_name" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Optional(CONF_DEVICES): vol.Any( - DEVICE_SCHEMA, vol.Schema({vol.All(cv.string): vol.Any(cv.string)}) + probatio.Optional(CONF_DEVICES): probatio.Any( + DEVICE_SCHEMA, + probatio.Schema({probatio.All(cv.string): probatio.Any(cv.string)}), ), - vol.Optional(CONF_PLATFORM): vol.Any( + probatio.Optional(CONF_PLATFORM): probatio.Any( SWITCH_DOMAIN, MEDIA_PLAYER_DOMAIN ), - vol.Optional(CONF_HOST): cv.string, - vol.Optional(CONF_DISPLAY_NAME): cv.string, - vol.Optional(CONF_TYPES, default={}): vol.Schema( - {cv.entity_id: vol.Any(MEDIA_PLAYER_DOMAIN, SWITCH_DOMAIN)} + probatio.Optional(CONF_HOST): cv.string, + probatio.Optional(CONF_DISPLAY_NAME): cv.string, + probatio.Optional(CONF_TYPES, default={}): probatio.Schema( + {cv.entity_id: probatio.Any(MEDIA_PLAYER_DOMAIN, SWITCH_DOMAIN)} ), } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) WATCHDOG_INTERVAL = 120 diff --git a/homeassistant/components/heatmiser/climate.py b/homeassistant/components/heatmiser/climate.py index 0f103a9730628..946d87120323b 100644 --- a/homeassistant/components/heatmiser/climate.py +++ b/homeassistant/components/heatmiser/climate.py @@ -4,7 +4,7 @@ from typing import Any, override from heatmiserv3 import connection, heatmiser -import voluptuous as vol +import probatio from homeassistant.components.climate import ( PLATFORM_SCHEMA as CLIMATE_PLATFORM_SCHEMA, @@ -29,18 +29,23 @@ CONF_THERMOSTATS = "tstats" -TSTATS_SCHEMA = vol.Schema( - vol.All( +TSTATS_SCHEMA = probatio.Schema( + probatio.All( cv.ensure_list, - [{vol.Required(CONF_ID): cv.positive_int, vol.Required(CONF_NAME): cv.string}], + [ + { + probatio.Required(CONF_ID): cv.positive_int, + probatio.Required(CONF_NAME): cv.string, + } + ], ) ) PLATFORM_SCHEMA = CLIMATE_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_PORT): cv.string, - vol.Optional(CONF_THERMOSTATS, default=[]): TSTATS_SCHEMA, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_PORT): cv.string, + probatio.Optional(CONF_THERMOSTATS, default=[]): TSTATS_SCHEMA, } ) diff --git a/homeassistant/components/hegel/config_flow.py b/homeassistant/components/hegel/config_flow.py index a726db3ecaeeb..295aedb4b3760 100644 --- a/homeassistant/components/hegel/config_flow.py +++ b/homeassistant/components/hegel/config_flow.py @@ -5,7 +5,7 @@ from hegel_ip_client import HegelClient from hegel_ip_client.exceptions import HegelConnectionError -import voluptuous as vol +import probatio from yarl import URL from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -64,10 +64,12 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_MODEL): vol.In(list(MODEL_INPUTS.keys())), + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_MODEL): probatio.In( + list(MODEL_INPUTS.keys()) + ), } ), errors=errors, @@ -139,12 +141,12 @@ async def async_step_discovery_confirm( return self.async_show_form( step_id="discovery_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_MODEL, default=self._model or list(MODEL_INPUTS.keys())[0], - ): vol.In(list(MODEL_INPUTS.keys())), + ): probatio.In(list(MODEL_INPUTS.keys())), } ), description_placeholders={ diff --git a/homeassistant/components/helty/config_flow.py b/homeassistant/components/helty/config_flow.py index 3959dbee6f584..01ed4d449058f 100644 --- a/homeassistant/components/helty/config_flow.py +++ b/homeassistant/components/helty/config_flow.py @@ -2,15 +2,15 @@ from typing import Any, override +import probatio from pyhelty import HeltyClient, HeltyConnectionError, HeltyError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST from .const import DOMAIN -STEP_USER_DATA_SCHEMA = vol.Schema({vol.Required(CONF_HOST): str}) +STEP_USER_DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_HOST): str}) class HeltyConfigFlow(ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/components/heos/config_flow.py b/homeassistant/components/heos/config_flow.py index 822ca31a08ea3..70758119a8726 100644 --- a/homeassistant/components/heos/config_flow.py +++ b/homeassistant/components/heos/config_flow.py @@ -5,6 +5,7 @@ from typing import TYPE_CHECKING, Any, override from urllib.parse import urlparse +import probatio from pyheos import ( CommandAuthenticationError, ConnectionState, @@ -12,7 +13,6 @@ HeosError, HeosOptions, ) -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_IGNORE, @@ -31,10 +31,10 @@ _LOGGER = logging.getLogger(__name__) -AUTH_SCHEMA = vol.Schema( +AUTH_SCHEMA = probatio.Schema( { - vol.Optional(CONF_USERNAME): selector.TextSelector(), - vol.Optional(CONF_PASSWORD): selector.TextSelector( + probatio.Optional(CONF_USERNAME): selector.TextSelector(), + probatio.Optional(CONF_PASSWORD): selector.TextSelector( selector.TextSelectorConfig(type=selector.TextSelectorType.PASSWORD) ), } @@ -196,7 +196,9 @@ async def async_step_user( # Return form return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_HOST, default=host): str}), + data_schema=probatio.Schema( + {probatio.Required(CONF_HOST, default=host): str} + ), errors=errors, ) @@ -215,7 +217,9 @@ async def async_step_reconfigure( ) return self.async_show_form( step_id="reconfigure", - data_schema=vol.Schema({vol.Required(CONF_HOST, default=host): str}), + data_schema=probatio.Schema( + {probatio.Required(CONF_HOST, default=host): str} + ), errors=errors, ) diff --git a/homeassistant/components/heos/services.py b/homeassistant/components/heos/services.py index aa6ab2389783d..560de4d39df3a 100644 --- a/homeassistant/components/heos/services.py +++ b/homeassistant/components/heos/services.py @@ -4,8 +4,8 @@ import logging from typing import Final +import probatio from pyheos import CommandAuthenticationError, Heos, HeosError -import voluptuous as vol from homeassistant.components.media_player import ATTR_MEDIA_VOLUME_LEVEL from homeassistant.config_entries import ConfigEntryState @@ -37,11 +37,14 @@ _LOGGER = logging.getLogger(__name__) -HEOS_SIGN_IN_SCHEMA = vol.Schema( - {vol.Required(ATTR_USERNAME): cv.string, vol.Required(ATTR_PASSWORD): cv.string} +HEOS_SIGN_IN_SCHEMA = probatio.Schema( + { + probatio.Required(ATTR_USERNAME): cv.string, + probatio.Required(ATTR_PASSWORD): cv.string, + } ) -HEOS_SIGN_OUT_SCHEMA = vol.Schema({}) +HEOS_SIGN_OUT_SCHEMA = probatio.Schema({}) @callback @@ -81,23 +84,23 @@ def async_register(self, platform: entity_platform.EntityPlatform) -> None: REMOVE_FROM_QUEUE_SCHEMA: Final[VolDictType] = { - vol.Required(ATTR_QUEUE_IDS): vol.All( + probatio.Required(ATTR_QUEUE_IDS): probatio.All( cv.ensure_list, - [vol.All(cv.positive_int, vol.Range(min=1))], - vol.Unique(), + [probatio.All(cv.positive_int, probatio.Range(min=1))], + probatio.Unique(), ) } GROUP_VOLUME_SET_SCHEMA: Final[VolDictType] = { - vol.Required(ATTR_MEDIA_VOLUME_LEVEL): cv.small_float + probatio.Required(ATTR_MEDIA_VOLUME_LEVEL): cv.small_float } MOVE_QEUEUE_ITEM_SCHEMA: Final[VolDictType] = { - vol.Required(ATTR_QUEUE_IDS): vol.All( + probatio.Required(ATTR_QUEUE_IDS): probatio.All( cv.ensure_list, - [vol.All(vol.Coerce(int), vol.Range(min=1, max=1000))], - vol.Unique(), + [probatio.All(probatio.Coerce(int), probatio.Range(min=1, max=1000))], + probatio.Unique(), ), - vol.Required(ATTR_DESTINATION_POSITION): vol.All( - vol.Coerce(int), vol.Range(min=1, max=1000) + probatio.Required(ATTR_DESTINATION_POSITION): probatio.All( + probatio.Coerce(int), probatio.Range(min=1, max=1000) ), } diff --git a/homeassistant/components/here_travel_time/config_flow.py b/homeassistant/components/here_travel_time/config_flow.py index 545fb040c5240..3e444acb3ee5b 100644 --- a/homeassistant/components/here_travel_time/config_flow.py +++ b/homeassistant/components/here_travel_time/config_flow.py @@ -12,7 +12,7 @@ TransportMode, ) from here_transit import HERETransitError -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_RECONFIGURE, @@ -75,17 +75,17 @@ async def async_validate_api_key(api_key: str) -> None: ) -def get_user_step_schema(data: Mapping[str, Any]) -> vol.Schema: +def get_user_step_schema(data: Mapping[str, Any]) -> probatio.Schema: """Get a populated schema or default.""" travel_mode = data.get(CONF_MODE, TRAVEL_MODE_CAR) if travel_mode == "publicTransportTimeTable": travel_mode = TRAVEL_MODE_PUBLIC - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_API_KEY, default=data.get(CONF_API_KEY)): cv.string, - vol.Optional( + probatio.Required(CONF_API_KEY, default=data.get(CONF_API_KEY)): cv.string, + probatio.Optional( CONF_MODE, default=data.get(CONF_MODE, TRAVEL_MODE_CAR) - ): vol.In(TRAVEL_MODES), + ): probatio.In(TRAVEL_MODES), } ) @@ -161,9 +161,9 @@ async def async_step_origin_coordinates( self._config.pop(CONF_ORIGIN_ENTITY_ID, None) return await self.async_step_destination_menu() schema = self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required( + probatio.Required( CONF_ORIGIN, ): LocationSelector() } @@ -190,9 +190,9 @@ async def async_step_origin_entity( self._config.pop(CONF_ORIGIN_LONGITUDE, None) return await self.async_step_destination_menu() schema = self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required( + probatio.Required( CONF_ORIGIN_ENTITY_ID, ): EntitySelector() } @@ -233,9 +233,9 @@ async def async_step_destination_coordinates( options=DEFAULT_OPTIONS, ) schema = self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required( + probatio.Required( CONF_DESTINATION, ): LocationSelector() } @@ -275,9 +275,9 @@ async def async_step_destination_entity( options=DEFAULT_OPTIONS, ) schema = self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required( + probatio.Required( CONF_DESTINATION_ENTITY_ID, ): EntitySelector() } @@ -305,15 +305,15 @@ async def async_step_init( return self.async_create_entry(title="", data=self._config) schema = self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_ROUTE_MODE, default=self.config_entry.options.get( CONF_ROUTE_MODE, DEFAULT_OPTIONS[CONF_ROUTE_MODE] ), - ): vol.In(ROUTE_MODES), - vol.Optional( + ): probatio.In(ROUTE_MODES), + probatio.Optional( CONF_TRAFFIC_MODE, default=self.config_entry.options.get( CONF_TRAFFIC_MODE, DEFAULT_OPTIONS[CONF_TRAFFIC_MODE] @@ -355,8 +355,12 @@ async def async_step_arrival_time( return self.async_create_entry(title="", data=self._config) schema = self.add_suggested_values_to_schema( - vol.Schema( - {vol.Required(CONF_ARRIVAL_TIME, default="00:00:00"): TimeSelector()} + probatio.Schema( + { + probatio.Required( + CONF_ARRIVAL_TIME, default="00:00:00" + ): TimeSelector() + } ), {CONF_ARRIVAL_TIME: "00:00:00"}, ) @@ -372,8 +376,12 @@ async def async_step_departure_time( return self.async_create_entry(title="", data=self._config) schema = self.add_suggested_values_to_schema( - vol.Schema( - {vol.Required(CONF_DEPARTURE_TIME, default="00:00:00"): TimeSelector()} + probatio.Schema( + { + probatio.Required( + CONF_DEPARTURE_TIME, default="00:00:00" + ): TimeSelector() + } ), {CONF_DEPARTURE_TIME: "00:00:00"}, ) diff --git a/homeassistant/components/here_travel_time/coordinator.py b/homeassistant/components/here_travel_time/coordinator.py index 1d73b93c89e57..851767bc08910 100644 --- a/homeassistant/components/here_travel_time/coordinator.py +++ b/homeassistant/components/here_travel_time/coordinator.py @@ -22,7 +22,7 @@ HERETransitNoRouteFoundError, HERETransitTooManyRequestsError, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_MODE, UnitOfLength @@ -306,8 +306,8 @@ def _from_entity_id(entity_id: str) -> list[str]: raise UpdateFailed(f"Could not find entity {entity_id}") try: formatted_coordinates = coordinates.split(",") - vol.Schema(cv.gps(formatted_coordinates)) - except (AttributeError, vol.ExactSequenceInvalid) as ex: + probatio.Schema(cv.gps(formatted_coordinates)) + except (AttributeError, probatio.ExactSequenceInvalid) as ex: raise UpdateFailed( f"{entity_id} does not have valid coordinates: {coordinates}" ) from ex diff --git a/homeassistant/components/hikvision/binary_sensor.py b/homeassistant/components/hikvision/binary_sensor.py index c4455e7461c5f..8db73b74bbcfa 100644 --- a/homeassistant/components/hikvision/binary_sensor.py +++ b/homeassistant/components/hikvision/binary_sensor.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from pyhik.constants import SENSOR_MAP -import voluptuous as vol from homeassistant.components.binary_sensor import ( PLATFORM_SCHEMA as BINARY_SENSOR_PLATFORM_SCHEMA, @@ -160,22 +160,22 @@ _LOGGER = logging.getLogger(__name__) -CUSTOMIZE_SCHEMA = vol.Schema( +CUSTOMIZE_SCHEMA = probatio.Schema( { - vol.Optional(CONF_IGNORED, default=DEFAULT_IGNORED): cv.boolean, - vol.Optional(CONF_DELAY, default=DEFAULT_DELAY): cv.positive_int, + probatio.Optional(CONF_IGNORED, default=DEFAULT_IGNORED): cv.boolean, + probatio.Optional(CONF_DELAY, default=DEFAULT_DELAY): cv.positive_int, } ) PLATFORM_SCHEMA = BINARY_SENSOR_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_NAME): cv.string, - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_SSL, default=False): cv.boolean, - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_CUSTOMIZE, default={}): vol.Schema( + probatio.Optional(CONF_NAME): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_SSL, default=False): cv.boolean, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_CUSTOMIZE, default={}): probatio.Schema( {cv.string: CUSTOMIZE_SCHEMA} ), } diff --git a/homeassistant/components/hikvision/config_flow.py b/homeassistant/components/hikvision/config_flow.py index 1dee74fa35cb5..8fb4f2491f4bb 100644 --- a/homeassistant/components/hikvision/config_flow.py +++ b/homeassistant/components/hikvision/config_flow.py @@ -3,9 +3,9 @@ import logging from typing import Any, override +import probatio from pyhik.hikvision import HikCamera import requests -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -77,13 +77,13 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Required(CONF_SSL, default=False): bool, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Required(CONF_SSL, default=False): bool, } ), errors=errors, diff --git a/homeassistant/components/hikvisioncam/switch.py b/homeassistant/components/hikvisioncam/switch.py index 23c4342795923..ec21c943a629f 100644 --- a/homeassistant/components/hikvisioncam/switch.py +++ b/homeassistant/components/hikvisioncam/switch.py @@ -5,7 +5,7 @@ import hikvision.api from hikvision.error import HikvisionError, MissingParamError -import voluptuous as vol +import probatio from homeassistant.components.switch import ( PLATFORM_SCHEMA as SWITCH_PLATFORM_SCHEMA, @@ -34,11 +34,11 @@ PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_PASSWORD, default=DEFAULT_PASSWORD): cv.string, - vol.Optional(CONF_PORT): cv.port, - vol.Optional(CONF_USERNAME, default=DEFAULT_USERNAME): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_PASSWORD, default=DEFAULT_PASSWORD): cv.string, + probatio.Optional(CONF_PORT): cv.port, + probatio.Optional(CONF_USERNAME, default=DEFAULT_USERNAME): cv.string, } ) diff --git a/homeassistant/components/hisense_aehw4a1/__init__.py b/homeassistant/components/hisense_aehw4a1/__init__.py index 565ad85bca39a..fae478d336c92 100644 --- a/homeassistant/components/hisense_aehw4a1/__init__.py +++ b/homeassistant/components/hisense_aehw4a1/__init__.py @@ -4,9 +4,9 @@ import ipaddress import logging +import probatio from pyaehw4a1.aehw4a1 import AehW4a1 import pyaehw4a1.exceptions -import voluptuous as vol from homeassistant import config_entries from homeassistant.components.climate import DOMAIN as CLIMATE_DOMAIN @@ -26,27 +26,27 @@ def coerce_ip(value): """Validate that provided value is a valid IP address.""" if not value: - raise vol.Invalid("Must define an IP address") + raise probatio.Invalid("Must define an IP address") try: ipaddress.IPv4Network(value) except ValueError as err: - raise vol.Invalid("Not a valid IP address") from err + raise probatio.Invalid("Not a valid IP address") from err return value -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { DOMAIN: { - CLIMATE_DOMAIN: vol.Schema( + CLIMATE_DOMAIN: probatio.Schema( { - vol.Optional(CONF_IP_ADDRESS, default=[]): vol.All( - cv.ensure_list, [vol.All(cv.string, coerce_ip)] + probatio.Optional(CONF_IP_ADDRESS, default=[]): probatio.All( + cv.ensure_list, [probatio.All(cv.string, coerce_ip)] ) } ) } }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/history/__init__.py b/homeassistant/components/history/__init__.py index 095fee5b89e3d..8681b0c39884a 100644 --- a/homeassistant/components/history/__init__.py +++ b/homeassistant/components/history/__init__.py @@ -5,7 +5,7 @@ from typing import cast from aiohttp import web -import voluptuous as vol +import probatio from homeassistant.auth.permissions import filter_entity_ids_by_permission from homeassistant.auth.permissions.const import POLICY_READ @@ -28,18 +28,18 @@ _ONE_DAY = timedelta(days=1) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.All( + DOMAIN: probatio.All( cv.deprecated(CONF_INCLUDE), cv.deprecated(CONF_EXCLUDE), cv.deprecated(CONF_ORDER), INCLUDE_EXCLUDE_BASE_FILTER_SCHEMA.extend( - {vol.Optional(CONF_ORDER, default=False): cv.boolean} + {probatio.Optional(CONF_ORDER, default=False): cv.boolean} ), ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/history/websocket_api.py b/homeassistant/components/history/websocket_api.py index d03958ae707e8..d72bb8f5ecbc6 100644 --- a/homeassistant/components/history/websocket_api.py +++ b/homeassistant/components/history/websocket_api.py @@ -7,7 +7,7 @@ import logging from typing import Any, cast -import voluptuous as vol +import probatio from homeassistant.auth.permissions import filter_entity_ids_by_permission from homeassistant.auth.permissions.const import POLICY_READ @@ -95,14 +95,14 @@ def _ws_get_significant_states( @websocket_api.websocket_command( { - vol.Required("type"): "history/history_during_period", - vol.Required("start_time"): str, - vol.Optional("end_time"): str, - vol.Required("entity_ids"): [str], - vol.Optional("include_start_time_state", default=True): bool, - vol.Optional("significant_changes_only", default=True): bool, - vol.Optional("minimal_response", default=False): bool, - vol.Optional("no_attributes", default=False): bool, + probatio.Required("type"): "history/history_during_period", + probatio.Required("start_time"): str, + probatio.Optional("end_time"): str, + probatio.Required("entity_ids"): [str], + probatio.Optional("include_start_time_state", default=True): bool, + probatio.Optional("significant_changes_only", default=True): bool, + probatio.Optional("minimal_response", default=False): bool, + probatio.Optional("no_attributes", default=False): bool, } ) @websocket_api.async_response @@ -408,14 +408,14 @@ def _forward_state_events_filtered(event: Event[EventStateChangedData]) -> None: @websocket_api.websocket_command( { - vol.Required("type"): "history/stream", - vol.Required("start_time"): str, - vol.Optional("end_time"): str, - vol.Required("entity_ids"): [str], - vol.Optional("include_start_time_state", default=True): bool, - vol.Optional("significant_changes_only", default=True): bool, - vol.Optional("minimal_response", default=False): bool, - vol.Optional("no_attributes", default=False): bool, + probatio.Required("type"): "history/stream", + probatio.Required("start_time"): str, + probatio.Optional("end_time"): str, + probatio.Required("entity_ids"): [str], + probatio.Optional("include_start_time_state", default=True): bool, + probatio.Optional("significant_changes_only", default=True): bool, + probatio.Optional("minimal_response", default=False): bool, + probatio.Optional("no_attributes", default=False): bool, } ) @websocket_api.async_response diff --git a/homeassistant/components/history_stats/config_flow.py b/homeassistant/components/history_stats/config_flow.py index 0da9538f6a67d..70b29e7f1c5a9 100644 --- a/homeassistant/components/history_stats/config_flow.py +++ b/homeassistant/components/history_stats/config_flow.py @@ -4,7 +4,7 @@ from datetime import timedelta from typing import Any, cast, override -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.components.sensor import CONF_STATE_CLASS, SensorStateClass @@ -69,11 +69,11 @@ async def validate_options( return user_input -DATA_SCHEMA_SETUP = vol.Schema( +DATA_SCHEMA_SETUP = probatio.Schema( { - vol.Required(CONF_NAME, default=DEFAULT_NAME): TextSelector(), - vol.Required(CONF_ENTITY_ID): EntitySelector(), - vol.Required(CONF_TYPE, default=CONF_TYPE_TIME): SelectSelector( + probatio.Required(CONF_NAME, default=DEFAULT_NAME): TextSelector(), + probatio.Required(CONF_ENTITY_ID): EntitySelector(), + probatio.Required(CONF_TYPE, default=CONF_TYPE_TIME): SelectSelector( SelectSelectorConfig( options=CONF_TYPE_KEYS, mode=SelectSelectorMode.DROPDOWN, @@ -84,16 +84,16 @@ async def validate_options( ) -async def get_state_schema(handler: SchemaCommonFlowHandler) -> vol.Schema: +async def get_state_schema(handler: SchemaCommonFlowHandler) -> probatio.Schema: """Return schema for state step.""" entity_id = handler.options[CONF_ENTITY_ID] - return vol.Schema( + return probatio.Schema( { - vol.Optional(CONF_ENTITY_ID): EntitySelector( + probatio.Optional(CONF_ENTITY_ID): EntitySelector( EntitySelectorConfig(read_only=True) ), - vol.Required(CONF_STATE): StateSelector( + probatio.Required(CONF_STATE): StateSelector( StateSelectorConfig( multiple=True, entity_id=entity_id, @@ -103,14 +103,14 @@ async def get_state_schema(handler: SchemaCommonFlowHandler) -> vol.Schema: ) -async def get_options_schema(handler: SchemaCommonFlowHandler) -> vol.Schema: +async def get_options_schema(handler: SchemaCommonFlowHandler) -> probatio.Schema: """Return schema for options step.""" entity_id = handler.options[CONF_ENTITY_ID] conf_type = handler.options[CONF_TYPE] return _get_options_schema_with_entity_id(entity_id, conf_type) -def _get_options_schema_with_entity_id(entity_id: str, type: str) -> vol.Schema: +def _get_options_schema_with_entity_id(entity_id: str, type: str) -> probatio.Schema: state_class_options = ( [SensorStateClass.MEASUREMENT] if type == CONF_TYPE_RATIO @@ -119,19 +119,19 @@ def _get_options_schema_with_entity_id(entity_id: str, type: str) -> vol.Schema: SensorStateClass.TOTAL_INCREASING, ] ) - return vol.Schema( + return probatio.Schema( { - vol.Optional(CONF_ENTITY_ID): EntitySelector( + probatio.Optional(CONF_ENTITY_ID): EntitySelector( EntitySelectorConfig(read_only=True) ), - vol.Optional(CONF_STATE): StateSelector( + probatio.Optional(CONF_STATE): StateSelector( StateSelectorConfig( multiple=True, entity_id=entity_id, read_only=True, ) ), - vol.Optional(CONF_TYPE): SelectSelector( + probatio.Optional(CONF_TYPE): SelectSelector( SelectSelectorConfig( options=CONF_TYPE_KEYS, mode=SelectSelectorMode.DROPDOWN, @@ -139,18 +139,18 @@ def _get_options_schema_with_entity_id(entity_id: str, type: str) -> vol.Schema: read_only=True, ) ), - vol.Optional(CONF_START): TemplateSelector(), - vol.Optional(CONF_END): TemplateSelector(), - vol.Optional(CONF_DURATION): DurationSelector( + probatio.Optional(CONF_START): TemplateSelector(), + probatio.Optional(CONF_END): TemplateSelector(), + probatio.Optional(CONF_DURATION): DurationSelector( DurationSelectorConfig(enable_day=True, allow_negative=False), ), - vol.Optional(CONF_STATE_CLASS): StateClassSelector( + probatio.Optional(CONF_STATE_CLASS): StateClassSelector( StateClassSelectorConfig(state_classes=state_class_options), ), - vol.Optional(SECTION_ADDITIONAL_SETTINGS): section( - vol.Schema( + probatio.Optional(SECTION_ADDITIONAL_SETTINGS): section( + probatio.Schema( { - vol.Optional(CONF_MIN_STATE_DURATION): DurationSelector( + probatio.Optional(CONF_MIN_STATE_DURATION): DurationSelector( DurationSelectorConfig( enable_day=True, allow_negative=False ) @@ -207,10 +207,10 @@ async def async_setup_preview(hass: HomeAssistant) -> None: @websocket_api.websocket_command( { - vol.Required("type"): "history_stats/start_preview", - vol.Required("flow_id"): str, - vol.Required("flow_type"): vol.Any("config_flow", "options_flow"), - vol.Required("user_input"): dict, + probatio.Required("type"): "history_stats/start_preview", + probatio.Required("flow_id"): str, + probatio.Required("flow_type"): probatio.Any("config_flow", "options_flow"), + probatio.Required("user_input"): dict, } ) @websocket_api.async_response @@ -269,7 +269,7 @@ def async_preview_updated( validated_data = (_get_options_schema_with_entity_id(entity_id, conf_type))( msg["user_input"] ) - except vol.Invalid as ex: + except probatio.Invalid as ex: connection.send_error(msg["id"], "invalid_schema", str(ex)) return diff --git a/homeassistant/components/history_stats/sensor.py b/homeassistant/components/history_stats/sensor.py index 973a05319a5a9..d8bd3b3ce2c6a 100644 --- a/homeassistant/components/history_stats/sensor.py +++ b/homeassistant/components/history_stats/sensor.py @@ -5,7 +5,7 @@ import datetime from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( CONF_STATE_CLASS, @@ -69,7 +69,7 @@ def exactly_two_period_keys[_T: dict[str, Any]](conf: _T) -> _T: """Ensure exactly 2 of CONF_PERIOD_KEYS are provided.""" if sum(param in conf for param in CONF_PERIOD_KEYS) != 2: - raise vol.Invalid( + raise probatio.Invalid( "You must provide exactly 2 of the following: start, end, duration" ) return conf @@ -81,27 +81,31 @@ def no_ratio_total[_T: dict[str, Any]](conf: _T) -> _T: conf.get(CONF_TYPE) == CONF_TYPE_RATIO and conf.get(CONF_STATE_CLASS) == SensorStateClass.TOTAL_INCREASING ): - raise vol.Invalid("State class total_increasing not to be used with type ratio") + raise probatio.Invalid( + "State class total_increasing not to be used with type ratio" + ) return conf -PLATFORM_SCHEMA = vol.All( +PLATFORM_SCHEMA = probatio.All( SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id, - vol.Required(CONF_STATE): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(CONF_START): cv.template, - vol.Optional(CONF_END): cv.template, - vol.Optional(CONF_DURATION): cv.time_period, - vol.Optional( + probatio.Required(CONF_ENTITY_ID): cv.entity_id, + probatio.Required(CONF_STATE): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(CONF_START): cv.template, + probatio.Optional(CONF_END): cv.template, + probatio.Optional(CONF_DURATION): cv.time_period, + probatio.Optional( CONF_MIN_STATE_DURATION, default=DEFAULT_MIN_STATE_DURATION ): cv.time_period, - vol.Optional(CONF_TYPE, default=CONF_TYPE_TIME): vol.In(CONF_TYPE_KEYS), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_UNIQUE_ID): cv.string, - vol.Optional( + probatio.Optional(CONF_TYPE, default=CONF_TYPE_TIME): probatio.In( + CONF_TYPE_KEYS + ), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Optional( CONF_STATE_CLASS, default=SensorStateClass.MEASUREMENT - ): vol.In( + ): probatio.In( [None, SensorStateClass.MEASUREMENT, SensorStateClass.TOTAL_INCREASING] ), } diff --git a/homeassistant/components/hitron_coda/device_tracker.py b/homeassistant/components/hitron_coda/device_tracker.py index 330a682de95c5..16312897366a8 100644 --- a/homeassistant/components/hitron_coda/device_tracker.py +++ b/homeassistant/components/hitron_coda/device_tracker.py @@ -5,8 +5,8 @@ import logging from typing import override +import probatio import requests -import voluptuous as vol from homeassistant.components.device_tracker import ( DOMAIN as DEVICE_TRACKER_DOMAIN, @@ -24,10 +24,10 @@ PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_TYPE, default=DEFAULT_TYPE): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_TYPE, default=DEFAULT_TYPE): cv.string, } ) diff --git a/homeassistant/components/hive/climate.py b/homeassistant/components/hive/climate.py index e057c6e84cd27..b49fbca3e9d0a 100644 --- a/homeassistant/components/hive/climate.py +++ b/homeassistant/components/hive/climate.py @@ -5,7 +5,7 @@ from typing import Any, override from apyhiveapi import Hive -import voluptuous as vol +import probatio from homeassistant.components.climate import ( PRESET_BOOST, @@ -70,12 +70,12 @@ async def async_setup_entry( platform.async_register_entity_service( SERVICE_BOOST_HEATING_ON, { - vol.Required(ATTR_TIME_PERIOD): vol.All( + probatio.Required(ATTR_TIME_PERIOD): probatio.All( cv.time_period, cv.positive_timedelta, lambda td: td.total_seconds() // 60, ), - vol.Optional(ATTR_TEMPERATURE, default="25.0"): vol.Coerce(float), + probatio.Optional(ATTR_TEMPERATURE, default="25.0"): probatio.Coerce(float), }, "async_heating_boost_on", ) diff --git a/homeassistant/components/hive/config_flow.py b/homeassistant/components/hive/config_flow.py index 60a394cc0197d..a38a5967dc4c5 100644 --- a/homeassistant/components/hive/config_flow.py +++ b/homeassistant/components/hive/config_flow.py @@ -11,7 +11,7 @@ HiveInvalidPassword, HiveInvalidUsername, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -94,8 +94,11 @@ async def async_step_user( errors["base"] = "unknown" # Show User Input form. - schema = vol.Schema( - {vol.Required(CONF_USERNAME): str, vol.Required(CONF_PASSWORD): str} + schema = probatio.Schema( + { + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + } ) return self.async_show_form(step_id="user", data_schema=schema, errors=errors) @@ -138,7 +141,7 @@ async def async_step_2fa( self.device_registration = True return await self.async_step_configuration() - schema = vol.Schema({vol.Required(CONF_CODE): str}) + schema = probatio.Schema({probatio.Required(CONF_CODE): str}) return self.async_show_form(step_id="2fa", data_schema=schema, errors=errors) async def async_step_configuration( @@ -159,10 +162,10 @@ async def async_step_configuration( except UnknownHiveError: errors["base"] = "unknown" - schema = vol.Schema( + schema = probatio.Schema( # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - {vol.Optional(CONF_DEVICE_NAME, default=self.device_name): str} + {probatio.Optional(CONF_DEVICE_NAME, default=self.device_name): str} ) return self.async_show_form( step_id="configuration", data_schema=schema, errors=errors @@ -236,13 +239,13 @@ async def async_step_user( await self.hive.updateInterval(new_interval) return self.async_create_entry(title="", data=user_input) - schema = vol.Schema( + schema = probatio.Schema( { # Polling interval is user-configurable, which is no longer allowed # pylint: disable-next=home-assistant-config-flow-polling-field - vol.Optional(CONF_SCAN_INTERVAL, default=self.interval): vol.All( - vol.Coerce(int), vol.Range(min=30) - ) + probatio.Optional( + CONF_SCAN_INTERVAL, default=self.interval + ): probatio.All(probatio.Coerce(int), probatio.Range(min=30)) } ) return self.async_show_form(step_id="user", data_schema=schema, errors=errors) diff --git a/homeassistant/components/hive/water_heater.py b/homeassistant/components/hive/water_heater.py index 1f244bac305f7..6e79df7afd5e8 100644 --- a/homeassistant/components/hive/water_heater.py +++ b/homeassistant/components/hive/water_heater.py @@ -3,7 +3,7 @@ from datetime import timedelta from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.water_heater import ( STATE_ECO, @@ -61,12 +61,12 @@ async def async_setup_entry( platform.async_register_entity_service( SERVICE_BOOST_HOT_WATER, { - vol.Optional(ATTR_TIME_PERIOD, default="00:30:00"): vol.All( + probatio.Optional(ATTR_TIME_PERIOD, default="00:30:00"): probatio.All( cv.time_period, cv.positive_timedelta, lambda td: td.total_seconds() // 60, ), - vol.Required(ATTR_ONOFF): vol.In(WATER_HEATER_MODES), + probatio.Required(ATTR_ONOFF): probatio.In(WATER_HEATER_MODES), }, "async_hot_water_boost", ) diff --git a/homeassistant/components/hko/config_flow.py b/homeassistant/components/hko/config_flow.py index be6f8f0785d5b..0f7af956c31e1 100644 --- a/homeassistant/components/hko/config_flow.py +++ b/homeassistant/components/hko/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from hko import HKO, LOCATIONS, HKOError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_LOCATION @@ -22,9 +22,9 @@ def get_loc_name(item): return item[KEY_LOCATION] -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_LOCATION, default=DEFAULT_LOCATION): SelectSelector( + probatio.Required(CONF_LOCATION, default=DEFAULT_LOCATION): SelectSelector( SelectSelectorConfig(options=list(map(get_loc_name, LOCATIONS)), sort=True) ) } diff --git a/homeassistant/components/hlk_sw16/__init__.py b/homeassistant/components/hlk_sw16/__init__.py index f55535d9be054..6ffbd99005f51 100644 --- a/homeassistant/components/hlk_sw16/__init__.py +++ b/homeassistant/components/hlk_sw16/__init__.py @@ -4,7 +4,7 @@ from hlk_sw16 import create_hlk_sw16_connection from hlk_sw16.protocol import SW16Client -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PORT, CONF_SWITCHES, Platform @@ -25,21 +25,22 @@ PLATFORMS = [Platform.SWITCH] -SWITCH_SCHEMA = vol.Schema({vol.Optional(CONF_NAME): cv.string}) +SWITCH_SCHEMA = probatio.Schema({probatio.Optional(CONF_NAME): cv.string}) -RELAY_ID = vol.All( - vol.Any(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "a", "b", "c", "d", "e", "f"), vol.Coerce(str) +RELAY_ID = probatio.All( + probatio.Any(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "a", "b", "c", "d", "e", "f"), + probatio.Coerce(str), ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - cv.string: vol.Schema( + cv.string: probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Required(CONF_SWITCHES): vol.Schema( + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Required(CONF_SWITCHES): probatio.Schema( {RELAY_ID: SWITCH_SCHEMA} ), } @@ -47,7 +48,7 @@ } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) type HlkConfigEntry = ConfigEntry[SW16Client] diff --git a/homeassistant/components/hlk_sw16/config_flow.py b/homeassistant/components/hlk_sw16/config_flow.py index 73c36851b3557..1789202bbf95f 100644 --- a/homeassistant/components/hlk_sw16/config_flow.py +++ b/homeassistant/components/hlk_sw16/config_flow.py @@ -5,7 +5,7 @@ from hlk_sw16 import create_hlk_sw16_connection from hlk_sw16.protocol import SW16Client -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PORT @@ -20,10 +20,10 @@ ) from .errors import CannotConnect -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): vol.Coerce(int), + probatio.Required(CONF_HOST): str, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): probatio.Coerce(int), } ) diff --git a/homeassistant/components/holiday/config_flow.py b/homeassistant/components/holiday/config_flow.py index 522319ac2abb3..69c867d19aa98 100644 --- a/homeassistant/components/holiday/config_flow.py +++ b/homeassistant/components/holiday/config_flow.py @@ -4,7 +4,7 @@ from babel import Locale, UnknownLocaleError from holidays import PUBLIC, country_holidays, list_supported_countries -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -65,18 +65,18 @@ def get_optional_categories(country: str) -> list[str]: ] -def get_options_schema(country: str) -> vol.Schema: +def get_options_schema(country: str) -> probatio.Schema: """Return the options schema.""" schema = {} if provinces := get_optional_provinces(country): - schema[vol.Optional(CONF_PROVINCE)] = SelectSelector( + schema[probatio.Optional(CONF_PROVINCE)] = SelectSelector( SelectSelectorConfig( options=provinces, mode=SelectSelectorMode.DROPDOWN, ) ) if categories := get_optional_categories(country): - schema[vol.Optional(CONF_CATEGORIES)] = SelectSelector( + schema[probatio.Optional(CONF_CATEGORIES)] = SelectSelector( SelectSelectorConfig( options=categories, multiple=True, @@ -84,7 +84,7 @@ def get_options_schema(country: str) -> vol.Schema: translation_key="categories", ) ) - return vol.Schema(schema) + return probatio.Schema(schema) def get_entry_name(language: str, country: str, province: str | None) -> str: @@ -143,9 +143,9 @@ async def async_step_user( title = locale.territories[selected_country] return self.async_create_entry(title=title, data=user_input) - user_schema = vol.Schema( + user_schema = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_COUNTRY, default=self.hass.config.country ): CountrySelector( CountrySelectorConfig( @@ -243,9 +243,9 @@ async def async_step_init( if not categories: return self.async_abort(reason="no_categories") - schema = vol.Schema( + schema = probatio.Schema( { - vol.Optional(CONF_CATEGORIES): SelectSelector( + probatio.Optional(CONF_CATEGORIES): SelectSelector( SelectSelectorConfig( options=categories, multiple=True, diff --git a/homeassistant/components/home_connect/config_flow.py b/homeassistant/components/home_connect/config_flow.py index 897416b156b6a..f66e1c5d93d6d 100644 --- a/homeassistant/components/home_connect/config_flow.py +++ b/homeassistant/components/home_connect/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override import jwt -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlowResult from homeassistant.helpers import config_entry_oauth2_flow, device_registry as dr @@ -42,7 +42,7 @@ async def async_step_reauth_confirm( if user_input is None: return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema({}), + data_schema=probatio.Schema({}), ) return await self.async_step_user() diff --git a/homeassistant/components/home_connect/services.py b/homeassistant/components/home_connect/services.py index fc0dbd6a19bad..4607cdb4fba6f 100644 --- a/homeassistant/components/home_connect/services.py +++ b/homeassistant/components/home_connect/services.py @@ -15,7 +15,7 @@ ) from aiohomeconnect.model.error import HomeConnectError, NoProgramActiveError from aiohomeconnect.model.program import Program, ProgramDefinition -import voluptuous as vol +import probatio from homeassistant.const import ATTR_DEVICE_ID, UnitOfTemperature from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -51,11 +51,15 @@ value, ) for key, value in { - OptionKey.BSH_COMMON_DURATION: vol.All(int, vol.Range(min=0)), - OptionKey.BSH_COMMON_START_IN_RELATIVE: vol.All(int, vol.Range(min=0)), - OptionKey.BSH_COMMON_FINISH_IN_RELATIVE: vol.All(int, vol.Range(min=0)), - OptionKey.CONSUMER_PRODUCTS_COFFEE_MAKER_FILL_QUANTITY: vol.All( - int, vol.Range(min=0) + OptionKey.BSH_COMMON_DURATION: probatio.All(int, probatio.Range(min=0)), + OptionKey.BSH_COMMON_START_IN_RELATIVE: probatio.All( + int, probatio.Range(min=0) + ), + OptionKey.BSH_COMMON_FINISH_IN_RELATIVE: probatio.All( + int, probatio.Range(min=0) + ), + OptionKey.CONSUMER_PRODUCTS_COFFEE_MAKER_FILL_QUANTITY: probatio.All( + int, probatio.Range(min=0) ), OptionKey.CONSUMER_PRODUCTS_COFFEE_MAKER_MULTIPLE_BEVERAGES: bool, OptionKey.DISHCARE_DISHWASHER_INTENSIV_ZONE: bool, @@ -69,11 +73,13 @@ OptionKey.DISHCARE_DISHWASHER_ZEOLITE_DRY: bool, ( OptionKey.HEATING_VENTILATION_AIR_CONDITIONING_AIR_CONDITIONER_FAN_SPEED_PERCENTAGE - ): vol.All(int, vol.Range(min=1, max=100)), - OptionKey.HEATING_VENTILATION_AIR_CONDITIONING_AIR_CONDITIONER_SETPOINT_TEMPERATURE: vol.Coerce( + ): probatio.All(int, probatio.Range(min=1, max=100)), + OptionKey.HEATING_VENTILATION_AIR_CONDITIONING_AIR_CONDITIONER_SETPOINT_TEMPERATURE: probatio.Coerce( float ), - OptionKey.COOKING_OVEN_SETPOINT_TEMPERATURE: vol.All(int, vol.Range(min=0)), + OptionKey.COOKING_OVEN_SETPOINT_TEMPERATURE: probatio.All( + int, probatio.Range(min=0) + ), OptionKey.COOKING_OVEN_FAST_PRE_HEAT: bool, OptionKey.LAUNDRY_CARE_COMMON_SILENT_MODE: bool, OptionKey.LAUNDRY_CARE_WASHER_I_DOS_1_ACTIVE: bool, @@ -89,14 +95,14 @@ } -SERVICE_SETTING_SCHEMA = vol.Schema( +SERVICE_SETTING_SCHEMA = probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): str, - vol.Required(ATTR_KEY): vol.All( - vol.Coerce(SettingKey), - vol.NotIn([SettingKey.UNKNOWN]), + probatio.Required(ATTR_DEVICE_ID): str, + probatio.Required(ATTR_KEY): probatio.All( + probatio.Coerce(SettingKey), + probatio.NotIn([SettingKey.UNKNOWN]), ), - vol.Required(ATTR_VALUE): vol.Any(str, int, bool), + probatio.Required(ATTR_VALUE): probatio.Any(str, int, bool), } ) @@ -117,19 +123,21 @@ def _require_program_or_at_least_one_option(data: dict) -> dict: return data -SERVICE_PROGRAM_AND_OPTIONS_SCHEMA = vol.All( - vol.Schema( +SERVICE_PROGRAM_AND_OPTIONS_SCHEMA = probatio.All( + probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): str, - vol.Required(ATTR_AFFECTS_TO): vol.In( + probatio.Required(ATTR_DEVICE_ID): str, + probatio.Required(ATTR_AFFECTS_TO): probatio.In( [AFFECTS_TO_ACTIVE_PROGRAM, AFFECTS_TO_SELECTED_PROGRAM] ), - vol.Optional(ATTR_PROGRAM): vol.In(TRANSLATION_KEYS_PROGRAMS_MAP.keys()), + probatio.Optional(ATTR_PROGRAM): probatio.In( + TRANSLATION_KEYS_PROGRAMS_MAP.keys() + ), } ) .extend( { - vol.Optional(translation_key): vol.In(allowed_values.keys()) + probatio.Optional(translation_key): probatio.In(allowed_values.keys()) for translation_key, ( key, allowed_values, @@ -138,21 +146,21 @@ def _require_program_or_at_least_one_option(data: dict) -> dict: ) .extend( { - vol.Optional(translation_key): schema + probatio.Optional(translation_key): schema for translation_key, (key, schema) in PROGRAM_OPTIONS.items() } ), _require_program_or_at_least_one_option, ) -SERVICE_START_SELECTED_PROGRAM_SCHEMA = vol.All( - vol.Schema( +SERVICE_START_SELECTED_PROGRAM_SCHEMA = probatio.All( + probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): str, + probatio.Required(ATTR_DEVICE_ID): str, } ).extend( { - vol.Optional(translation_key): schema + probatio.Optional(translation_key): schema for translation_key, (key, schema) in PROGRAM_OPTIONS.items() if key in ( diff --git a/homeassistant/components/homeassistant/__init__.py b/homeassistant/components/homeassistant/__init__.py index 5e66be54232e3..cf60e4e615189 100644 --- a/homeassistant/components/homeassistant/__init__.py +++ b/homeassistant/components/homeassistant/__init__.py @@ -7,7 +7,7 @@ import struct from typing import Any -import voluptuous as vol +import probatio from homeassistant import config as conf_util, core_config from homeassistant.auth.permissions.const import CAT_ENTITIES, POLICY_CONTROL @@ -81,17 +81,19 @@ SERVICE_UPDATE_ENTITY = "update_entity" SERVICE_SET_LOCATION = "set_location" SERVICE_RELOAD_ALL = "reload_all" -SCHEMA_UPDATE_ENTITY = vol.Schema({ATTR_ENTITY_ID: cv.entity_ids}) -SCHEMA_RELOAD_CONFIG_ENTRY = vol.All( - vol.Schema( +SCHEMA_UPDATE_ENTITY = probatio.Schema({ATTR_ENTITY_ID: cv.entity_ids}) +SCHEMA_RELOAD_CONFIG_ENTRY = probatio.All( + probatio.Schema( { - vol.Optional(ATTR_ENTRY_ID): str, + probatio.Optional(ATTR_ENTRY_ID): str, **cv.ENTITY_SERVICE_FIELDS, }, ), cv.has_at_least_one_key(ATTR_ENTRY_ID, *cv.ENTITY_SERVICE_FIELDS), ) -SCHEMA_RESTART = vol.Schema({vol.Optional(ATTR_SAFE_MODE, default=False): bool}) +SCHEMA_RESTART = probatio.Schema( + {probatio.Optional(ATTR_SAFE_MODE, default=False): bool} +) SHUTDOWN_SERVICES = (SERVICE_HOMEASSISTANT_STOP, SERVICE_HOMEASSISTANT_RESTART) @@ -180,7 +182,9 @@ async def async_handle_turn_service(service: ServiceCall) -> None: DOMAIN, SERVICE_SAVE_PERSISTENT_STATES, async_save_persistent_states ) - service_schema = vol.Schema({ATTR_ENTITY_ID: cv.entity_ids}, extra=vol.ALLOW_EXTRA) + service_schema = probatio.Schema( + {ATTR_ENTITY_ID: cv.entity_ids}, extra=probatio.ALLOW_EXTRA + ) hass.services.async_register( DOMAIN, SERVICE_TURN_OFF, async_handle_turn_service, schema=service_schema @@ -321,11 +325,11 @@ async def async_set_location(call: ServiceCall) -> None: DOMAIN, SERVICE_SET_LOCATION, async_set_location, - vol.Schema( + probatio.Schema( { - vol.Required(ATTR_LATITUDE): cv.latitude, - vol.Required(ATTR_LONGITUDE): cv.longitude, - vol.Optional(ATTR_ELEVATION): vol.Coerce(int), + probatio.Required(ATTR_LATITUDE): cv.latitude, + probatio.Required(ATTR_LONGITUDE): cv.longitude, + probatio.Optional(ATTR_ELEVATION): probatio.Coerce(int), } ), ) diff --git a/homeassistant/components/homeassistant/exposed_entities.py b/homeassistant/components/homeassistant/exposed_entities.py index dc1f37a2360c3..4a76eaa707141 100644 --- a/homeassistant/components/homeassistant/exposed_entities.py +++ b/homeassistant/components/homeassistant/exposed_entities.py @@ -5,7 +5,7 @@ from itertools import chain from typing import Any, TypedDict -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.components.binary_sensor import ( @@ -396,10 +396,10 @@ def _data_to_save(self) -> SerializedExposedEntities: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "homeassistant/expose_entity", - vol.Required("assistants"): [vol.In(KNOWN_ASSISTANTS)], - vol.Required("entity_ids"): [str], - vol.Required("should_expose"): bool, + probatio.Required("type"): "homeassistant/expose_entity", + probatio.Required("assistants"): [probatio.In(KNOWN_ASSISTANTS)], + probatio.Required("entity_ids"): [str], + probatio.Required("should_expose"): bool, } ) def ws_expose_entity( @@ -418,7 +418,7 @@ def ws_expose_entity( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "homeassistant/expose_entity/list", + probatio.Required("type"): "homeassistant/expose_entity/list", } ) def ws_list_exposed_entities( @@ -446,8 +446,8 @@ def ws_list_exposed_entities( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "homeassistant/expose_new_entities/get", - vol.Required("assistant"): vol.In(KNOWN_ASSISTANTS), + probatio.Required("type"): "homeassistant/expose_new_entities/get", + probatio.Required("assistant"): probatio.In(KNOWN_ASSISTANTS), } ) def ws_expose_new_entities_get( @@ -463,9 +463,9 @@ def ws_expose_new_entities_get( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "homeassistant/expose_new_entities/set", - vol.Required("assistant"): vol.In(KNOWN_ASSISTANTS), - vol.Required("expose_new"): bool, + probatio.Required("type"): "homeassistant/expose_new_entities/set", + probatio.Required("assistant"): probatio.In(KNOWN_ASSISTANTS), + probatio.Required("expose_new"): bool, } ) def ws_expose_new_entities_set( diff --git a/homeassistant/components/homeassistant/llm.py b/homeassistant/components/homeassistant/llm.py index 8351819b62bb9..c2fbd6a3976b8 100644 --- a/homeassistant/components/homeassistant/llm.py +++ b/homeassistant/components/homeassistant/llm.py @@ -5,7 +5,7 @@ from operator import attrgetter from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.llm import LLMTools from homeassistant.components.sensor import ( @@ -220,21 +220,21 @@ class GetLiveContextTool(Tool): "Prefer filtering by domain when searching" " for multiple devices of the same type." ) - parameters = vol.Schema( + parameters = probatio.Schema( { - vol.Optional( + probatio.Optional( "name", description="Filter entities by name or alias (case-insensitive).", ): cv.string, - vol.Optional( + probatio.Optional( "domain", description=( "Filter entities by domain" " (e.g. 'light', 'sensor')." " Accepts a single domain or a list." ), - ): vol.Any(cv.string, [cv.string]), - vol.Optional( + ): probatio.Any(cv.string, [cv.string]), + probatio.Optional( "area", description="Filter entities by area name or alias (case-insensitive).", ): cv.string, diff --git a/homeassistant/components/homeassistant/scene.py b/homeassistant/components/homeassistant/scene.py index 06f1369fb9843..bca51041bc079 100644 --- a/homeassistant/components/homeassistant/scene.py +++ b/homeassistant/components/homeassistant/scene.py @@ -4,7 +4,7 @@ import logging from typing import Any, NamedTuple, cast, override -import voluptuous as vol +import probatio from homeassistant import config as conf_util from homeassistant.components.light import ATTR_TRANSITION @@ -56,7 +56,7 @@ def _convert_states(states: dict[str, Any]) -> dict[str, State]: if isinstance(state, bool): state = STATE_ON if state else STATE_OFF elif not isinstance(state, str): - raise vol.Invalid(f"State for {entity_id} should be a string") + raise probatio.Invalid(f"State for {entity_id} should be a string") result[entity_id] = State(entity_id, state, attributes) @@ -74,45 +74,45 @@ def _ensure_no_intersection(value: dict[str, Any]) -> dict[str, Any]: ): return value - raise vol.Invalid("entities and snapshot_entities must not overlap") + raise probatio.Invalid("entities and snapshot_entities must not overlap") CONF_SCENE_ID = "scene_id" CONF_SNAPSHOT = "snapshot_entities" DATA_PLATFORM = "homeassistant_scene" EVENT_SCENE_RELOADED = "scene_reloaded" -STATES_SCHEMA = vol.All(dict, _convert_states) +STATES_SCHEMA = probatio.All(dict, _convert_states) -PLATFORM_SCHEMA = vol.Schema( +PLATFORM_SCHEMA = probatio.Schema( { - vol.Required(CONF_PLATFORM): DOMAIN, - vol.Required(STATES): vol.All( + probatio.Required(CONF_PLATFORM): DOMAIN, + probatio.Required(STATES): probatio.All( cv.ensure_list, [ - vol.Schema( + probatio.Schema( { - vol.Optional(CONF_ID): cv.string, - vol.Required(CONF_NAME): cv.string, - vol.Optional(CONF_ICON): cv.icon, - vol.Required(CONF_ENTITIES): STATES_SCHEMA, - vol.Optional("metadata"): dict, + probatio.Optional(CONF_ID): cv.string, + probatio.Required(CONF_NAME): cv.string, + probatio.Optional(CONF_ICON): cv.icon, + probatio.Required(CONF_ENTITIES): STATES_SCHEMA, + probatio.Optional("metadata"): dict, } ) ], ), }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -CREATE_SCENE_SCHEMA = vol.All( +CREATE_SCENE_SCHEMA = probatio.All( cv.has_at_least_one_key(CONF_ENTITIES, CONF_SNAPSHOT), _ensure_no_intersection, - vol.Schema( + probatio.Schema( { - vol.Required(CONF_SCENE_ID): cv.slug, - vol.Optional(CONF_ENTITIES, default={}): STATES_SCHEMA, - vol.Optional(CONF_SNAPSHOT, default=[]): cv.entity_ids, + probatio.Required(CONF_SCENE_ID): cv.slug, + probatio.Optional(CONF_ENTITIES, default={}): STATES_SCHEMA, + probatio.Optional(CONF_SNAPSHOT, default=[]): cv.entity_ids, } ), ) @@ -230,12 +230,12 @@ async def apply_service(call: ServiceCall) -> None: SCENE_DOMAIN, SERVICE_APPLY, apply_service, - vol.Schema( + probatio.Schema( { - vol.Optional(ATTR_TRANSITION): vol.All( - vol.Coerce(float), vol.Clamp(min=0, max=6553) + probatio.Optional(ATTR_TRANSITION): probatio.All( + probatio.Coerce(float), probatio.Clamp(min=0, max=6553) ), - vol.Required(CONF_ENTITIES): STATES_SCHEMA, + probatio.Required(CONF_ENTITIES): STATES_SCHEMA, } ), ) diff --git a/homeassistant/components/homeassistant/triggers/event.py b/homeassistant/components/homeassistant/triggers/event.py index 010f20a0c5a46..5ad125d18bad8 100644 --- a/homeassistant/components/homeassistant/triggers/event.py +++ b/homeassistant/components/homeassistant/triggers/event.py @@ -4,7 +4,7 @@ import logging from typing import Any -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_DEVICE_ID, @@ -36,18 +36,20 @@ def _validate_event_types(value: Any) -> Any: """ templates: list[template.Template] = value if any(tpl.is_static and tpl.template == EVENT_STATE_REPORTED for tpl in templates): - raise vol.Invalid(f"Can't listen to {EVENT_STATE_REPORTED} in event trigger") + raise probatio.Invalid( + f"Can't listen to {EVENT_STATE_REPORTED} in event trigger" + ) return value TRIGGER_SCHEMA = cv.TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_PLATFORM): "event", - vol.Required(CONF_EVENT_TYPE): vol.All( + probatio.Required(CONF_PLATFORM): "event", + probatio.Required(CONF_EVENT_TYPE): probatio.All( cv.ensure_list, [cv.template], _validate_event_types ), - vol.Optional(CONF_EVENT_DATA): vol.All(dict, cv.template_complex), - vol.Optional(CONF_EVENT_CONTEXT): vol.All(dict, cv.template_complex), + probatio.Optional(CONF_EVENT_DATA): probatio.All(dict, cv.template_complex), + probatio.Optional(CONF_EVENT_CONTEXT): probatio.All(dict, cv.template_complex), } ) @@ -106,7 +108,7 @@ def _log_composite_device_id_warning( def _schema_value(value: Any) -> Any: if isinstance(value, list): - return vol.In(value) + return probatio.In(value) return value @@ -130,7 +132,7 @@ async def async_attach_trigger( raise HomeAssistantError( f"Can't listen to {EVENT_STATE_REPORTED} in event trigger" ) - event_data_schema: vol.Schema | None = None + event_data_schema: probatio.Schema | None = None event_data_items: ItemsView | None = None if CONF_EVENT_DATA in config: # Render the schema input @@ -139,23 +141,23 @@ async def async_attach_trigger( template.render_complex(config[CONF_EVENT_DATA], variables, limited=True) ) - # For performance reasons, we want to avoid using a voluptuous schema here + # For performance reasons, we want to avoid using a probatio schema here # unless required. Thus, if possible, we try to use a simple items comparison # For that, we explicitly do not check for list like the context data below # since lists are a special case only used for context data, see test # test_event_data_with_list. Otherwise, we build a volutupus schema, see test # test_event_data_with_list_nested if any(isinstance(value, dict) for value in event_data.values()): - event_data_schema = vol.Schema( + event_data_schema = probatio.Schema( event_data, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, required=True, ) else: # Use a simple items comparison if possible event_data_items = event_data.items() - event_context_schema: vol.Schema | None = None + event_context_schema: probatio.Schema | None = None event_context_items: ItemsView | None = None if CONF_EVENT_CONTEXT in config: # Render the schema input @@ -170,12 +172,12 @@ async def async_attach_trigger( # multiple user_id case without requiring expensive schema # validation. if any(isinstance(value, list) for value in event_context.values()): - event_context_schema = vol.Schema( + event_context_schema = probatio.Schema( { - vol.Required(key): _schema_value(value) + probatio.Required(key): _schema_value(value) for key, value in event_context.items() }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) else: # Use a simple items comparison if possible @@ -196,7 +198,7 @@ def filter_event(event_data: Mapping[str, Any]) -> bool: elif event_data_schema: # Slow path for schema validation event_data_schema(event_data) - except vol.Invalid: + except probatio.Invalid: # If event doesn't match, skip event return False return True @@ -214,7 +216,7 @@ def handle_event(event: Event) -> None: # Slow path for schema validation # This is safe because we make a copy of the event context event_context_schema(dict(event.context._as_dict)) # noqa: SLF001 - except vol.Invalid: + except probatio.Invalid: # If event doesn't match, skip event return diff --git a/homeassistant/components/homeassistant/triggers/homeassistant.py b/homeassistant/components/homeassistant/triggers/homeassistant.py index 4f96b25d281e7..3a84d07009c80 100644 --- a/homeassistant/components/homeassistant/triggers/homeassistant.py +++ b/homeassistant/components/homeassistant/triggers/homeassistant.py @@ -1,6 +1,6 @@ """Offer Home Assistant core automation rules.""" -import voluptuous as vol +import probatio from homeassistant.const import CONF_EVENT, CONF_PLATFORM, EVENT_HOMEASSISTANT_STARTED from homeassistant.core import CALLBACK_TYPE, Event, HassJob, HomeAssistant, callback @@ -15,8 +15,8 @@ TRIGGER_SCHEMA = cv.TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_PLATFORM): DOMAIN, - vol.Required(CONF_EVENT): vol.Any(EVENT_START, EVENT_SHUTDOWN), + probatio.Required(CONF_PLATFORM): DOMAIN, + probatio.Required(CONF_EVENT): probatio.Any(EVENT_START, EVENT_SHUTDOWN), } ) diff --git a/homeassistant/components/homeassistant/triggers/numeric_state.py b/homeassistant/components/homeassistant/triggers/numeric_state.py index 906674dc8ca4b..229fe3e049320 100644 --- a/homeassistant/components/homeassistant/triggers/numeric_state.py +++ b/homeassistant/components/homeassistant/triggers/numeric_state.py @@ -5,7 +5,7 @@ import logging from typing import Any -import voluptuous as vol +import probatio from homeassistant import exceptions from homeassistant.const import ( @@ -52,7 +52,7 @@ def validate_above_below[_T: dict[str, Any]](value: _T) -> _T: return value if above > below: - raise vol.Invalid( + raise probatio.Invalid( ( f"A value can never be above {above} and below {below} at the same" " time. You probably want two different triggers." @@ -62,16 +62,16 @@ def validate_above_below[_T: dict[str, Any]](value: _T) -> _T: return value -_TRIGGER_SCHEMA = vol.All( +_TRIGGER_SCHEMA = probatio.All( cv.TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_PLATFORM): "numeric_state", - vol.Required(CONF_ENTITY_ID): cv.entity_ids_or_uuids, - vol.Optional(CONF_BELOW): cv.NUMERIC_STATE_THRESHOLD_SCHEMA, - vol.Optional(CONF_ABOVE): cv.NUMERIC_STATE_THRESHOLD_SCHEMA, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, - vol.Optional(CONF_FOR): cv.positive_time_period_template, - vol.Optional(CONF_ATTRIBUTE): cv.match_all, + probatio.Required(CONF_PLATFORM): "numeric_state", + probatio.Required(CONF_ENTITY_ID): cv.entity_ids_or_uuids, + probatio.Optional(CONF_BELOW): cv.NUMERIC_STATE_THRESHOLD_SCHEMA, + probatio.Optional(CONF_ABOVE): cv.NUMERIC_STATE_THRESHOLD_SCHEMA, + probatio.Optional(CONF_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_FOR): cv.positive_time_period_template, + probatio.Optional(CONF_ATTRIBUTE): cv.match_all, } ), cv.has_at_least_one_key(CONF_BELOW, CONF_ABOVE), @@ -210,7 +210,7 @@ def check_numeric_state_no_raise( period[entity_id] = cv.positive_time_period( template.render_complex(time_delta, variables(entity_id)) ) - except (exceptions.TemplateError, vol.Invalid) as ex: + except (exceptions.TemplateError, probatio.Invalid) as ex: _LOGGER.error( "Error rendering '%s' for template: %s", trigger_info["name"], diff --git a/homeassistant/components/homeassistant/triggers/state.py b/homeassistant/components/homeassistant/triggers/state.py index 0ca943d3c3f72..0c80dcc58e499 100644 --- a/homeassistant/components/homeassistant/triggers/state.py +++ b/homeassistant/components/homeassistant/triggers/state.py @@ -4,7 +4,7 @@ from datetime import timedelta import logging -import voluptuous as vol +import probatio from homeassistant import exceptions from homeassistant.const import ( @@ -45,29 +45,29 @@ BASE_SCHEMA = cv.TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_PLATFORM): "state", - vol.Required(CONF_ENTITY_ID): cv.entity_ids_or_uuids, - vol.Optional(CONF_FOR): cv.positive_time_period_template, - vol.Optional(CONF_ATTRIBUTE): cv.match_all, + probatio.Required(CONF_PLATFORM): "state", + probatio.Required(CONF_ENTITY_ID): cv.entity_ids_or_uuids, + probatio.Optional(CONF_FOR): cv.positive_time_period_template, + probatio.Optional(CONF_ATTRIBUTE): cv.match_all, } ) TRIGGER_STATE_SCHEMA = BASE_SCHEMA.extend( { # These are str on purpose. Want to catch YAML conversions - vol.Exclusive(CONF_FROM, CONF_FROM): vol.Any(str, [str], None), - vol.Exclusive(CONF_NOT_FROM, CONF_FROM): vol.Any(str, [str], None), - vol.Exclusive(CONF_TO, CONF_TO): vol.Any(str, [str], None), - vol.Exclusive(CONF_NOT_TO, CONF_TO): vol.Any(str, [str], None), + probatio.Exclusive(CONF_FROM, CONF_FROM): probatio.Any(str, [str], None), + probatio.Exclusive(CONF_NOT_FROM, CONF_FROM): probatio.Any(str, [str], None), + probatio.Exclusive(CONF_TO, CONF_TO): probatio.Any(str, [str], None), + probatio.Exclusive(CONF_NOT_TO, CONF_TO): probatio.Any(str, [str], None), } ) TRIGGER_ATTRIBUTE_SCHEMA = BASE_SCHEMA.extend( { - vol.Exclusive(CONF_FROM, CONF_FROM): cv.match_all, - vol.Exclusive(CONF_NOT_FROM, CONF_FROM): cv.match_all, - vol.Exclusive(CONF_TO, CONF_TO): cv.match_all, - vol.Exclusive(CONF_NOT_TO, CONF_TO): cv.match_all, + probatio.Exclusive(CONF_FROM, CONF_FROM): cv.match_all, + probatio.Exclusive(CONF_NOT_FROM, CONF_FROM): cv.match_all, + probatio.Exclusive(CONF_TO, CONF_TO): cv.match_all, + probatio.Exclusive(CONF_NOT_TO, CONF_TO): cv.match_all, } ) @@ -77,9 +77,9 @@ async def async_validate_trigger_config( ) -> ConfigType: """Validate trigger config.""" if not isinstance(config, dict): - raise vol.Invalid("Expected a dictionary") + raise probatio.Invalid("Expected a dictionary") - # We use this approach instead of vol.Any because + # We use this approach instead of probatio.Any because # this gives better error messages. if CONF_ATTRIBUTE in config: config = TRIGGER_ATTRIBUTE_SCHEMA(config) @@ -206,7 +206,7 @@ def call_action() -> None: period[entity] = cv.positive_time_period( template.render_complex(time_delta, variables) ) - except (exceptions.TemplateError, vol.Invalid) as ex: + except (exceptions.TemplateError, probatio.Invalid) as ex: _LOGGER.error( "Error rendering '%s' for template: %s", trigger_info["name"], ex ) diff --git a/homeassistant/components/homeassistant/triggers/time.py b/homeassistant/components/homeassistant/triggers/time.py index 93ece015a192c..7a831bd652868 100644 --- a/homeassistant/components/homeassistant/triggers/time.py +++ b/homeassistant/components/homeassistant/triggers/time.py @@ -5,7 +5,7 @@ from functools import partial from typing import Any, NamedTuple -import voluptuous as vol +import probatio from homeassistant.components import sensor from homeassistant.components.input_datetime import DOMAIN as INPUT_DATETIME_DOMAIN @@ -41,13 +41,15 @@ from homeassistant.helpers.typing import ConfigType from homeassistant.util import dt as dt_util -_TIME_TRIGGER_ENTITY = vol.All(str, cv.entity_domain(["input_datetime", "sensor"])) -_TIME_AT_SCHEMA = vol.Any(cv.time, _TIME_TRIGGER_ENTITY) +_TIME_TRIGGER_ENTITY = probatio.All(str, cv.entity_domain(["input_datetime", "sensor"])) +_TIME_AT_SCHEMA = probatio.Any(cv.time, _TIME_TRIGGER_ENTITY) -_TIME_TRIGGER_ENTITY_WITH_OFFSET = vol.Schema( +_TIME_TRIGGER_ENTITY_WITH_OFFSET = probatio.Schema( { - vol.Required(CONF_ENTITY_ID): cv.entity_domain(["input_datetime", "sensor"]), - vol.Optional(CONF_OFFSET): cv.time_period, + probatio.Required(CONF_ENTITY_ID): cv.entity_domain( + ["input_datetime", "sensor"] + ), + probatio.Optional(CONF_OFFSET): cv.time_period, } ) @@ -62,7 +64,7 @@ def valid_at_template(value: Any) -> template.Template: return tpl -_TIME_TRIGGER_SCHEMA = vol.Any( +_TIME_TRIGGER_SCHEMA = probatio.Any( cv.time, _TIME_TRIGGER_ENTITY, _TIME_TRIGGER_ENTITY_WITH_OFFSET, @@ -77,11 +79,13 @@ def valid_at_template(value: Any) -> template.Template: TRIGGER_SCHEMA = cv.TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_PLATFORM): "time", - vol.Required(CONF_AT): vol.All(cv.ensure_list, [_TIME_TRIGGER_SCHEMA]), - vol.Optional(CONF_WEEKDAY): vol.Any( - vol.In(WEEKDAYS), - vol.All(cv.ensure_list, [vol.In(WEEKDAYS)]), + probatio.Required(CONF_PLATFORM): "time", + probatio.Required(CONF_AT): probatio.All( + cv.ensure_list, [_TIME_TRIGGER_SCHEMA] + ), + probatio.Optional(CONF_WEEKDAY): probatio.Any( + probatio.In(WEEKDAYS), + probatio.All(cv.ensure_list, [probatio.In(WEEKDAYS)]), ), } ) @@ -257,7 +261,7 @@ def update_entity_trigger( render = template.render_complex(at_time, variables, limited=True) try: at_time = _TIME_AT_SCHEMA(render) - except vol.Invalid as exc: + except probatio.Invalid as exc: raise HomeAssistantError( f"Limited Template for 'at' rendered a" f" unexpected value '{render}', expected" diff --git a/homeassistant/components/homeassistant/triggers/time_pattern.py b/homeassistant/components/homeassistant/triggers/time_pattern.py index 9bd9ce1fb3c6d..86a1d9b2e5859 100644 --- a/homeassistant/components/homeassistant/triggers/time_pattern.py +++ b/homeassistant/components/homeassistant/triggers/time_pattern.py @@ -3,7 +3,7 @@ from datetime import datetime from typing import Any -import voluptuous as vol +import probatio from homeassistant.const import CONF_PLATFORM from homeassistant.core import CALLBACK_TYPE, HassJob, HomeAssistant, callback @@ -36,22 +36,24 @@ def __call__(self, value: Any) -> str | int: if isinstance(value, str) and value.startswith("/"): number = int(value[1:]) if number == 0: - raise vol.Invalid(f"must be a value between 1 and {self.maximum}") + raise probatio.Invalid( + f"must be a value between 1 and {self.maximum}" + ) else: value = number = int(value) if not (0 <= number <= self.maximum): - raise vol.Invalid(f"must be a value between 0 and {self.maximum}") + raise probatio.Invalid(f"must be a value between 0 and {self.maximum}") except ValueError as err: - raise vol.Invalid("invalid time_pattern value") from err + raise probatio.Invalid("invalid time_pattern value") from err return value # type: ignore[no-any-return] -TRIGGER_SCHEMA = vol.All( +TRIGGER_SCHEMA = probatio.All( cv.TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_PLATFORM): "time_pattern", + probatio.Required(CONF_PLATFORM): "time_pattern", CONF_HOURS: TimePattern(maximum=23), CONF_MINUTES: TimePattern(maximum=59), CONF_SECONDS: TimePattern(maximum=59), diff --git a/homeassistant/components/homeassistant_green/config_flow.py b/homeassistant/components/homeassistant_green/config_flow.py index 44e1c4e3d0ab9..88e666dd7c8a4 100644 --- a/homeassistant/components/homeassistant_green/config_flow.py +++ b/homeassistant/components/homeassistant_green/config_flow.py @@ -4,7 +4,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.hassio import ( GreenOptions, @@ -25,12 +25,12 @@ _LOGGER = logging.getLogger(__name__) -STEP_HW_SETTINGS_SCHEMA = vol.Schema( +STEP_HW_SETTINGS_SCHEMA = probatio.Schema( { # Sorted to match front panel left to right - vol.Required("power_led"): selector.BooleanSelector(), - vol.Required("activity_led"): selector.BooleanSelector(), - vol.Required("system_health_led"): selector.BooleanSelector(), + probatio.Required("power_led"): selector.BooleanSelector(), + probatio.Required("activity_led"): selector.BooleanSelector(), + probatio.Required("system_health_led"): selector.BooleanSelector(), } ) diff --git a/homeassistant/components/homeassistant_hardware/silabs_multiprotocol_addon.py b/homeassistant/components/homeassistant_hardware/silabs_multiprotocol_addon.py index bee67611e6aab..de061599e3159 100644 --- a/homeassistant/components/homeassistant_hardware/silabs_multiprotocol_addon.py +++ b/homeassistant/components/homeassistant_hardware/silabs_multiprotocol_addon.py @@ -8,7 +8,7 @@ from aiohttp import ClientError from ha_silabs_firmware_client import FirmwareUpdateClient, ManifestMissing -import voluptuous as vol +import probatio import yarl from homeassistant.components.hassio import ( @@ -354,8 +354,8 @@ async def async_step_addon_not_installed( if user_input is None: return self.async_show_form( step_id="addon_not_installed", - data_schema=vol.Schema( - {vol.Required(CONF_ENABLE_MULTI_PAN, default=False): bool} + data_schema=probatio.Schema( + {probatio.Required(CONF_ENABLE_MULTI_PAN, default=False): bool} ), description_placeholders={"hardware_name": self._hardware_name()}, ) @@ -591,9 +591,9 @@ async def async_step_change_channel( suggested_channel = DEFAULT_CHANNEL if (channel := multipan_manager.async_get_channel()) is not None: suggested_channel = channel - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required( + probatio.Required( "channel", description={"suggested_value": str(suggested_channel)}, ): SelectSelector( @@ -633,8 +633,8 @@ async def async_step_uninstall_addon( if user_input is None: return self.async_show_form( step_id="uninstall_addon", - data_schema=vol.Schema( - {vol.Required(CONF_DISABLE_MULTI_PAN, default=False): bool} + data_schema=probatio.Schema( + {probatio.Required(CONF_DISABLE_MULTI_PAN, default=False): bool} ), description_placeholders={"hardware_name": self._hardware_name()}, ) diff --git a/homeassistant/components/homeassistant_yellow/config_flow.py b/homeassistant/components/homeassistant_yellow/config_flow.py index ca08767f93865..25826276c6df2 100644 --- a/homeassistant/components/homeassistant_yellow/config_flow.py +++ b/homeassistant/components/homeassistant_yellow/config_flow.py @@ -5,8 +5,8 @@ import logging from typing import TYPE_CHECKING, Any, Protocol, final, override +import probatio from universal_silabs_flasher.flasher import YellowFlasher -import voluptuous as vol from homeassistant.components.hassio import ( SupervisorError, @@ -49,11 +49,11 @@ _LOGGER = logging.getLogger(__name__) -STEP_HW_SETTINGS_SCHEMA = vol.Schema( +STEP_HW_SETTINGS_SCHEMA = probatio.Schema( { - vol.Required("disk_led"): selector.BooleanSelector(), - vol.Required("heartbeat_led"): selector.BooleanSelector(), - vol.Required("power_led"): selector.BooleanSelector(), + probatio.Required("disk_led"): selector.BooleanSelector(), + probatio.Required("heartbeat_led"): selector.BooleanSelector(), + probatio.Required("power_led"): selector.BooleanSelector(), } ) diff --git a/homeassistant/components/homee/config_flow.py b/homeassistant/components/homee/config_flow.py index 6c5ef2e192037..74dbd1a49386c 100644 --- a/homeassistant/components/homee/config_flow.py +++ b/homeassistant/components/homee/config_flow.py @@ -4,12 +4,12 @@ import logging from typing import Any, override +import probatio from pyHomee import ( Homee, HomeeAuthFailedException as HomeeAuthenticationFailedException, HomeeConnectionFailedException, ) -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_USER, @@ -29,11 +29,11 @@ _LOGGER = logging.getLogger(__name__) -AUTH_SCHEMA = vol.Schema( +AUTH_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) @@ -179,10 +179,10 @@ async def async_step_zeroconf_confirm( return self.async_show_form( step_id="zeroconf_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, @@ -237,10 +237,12 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_USERNAME, default=self._reauth_username): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required( + CONF_USERNAME, default=self._reauth_username + ): str, + probatio.Required(CONF_PASSWORD): str, } ), description_placeholders={ @@ -287,9 +289,9 @@ async def async_step_reconfigure( ) return self.async_show_form( - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_HOST, default=reconfigure_entry.data[CONF_HOST] ): str } diff --git a/homeassistant/components/homekit/__init__.py b/homeassistant/components/homekit/__init__.py index be54b3f1721a0..243d52d12b6d2 100644 --- a/homeassistant/components/homekit/__init__.py +++ b/homeassistant/components/homekit/__init__.py @@ -11,12 +11,12 @@ from typing import Any, cast from aiohttp import web +import probatio from pyhap import util as pyhap_util from pyhap.characteristic import Characteristic from pyhap.const import STANDALONE_AID from pyhap.loader import get_loader from pyhap.service import Service -import voluptuous as vol from zeroconf.asyncio import AsyncZeroconf from homeassistant.components import device_automation, network, zeroconf @@ -191,46 +191,52 @@ def _has_all_unique_names_and_ports( """Validate that each homekit bridge configured has a unique name.""" names = [bridge[CONF_NAME] for bridge in bridges] ports = [bridge[CONF_PORT] for bridge in bridges] - vol.Schema(vol.Unique())(names) - vol.Schema(vol.Unique())(ports) + probatio.Schema(probatio.Unique())(names) + probatio.Schema(probatio.Unique())(ports) return bridges -BRIDGE_SCHEMA = vol.All( - vol.Schema( +BRIDGE_SCHEMA = probatio.All( + probatio.Schema( { - vol.Optional(CONF_HOMEKIT_MODE, default=DEFAULT_HOMEKIT_MODE): vol.In( - HOMEKIT_MODES + probatio.Optional( + CONF_HOMEKIT_MODE, default=DEFAULT_HOMEKIT_MODE + ): probatio.In(HOMEKIT_MODES), + probatio.Optional(CONF_NAME, default=BRIDGE_NAME): probatio.All( + cv.string, probatio.Length(min=3, max=25) ), - vol.Optional(CONF_NAME, default=BRIDGE_NAME): vol.All( - cv.string, vol.Length(min=3, max=25) + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_IP_ADDRESS): probatio.All( + ipaddress.ip_address, cv.string ), - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_IP_ADDRESS): vol.All(ipaddress.ip_address, cv.string), - vol.Optional(CONF_ADVERTISE_IP): vol.All( + probatio.Optional(CONF_ADVERTISE_IP): probatio.All( cv.ensure_list, [ipaddress.ip_address], [cv.string] ), - vol.Optional(CONF_FILTER, default={}): BASE_FILTER_SCHEMA, - vol.Optional(CONF_ENTITY_CONFIG, default={}): validate_entity_config, - vol.Optional(CONF_DEVICES): cv.ensure_list, + probatio.Optional(CONF_FILTER, default={}): BASE_FILTER_SCHEMA, + probatio.Optional(CONF_ENTITY_CONFIG, default={}): validate_entity_config, + probatio.Optional(CONF_DEVICES): cv.ensure_list, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ), ) -CONFIG_SCHEMA = vol.Schema( - {DOMAIN: vol.All(cv.ensure_list, [BRIDGE_SCHEMA], _has_all_unique_names_and_ports)}, - extra=vol.ALLOW_EXTRA, +CONFIG_SCHEMA = probatio.Schema( + { + DOMAIN: probatio.All( + cv.ensure_list, [BRIDGE_SCHEMA], _has_all_unique_names_and_ports + ) + }, + extra=probatio.ALLOW_EXTRA, ) -RESET_ACCESSORY_SERVICE_SCHEMA = vol.Schema( - {vol.Required(ATTR_ENTITY_ID): cv.entity_ids} +RESET_ACCESSORY_SERVICE_SCHEMA = probatio.Schema( + {probatio.Required(ATTR_ENTITY_ID): cv.entity_ids} ) -UNPAIR_SERVICE_SCHEMA = vol.Schema( - {vol.Required(ATTR_DEVICE_ID): vol.All(cv.ensure_list, [str])} +UNPAIR_SERVICE_SCHEMA = probatio.Schema( + {probatio.Required(ATTR_DEVICE_ID): probatio.All(cv.ensure_list, [str])} ) @@ -1106,7 +1112,7 @@ async def _async_add_trigger_accessories(self) -> None: for trigger in device_triggers: try: await async_validate_trigger_config(self.hass, trigger) - except vol.Invalid as ex: + except probatio.Invalid as ex: _LOGGER.debug( ( "%s: cannot add unsupported trigger %s because it requires" diff --git a/homeassistant/components/homekit/config_flow.py b/homeassistant/components/homekit/config_flow.py index 5acce6ec11f77..b84545770c9cd 100644 --- a/homeassistant/components/homekit/config_flow.py +++ b/homeassistant/components/homekit/config_flow.py @@ -8,7 +8,7 @@ import string from typing import Any, Final, TypedDict, override -import voluptuous as vol +import probatio from homeassistant.components import device_automation from homeassistant.components.camera import DOMAIN as CAMERA_DOMAIN @@ -253,9 +253,9 @@ async def async_step_user( name_to_type_map = await _async_name_to_type_map(self.hass) return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_INCLUDE_DOMAINS, default=default_domains ): cv.multi_select(name_to_type_map), } @@ -459,9 +459,9 @@ async def async_step_climate( translation_key="climate_accessory_type", ) ) - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required( + probatio.Required( label, default=all_entity_config.get(entity_id, {}).get( CONF_TYPE, CLIMATE_TYPE_AUTOMATIC @@ -533,9 +533,9 @@ async def async_step_bridged_device_triggers( ] return self.async_show_form( step_id="bridged_device_triggers", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional(CONF_DEVICES, default=devices): cv.multi_select( + probatio.Optional(CONF_DEVICES, default=devices): cv.multi_select( all_supported_devices ) } @@ -582,9 +582,9 @@ async def async_step_cameras( if entity_config.get(CONF_SUPPORT_AUDIO): cameras_with_audio.append(entity) - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_CAMERA_COPY, default=cameras_with_copy ): selector.EntitySelector( selector.EntitySelectorConfig( @@ -592,7 +592,7 @@ async def async_step_cameras( include_entities=(self.included_cameras), ) ), - vol.Optional( + probatio.Optional( CONF_CAMERA_AUDIO, default=cameras_with_audio ): selector.EntitySelector( selector.EntitySelectorConfig( @@ -637,9 +637,9 @@ async def async_step_accessory( return self.async_show_form( step_id="accessory", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_ENTITIES, default=default_value ): selector.EntitySelector( selector.EntitySelectorConfig( @@ -683,9 +683,9 @@ async def async_step_include( description_placeholders={ "domains": await _async_domain_names(self.hass, domains) }, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_ENTITIES, default=default_value ): selector.EntitySelector( selector.EntitySelectorConfig( @@ -740,9 +740,9 @@ def _remaining_in_domain(domain: str) -> list[str]: description_placeholders={ "domains": await _async_domain_names(self.hass, domains) }, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_ENTITIES, default=default_value ): selector.EntitySelector( selector.EntitySelectorConfig( @@ -782,15 +782,15 @@ async def async_step_init( name_to_type_map = await _async_name_to_type_map(self.hass) return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOMEKIT_MODE, default=homekit_mode): vol.In( - HOMEKIT_MODES - ), - vol.Required( + probatio.Required( + CONF_HOMEKIT_MODE, default=homekit_mode + ): probatio.In(HOMEKIT_MODES), + probatio.Required( CONF_INCLUDE_EXCLUDE_MODE, default=include_exclude_mode - ): vol.In(INCLUDE_EXCLUDE_MODES), - vol.Required( + ): probatio.In(INCLUDE_EXCLUDE_MODES), + probatio.Required( CONF_DOMAINS, default=domains, ): cv.multi_select(name_to_type_map), diff --git a/homeassistant/components/homekit/util.py b/homeassistant/components/homekit/util.py index 2d2dd801496f5..8b99b700e2230 100644 --- a/homeassistant/components/homekit/util.py +++ b/homeassistant/components/homekit/util.py @@ -9,9 +9,9 @@ import socket from typing import Any, cast +import probatio from pyhap.accessory import Accessory import pyqrcode -import voluptuous as vol from homeassistant.components import persistent_notification from homeassistant.components.alarm_control_panel import ( @@ -146,88 +146,96 @@ ] VALID_AUDIO_CODECS = [AUDIO_CODEC_OPUS, VIDEO_CODEC_COPY] -BASIC_INFO_SCHEMA = vol.Schema( +BASIC_INFO_SCHEMA = probatio.Schema( { - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_LINKED_BATTERY_SENSOR): cv.entity_domain(SENSOR_DOMAIN), - vol.Optional(CONF_LINKED_BATTERY_CHARGING_SENSOR): cv.entity_domain( + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_LINKED_BATTERY_SENSOR): cv.entity_domain(SENSOR_DOMAIN), + probatio.Optional(CONF_LINKED_BATTERY_CHARGING_SENSOR): cv.entity_domain( BINARY_SENSOR_DOMAIN ), - vol.Optional( + probatio.Optional( CONF_LOW_BATTERY_THRESHOLD, default=DEFAULT_LOW_BATTERY_THRESHOLD ): cv.positive_int, } ) FEATURE_SCHEMA = BASIC_INFO_SCHEMA.extend( - {vol.Optional(CONF_FEATURE_LIST, default=None): cv.ensure_list} + {probatio.Optional(CONF_FEATURE_LIST, default=None): cv.ensure_list} ) CAMERA_SCHEMA = BASIC_INFO_SCHEMA.extend( { - vol.Optional(CONF_STREAM_ADDRESS): vol.All(ipaddress.ip_address, cv.string), - vol.Optional(CONF_STREAM_SOURCE): cv.string, - vol.Optional(CONF_AUDIO_CODEC, default=DEFAULT_AUDIO_CODEC): vol.In( - VALID_AUDIO_CODECS + probatio.Optional(CONF_STREAM_ADDRESS): probatio.All( + ipaddress.ip_address, cv.string ), - vol.Optional(CONF_SUPPORT_AUDIO, default=DEFAULT_SUPPORT_AUDIO): cv.boolean, - vol.Optional(CONF_MAX_WIDTH, default=DEFAULT_MAX_WIDTH): cv.positive_int, - vol.Optional(CONF_MAX_HEIGHT, default=DEFAULT_MAX_HEIGHT): cv.positive_int, - vol.Optional(CONF_MAX_FPS, default=DEFAULT_MAX_FPS): cv.positive_int, - vol.Optional(CONF_AUDIO_MAP, default=DEFAULT_AUDIO_MAP): cv.string, - vol.Optional(CONF_VIDEO_MAP, default=DEFAULT_VIDEO_MAP): cv.string, - vol.Optional(CONF_STREAM_COUNT, default=DEFAULT_STREAM_COUNT): vol.All( - vol.Coerce(int), vol.Range(min=1, max=10) + probatio.Optional(CONF_STREAM_SOURCE): cv.string, + probatio.Optional(CONF_AUDIO_CODEC, default=DEFAULT_AUDIO_CODEC): probatio.In( + VALID_AUDIO_CODECS ), - vol.Optional(CONF_VIDEO_CODEC, default=DEFAULT_VIDEO_CODEC): vol.In( + probatio.Optional( + CONF_SUPPORT_AUDIO, default=DEFAULT_SUPPORT_AUDIO + ): cv.boolean, + probatio.Optional(CONF_MAX_WIDTH, default=DEFAULT_MAX_WIDTH): cv.positive_int, + probatio.Optional(CONF_MAX_HEIGHT, default=DEFAULT_MAX_HEIGHT): cv.positive_int, + probatio.Optional(CONF_MAX_FPS, default=DEFAULT_MAX_FPS): cv.positive_int, + probatio.Optional(CONF_AUDIO_MAP, default=DEFAULT_AUDIO_MAP): cv.string, + probatio.Optional(CONF_VIDEO_MAP, default=DEFAULT_VIDEO_MAP): cv.string, + probatio.Optional( + CONF_STREAM_COUNT, default=DEFAULT_STREAM_COUNT + ): probatio.All(probatio.Coerce(int), probatio.Range(min=1, max=10)), + probatio.Optional(CONF_VIDEO_CODEC, default=DEFAULT_VIDEO_CODEC): probatio.In( VALID_VIDEO_CODECS ), - vol.Optional(CONF_VIDEO_PROFILE_NAMES, default=DEFAULT_VIDEO_PROFILE_NAMES): [ - cv.string - ], - vol.Optional( + probatio.Optional( + CONF_VIDEO_PROFILE_NAMES, default=DEFAULT_VIDEO_PROFILE_NAMES + ): [cv.string], + probatio.Optional( CONF_AUDIO_PACKET_SIZE, default=DEFAULT_AUDIO_PACKET_SIZE ): cv.positive_int, - vol.Optional( + probatio.Optional( CONF_VIDEO_PACKET_SIZE, default=DEFAULT_VIDEO_PACKET_SIZE ): cv.positive_int, - vol.Optional(CONF_LINKED_MOTION_SENSOR): cv.entity_domain( + probatio.Optional(CONF_LINKED_MOTION_SENSOR): cv.entity_domain( [BINARY_SENSOR_DOMAIN, EVENT_DOMAIN] ), - vol.Optional(CONF_LINKED_DOORBELL_SENSOR): cv.entity_domain( + probatio.Optional(CONF_LINKED_DOORBELL_SENSOR): cv.entity_domain( [BINARY_SENSOR_DOMAIN, EVENT_DOMAIN] ), } ) HUMIDIFIER_SCHEMA = BASIC_INFO_SCHEMA.extend( - {vol.Optional(CONF_LINKED_HUMIDITY_SENSOR): cv.entity_domain(SENSOR_DOMAIN)} + {probatio.Optional(CONF_LINKED_HUMIDITY_SENSOR): cv.entity_domain(SENSOR_DOMAIN)} ) FAN_SCHEMA = BASIC_INFO_SCHEMA.extend( { - vol.Optional(CONF_TYPE, default=TYPE_FAN): vol.All( + probatio.Optional(CONF_TYPE, default=TYPE_FAN): probatio.All( cv.string, - vol.In( + probatio.In( ( TYPE_FAN, TYPE_AIR_PURIFIER, ) ), ), - vol.Optional(CONF_LINKED_HUMIDITY_SENSOR): cv.entity_domain(SENSOR_DOMAIN), - vol.Optional(CONF_LINKED_PM25_SENSOR): cv.entity_domain(SENSOR_DOMAIN), - vol.Optional(CONF_LINKED_TEMPERATURE_SENSOR): cv.entity_domain(SENSOR_DOMAIN), - vol.Optional(CONF_LINKED_FILTER_CHANGE_INDICATION): cv.entity_domain( + probatio.Optional(CONF_LINKED_HUMIDITY_SENSOR): cv.entity_domain(SENSOR_DOMAIN), + probatio.Optional(CONF_LINKED_PM25_SENSOR): cv.entity_domain(SENSOR_DOMAIN), + probatio.Optional(CONF_LINKED_TEMPERATURE_SENSOR): cv.entity_domain( + SENSOR_DOMAIN + ), + probatio.Optional(CONF_LINKED_FILTER_CHANGE_INDICATION): cv.entity_domain( BINARY_SENSOR_DOMAIN ), - vol.Optional(CONF_LINKED_FILTER_LIFE_LEVEL): cv.entity_domain(SENSOR_DOMAIN), + probatio.Optional(CONF_LINKED_FILTER_LIFE_LEVEL): cv.entity_domain( + SENSOR_DOMAIN + ), } ) COVER_SCHEMA = BASIC_INFO_SCHEMA.extend( { - vol.Optional(CONF_LINKED_OBSTRUCTION_SENSOR): cv.entity_domain( + probatio.Optional(CONF_LINKED_OBSTRUCTION_SENSOR): cv.entity_domain( BINARY_SENSOR_DOMAIN ) } @@ -236,9 +244,9 @@ # No default so an unset type keeps the automatic Thermostat/HeaterCooler routing. CLIMATE_SCHEMA = BASIC_INFO_SCHEMA.extend( { - vol.Optional(CONF_TYPE): vol.All( + probatio.Optional(CONF_TYPE): probatio.All( cv.string, - vol.In( + probatio.In( ( TYPE_HEATER_COOLER, TYPE_THERMOSTAT, @@ -249,22 +257,22 @@ ) CODE_SCHEMA = BASIC_INFO_SCHEMA.extend( - {vol.Optional(ATTR_CODE, default=None): vol.Any(None, cv.string)} + {probatio.Optional(ATTR_CODE, default=None): probatio.Any(None, cv.string)} ) LOCK_SCHEMA = CODE_SCHEMA.extend( { - vol.Optional(CONF_LINKED_DOORBELL_SENSOR): cv.entity_domain( + probatio.Optional(CONF_LINKED_DOORBELL_SENSOR): cv.entity_domain( [BINARY_SENSOR_DOMAIN, EVENT_DOMAIN] ), } ) -MEDIA_PLAYER_SCHEMA = vol.Schema( +MEDIA_PLAYER_SCHEMA = probatio.Schema( { - vol.Required(CONF_FEATURE): vol.All( + probatio.Required(CONF_FEATURE): probatio.All( cv.string, - vol.In( + probatio.In( ( FEATURE_ON_OFF, FEATURE_PLAY_PAUSE, @@ -278,9 +286,9 @@ SWITCH_TYPE_SCHEMA = BASIC_INFO_SCHEMA.extend( { - vol.Optional(CONF_TYPE, default=TYPE_SWITCH): vol.All( + probatio.Optional(CONF_TYPE, default=TYPE_SWITCH): probatio.All( cv.string, - vol.In( + probatio.In( ( TYPE_FAUCET, TYPE_OUTLET, @@ -291,30 +299,30 @@ ) ), ), - vol.Optional(CONF_LINKED_VALVE_DURATION): cv.entity_domain( + probatio.Optional(CONF_LINKED_VALVE_DURATION): cv.entity_domain( [INPUT_NUMBER_DOMAIN, NUMBER_DOMAIN] ), - vol.Optional(CONF_LINKED_VALVE_END_TIME): cv.entity_domain(SENSOR_DOMAIN), + probatio.Optional(CONF_LINKED_VALVE_END_TIME): cv.entity_domain(SENSOR_DOMAIN), } ) SENSOR_SCHEMA = BASIC_INFO_SCHEMA.extend( { - vol.Optional(CONF_THRESHOLD_CO): vol.Any(None, cv.positive_int), - vol.Optional(CONF_THRESHOLD_CO2): vol.Any(None, cv.positive_int), + probatio.Optional(CONF_THRESHOLD_CO): probatio.Any(None, cv.positive_int), + probatio.Optional(CONF_THRESHOLD_CO2): probatio.Any(None, cv.positive_int), } ) VALVE_SCHEMA = BASIC_INFO_SCHEMA.extend( { - vol.Optional(CONF_TYPE): vol.All( + probatio.Optional(CONF_TYPE): probatio.All( cv.string, - vol.In((TYPE_FAUCET, TYPE_SHOWER, TYPE_SPRINKLER, TYPE_VALVE)), + probatio.In((TYPE_FAUCET, TYPE_SHOWER, TYPE_SPRINKLER, TYPE_VALVE)), ), - vol.Optional(CONF_LINKED_VALVE_DURATION): cv.entity_domain( + probatio.Optional(CONF_LINKED_VALVE_DURATION): cv.entity_domain( [INPUT_NUMBER_DOMAIN, NUMBER_DOMAIN] ), - vol.Optional(CONF_LINKED_VALVE_END_TIME): cv.entity_domain(SENSOR_DOMAIN), + probatio.Optional(CONF_LINKED_VALVE_END_TIME): cv.entity_domain(SENSOR_DOMAIN), } ) @@ -355,7 +363,7 @@ def validate_entity_config(values: dict) -> dict[str, dict]: """Validate config entry for CONF_ENTITY.""" if not isinstance(values, dict): - raise vol.Invalid("expected a dictionary") + raise probatio.Invalid("expected a dictionary") entities = {} for entity_id, config in values.items(): @@ -363,7 +371,9 @@ def validate_entity_config(values: dict) -> dict[str, dict]: domain, _ = split_entity_id(entity) if not isinstance(config, dict): - raise vol.Invalid(f"The configuration for {entity} must be a dictionary.") + raise probatio.Invalid( + f"The configuration for {entity} must be a dictionary." + ) if domain == ALARM_CONTROL_PANEL_DOMAIN: config = CODE_SCHEMA(config) @@ -375,7 +385,9 @@ def validate_entity_config(values: dict) -> dict[str, dict]: params = MEDIA_PLAYER_SCHEMA(feature) key = params.pop(CONF_FEATURE) if key in feature_list: - raise vol.Invalid(f"A feature can be added only once for {entity}") + raise probatio.Invalid( + f"A feature can be added only once for {entity}" + ) feature_list[key] = params config[CONF_FEATURE_LIST] = feature_list diff --git a/homeassistant/components/homekit_controller/config_flow.py b/homeassistant/components/homekit_controller/config_flow.py index af77641b0b973..ad6fd4e334ea9 100644 --- a/homeassistant/components/homekit_controller/config_flow.py +++ b/homeassistant/components/homekit_controller/config_flow.py @@ -15,7 +15,7 @@ from aiohomekit.model.categories import Categories from aiohomekit.model.status_flags import StatusFlags from aiohomekit.utils import domain_supported, domain_to_name, serialize_broadcast_key -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.core import callback @@ -158,9 +158,9 @@ async def async_step_user( return self.async_show_form( step_id="user", errors=errors, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required("device"): vol.In( + probatio.Required("device"): probatio.In( { key: ( f"{key} (" @@ -553,15 +553,17 @@ def _async_step_pair_show_form( "category": formatted_category(self.category), } - schema: VolDictType = {vol.Required("pairing_code"): vol.All(str, vol.Strip)} + schema: VolDictType = { + probatio.Required("pairing_code"): probatio.All(str, probatio.Strip) + } if errors and errors.get("pairing_code") == "insecure_setup_code": - schema[vol.Optional("allow_insecure_setup_codes")] = bool + schema[probatio.Optional("allow_insecure_setup_codes")] = bool return self.async_show_form( step_id="pair", errors=errors or {}, description_placeholders=placeholders | (description_placeholders or {}), - data_schema=vol.Schema(schema), + data_schema=probatio.Schema(schema), ) async def _entry_from_accessory(self, pairing: AbstractPairing) -> ConfigFlowResult: diff --git a/homeassistant/components/homekit_controller/device_trigger.py b/homeassistant/components/homekit_controller/device_trigger.py index eb50ccca8d18f..4205c56657a5b 100644 --- a/homeassistant/components/homekit_controller/device_trigger.py +++ b/homeassistant/components/homekit_controller/device_trigger.py @@ -7,7 +7,7 @@ from aiohomekit.model.characteristics.const import InputEventValues from aiohomekit.model.services import Service, ServicesTypes from aiohomekit.utils import clamp_enum_to_char -import voluptuous as vol +import probatio from homeassistant.components.device_automation import DEVICE_TRIGGER_BASE_SCHEMA from homeassistant.config_entries import ConfigEntry @@ -41,8 +41,8 @@ TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): vol.In(TRIGGER_TYPES), - vol.Required(CONF_SUBTYPE): vol.In(TRIGGER_SUBTYPES), + probatio.Required(CONF_TYPE): probatio.In(TRIGGER_TYPES), + probatio.Required(CONF_SUBTYPE): probatio.In(TRIGGER_SUBTYPES), } ) diff --git a/homeassistant/components/homematic/__init__.py b/homeassistant/components/homematic/__init__.py index 4c64fdb5f42d7..5b3f2f5ac1549 100644 --- a/homeassistant/components/homematic/__init__.py +++ b/homeassistant/components/homematic/__init__.py @@ -5,8 +5,8 @@ import logging from typing import Any +import probatio from pyhomematic import HMConnection -import voluptuous as vol from homeassistant.const import ( ATTR_ENTITY_ID, @@ -100,114 +100,118 @@ DEFAULT_CHANNEL = 1 -DEVICE_SCHEMA = vol.Schema( +DEVICE_SCHEMA = probatio.Schema( { - vol.Required(CONF_PLATFORM): "homematic", - vol.Required(ATTR_NAME): cv.string, - vol.Required(ATTR_ADDRESS): cv.string, - vol.Required(ATTR_INTERFACE): cv.string, - vol.Optional(ATTR_DEVICE_TYPE): cv.string, - vol.Optional(ATTR_CHANNEL, default=DEFAULT_CHANNEL): vol.Coerce(int), - vol.Optional(ATTR_PARAM): cv.string, - vol.Optional(ATTR_UNIQUE_ID): cv.string, + probatio.Required(CONF_PLATFORM): "homematic", + probatio.Required(ATTR_NAME): cv.string, + probatio.Required(ATTR_ADDRESS): cv.string, + probatio.Required(ATTR_INTERFACE): cv.string, + probatio.Optional(ATTR_DEVICE_TYPE): cv.string, + probatio.Optional(ATTR_CHANNEL, default=DEFAULT_CHANNEL): probatio.Coerce(int), + probatio.Optional(ATTR_PARAM): cv.string, + probatio.Optional(ATTR_UNIQUE_ID): cv.string, } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Optional(CONF_INTERFACES, default={}): { + probatio.Optional(CONF_INTERFACES, default={}): { cv.match_all: { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_PATH, default=DEFAULT_PATH): cv.string, - vol.Optional( + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_PATH, default=DEFAULT_PATH): cv.string, + probatio.Optional( CONF_RESOLVENAMES, default=DEFAULT_RESOLVENAMES - ): vol.In(CONF_RESOLVENAMES_OPTIONS), - vol.Optional(CONF_JSONPORT, default=DEFAULT_JSONPORT): cv.port, - vol.Optional( + ): probatio.In(CONF_RESOLVENAMES_OPTIONS), + probatio.Optional( + CONF_JSONPORT, default=DEFAULT_JSONPORT + ): cv.port, + probatio.Optional( CONF_USERNAME, default=DEFAULT_USERNAME ): cv.string, - vol.Optional( + probatio.Optional( CONF_PASSWORD, default=DEFAULT_PASSWORD ): cv.string, - vol.Optional(CONF_CALLBACK_IP): cv.string, - vol.Optional(CONF_CALLBACK_PORT): cv.port, - vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, - vol.Optional( + probatio.Optional(CONF_CALLBACK_IP): cv.string, + probatio.Optional(CONF_CALLBACK_PORT): cv.port, + probatio.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, + probatio.Optional( CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL ): cv.boolean, } }, - vol.Optional(CONF_HOSTS, default={}): { + probatio.Optional(CONF_HOSTS, default={}): { cv.match_all: { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional( + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional( CONF_USERNAME, default=DEFAULT_USERNAME ): cv.string, - vol.Optional( + probatio.Optional( CONF_PASSWORD, default=DEFAULT_PASSWORD ): cv.string, } }, - vol.Optional(CONF_LOCAL_IP, default=DEFAULT_LOCAL_IP): cv.string, - vol.Optional(CONF_LOCAL_PORT): cv.port, + probatio.Optional(CONF_LOCAL_IP, default=DEFAULT_LOCAL_IP): cv.string, + probatio.Optional(CONF_LOCAL_PORT): cv.port, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -SCHEMA_SERVICE_VIRTUALKEY = vol.Schema( +SCHEMA_SERVICE_VIRTUALKEY = probatio.Schema( { - vol.Required(ATTR_ADDRESS): vol.All(cv.string, vol.Upper), - vol.Required(ATTR_CHANNEL): vol.Coerce(int), - vol.Required(ATTR_PARAM): cv.string, - vol.Optional(ATTR_INTERFACE): cv.string, + probatio.Required(ATTR_ADDRESS): probatio.All(cv.string, probatio.Upper), + probatio.Required(ATTR_CHANNEL): probatio.Coerce(int), + probatio.Required(ATTR_PARAM): cv.string, + probatio.Optional(ATTR_INTERFACE): cv.string, } ) -SCHEMA_SERVICE_SET_VARIABLE_VALUE = vol.Schema( +SCHEMA_SERVICE_SET_VARIABLE_VALUE = probatio.Schema( { - vol.Required(ATTR_NAME): cv.string, - vol.Required(ATTR_VALUE): cv.match_all, - vol.Optional(ATTR_ENTITY_ID): cv.entity_ids, + probatio.Required(ATTR_NAME): cv.string, + probatio.Required(ATTR_VALUE): cv.match_all, + probatio.Optional(ATTR_ENTITY_ID): cv.entity_ids, } ) -SCHEMA_SERVICE_SET_DEVICE_VALUE = vol.Schema( +SCHEMA_SERVICE_SET_DEVICE_VALUE = probatio.Schema( { - vol.Required(ATTR_ADDRESS): vol.All(cv.string, vol.Upper), - vol.Required(ATTR_CHANNEL): vol.Coerce(int), - vol.Required(ATTR_PARAM): vol.All(cv.string, vol.Upper), - vol.Required(ATTR_VALUE): cv.match_all, - vol.Optional(ATTR_VALUE_TYPE): vol.In( + probatio.Required(ATTR_ADDRESS): probatio.All(cv.string, probatio.Upper), + probatio.Required(ATTR_CHANNEL): probatio.Coerce(int), + probatio.Required(ATTR_PARAM): probatio.All(cv.string, probatio.Upper), + probatio.Required(ATTR_VALUE): cv.match_all, + probatio.Optional(ATTR_VALUE_TYPE): probatio.In( ["boolean", "dateTime.iso8601", "double", "int", "string"] ), - vol.Optional(ATTR_INTERFACE): cv.string, + probatio.Optional(ATTR_INTERFACE): cv.string, } ) -SCHEMA_SERVICE_RECONNECT = vol.Schema({}) +SCHEMA_SERVICE_RECONNECT = probatio.Schema({}) -SCHEMA_SERVICE_SET_INSTALL_MODE = vol.Schema( +SCHEMA_SERVICE_SET_INSTALL_MODE = probatio.Schema( { - vol.Required(ATTR_INTERFACE): cv.string, - vol.Optional(ATTR_TIME, default=60): cv.positive_int, - vol.Optional(ATTR_MODE, default=1): vol.All(vol.Coerce(int), vol.In([1, 2])), - vol.Optional(ATTR_ADDRESS): vol.All(cv.string, vol.Upper), + probatio.Required(ATTR_INTERFACE): cv.string, + probatio.Optional(ATTR_TIME, default=60): cv.positive_int, + probatio.Optional(ATTR_MODE, default=1): probatio.All( + probatio.Coerce(int), probatio.In([1, 2]) + ), + probatio.Optional(ATTR_ADDRESS): probatio.All(cv.string, probatio.Upper), } ) -SCHEMA_SERVICE_PUT_PARAMSET = vol.Schema( +SCHEMA_SERVICE_PUT_PARAMSET = probatio.Schema( { - vol.Required(ATTR_INTERFACE): cv.string, - vol.Required(ATTR_ADDRESS): vol.All(cv.string, vol.Upper), - vol.Required(ATTR_PARAMSET_KEY): vol.All(cv.string, vol.Upper), - vol.Required(ATTR_PARAMSET): dict, - vol.Optional(ATTR_RX_MODE): vol.All(cv.string, vol.Upper), + probatio.Required(ATTR_INTERFACE): cv.string, + probatio.Required(ATTR_ADDRESS): probatio.All(cv.string, probatio.Upper), + probatio.Required(ATTR_PARAMSET_KEY): probatio.All(cv.string, probatio.Upper), + probatio.Required(ATTR_PARAMSET): dict, + probatio.Optional(ATTR_RX_MODE): probatio.All(cv.string, probatio.Upper), } ) @@ -558,7 +562,7 @@ def _get_devices(hass, discovery_type, keys, interface): try: DEVICE_SCHEMA(device_dict) device_arr.append(device_dict) - except vol.MultipleInvalid as err: + except probatio.MultipleInvalid as err: _LOGGER.error("Invalid device config: %s", str(err)) return device_arr diff --git a/homeassistant/components/homematic/notify.py b/homeassistant/components/homematic/notify.py index 0cb44ab07f957..5f1b1fedccb39 100644 --- a/homeassistant/components/homematic/notify.py +++ b/homeassistant/components/homematic/notify.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.notify import ( ATTR_DATA, @@ -25,11 +25,11 @@ PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( { - vol.Required(ATTR_ADDRESS): vol.All(cv.string, vol.Upper), - vol.Required(ATTR_CHANNEL): vol.Coerce(int), - vol.Required(ATTR_PARAM): vol.All(cv.string, vol.Upper), - vol.Required(ATTR_VALUE): cv.match_all, - vol.Optional(ATTR_INTERFACE): cv.string, + probatio.Required(ATTR_ADDRESS): probatio.All(cv.string, probatio.Upper), + probatio.Required(ATTR_CHANNEL): probatio.Coerce(int), + probatio.Required(ATTR_PARAM): probatio.All(cv.string, probatio.Upper), + probatio.Required(ATTR_VALUE): cv.match_all, + probatio.Optional(ATTR_INTERFACE): cv.string, } ) diff --git a/homeassistant/components/homematicip_cloud/__init__.py b/homeassistant/components/homematicip_cloud/__init__.py index 45656d0b8325a..aaf82b8c27fd2 100644 --- a/homeassistant/components/homematicip_cloud/__init__.py +++ b/homeassistant/components/homematicip_cloud/__init__.py @@ -2,7 +2,7 @@ import logging -import voluptuous as vol +import probatio from homeassistant import config_entries from homeassistant.const import CONF_NAME, EVENT_HOMEASSISTANT_STOP @@ -24,22 +24,24 @@ _LOGGER = logging.getLogger(__name__) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Optional(DOMAIN, default=[]): vol.All( + probatio.Optional(DOMAIN, default=[]): probatio.All( cv.ensure_list, [ - vol.Schema( + probatio.Schema( { - vol.Optional(CONF_NAME, default=""): vol.Any(cv.string), - vol.Required(CONF_ACCESSPOINT): cv.string, - vol.Required(CONF_AUTHTOKEN): cv.string, + probatio.Optional(CONF_NAME, default=""): probatio.Any( + cv.string + ), + probatio.Required(CONF_ACCESSPOINT): cv.string, + probatio.Required(CONF_AUTHTOKEN): cv.string, } ) ], ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/homematicip_cloud/config_flow.py b/homeassistant/components/homematicip_cloud/config_flow.py index dca09ab1b8a70..5f3c64918d149 100644 --- a/homeassistant/components/homematicip_cloud/config_flow.py +++ b/homeassistant/components/homematicip_cloud/config_flow.py @@ -4,7 +4,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -54,11 +54,11 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(HMIPC_HAPID): str, - vol.Optional(HMIPC_NAME): str, - vol.Optional(HMIPC_PIN): str, + probatio.Required(HMIPC_HAPID): str, + probatio.Optional(HMIPC_NAME): str, + probatio.Optional(HMIPC_PIN): str, } ), errors=errors, @@ -122,9 +122,9 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional(HMIPC_PIN): str, + probatio.Optional(HMIPC_PIN): str, } ), errors=errors, diff --git a/homeassistant/components/homematicip_cloud/services.py b/homeassistant/components/homematicip_cloud/services.py index 275afc294c1d4..71f4bf11da128 100644 --- a/homeassistant/components/homematicip_cloud/services.py +++ b/homeassistant/components/homematicip_cloud/services.py @@ -7,7 +7,7 @@ from homematicip.base.helpers import handle_config from homematicip.device import SwitchMeasuring from homematicip.group import HeatingGroup -import voluptuous as vol +import probatio from homeassistant.const import ATTR_ENTITY_ID, ATTR_TEMPERATURE from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -57,63 +57,79 @@ SERVICE_SET_HOME_COOLING_MODE, ] -SCHEMA_ACTIVATE_ECO_MODE_WITH_DURATION = vol.Schema( +SCHEMA_ACTIVATE_ECO_MODE_WITH_DURATION = probatio.Schema( { - vol.Required(ATTR_DURATION): cv.positive_int, - vol.Optional(ATTR_ACCESSPOINT_ID): vol.All(str, vol.Length(min=24, max=24)), + probatio.Required(ATTR_DURATION): cv.positive_int, + probatio.Optional(ATTR_ACCESSPOINT_ID): probatio.All( + str, probatio.Length(min=24, max=24) + ), } ) -SCHEMA_ACTIVATE_ECO_MODE_WITH_PERIOD = vol.Schema( +SCHEMA_ACTIVATE_ECO_MODE_WITH_PERIOD = probatio.Schema( { - vol.Required(ATTR_ENDTIME): cv.datetime, - vol.Optional(ATTR_ACCESSPOINT_ID): vol.All(str, vol.Length(min=24, max=24)), + probatio.Required(ATTR_ENDTIME): cv.datetime, + probatio.Optional(ATTR_ACCESSPOINT_ID): probatio.All( + str, probatio.Length(min=24, max=24) + ), } ) -SCHEMA_ACTIVATE_VACATION = vol.Schema( +SCHEMA_ACTIVATE_VACATION = probatio.Schema( { - vol.Required(ATTR_ENDTIME): cv.datetime, - vol.Required(ATTR_TEMPERATURE, default=18.0): vol.All( - vol.Coerce(float), vol.Range(min=0, max=55) + probatio.Required(ATTR_ENDTIME): cv.datetime, + probatio.Required(ATTR_TEMPERATURE, default=18.0): probatio.All( + probatio.Coerce(float), probatio.Range(min=0, max=55) + ), + probatio.Optional(ATTR_ACCESSPOINT_ID): probatio.All( + str, probatio.Length(min=24, max=24) ), - vol.Optional(ATTR_ACCESSPOINT_ID): vol.All(str, vol.Length(min=24, max=24)), } ) -SCHEMA_DEACTIVATE_ECO_MODE = vol.Schema( - {vol.Optional(ATTR_ACCESSPOINT_ID): vol.All(str, vol.Length(min=24, max=24))} +SCHEMA_DEACTIVATE_ECO_MODE = probatio.Schema( + { + probatio.Optional(ATTR_ACCESSPOINT_ID): probatio.All( + str, probatio.Length(min=24, max=24) + ) + } ) -SCHEMA_DEACTIVATE_VACATION = vol.Schema( - {vol.Optional(ATTR_ACCESSPOINT_ID): vol.All(str, vol.Length(min=24, max=24))} +SCHEMA_DEACTIVATE_VACATION = probatio.Schema( + { + probatio.Optional(ATTR_ACCESSPOINT_ID): probatio.All( + str, probatio.Length(min=24, max=24) + ) + } ) -SCHEMA_SET_ACTIVE_CLIMATE_PROFILE = vol.Schema( +SCHEMA_SET_ACTIVE_CLIMATE_PROFILE = probatio.Schema( { - vol.Required(ATTR_ENTITY_ID): comp_entity_ids, - vol.Required(ATTR_CLIMATE_PROFILE_INDEX): cv.positive_int, + probatio.Required(ATTR_ENTITY_ID): comp_entity_ids, + probatio.Required(ATTR_CLIMATE_PROFILE_INDEX): cv.positive_int, } ) -SCHEMA_DUMP_HAP_CONFIG = vol.Schema( +SCHEMA_DUMP_HAP_CONFIG = probatio.Schema( { - vol.Optional(ATTR_CONFIG_OUTPUT_PATH): cv.string, - vol.Optional( + probatio.Optional(ATTR_CONFIG_OUTPUT_PATH): cv.string, + probatio.Optional( ATTR_CONFIG_OUTPUT_FILE_PREFIX, default=DEFAULT_CONFIG_FILE_PREFIX ): cv.string, - vol.Optional(ATTR_ANONYMIZE, default=True): cv.boolean, + probatio.Optional(ATTR_ANONYMIZE, default=True): cv.boolean, } ) -SCHEMA_RESET_ENERGY_COUNTER = vol.Schema( - {vol.Required(ATTR_ENTITY_ID): comp_entity_ids} +SCHEMA_RESET_ENERGY_COUNTER = probatio.Schema( + {probatio.Required(ATTR_ENTITY_ID): comp_entity_ids} ) -SCHEMA_SET_HOME_COOLING_MODE = vol.Schema( +SCHEMA_SET_HOME_COOLING_MODE = probatio.Schema( { - vol.Optional(ATTR_COOLING, default=True): cv.boolean, - vol.Optional(ATTR_ACCESSPOINT_ID): vol.All(str, vol.Length(min=24, max=24)), + probatio.Optional(ATTR_COOLING, default=True): cv.boolean, + probatio.Optional(ATTR_ACCESSPOINT_ID): probatio.All( + str, probatio.Length(min=24, max=24) + ), } ) diff --git a/homeassistant/components/homevolt/config_flow.py b/homeassistant/components/homevolt/config_flow.py index 324a380d35c17..4a59fba653450 100644 --- a/homeassistant/components/homevolt/config_flow.py +++ b/homeassistant/components/homevolt/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from homevolt import Homevolt, HomevoltAuthenticationError, HomevoltConnectionError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PASSWORD @@ -16,15 +16,15 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, + probatio.Required(CONF_HOST): str, } ) -STEP_CREDENTIALS_DATA_SCHEMA = vol.Schema( +STEP_CREDENTIALS_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/homewizard/config_flow.py b/homeassistant/components/homewizard/config_flow.py index 627073d47b04d..acd8d9fbeb98d 100644 --- a/homeassistant/components/homewizard/config_flow.py +++ b/homeassistant/components/homewizard/config_flow.py @@ -16,7 +16,7 @@ UnsupportedError, ) from homewizard_energy.models import Device -import voluptuous as vol +import probatio from homeassistant.components import onboarding from homeassistant.config_entries import SOURCE_USER, ConfigFlow, ConfigFlowResult @@ -72,9 +72,9 @@ async def async_step_user( user_input = user_input or {} return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_IP_ADDRESS, default=user_input.get(CONF_IP_ADDRESS) ): TextSelector(), } @@ -302,9 +302,9 @@ async def async_step_reconfigure( ) return self.async_show_form( step_id="reconfigure", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_IP_ADDRESS, default=reconfigure_entry.data.get(CONF_IP_ADDRESS), ): TextSelector(), diff --git a/homeassistant/components/homeworks/__init__.py b/homeassistant/components/homeworks/__init__.py index 0a4a31f500b78..d2d6ea07fcf8c 100644 --- a/homeassistant/components/homeworks/__init__.py +++ b/homeassistant/components/homeworks/__init__.py @@ -5,6 +5,7 @@ import logging from typing import Any +import probatio from pyhomeworks import exceptions as hw_exceptions from pyhomeworks.pyhomeworks import ( HW_BUTTON_PRESSED, @@ -12,7 +13,6 @@ HW_LOGIN_INCORRECT, Homeworks, ) -import voluptuous as vol from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( @@ -47,10 +47,10 @@ CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN) -SERVICE_SEND_COMMAND_SCHEMA = vol.Schema( +SERVICE_SEND_COMMAND_SCHEMA = probatio.Schema( { - vol.Required(CONF_CONTROLLER_ID): str, - vol.Required(CONF_COMMAND): vol.All(cv.ensure_list, [str]), + probatio.Required(CONF_CONTROLLER_ID): str, + probatio.Required(CONF_COMMAND): probatio.All(cv.ensure_list, [str]), } ) diff --git a/homeassistant/components/homeworks/config_flow.py b/homeassistant/components/homeworks/config_flow.py index 4ba2fda7c3f06..ab99c8b94703b 100644 --- a/homeassistant/components/homeworks/config_flow.py +++ b/homeassistant/components/homeworks/config_flow.py @@ -5,9 +5,9 @@ import logging from typing import Any, override +import probatio from pyhomeworks import exceptions as hw_exceptions from pyhomeworks.pyhomeworks import Homeworks -import voluptuous as vol from homeassistant.components.binary_sensor import DOMAIN as BINARY_SENSOR_DOMAIN from homeassistant.components.button import DOMAIN as BUTTON_DOMAIN @@ -61,22 +61,22 @@ DEFAULT_FADE_RATE = 1.0 CONTROLLER_EDIT = { - vol.Required(CONF_HOST): selector.TextSelector(), - vol.Required(CONF_PORT): selector.NumberSelector( + probatio.Required(CONF_HOST): selector.TextSelector(), + probatio.Required(CONF_PORT): selector.NumberSelector( selector.NumberSelectorConfig( min=1, max=65535, mode=selector.NumberSelectorMode.BOX, ) ), - vol.Optional(CONF_USERNAME): selector.TextSelector(), - vol.Optional(CONF_PASSWORD): selector.TextSelector( + probatio.Optional(CONF_USERNAME): selector.TextSelector(), + probatio.Optional(CONF_PASSWORD): selector.TextSelector( selector.TextSelectorConfig(type=selector.TextSelectorType.PASSWORD) ), } LIGHT_EDIT: VolDictType = { - vol.Optional(CONF_RATE, default=DEFAULT_FADE_RATE): selector.NumberSelector( + probatio.Optional(CONF_RATE, default=DEFAULT_FADE_RATE): selector.NumberSelector( selector.NumberSelectorConfig( min=0, max=20, @@ -87,8 +87,8 @@ } BUTTON_EDIT: VolDictType = { - vol.Optional(CONF_LED, default=False): selector.BooleanSelector(), - vol.Optional(CONF_RELEASE_DELAY, default=0): selector.NumberSelector( + probatio.Optional(CONF_LED, default=False): selector.BooleanSelector(), + probatio.Optional(CONF_RELEASE_DELAY, default=0): selector.NumberSelector( selector.NumberSelectorConfig( min=0, max=5, @@ -179,7 +179,7 @@ def _validate_address(handler: SchemaCommonFlowHandler, addr: str) -> None: """Validate address.""" try: validate_addr(addr) - except vol.Invalid as err: + except probatio.Invalid as err: raise SchemaFlowError("invalid_addr") from err for _key in (CONF_DIMMERS, CONF_KEYPADS): @@ -241,14 +241,14 @@ async def validate_add_light( return {} -async def get_select_button_schema(handler: SchemaCommonFlowHandler) -> vol.Schema: +async def get_select_button_schema(handler: SchemaCommonFlowHandler) -> probatio.Schema: """Return schema for selecting a button.""" keypad = handler.flow_state["_idx"] buttons: list[dict[str, Any]] = handler.options[CONF_KEYPADS][keypad][CONF_BUTTONS] - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_INDEX): vol.In( + probatio.Required(CONF_INDEX): probatio.In( { str(index): f"{config[CONF_NAME]} ({config[CONF_NUMBER]})" for index, config in enumerate(buttons) @@ -258,11 +258,11 @@ async def get_select_button_schema(handler: SchemaCommonFlowHandler) -> vol.Sche ) -async def get_select_keypad_schema(handler: SchemaCommonFlowHandler) -> vol.Schema: +async def get_select_keypad_schema(handler: SchemaCommonFlowHandler) -> probatio.Schema: """Return schema for selecting a keypad.""" - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_INDEX): vol.In( + probatio.Required(CONF_INDEX): probatio.In( { str(index): f"{config[CONF_NAME]} ({config[CONF_ADDR]})" for index, config in enumerate(handler.options[CONF_KEYPADS]) @@ -272,11 +272,11 @@ async def get_select_keypad_schema(handler: SchemaCommonFlowHandler) -> vol.Sche ) -async def get_select_light_schema(handler: SchemaCommonFlowHandler) -> vol.Schema: +async def get_select_light_schema(handler: SchemaCommonFlowHandler) -> probatio.Schema: """Return schema for selecting a light.""" - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_INDEX): vol.In( + probatio.Required(CONF_INDEX): probatio.In( { str(index): f"{config[CONF_NAME]} ({config[CONF_ADDR]})" for index, config in enumerate(handler.options[CONF_DIMMERS]) @@ -343,13 +343,13 @@ async def validate_light_edit( return {} -async def get_remove_button_schema(handler: SchemaCommonFlowHandler) -> vol.Schema: +async def get_remove_button_schema(handler: SchemaCommonFlowHandler) -> probatio.Schema: """Return schema for button removal.""" keypad_idx: int = handler.flow_state["_idx"] buttons: list[dict] = handler.options[CONF_KEYPADS][keypad_idx][CONF_BUTTONS] - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_INDEX): cv.multi_select( + probatio.Required(CONF_INDEX): cv.multi_select( { str(index): f"{config[CONF_NAME]} ({config[CONF_NUMBER]})" for index, config in enumerate(buttons) @@ -361,11 +361,11 @@ async def get_remove_button_schema(handler: SchemaCommonFlowHandler) -> vol.Sche async def get_remove_keypad_light_schema( handler: SchemaCommonFlowHandler, *, key: str -) -> vol.Schema: +) -> probatio.Schema: """Return schema for keypad or light removal.""" - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_INDEX): cv.multi_select( + probatio.Required(CONF_INDEX): cv.multi_select( { str(index): f"{config[CONF_NAME]} ({config[CONF_ADDR]})" for index, config in enumerate(handler.options[key]) @@ -435,32 +435,32 @@ async def validate_remove_keypad_light( return {} -DATA_SCHEMA_ADD_CONTROLLER = vol.Schema( +DATA_SCHEMA_ADD_CONTROLLER = probatio.Schema( { - vol.Required( + probatio.Required( CONF_NAME, description={"suggested_value": "Lutron Homeworks"} ): selector.TextSelector(), **CONTROLLER_EDIT, } ) -DATA_SCHEMA_EDIT_CONTROLLER = vol.Schema(CONTROLLER_EDIT) -DATA_SCHEMA_ADD_LIGHT = vol.Schema( +DATA_SCHEMA_EDIT_CONTROLLER = probatio.Schema(CONTROLLER_EDIT) +DATA_SCHEMA_ADD_LIGHT = probatio.Schema( { - vol.Optional(CONF_NAME, default=DEFAULT_LIGHT_NAME): TextSelector(), - vol.Required(CONF_ADDR): TextSelector(), + probatio.Optional(CONF_NAME, default=DEFAULT_LIGHT_NAME): TextSelector(), + probatio.Required(CONF_ADDR): TextSelector(), **LIGHT_EDIT, } ) -DATA_SCHEMA_ADD_KEYPAD = vol.Schema( +DATA_SCHEMA_ADD_KEYPAD = probatio.Schema( { - vol.Optional(CONF_NAME, default=DEFAULT_KEYPAD_NAME): TextSelector(), - vol.Required(CONF_ADDR): TextSelector(), + probatio.Optional(CONF_NAME, default=DEFAULT_KEYPAD_NAME): TextSelector(), + probatio.Required(CONF_ADDR): TextSelector(), } ) -DATA_SCHEMA_ADD_BUTTON = vol.Schema( +DATA_SCHEMA_ADD_BUTTON = probatio.Schema( { - vol.Optional(CONF_NAME, default=DEFAULT_BUTTON_NAME): TextSelector(), - vol.Required(CONF_NUMBER): selector.NumberSelector( + probatio.Optional(CONF_NAME, default=DEFAULT_BUTTON_NAME): TextSelector(), + probatio.Required(CONF_NUMBER): selector.NumberSelector( selector.NumberSelectorConfig( min=1, max=24, @@ -471,8 +471,8 @@ async def validate_remove_keypad_light( **BUTTON_EDIT, } ) -DATA_SCHEMA_EDIT_BUTTON = vol.Schema(BUTTON_EDIT) -DATA_SCHEMA_EDIT_LIGHT = vol.Schema(LIGHT_EDIT) +DATA_SCHEMA_EDIT_BUTTON = probatio.Schema(BUTTON_EDIT) +DATA_SCHEMA_EDIT_LIGHT = probatio.Schema(LIGHT_EDIT) OPTIONS_FLOW = { "init": SchemaFlowMenuStep( diff --git a/homeassistant/components/honeywell/config_flow.py b/homeassistant/components/honeywell/config_flow.py index 5f48b6baa9b84..5caceec2f9f64 100644 --- a/homeassistant/components/honeywell/config_flow.py +++ b/homeassistant/components/honeywell/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override import aiosomecomfort -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -24,10 +24,10 @@ DOMAIN, ) -REAUTH_SCHEMA = vol.Schema( +REAUTH_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) @@ -102,12 +102,12 @@ async def async_step_user(self, user_input=None) -> ConfigFlowResult: ) data_schema = { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } return self.async_show_form( step_id="user", - data_schema=vol.Schema(data_schema), + data_schema=probatio.Schema(data_schema), errors=errors, ) @@ -146,15 +146,15 @@ async def async_step_init(self, user_input=None) -> ConfigFlowResult: return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_COOL_AWAY_TEMPERATURE, default=self.config_entry.options.get( CONF_COOL_AWAY_TEMPERATURE, DEFAULT_COOL_AWAY_TEMPERATURE ), ): int, - vol.Required( + probatio.Required( CONF_HEAT_AWAY_TEMPERATURE, default=self.config_entry.options.get( CONF_HEAT_AWAY_TEMPERATURE, DEFAULT_HEAT_AWAY_TEMPERATURE diff --git a/homeassistant/components/honeywell_string_lights/config_flow.py b/homeassistant/components/honeywell_string_lights/config_flow.py index b0c8535892bdd..a71eff1079872 100644 --- a/homeassistant/components/honeywell_string_lights/config_flow.py +++ b/homeassistant/components/honeywell_string_lights/config_flow.py @@ -2,9 +2,9 @@ from typing import Any, override +import probatio from rf_protocols import RadioFrequencyCommand from rf_protocols.codes.honeywell.string_lights import CODES -import voluptuous as vol from homeassistant.components.radio_frequency import async_get_transmitters from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -56,9 +56,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_TRANSMITTER): selector.EntitySelector( + probatio.Required(CONF_TRANSMITTER): selector.EntitySelector( selector.EntitySelectorConfig(include_entities=transmitters), ), } diff --git a/homeassistant/components/horizon/media_player.py b/homeassistant/components/horizon/media_player.py index a367f8ed16a19..8054f2ad93de3 100644 --- a/homeassistant/components/horizon/media_player.py +++ b/homeassistant/components/horizon/media_player.py @@ -6,7 +6,7 @@ from horimote import Client, keys from horimote.exceptions import AuthenticationError -import voluptuous as vol +import probatio from homeassistant import util from homeassistant.components.media_player import ( @@ -34,9 +34,9 @@ PLATFORM_SCHEMA = MEDIA_PLAYER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, } ) diff --git a/homeassistant/components/hortimax/config_flow.py b/homeassistant/components/hortimax/config_flow.py index 6ec55721e6f83..9b43ffb9fec1b 100644 --- a/homeassistant/components/hortimax/config_flow.py +++ b/homeassistant/components/hortimax/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from aiohortos import HortosAuthenticationError, HortosClient, HortosError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY @@ -16,9 +16,9 @@ from .const import DOMAIN, LOGGER -USER_SCHEMA = vol.Schema( +USER_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_KEY): TextSelector( + probatio.Required(CONF_API_KEY): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD, autocomplete="api_key") ), } diff --git a/homeassistant/components/hotspring/config_flow.py b/homeassistant/components/hotspring/config_flow.py index 9967c88f65a2c..3c66c098c4d5c 100644 --- a/homeassistant/components/hotspring/config_flow.py +++ b/homeassistant/components/hotspring/config_flow.py @@ -10,7 +10,7 @@ HotSpringSNADetectedError, Spa, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_RECONFIGURE, @@ -25,9 +25,9 @@ from .const import DOMAIN -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): TextSelector(), + probatio.Required(CONF_HOST): TextSelector(), } ) diff --git a/homeassistant/components/hp_ilo/sensor.py b/homeassistant/components/hp_ilo/sensor.py index 7068664713a70..5d0fab1104610 100644 --- a/homeassistant/components/hp_ilo/sensor.py +++ b/homeassistant/components/hp_ilo/sensor.py @@ -4,7 +4,7 @@ import logging import hpilo -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -50,26 +50,26 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_MONITORED_VARIABLES, default=[]): vol.All( + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_MONITORED_VARIABLES, default=[]): probatio.All( cv.ensure_list, [ - vol.Schema( + probatio.Schema( { - vol.Required(CONF_NAME): cv.string, - vol.Required(CONF_SENSOR_TYPE): vol.All( - cv.string, vol.In(SENSOR_TYPES) + probatio.Required(CONF_NAME): cv.string, + probatio.Required(CONF_SENSOR_TYPE): probatio.All( + cv.string, probatio.In(SENSOR_TYPES) ), - vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, + probatio.Optional(CONF_VALUE_TEMPLATE): cv.template, } ) ], ), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, } ) diff --git a/homeassistant/components/hr_energy_qube/config_flow.py b/homeassistant/components/hr_energy_qube/config_flow.py index 845351e225fd4..13075ad9c3590 100644 --- a/homeassistant/components/hr_energy_qube/config_flow.py +++ b/homeassistant/components/hr_energy_qube/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from python_qube_heatpump import QubeClient -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PORT @@ -52,9 +52,9 @@ async def async_step_user( }, ) - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required(CONF_HOST): str, + probatio.Required(CONF_HOST): str, } ) return self.async_show_form(step_id="user", data_schema=schema, errors=errors) diff --git a/homeassistant/components/html5/config_flow.py b/homeassistant/components/html5/config_flow.py index 0a8bab9643e35..989b7ba12f90b 100644 --- a/homeassistant/components/html5/config_flow.py +++ b/homeassistant/components/html5/config_flow.py @@ -6,9 +6,9 @@ from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives import serialization from cryptography.hazmat.primitives.asymmetric import ec +import probatio from py_vapid import Vapid from py_vapid.utils import b64urlencode -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_NAME @@ -80,12 +80,12 @@ async def async_step_user( user_input = {} return self.async_show_form( - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( ATTR_VAPID_EMAIL, default=user_input.get(ATTR_VAPID_EMAIL, "") ): str, - vol.Optional(ATTR_VAPID_PRV_KEY): str, + probatio.Optional(ATTR_VAPID_PRV_KEY): str, } ), errors=errors, diff --git a/homeassistant/components/html5/http.py b/homeassistant/components/html5/http.py index e24a1b9213e90..953d73c8e2ac7 100644 --- a/homeassistant/components/html5/http.py +++ b/homeassistant/components/html5/http.py @@ -10,8 +10,8 @@ from aiohttp.hdrs import AUTHORIZATION import jwt from jwt.warnings import InsecureKeyLengthWarning -import voluptuous as vol -from voluptuous.humanize import humanize_error +import probatio +from probatio.humanize import humanize_error from homeassistant.components.http import KEY_HASS, HomeAssistantView from homeassistant.components.notify import ATTR_DATA, ATTR_TARGET @@ -39,42 +39,42 @@ NOTIFY_CALLBACK_EVENT = "html5_notification" -KEYS_SCHEMA = vol.All( +KEYS_SCHEMA = probatio.All( dict, - vol.Schema( + probatio.Schema( { - vol.Required(ATTR_AUTH): cv.string, - vol.Required(ATTR_P256DH): cv.string, + probatio.Required(ATTR_AUTH): cv.string, + probatio.Required(ATTR_P256DH): cv.string, } ), ) -SUBSCRIPTION_SCHEMA = vol.All( +SUBSCRIPTION_SCHEMA = probatio.All( dict, - vol.Schema( + probatio.Schema( { - vol.Required(ATTR_ENDPOINT): vol.Url(), - vol.Required(ATTR_KEYS): KEYS_SCHEMA, - vol.Optional(ATTR_EXPIRATIONTIME): vol.Any(None, cv.positive_int), + probatio.Required(ATTR_ENDPOINT): probatio.Url(), + probatio.Required(ATTR_KEYS): KEYS_SCHEMA, + probatio.Optional(ATTR_EXPIRATIONTIME): probatio.Any(None, cv.positive_int), } ), ) -REGISTER_SCHEMA = vol.Schema( +REGISTER_SCHEMA = probatio.Schema( { - vol.Required(ATTR_SUBSCRIPTION): SUBSCRIPTION_SCHEMA, - vol.Required(ATTR_BROWSER): vol.In(["chrome", "firefox"]), - vol.Optional(ATTR_NAME): cv.string, + probatio.Required(ATTR_SUBSCRIPTION): SUBSCRIPTION_SCHEMA, + probatio.Required(ATTR_BROWSER): probatio.In(["chrome", "firefox"]), + probatio.Optional(ATTR_NAME): cv.string, } ) -CALLBACK_EVENT_PAYLOAD_SCHEMA = vol.Schema( +CALLBACK_EVENT_PAYLOAD_SCHEMA = probatio.Schema( { - vol.Required(ATTR_TAG): cv.string, - vol.Required(ATTR_TYPE): vol.In(["received", "clicked", "closed"]), - vol.Required(ATTR_TARGET): cv.string, - vol.Optional(ATTR_ACTION): cv.string, - vol.Optional(ATTR_DATA): dict, + probatio.Required(ATTR_TAG): cv.string, + probatio.Required(ATTR_TYPE): probatio.In(["received", "clicked", "closed"]), + probatio.Required(ATTR_TARGET): cv.string, + probatio.Optional(ATTR_ACTION): cv.string, + probatio.Optional(ATTR_DATA): dict, } ) @@ -109,7 +109,7 @@ async def post(self, request: web.Request) -> web.Response: return self.json_message("Invalid JSON", HTTPStatus.BAD_REQUEST) try: data = cast(Registration, REGISTER_SCHEMA(data)) - except vol.Invalid as ex: + except probatio.Invalid as ex: return self.json_message(humanize_error(data, ex), HTTPStatus.BAD_REQUEST) devname = data.get(ATTR_NAME) @@ -280,7 +280,7 @@ async def post(self, request: web.Request) -> web.Response: try: event_payload = CALLBACK_EVENT_PAYLOAD_SCHEMA(event_payload) - except vol.Invalid as ex: + except probatio.Invalid as ex: _LOGGER.warning( "Callback event payload is not valid: %s", humanize_error(event_payload, ex), diff --git a/homeassistant/components/html5/notify.py b/homeassistant/components/html5/notify.py index 3b6148af46e73..a172e77e36559 100644 --- a/homeassistant/components/html5/notify.py +++ b/homeassistant/components/html5/notify.py @@ -14,9 +14,9 @@ from aiohttp import ClientError, ClientResponse, ClientSession import jwt from jwt.warnings import InsecureKeyLengthWarning +import probatio from py_vapid import Vapid from pywebpush import WebPusher, WebPushException, webpush_async -import voluptuous as vol from homeassistant.components import websocket_api from homeassistant.components.notify import ( @@ -73,7 +73,7 @@ WS_TYPE_APPKEY = "notify/html5/appkey" SCHEMA_WS_APPKEY = websocket_api.BASE_COMMAND_MESSAGE_SCHEMA.extend( - {vol.Required("type"): WS_TYPE_APPKEY} + {probatio.Required("type"): WS_TYPE_APPKEY} ) # The number of days after the moment a notification is sent that a JWT @@ -82,10 +82,10 @@ VAPID_CLAIM_VALID_HOURS = 12 -DISMISS_SERVICE_SCHEMA = vol.Schema( +DISMISS_SERVICE_SCHEMA = probatio.Schema( { - vol.Optional(ATTR_TARGET): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(ATTR_DATA): dict, + probatio.Optional(ATTR_TARGET): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(ATTR_DATA): dict, } ) @@ -266,7 +266,7 @@ async def _push_message(self, payload: dict[str, Any], **kwargs: Any) -> None: info = self.registrations.get(target) try: info = cast(Registration, REGISTER_SCHEMA(info)) - except vol.Invalid: + except probatio.Invalid: _LOGGER.error( "%s is not a valid HTML5 push notification target", target ) diff --git a/homeassistant/components/html5/services.py b/homeassistant/components/html5/services.py index b2f196e017a08..60114efb92610 100644 --- a/homeassistant/components/html5/services.py +++ b/homeassistant/components/html5/services.py @@ -1,6 +1,6 @@ """Service registration for HTML5 integration.""" -import voluptuous as vol +import probatio from homeassistant.components.notify import ( ATTR_DATA, @@ -36,40 +36,42 @@ SERVICE_SEND_MESSAGE_SCHEMA = cv.make_entity_service_schema( { - vol.Required(ATTR_TITLE, default=ATTR_TITLE_DEFAULT): cv.string, - vol.Optional(ATTR_MESSAGE): cv.string, - vol.Optional(ATTR_DIR): vol.In({"auto", "ltr", "rtl"}), - vol.Optional(ATTR_ICON): cv.string, - vol.Optional(ATTR_BADGE): cv.string, - vol.Optional(ATTR_IMAGE): cv.string, - vol.Optional(ATTR_TAG): cv.string, - vol.Exclusive(ATTR_VIBRATE, "silent_xor_vibrate"): vol.All( + probatio.Required(ATTR_TITLE, default=ATTR_TITLE_DEFAULT): cv.string, + probatio.Optional(ATTR_MESSAGE): cv.string, + probatio.Optional(ATTR_DIR): probatio.In({"auto", "ltr", "rtl"}), + probatio.Optional(ATTR_ICON): cv.string, + probatio.Optional(ATTR_BADGE): cv.string, + probatio.Optional(ATTR_IMAGE): cv.string, + probatio.Optional(ATTR_TAG): cv.string, + probatio.Exclusive(ATTR_VIBRATE, "silent_xor_vibrate"): probatio.All( cv.ensure_list, - [vol.All(vol.Coerce(int), vol.Range(min=0))], + [probatio.All(probatio.Coerce(int), probatio.Range(min=0))], ), - vol.Optional(ATTR_TIMESTAMP): cv.datetime, - vol.Optional(ATTR_LANG): cv.language, - vol.Exclusive(ATTR_SILENT, "silent_xor_vibrate"): cv.boolean, - vol.Optional(ATTR_RENOTIFY): cv.boolean, - vol.Optional(ATTR_REQUIRE_INTERACTION): cv.boolean, - vol.Optional(ATTR_URGENCY): vol.In({"normal", "high", "low"}), - vol.Optional(ATTR_TTL): vol.All(cv.time_period, cv.positive_timedelta), - vol.Optional(ATTR_ACTIONS): vol.All( + probatio.Optional(ATTR_TIMESTAMP): cv.datetime, + probatio.Optional(ATTR_LANG): cv.language, + probatio.Exclusive(ATTR_SILENT, "silent_xor_vibrate"): cv.boolean, + probatio.Optional(ATTR_RENOTIFY): cv.boolean, + probatio.Optional(ATTR_REQUIRE_INTERACTION): cv.boolean, + probatio.Optional(ATTR_URGENCY): probatio.In({"normal", "high", "low"}), + probatio.Optional(ATTR_TTL): probatio.All( + cv.time_period, cv.positive_timedelta + ), + probatio.Optional(ATTR_ACTIONS): probatio.All( cv.ensure_list, [ { - vol.Required(ATTR_ACTION): cv.string, - vol.Required(ATTR_TITLE): cv.string, - vol.Optional(ATTR_ICON): cv.string, + probatio.Required(ATTR_ACTION): cv.string, + probatio.Required(ATTR_TITLE): cv.string, + probatio.Optional(ATTR_ICON): cv.string, } ], ), - vol.Optional(ATTR_DATA): dict, + probatio.Optional(ATTR_DATA): dict, } ) SERVICE_DISMISS_MESSAGE_SCHEMA = cv.make_entity_service_schema( - {vol.Optional(ATTR_TAG): cv.string} + {probatio.Optional(ATTR_TAG): cv.string} ) diff --git a/homeassistant/components/http/__init__.py b/homeassistant/components/http/__init__.py index 2cfa6379a0f38..cbc45ee5ad0a5 100644 --- a/homeassistant/components/http/__init__.py +++ b/homeassistant/components/http/__init__.py @@ -6,7 +6,7 @@ from pathlib import Path from typing import Any, Final -import voluptuous as vol +import probatio from homeassistant.components.network import async_get_source_ip from homeassistant.const import ( @@ -70,41 +70,43 @@ DEFAULT_DEVELOPMENT: Final = "0" -HTTP_SCHEMA: Final = vol.All( +HTTP_SCHEMA: Final = probatio.All( cv.deprecated(CONF_BASE_URL), - vol.Schema( + probatio.Schema( { - vol.Optional(CONF_SERVER_HOST): vol.All( - cv.ensure_list, vol.Length(min=1), [cv.string] + probatio.Optional(CONF_SERVER_HOST): probatio.All( + cv.ensure_list, probatio.Length(min=1), [cv.string] ), # No default: the YAML migration needs to tell an explicitly # configured port apart from an omitted one, which it keeps on the # previous default port instead of the Supervisor default. - vol.Optional(CONF_SERVER_PORT): cv.port, - vol.Optional(CONF_BASE_URL): cv.string, - vol.Optional(CONF_SSL_CERTIFICATE): cv.isfile, - vol.Optional(CONF_SSL_PEER_CERTIFICATE): cv.isfile, - vol.Optional(CONF_SSL_KEY): cv.isfile, - vol.Optional(CONF_CORS_ORIGINS, default=DEFAULT_CORS): vol.All( + probatio.Optional(CONF_SERVER_PORT): cv.port, + probatio.Optional(CONF_BASE_URL): cv.string, + probatio.Optional(CONF_SSL_CERTIFICATE): cv.isfile, + probatio.Optional(CONF_SSL_PEER_CERTIFICATE): cv.isfile, + probatio.Optional(CONF_SSL_KEY): cv.isfile, + probatio.Optional(CONF_CORS_ORIGINS, default=DEFAULT_CORS): probatio.All( cv.ensure_list, [cv.string] ), - vol.Inclusive(CONF_USE_X_FORWARDED_FOR, "proxy"): cv.boolean, - vol.Inclusive(CONF_TRUSTED_PROXIES, "proxy"): vol.All( + probatio.Inclusive(CONF_USE_X_FORWARDED_FOR, "proxy"): cv.boolean, + probatio.Inclusive(CONF_TRUSTED_PROXIES, "proxy"): probatio.All( cv.ensure_list, [ip_network] ), - vol.Optional( + probatio.Optional( CONF_LOGIN_ATTEMPTS_THRESHOLD, default=NO_LOGIN_ATTEMPT_THRESHOLD - ): vol.Any(cv.positive_int, NO_LOGIN_ATTEMPT_THRESHOLD), - vol.Optional(CONF_IP_BAN_ENABLED, default=True): cv.boolean, - vol.Optional(CONF_SSL_PROFILE, default=SSL_MODERN): vol.In( + ): probatio.Any(cv.positive_int, NO_LOGIN_ATTEMPT_THRESHOLD), + probatio.Optional(CONF_IP_BAN_ENABLED, default=True): cv.boolean, + probatio.Optional(CONF_SSL_PROFILE, default=SSL_MODERN): probatio.In( [SSL_INTERMEDIATE, SSL_MODERN] ), - vol.Optional(CONF_USE_X_FRAME_OPTIONS, default=True): cv.boolean, + probatio.Optional(CONF_USE_X_FRAME_OPTIONS, default=True): cv.boolean, } ), ) -CONFIG_SCHEMA: Final = vol.Schema({DOMAIN: HTTP_SCHEMA}, extra=vol.ALLOW_EXTRA) +CONFIG_SCHEMA: Final = probatio.Schema( + {DOMAIN: HTTP_SCHEMA}, extra=probatio.ALLOW_EXTRA +) class ApiConfig: diff --git a/homeassistant/components/http/ban.py b/homeassistant/components/http/ban.py index d85ded19b016e..c9f6cab2c8884 100644 --- a/homeassistant/components/http/ban.py +++ b/homeassistant/components/http/ban.py @@ -19,7 +19,7 @@ middleware, ) from aiohttp.web_exceptions import HTTPForbidden, HTTPUnauthorized -import voluptuous as vol +import probatio from homeassistant.config import load_yaml_config_file from homeassistant.core import HomeAssistant, callback @@ -45,8 +45,8 @@ IP_BANS_FILE: Final = "ip_bans.yaml" ATTR_BANNED_AT: Final = "banned_at" -SCHEMA_IP_BAN_ENTRY: Final = vol.Schema( - {vol.Optional(ATTR_BANNED_AT, default=None): vol.Any(None, cv.datetime)} +SCHEMA_IP_BAN_ENTRY: Final = probatio.Schema( + {probatio.Optional(ATTR_BANNED_AT, default=None): probatio.Any(None, cv.datetime)} ) @@ -232,7 +232,7 @@ async def async_load(self) -> None: ip_info = SCHEMA_IP_BAN_ENTRY(ip_info) ban = IpBan(ip_ban, ip_info["banned_at"]) ip_bans_lookup[ban.ip_address] = ban - except vol.Invalid as err: + except probatio.Invalid as err: _LOGGER.error("Failed to load IP ban %s: %s", ip_info, err) continue except ValueError: diff --git a/homeassistant/components/http/config.py b/homeassistant/components/http/config.py index 03f350883c801..2b35afec5ae12 100644 --- a/homeassistant/components/http/config.py +++ b/homeassistant/components/http/config.py @@ -8,7 +8,7 @@ import os from typing import Any, Final, TypedDict, cast, override -import voluptuous as vol +import probatio from homeassistant.const import SERVER_PORT from homeassistant.core import CALLBACK_TYPE, HassJob, HomeAssistant, callback @@ -60,7 +60,7 @@ def default_server_port() -> int: return default try: return cast(int, cv.port(env_value)) - except vol.Invalid: + except probatio.Invalid: _LOGGER.warning( "Invalid port %r in %s environment variable; falling back to %s", env_value, @@ -135,31 +135,33 @@ def _ip_network_str(value: Any) -> str: return str(ip_network(value)) -HTTP_STORAGE_SCHEMA: Final = vol.Schema( +HTTP_STORAGE_SCHEMA: Final = probatio.Schema( { # YAML used to allow base_url (deprecated); strip it on the way in so # the stored config never contains it. - vol.Remove(CONF_BASE_URL): object, - vol.Optional(CONF_SERVER_HOST): vol.All( - cv.ensure_list, vol.Length(min=1), [cv.string] + probatio.Remove(CONF_BASE_URL): object, + probatio.Optional(CONF_SERVER_HOST): probatio.All( + cv.ensure_list, probatio.Length(min=1), [cv.string] ), - vol.Optional(CONF_SERVER_PORT, default=default_server_port): cv.port, - vol.Optional(CONF_SSL_CERTIFICATE): cv.isfile, - vol.Optional(CONF_SSL_PEER_CERTIFICATE): cv.isfile, - vol.Optional(CONF_SSL_KEY): cv.isfile, - vol.Optional(CONF_CORS_ORIGINS, default=DEFAULT_CORS): vol.All( + probatio.Optional(CONF_SERVER_PORT, default=default_server_port): cv.port, + probatio.Optional(CONF_SSL_CERTIFICATE): cv.isfile, + probatio.Optional(CONF_SSL_PEER_CERTIFICATE): cv.isfile, + probatio.Optional(CONF_SSL_KEY): cv.isfile, + probatio.Optional(CONF_CORS_ORIGINS, default=DEFAULT_CORS): probatio.All( cv.ensure_list, [cv.string] ), - vol.Optional(CONF_USE_X_FORWARDED_FOR): cv.boolean, - vol.Optional(CONF_TRUSTED_PROXIES): vol.All(cv.ensure_list, [_ip_network_str]), - vol.Optional( + probatio.Optional(CONF_USE_X_FORWARDED_FOR): cv.boolean, + probatio.Optional(CONF_TRUSTED_PROXIES): probatio.All( + cv.ensure_list, [_ip_network_str] + ), + probatio.Optional( CONF_LOGIN_ATTEMPTS_THRESHOLD, default=NO_LOGIN_ATTEMPT_THRESHOLD - ): vol.Any(cv.positive_int, NO_LOGIN_ATTEMPT_THRESHOLD), - vol.Optional(CONF_IP_BAN_ENABLED, default=True): cv.boolean, - vol.Optional(CONF_SSL_PROFILE, default=SSL_MODERN): vol.In( + ): probatio.Any(cv.positive_int, NO_LOGIN_ATTEMPT_THRESHOLD), + probatio.Optional(CONF_IP_BAN_ENABLED, default=True): cv.boolean, + probatio.Optional(CONF_SSL_PROFILE, default=SSL_MODERN): probatio.In( [SSL_INTERMEDIATE, SSL_MODERN] ), - vol.Optional(CONF_USE_X_FRAME_OPTIONS, default=True): cv.boolean, + probatio.Optional(CONF_USE_X_FRAME_OPTIONS, default=True): cv.boolean, } ) _DEFAULT_CONFIG: Final[ConfData] = ConfData( @@ -669,7 +671,7 @@ async def _async_migrate_func( # load step can rely on direct key access. try: stable = HTTP_STORAGE_SCHEMA(old_data) - except vol.Invalid: + except probatio.Invalid: _LOGGER.warning( "Discarding invalid v1 HTTP config during migration; " "falling back to defaults" diff --git a/homeassistant/components/http/data_validator.py b/homeassistant/components/http/data_validator.py index b2cc982b747b6..20c41b015e05f 100644 --- a/homeassistant/components/http/data_validator.py +++ b/homeassistant/components/http/data_validator.py @@ -7,7 +7,7 @@ from typing import Any, Concatenate from aiohttp import web -import voluptuous as vol +import probatio from homeassistant.helpers.typing import VolDictType @@ -19,18 +19,18 @@ class RequestDataValidator: """Decorator that will validate the incoming data. - Takes in a voluptuous schema and adds 'data' as + Takes in a probatio schema and adds 'data' as keyword argument to the function call. Will return a 400 if no JSON provided or doesn't match schema. """ def __init__( - self, schema: VolDictType | vol.Schema, allow_empty: bool = False + self, schema: VolDictType | probatio.Schema, allow_empty: bool = False ) -> None: """Initialize the decorator.""" if isinstance(schema, dict): - schema = vol.Schema(schema) + schema = probatio.Schema(schema) self._schema = schema self._allow_empty = allow_empty @@ -63,7 +63,7 @@ async def wrapper( try: data: dict[str, Any] = self._schema(raw_data) - except vol.Invalid as err: + except probatio.Invalid as err: _LOGGER.error("Data does not match schema: %s", err) return view.json_message( f"Message format incorrect: {err}", HTTPStatus.BAD_REQUEST diff --git a/homeassistant/components/http/websocket_api.py b/homeassistant/components/http/websocket_api.py index 5a6f8559feee1..7bc9d62584665 100644 --- a/homeassistant/components/http/websocket_api.py +++ b/homeassistant/components/http/websocket_api.py @@ -2,7 +2,7 @@ from typing import Any, Final -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.components.homeassistant import ( @@ -32,7 +32,7 @@ def _validate_trusted_proxies(config: ConfData) -> ConfData: breaks the very setup it is meant to enable. """ if config.get(CONF_USE_X_FORWARDED_FOR) and not config.get(CONF_TRUSTED_PROXIES): - raise vol.Invalid( + raise probatio.Invalid( "at least one trusted proxy is required to use X-Forwarded-For", path=[CONF_TRUSTED_PROXIES], ) @@ -49,7 +49,7 @@ def async_register_websocket_commands(hass: HomeAssistant) -> None: @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required("type"): "http/config"}) +@websocket_api.websocket_command({probatio.Required("type"): "http/config"}) @websocket_api.async_response async def websocket_get_config( hass: HomeAssistant, @@ -83,9 +83,9 @@ async def websocket_get_config( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "http/config/configure", - vol.Required(ATTR_CONFIG): vol.Any( - None, vol.All(HTTP_STORAGE_SCHEMA, _validate_trusted_proxies) + probatio.Required("type"): "http/config/configure", + probatio.Required(ATTR_CONFIG): probatio.Any( + None, probatio.All(HTTP_STORAGE_SCHEMA, _validate_trusted_proxies) ), } ) @@ -140,7 +140,7 @@ async def websocket_set_config( @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required("type"): "http/config/promote"}) +@websocket_api.websocket_command({probatio.Required("type"): "http/config/promote"}) @websocket_api.async_response async def websocket_promote_config( hass: HomeAssistant, diff --git a/homeassistant/components/huawei_lte/__init__.py b/homeassistant/components/huawei_lte/__init__.py index aee3966e9ed10..2797accc6d79a 100644 --- a/homeassistant/components/huawei_lte/__init__.py +++ b/homeassistant/components/huawei_lte/__init__.py @@ -17,8 +17,8 @@ ResponseErrorLoginRequiredException, ResponseErrorNotSupportedException, ) +import probatio from requests.exceptions import Timeout -import voluptuous as vol from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( @@ -89,7 +89,7 @@ CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN) -SERVICE_SCHEMA = vol.Schema({vol.Optional(CONF_URL): cv.url}) +SERVICE_SCHEMA = probatio.Schema({probatio.Optional(CONF_URL): cv.url}) PLATFORMS = [ Platform.BINARY_SENSOR, diff --git a/homeassistant/components/huawei_lte/config_flow.py b/homeassistant/components/huawei_lte/config_flow.py index 2916848e05bf5..d597ae7ff7c96 100644 --- a/homeassistant/components/huawei_lte/config_flow.py +++ b/homeassistant/components/huawei_lte/config_flow.py @@ -15,9 +15,9 @@ ResponseErrorException, ) from huawei_lte_api.Session import GetResponseType +import probatio from requests.exceptions import SSLError, Timeout from url_normalize import url_normalize -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, OptionsFlow from homeassistant.const import ( @@ -85,23 +85,23 @@ async def _async_show_user_form( user_input = {} return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_URL, default=user_input.get(CONF_URL, self.url or ""), ): str, - vol.Optional( + probatio.Optional( CONF_VERIFY_SSL, default=user_input.get( CONF_VERIFY_SSL, False, ), ): bool, - vol.Optional( + probatio.Optional( CONF_USERNAME, default=user_input.get(CONF_USERNAME) or "" ): str, - vol.Optional( + probatio.Optional( CONF_PASSWORD, default=user_input.get(CONF_PASSWORD) or "" ): str, } @@ -119,12 +119,12 @@ async def _async_show_reauth_form( ) -> ConfigFlowResult: return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_USERNAME, default=user_input.get(CONF_USERNAME) or "" ): str, - vol.Optional( + probatio.Optional( CONF_PASSWORD, default=user_input.get(CONF_PASSWORD) or "" ): str, } @@ -386,29 +386,29 @@ async def async_step_init( ] return self.async_create_entry(title="", data=data) - data_schema = vol.Schema( + data_schema = probatio.Schema( { # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Optional( + probatio.Optional( CONF_NAME, default=self.config_entry.options.get( CONF_NAME, DEFAULT_NOTIFY_SERVICE_NAME ), ): str, - vol.Optional( + probatio.Optional( CONF_RECIPIENT, default=", ".join( self.config_entry.options.get(CONF_RECIPIENT, []) ), ): str, - vol.Optional( + probatio.Optional( CONF_TRACK_WIRED_CLIENTS, default=self.config_entry.options.get( CONF_TRACK_WIRED_CLIENTS, DEFAULT_TRACK_WIRED_CLIENTS ), ): bool, - vol.Optional( + probatio.Optional( CONF_UNAUTHENTICATED_MODE, default=self.config_entry.options.get( CONF_UNAUTHENTICATED_MODE, DEFAULT_UNAUTHENTICATED_MODE diff --git a/homeassistant/components/hue/config_flow.py b/homeassistant/components/hue/config_flow.py index d013e87cd0abc..3a77cf6b7833f 100644 --- a/homeassistant/components/hue/config_flow.py +++ b/homeassistant/components/hue/config_flow.py @@ -10,8 +10,8 @@ from aiohue.errors import AiohueException from aiohue.util import normalize_bridge_id from aiohue.v2 import HueBridgeV2 +import probatio import slugify as unicode_slug -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, OptionsFlow from homeassistant.const import CONF_API_KEY, CONF_API_VERSION, CONF_HOST @@ -144,9 +144,9 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required("id"): vol.In( + probatio.Required("id"): probatio.In( { **{bridge.id: bridge.host for bridge in bridges}, HUE_MANUAL_BRIDGE_ID: "Manually add a Hue Bridge", @@ -163,7 +163,7 @@ async def async_step_manual( if user_input is None: return self.async_show_form( step_id="manual", - data_schema=vol.Schema({vol.Required(CONF_HOST): str}), + data_schema=probatio.Schema({probatio.Required(CONF_HOST): str}), ) self._async_abort_entries_match({"host": user_input["host"]}) @@ -362,15 +362,15 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_ALLOW_HUE_GROUPS, default=self.config_entry.options.get( CONF_ALLOW_HUE_GROUPS, DEFAULT_ALLOW_HUE_GROUPS ), ): bool, - vol.Optional( + probatio.Optional( CONF_ALLOW_UNREACHABLE, default=self.config_entry.options.get( CONF_ALLOW_UNREACHABLE, DEFAULT_ALLOW_UNREACHABLE @@ -410,9 +410,9 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_IGNORE_AVAILABILITY, default=cur_ids, ): cv.multi_select(dev_ids), diff --git a/homeassistant/components/hue/scene.py b/homeassistant/components/hue/scene.py index 5f020fe4a79c1..00681795359e3 100644 --- a/homeassistant/components/hue/scene.py +++ b/homeassistant/components/hue/scene.py @@ -8,7 +8,7 @@ from aiohue.v2.controllers.scenes import ScenesController from aiohue.v2.models.scene import Scene as HueScene, ScenePut as HueScenePut from aiohue.v2.models.smart_scene import SmartScene as HueSmartScene, SmartSceneState -import voluptuous as vol +import probatio from homeassistant.components.scene import ATTR_TRANSITION, Scene as SceneEntity from homeassistant.core import HomeAssistant, callback @@ -77,15 +77,15 @@ def async_add_entity( platform.async_register_entity_service( SERVICE_ACTIVATE_SCENE, { - vol.Optional(ATTR_DYNAMIC): vol.Coerce(bool), - vol.Optional(ATTR_SPEED): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) + probatio.Optional(ATTR_DYNAMIC): probatio.Coerce(bool), + probatio.Optional(ATTR_SPEED): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) ), - vol.Optional(ATTR_TRANSITION): vol.All( - vol.Coerce(float), vol.Range(min=0, max=3600) + probatio.Optional(ATTR_TRANSITION): probatio.All( + probatio.Coerce(float), probatio.Range(min=0, max=3600) ), - vol.Optional(ATTR_BRIGHTNESS): vol.All( - vol.Coerce(int), vol.Range(min=1, max=255) + probatio.Optional(ATTR_BRIGHTNESS): probatio.All( + probatio.Coerce(int), probatio.Range(min=1, max=255) ), }, "_async_activate", diff --git a/homeassistant/components/hue/services.py b/homeassistant/components/hue/services.py index 8d73c050e89a2..08f03eac5dc75 100644 --- a/homeassistant/components/hue/services.py +++ b/homeassistant/components/hue/services.py @@ -4,7 +4,7 @@ import logging from aiohue import HueBridgeV1, HueBridgeV2 -import voluptuous as vol +import probatio from homeassistant.core import HomeAssistant, ServiceCall, callback from homeassistant.helpers import config_validation as cv @@ -63,12 +63,12 @@ async def hue_activate_scene(call: ServiceCall, skip_reload=True) -> None: DOMAIN, SERVICE_HUE_ACTIVATE_SCENE, verify_domain_control(DOMAIN)(hue_activate_scene), - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(ATTR_GROUP_NAME): cv.string, - vol.Required(ATTR_SCENE_NAME): cv.string, - vol.Optional(ATTR_TRANSITION): cv.positive_int, - vol.Optional(ATTR_DYNAMIC): cv.boolean, + probatio.Required(ATTR_GROUP_NAME): cv.string, + probatio.Required(ATTR_SCENE_NAME): cv.string, + probatio.Optional(ATTR_TRANSITION): cv.positive_int, + probatio.Optional(ATTR_DYNAMIC): cv.boolean, } ), ) diff --git a/homeassistant/components/hue/v1/device_trigger.py b/homeassistant/components/hue/v1/device_trigger.py index 16589d25ad616..70896638bc44b 100644 --- a/homeassistant/components/hue/v1/device_trigger.py +++ b/homeassistant/components/hue/v1/device_trigger.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING -import voluptuous as vol +import probatio from homeassistant.components.device_automation import ( DEVICE_TRIGGER_BASE_SCHEMA, @@ -28,7 +28,7 @@ from ..bridge import HueBridge, HueConfigEntry TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( - {vol.Required(CONF_TYPE): str, vol.Required(CONF_SUBTYPE): str} + {probatio.Required(CONF_TYPE): str, probatio.Required(CONF_SUBTYPE): str} ) diff --git a/homeassistant/components/hue/v2/device_trigger.py b/homeassistant/components/hue/v2/device_trigger.py index 9ac568fb10635..5b2d72505bb6b 100644 --- a/homeassistant/components/hue/v2/device_trigger.py +++ b/homeassistant/components/hue/v2/device_trigger.py @@ -3,7 +3,7 @@ from typing import TYPE_CHECKING, Any from aiohue.v2.models.resource import ResourceTypes -import voluptuous as vol +import probatio from homeassistant.components.device_automation import DEVICE_TRIGGER_BASE_SCHEMA from homeassistant.components.homeassistant.triggers import event as event_trigger @@ -37,9 +37,9 @@ TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): str, - vol.Required(CONF_SUBTYPE): vol.Union(int, str), - vol.Optional(CONF_UNIQUE_ID): str, + probatio.Required(CONF_TYPE): str, + probatio.Required(CONF_SUBTYPE): probatio.Union(int, str), + probatio.Optional(CONF_UNIQUE_ID): str, } ) diff --git a/homeassistant/components/hue_ble/config_flow.py b/homeassistant/components/hue_ble/config_flow.py index de53286c730c9..752f634dd1634 100644 --- a/homeassistant/components/hue_ble/config_flow.py +++ b/homeassistant/components/hue_ble/config_flow.py @@ -6,7 +6,7 @@ from bleak.backends.scanner import AdvertisementData from HueBLE import ConnectionError, HueBleError, HueBleLight, PairingError -import voluptuous as vol +import probatio from homeassistant.components import bluetooth from homeassistant.components.bluetooth.api import ( @@ -113,9 +113,9 @@ async def async_step_user( if not self._discovered_devices: return self.async_abort(reason="no_devices_found") - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_MAC): vol.In( + probatio.Required(CONF_MAC): probatio.In( { service_info.address: ( f"{service_info.name} ({service_info.address})" @@ -166,7 +166,7 @@ async def async_step_confirm( return self.async_show_form( step_id="confirm", - data_schema=vol.Schema({}), + data_schema=probatio.Schema({}), errors=errors, description_placeholders={ CONF_NAME: self._discovery_info.name, diff --git a/homeassistant/components/huisbaasje/config_flow.py b/homeassistant/components/huisbaasje/config_flow.py index cdb216bbc3626..486744d862df9 100644 --- a/homeassistant/components/huisbaasje/config_flow.py +++ b/homeassistant/components/huisbaasje/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from energyflip import EnergyFlip, EnergyFlipConnectionException, EnergyFlipException -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_ID, CONF_PASSWORD, CONF_USERNAME @@ -14,8 +14,8 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( - {vol.Required(CONF_USERNAME): str, vol.Required(CONF_PASSWORD): str} +DATA_SCHEMA = probatio.Schema( + {probatio.Required(CONF_USERNAME): str, probatio.Required(CONF_PASSWORD): str} ) diff --git a/homeassistant/components/humidifier/__init__.py b/homeassistant/components/humidifier/__init__.py index 6eea849300b1a..9edf74104b2e8 100644 --- a/homeassistant/components/humidifier/__init__.py +++ b/homeassistant/components/humidifier/__init__.py @@ -5,8 +5,8 @@ import logging from typing import Any, final, override +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( @@ -68,7 +68,9 @@ class HumidifierDeviceClass(StrEnum): DEHUMIDIFIER = "dehumidifier" -DEVICE_CLASSES_SCHEMA = vol.All(vol.Lower, vol.Coerce(HumidifierDeviceClass)) +DEVICE_CLASSES_SCHEMA = probatio.All( + probatio.Lower, probatio.Coerce(HumidifierDeviceClass) +) # DEVICE_CLASSES below is deprecated as of 2021.12 # use the HumidifierDeviceClass enum instead. @@ -97,15 +99,15 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: component.async_register_entity_service(SERVICE_TOGGLE, None, "async_toggle") component.async_register_entity_service( SERVICE_SET_MODE, - {vol.Required(ATTR_MODE): cv.string}, + {probatio.Required(ATTR_MODE): cv.string}, "async_set_mode", [HumidifierEntityFeature.MODES], ) component.async_register_entity_service( SERVICE_SET_HUMIDITY, { - vol.Required(ATTR_HUMIDITY): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) + probatio.Required(ATTR_HUMIDITY): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) ) }, async_service_humidity_set, diff --git a/homeassistant/components/humidifier/condition.py b/homeassistant/components/humidifier/condition.py index 55ddc6eb30449..f48de0d3f1531 100644 --- a/homeassistant/components/humidifier/condition.py +++ b/homeassistant/components/humidifier/condition.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING, override -import voluptuous as vol +import probatio from homeassistant.const import CONF_MODE, CONF_OPTIONS, PERCENTAGE, STATE_OFF, STATE_ON from homeassistant.core import HomeAssistant, State @@ -28,8 +28,10 @@ IS_MODE_CONDITION_SCHEMA = ENTITY_STATE_CONDITION_SCHEMA_ANY_ALL.extend( { - vol.Required(CONF_OPTIONS): { - vol.Required(CONF_MODE): vol.All(cv.ensure_list, vol.Length(min=1), [str]), + probatio.Required(CONF_OPTIONS): { + probatio.Required(CONF_MODE): probatio.All( + cv.ensure_list, probatio.Length(min=1), [str] + ), }, } ) diff --git a/homeassistant/components/humidifier/device_action.py b/homeassistant/components/humidifier/device_action.py index 3e2124e129a3a..b4bdfdbadd075 100644 --- a/homeassistant/components/humidifier/device_action.py +++ b/homeassistant/components/humidifier/device_action.py @@ -1,6 +1,6 @@ """Provides device actions for Humidifier.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import ( async_get_entity_registry_entry_or_raise, @@ -27,23 +27,25 @@ SET_HUMIDITY_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): "set_humidity", - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(const.ATTR_HUMIDITY): vol.Coerce(int), + probatio.Required(CONF_TYPE): "set_humidity", + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(const.ATTR_HUMIDITY): probatio.Coerce(int), } ) SET_MODE_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): "set_mode", - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(ATTR_MODE): cv.string, + probatio.Required(CONF_TYPE): "set_mode", + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(ATTR_MODE): cv.string, } ) -ONOFF_SCHEMA = toggle_entity.ACTION_SCHEMA.extend({vol.Required(CONF_DOMAIN): DOMAIN}) +ONOFF_SCHEMA = toggle_entity.ACTION_SCHEMA.extend( + {probatio.Required(CONF_DOMAIN): DOMAIN} +) -_ACTION_SCHEMA = vol.Any(SET_HUMIDITY_SCHEMA, SET_MODE_SCHEMA, ONOFF_SCHEMA) +_ACTION_SCHEMA = probatio.Any(SET_HUMIDITY_SCHEMA, SET_MODE_SCHEMA, ONOFF_SCHEMA) async def async_validate_action_config( @@ -108,14 +110,14 @@ async def async_call_action_from_config( async def async_get_action_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List action capabilities.""" action_type = config[CONF_TYPE] fields: VolDictType = {} if action_type == "set_humidity": - fields[vol.Required(const.ATTR_HUMIDITY)] = vol.Coerce(int) + fields[probatio.Required(const.ATTR_HUMIDITY)] = probatio.Coerce(int) elif action_type == "set_mode": try: entry = async_get_entity_registry_entry_or_raise( @@ -131,8 +133,8 @@ async def async_get_action_capabilities( ) except HomeAssistantError: available_modes = [] - fields[vol.Required(ATTR_MODE)] = vol.In(available_modes) + fields[probatio.Required(ATTR_MODE)] = probatio.In(available_modes) else: return {} - return {"extra_fields": vol.Schema(fields)} + return {"extra_fields": probatio.Schema(fields)} diff --git a/homeassistant/components/humidifier/device_condition.py b/homeassistant/components/humidifier/device_condition.py index 193f3f54d3ca4..4ca2d16fdf87c 100644 --- a/homeassistant/components/humidifier/device_condition.py +++ b/homeassistant/components/humidifier/device_condition.py @@ -1,6 +1,6 @@ """Provide the device automations for Humidifier.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import ( async_get_entity_registry_entry_or_raise, @@ -29,18 +29,18 @@ from . import DOMAIN, const TOGGLE_CONDITION = toggle_entity.CONDITION_SCHEMA.extend( - {vol.Required(CONF_DOMAIN): DOMAIN} + {probatio.Required(CONF_DOMAIN): DOMAIN} ) MODE_CONDITION = DEVICE_CONDITION_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): "is_mode", - vol.Required(ATTR_MODE): str, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): "is_mode", + probatio.Required(ATTR_MODE): str, } ) -CONDITION_SCHEMA = vol.Any(TOGGLE_CONDITION, MODE_CONDITION) +CONDITION_SCHEMA = probatio.Any(TOGGLE_CONDITION, MODE_CONDITION) # Maps a state attribute to the condition config key used to compare against it. _STATE_ATTRIBUTE_TO_CONFIG_KEY = { @@ -103,7 +103,7 @@ def test_is_state(hass: HomeAssistant, variables: TemplateVarsType) -> bool: async def async_get_condition_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List condition capabilities.""" condition_type = config[CONF_TYPE] @@ -125,8 +125,8 @@ async def async_get_condition_capabilities( except HomeAssistantError: modes = [] - fields[vol.Required(ATTR_MODE)] = vol.In(modes) + fields[probatio.Required(ATTR_MODE)] = probatio.In(modes) - return {"extra_fields": vol.Schema(fields)} + return {"extra_fields": probatio.Schema(fields)} return await toggle_entity.async_get_condition_capabilities(hass, config) diff --git a/homeassistant/components/humidifier/device_trigger.py b/homeassistant/components/humidifier/device_trigger.py index bfd2fe00844a0..aff95e3471631 100644 --- a/homeassistant/components/humidifier/device_trigger.py +++ b/homeassistant/components/humidifier/device_trigger.py @@ -1,6 +1,6 @@ """Provides device automations for Climate.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import ( DEVICE_TRIGGER_BASE_SCHEMA, @@ -30,39 +30,41 @@ # mypy: disallow-any-generics -CURRENT_TRIGGER_SCHEMA = vol.All( +CURRENT_TRIGGER_SCHEMA = probatio.All( DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): "current_humidity_changed", - vol.Optional(CONF_BELOW): vol.Any(vol.Coerce(float)), - vol.Optional(CONF_ABOVE): vol.Any(vol.Coerce(float)), - vol.Optional(CONF_FOR): cv.positive_time_period_dict, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): "current_humidity_changed", + probatio.Optional(CONF_BELOW): probatio.Any(probatio.Coerce(float)), + probatio.Optional(CONF_ABOVE): probatio.Any(probatio.Coerce(float)), + probatio.Optional(CONF_FOR): cv.positive_time_period_dict, } ), cv.has_at_least_one_key(CONF_BELOW, CONF_ABOVE), ) -HUMIDIFIER_TRIGGER_SCHEMA = vol.All( +HUMIDIFIER_TRIGGER_SCHEMA = probatio.All( DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): "target_humidity_changed", - vol.Optional(CONF_BELOW): vol.Any(vol.Coerce(int)), - vol.Optional(CONF_ABOVE): vol.Any(vol.Coerce(int)), - vol.Optional(CONF_FOR): cv.positive_time_period_dict, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): "target_humidity_changed", + probatio.Optional(CONF_BELOW): probatio.Any(probatio.Coerce(int)), + probatio.Optional(CONF_ABOVE): probatio.Any(probatio.Coerce(int)), + probatio.Optional(CONF_FOR): cv.positive_time_period_dict, } ), cv.has_at_least_one_key(CONF_BELOW, CONF_ABOVE), ) -TRIGGER_SCHEMA = vol.All( - vol.Any( +TRIGGER_SCHEMA = probatio.All( + probatio.Any( CURRENT_TRIGGER_SCHEMA, HUMIDIFIER_TRIGGER_SCHEMA, toggle_entity.TRIGGER_SCHEMA, ), - vol.Schema({vol.Required(CONF_DOMAIN): DOMAIN}, extra=vol.ALLOW_EXTRA), + probatio.Schema( + {probatio.Required(CONF_DOMAIN): DOMAIN}, extra=probatio.ALLOW_EXTRA + ), ) @@ -157,19 +159,19 @@ async def async_attach_trigger( async def async_get_trigger_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List trigger capabilities.""" if config[CONF_TYPE] in {"current_humidity_changed", "target_humidity_changed"}: return { - "extra_fields": vol.Schema( + "extra_fields": probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_ABOVE, description={"suffix": PERCENTAGE} - ): vol.Coerce(int), - vol.Optional( + ): probatio.Coerce(int), + probatio.Optional( CONF_BELOW, description={"suffix": PERCENTAGE} - ): vol.Coerce(int), - vol.Optional(CONF_FOR): cv.positive_time_period_dict, + ): probatio.Coerce(int), + probatio.Optional(CONF_FOR): cv.positive_time_period_dict, } ) } diff --git a/homeassistant/components/humidifier/intent.py b/homeassistant/components/humidifier/intent.py index 70ed62260155a..6f3bcf2b4d336 100644 --- a/homeassistant/components/humidifier/intent.py +++ b/homeassistant/components/humidifier/intent.py @@ -2,7 +2,7 @@ from typing import override -import voluptuous as vol +import probatio from homeassistant.const import ATTR_ENTITY_ID, ATTR_MODE, STATE_OFF from homeassistant.core import HomeAssistant @@ -34,8 +34,10 @@ class HumidityHandler(intent.IntentHandler): intent_type = INTENT_HUMIDITY description = "Set desired humidity level" slot_schema = { - vol.Required("name"): intent.non_empty_string, - vol.Required("humidity"): vol.All(vol.Coerce(int), vol.Range(0, 100)), + probatio.Required("name"): intent.non_empty_string, + probatio.Required("humidity"): probatio.All( + probatio.Coerce(int), probatio.Range(0, 100) + ), } platforms = {DOMAIN} @@ -90,8 +92,8 @@ class SetModeHandler(intent.IntentHandler): intent_type = INTENT_MODE description = "Set humidifier mode" slot_schema = { - vol.Required("name"): intent.non_empty_string, - vol.Required("mode"): cv.string, + probatio.Required("name"): intent.non_empty_string, + probatio.Required("mode"): cv.string, } platforms = {DOMAIN} diff --git a/homeassistant/components/humidifier/trigger.py b/homeassistant/components/humidifier/trigger.py index 3b01529de6b5a..3de9c85e253ec 100644 --- a/homeassistant/components/humidifier/trigger.py +++ b/homeassistant/components/humidifier/trigger.py @@ -2,7 +2,7 @@ from typing import override -import voluptuous as vol +import probatio from homeassistant.const import CONF_MODE, CONF_OPTIONS, STATE_OFF, STATE_ON from homeassistant.core import HomeAssistant @@ -27,8 +27,10 @@ MODE_CHANGED_TRIGGER_SCHEMA = ENTITY_STATE_TRIGGER_SCHEMA_WITH_BEHAVIOR.extend( { - vol.Required(CONF_OPTIONS): { - vol.Required(CONF_MODE): vol.All(cv.ensure_list, vol.Length(min=1), [str]), + probatio.Required(CONF_OPTIONS): { + probatio.Required(CONF_MODE): probatio.All( + cv.ensure_list, probatio.Length(min=1), [str] + ), }, } ) diff --git a/homeassistant/components/hunterdouglas_powerview/config_flow.py b/homeassistant/components/hunterdouglas_powerview/config_flow.py index 49beba29c4842..9cef61882a82b 100644 --- a/homeassistant/components/hunterdouglas_powerview/config_flow.py +++ b/homeassistant/components/hunterdouglas_powerview/config_flow.py @@ -3,7 +3,7 @@ import logging from typing import TYPE_CHECKING, Any, Self, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_VERSION, CONF_HOST, CONF_NAME @@ -57,7 +57,7 @@ def __init__(self) -> None: self.powerview_config: dict = {} self.discovered_ip: str | None = None self.discovered_name: str | None = None - self.data_schema: dict = {vol.Required(CONF_HOST): str} + self.data_schema: dict = {probatio.Required(CONF_HOST): str} @override async def async_step_user( @@ -89,7 +89,7 @@ async def async_step_user( errors["base"] = error return self.async_show_form( - step_id="user", data_schema=vol.Schema(self.data_schema), errors=errors + step_id="user", data_schema=probatio.Schema(self.data_schema), errors=errors ) async def _async_validate_or_error( diff --git a/homeassistant/components/husqvarna_automower/services.py b/homeassistant/components/husqvarna_automower/services.py index 28e2d350f6995..15271f4b7e932 100644 --- a/homeassistant/components/husqvarna_automower/services.py +++ b/homeassistant/components/husqvarna_automower/services.py @@ -2,7 +2,7 @@ from datetime import timedelta -import voluptuous as vol +import probatio from homeassistant.components.lawn_mower import DOMAIN as LAWN_MOWER_DOMAIN from homeassistant.core import HomeAssistant, callback @@ -23,11 +23,11 @@ def async_setup_services(hass: HomeAssistant) -> None: "override_schedule", entity_domain=LAWN_MOWER_DOMAIN, schema={ - vol.Required("override_mode"): vol.In(OVERRIDE_MODES), - vol.Required("duration"): vol.All( + probatio.Required("override_mode"): probatio.In(OVERRIDE_MODES), + probatio.Required("duration"): probatio.All( cv.time_period, cv.positive_timedelta, - vol.Range(min=timedelta(minutes=1), max=timedelta(days=42)), + probatio.Range(min=timedelta(minutes=1), max=timedelta(days=42)), ), }, func="async_override_schedule", @@ -38,11 +38,11 @@ def async_setup_services(hass: HomeAssistant) -> None: "override_schedule_work_area", entity_domain=LAWN_MOWER_DOMAIN, schema={ - vol.Required("work_area_id"): vol.Coerce(int), - vol.Required("duration"): vol.All( + probatio.Required("work_area_id"): probatio.Coerce(int), + probatio.Required("duration"): probatio.All( cv.time_period, cv.positive_timedelta, - vol.Range(min=timedelta(minutes=1), max=timedelta(days=42)), + probatio.Range(min=timedelta(minutes=1), max=timedelta(days=42)), ), }, func="async_override_schedule_work_area", diff --git a/homeassistant/components/husqvarna_automower_ble/config_flow.py b/homeassistant/components/husqvarna_automower_ble/config_flow.py index 9e1cfa7005430..df0bdc64cfd4b 100644 --- a/homeassistant/components/husqvarna_automower_ble/config_flow.py +++ b/homeassistant/components/husqvarna_automower_ble/config_flow.py @@ -11,7 +11,7 @@ from gardena_bluetooth.const import ScanService from gardena_bluetooth.parse import ProductType from gardena_bluetooth.scan import async_get_manufacturer_data -import voluptuous as vol +import probatio from homeassistant.components import bluetooth from homeassistant.components.bluetooth import BluetoothServiceInfo @@ -20,16 +20,16 @@ from .const import DOMAIN, LOGGER -BLUETOOTH_SCHEMA = vol.Schema( +BLUETOOTH_SCHEMA = probatio.Schema( { - vol.Required(CONF_PIN): str, + probatio.Required(CONF_PIN): str, } ) -USER_SCHEMA = vol.Schema( +USER_SCHEMA = probatio.Schema( { - vol.Required(CONF_ADDRESS): str, - vol.Required(CONF_PIN): str, + probatio.Required(CONF_ADDRESS): str, + probatio.Required(CONF_PIN): str, } ) diff --git a/homeassistant/components/huum/config_flow.py b/homeassistant/components/huum/config_flow.py index 58e263fd1603c..bd41af4ff8d00 100644 --- a/homeassistant/components/huum/config_flow.py +++ b/homeassistant/components/huum/config_flow.py @@ -6,7 +6,7 @@ from huum.exceptions import Forbidden, NotAuthenticated from huum.huum import Huum -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -16,10 +16,10 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) @@ -129,9 +129,9 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ), description_placeholders={ diff --git a/homeassistant/components/hvv_departures/config_flow.py b/homeassistant/components/hvv_departures/config_flow.py index 094f1ec218753..0e5a822039955 100644 --- a/homeassistant/components/hvv_departures/config_flow.py +++ b/homeassistant/components/hvv_departures/config_flow.py @@ -4,6 +4,7 @@ from typing import Any, override from aiohttp import ClientConnectorError +import probatio from pygti.auth import GTI_DEFAULT_HOST from pygti.exceptions import GTIError, GTIUnauthorizedError from pygti.models import ( @@ -14,7 +15,6 @@ SDName, SDNameType, ) -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, OptionsFlow from homeassistant.const import CONF_HOST, CONF_OFFSET, CONF_PASSWORD, CONF_USERNAME @@ -26,21 +26,21 @@ _LOGGER = logging.getLogger(__name__) -SCHEMA_STEP_USER = vol.Schema( +SCHEMA_STEP_USER = probatio.Schema( { - vol.Required(CONF_HOST, default=GTI_DEFAULT_HOST): str, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_HOST, default=GTI_DEFAULT_HOST): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) -SCHEMA_STEP_STATION = vol.Schema({vol.Required(CONF_STATION): str}) +SCHEMA_STEP_STATION = probatio.Schema({probatio.Required(CONF_STATION): str}) -SCHEMA_STEP_OPTIONS = vol.Schema( +SCHEMA_STEP_OPTIONS = probatio.Schema( { - vol.Required(CONF_FILTER): vol.In([]), - vol.Required(CONF_OFFSET, default=0): cv.positive_int, - vol.Optional(CONF_REAL_TIME, default=True): bool, + probatio.Required(CONF_FILTER): probatio.In([]), + probatio.Required(CONF_OFFSET, default=0): cv.positive_int, + probatio.Optional(CONF_REAL_TIME, default=True): bool, } ) @@ -125,7 +125,9 @@ async def async_step_station_select( ) -> ConfigFlowResult: """Handle the step where the user inputs his/her station.""" - schema = vol.Schema({vol.Required(CONF_STATION): vol.In(list(self.stations))}) + schema = probatio.Schema( + {probatio.Required(CONF_STATION): probatio.In(list(self.stations))} + ) if user_input is None: return self.async_show_form(step_id="station_select", data_schema=schema) @@ -215,9 +217,9 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional(CONF_FILTER, default=old_filter): cv.multi_select( + probatio.Optional(CONF_FILTER, default=old_filter): cv.multi_select( { key: ( f"{departure_filter.get('serviceName', '')}," @@ -226,11 +228,11 @@ async def async_step_init( for key, departure_filter in self.departure_filters.items() } ), - vol.Required( + probatio.Required( CONF_OFFSET, default=self.config_entry.options.get(CONF_OFFSET, 0), ): cv.positive_int, - vol.Optional( + probatio.Optional( CONF_REAL_TIME, default=self.config_entry.options.get(CONF_REAL_TIME, True), ): bool, diff --git a/homeassistant/components/hydrawise/binary_sensor.py b/homeassistant/components/hydrawise/binary_sensor.py index 7d53657538112..00e16fdb7f99e 100644 --- a/homeassistant/components/hydrawise/binary_sensor.py +++ b/homeassistant/components/hydrawise/binary_sensor.py @@ -5,8 +5,8 @@ from datetime import datetime from typing import override +import probatio from pydrawise import Controller, Zone -import voluptuous as vol from homeassistant.components.binary_sensor import ( BinarySensorDeviceClass, @@ -71,10 +71,12 @@ class HydrawiseBinarySensorEntityDescription(BinarySensorEntityDescription): ) SCHEMA_START_WATERING: VolDictType = { - vol.Optional("duration"): vol.All(vol.Coerce(int), vol.Range(min=0, max=1440)), + probatio.Optional("duration"): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=1440) + ), } SCHEMA_SUSPEND: VolDictType = { - vol.Required("until"): cv.datetime, + probatio.Required("until"): cv.datetime, } diff --git a/homeassistant/components/hydrawise/config_flow.py b/homeassistant/components/hydrawise/config_flow.py index 590801a574c82..87d9dd30f7df3 100644 --- a/homeassistant/components/hydrawise/config_flow.py +++ b/homeassistant/components/hydrawise/config_flow.py @@ -4,24 +4,24 @@ from typing import Any, override from aiohttp import ClientError +import probatio from pydrawise import auth as pydrawise_auth, hybrid from pydrawise.exceptions import NotAuthorizedError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY, CONF_PASSWORD, CONF_USERNAME from .const import APP_ID, DOMAIN, LOGGER -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Required(CONF_API_KEY): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Required(CONF_API_KEY): str, } ) -STEP_REAUTH_DATA_SCHEMA = vol.Schema( - {vol.Required(CONF_PASSWORD): str, vol.Required(CONF_API_KEY): str} +STEP_REAUTH_DATA_SCHEMA = probatio.Schema( + {probatio.Required(CONF_PASSWORD): str, probatio.Required(CONF_API_KEY): str} ) diff --git a/homeassistant/components/hyperion/config_flow.py b/homeassistant/components/hyperion/config_flow.py index 112982e2251af..d8ca079a12233 100644 --- a/homeassistant/components/hyperion/config_flow.py +++ b/homeassistant/components/hyperion/config_flow.py @@ -8,7 +8,7 @@ from urllib.parse import urlparse from hyperion import client, const -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -243,10 +243,10 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Optional(CONF_PORT, default=const.DEFAULT_PORT_JSON): int, + probatio.Required(CONF_HOST): str, + probatio.Optional(CONF_PORT, default=const.DEFAULT_PORT_JSON): int, } ), errors=errors, @@ -318,10 +318,10 @@ async def async_step_auth( return self.async_show_form( step_id="auth", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_CREATE_TOKEN): bool, - vol.Optional(CONF_TOKEN): str, + probatio.Required(CONF_CREATE_TOKEN): bool, + probatio.Optional(CONF_TOKEN): str, } ), errors=errors, @@ -475,15 +475,17 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_PRIORITY, default=self.config_entry.options.get( CONF_PRIORITY, DEFAULT_PRIORITY ), - ): vol.All(vol.Coerce(int), vol.Range(min=0, max=255)), - vol.Optional( + ): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=255) + ), + probatio.Optional( CONF_EFFECT_SHOW_LIST, default=default_effect_show_list, ): cv.multi_select(effects), diff --git a/homeassistant/components/hypontech/config_flow.py b/homeassistant/components/hypontech/config_flow.py index 1c30139bd8929..56f708a9c1963 100644 --- a/homeassistant/components/hypontech/config_flow.py +++ b/homeassistant/components/hypontech/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from hyponcloud import KNOWN_OEMS, AdminInfo, AuthenticationError, HyponCloud -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_USER, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -26,21 +26,21 @@ for oem in KNOWN_OEMS ] -STEP_REAUTH_DATA_SCHEMA = vol.Schema( +STEP_REAUTH_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) -def _data_schema(default_oem: int = DEFAULT_OEM) -> vol.Schema: +def _data_schema(default_oem: int = DEFAULT_OEM) -> probatio.Schema: """Return the config flow data schema.""" - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Required(CONF_OEM, default=str(default_oem)): SelectSelector( + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Required(CONF_OEM, default=str(default_oem)): SelectSelector( SelectSelectorConfig( options=OEM_OPTIONS, mode=SelectSelectorMode.DROPDOWN, diff --git a/homeassistant/components/ialarm/config_flow.py b/homeassistant/components/ialarm/config_flow.py index 9bbb8e10742c8..85988ca919de3 100644 --- a/homeassistant/components/ialarm/config_flow.py +++ b/homeassistant/components/ialarm/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from pyialarm import IAlarm -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PORT @@ -14,10 +14,10 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, } ) diff --git a/homeassistant/components/iammeter/sensor.py b/homeassistant/components/iammeter/sensor.py index e4f4572d62a9f..c1eb52f134525 100644 --- a/homeassistant/components/iammeter/sensor.py +++ b/homeassistant/components/iammeter/sensor.py @@ -8,7 +8,7 @@ from typing import override from iammeter.client import IamMeter -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -51,9 +51,9 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_DEVICE_NAME): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_DEVICE_NAME): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, } ) diff --git a/homeassistant/components/iaqualink/config_flow.py b/homeassistant/components/iaqualink/config_flow.py index 386ca08fb10fc..c5a9aedb7a617 100644 --- a/homeassistant/components/iaqualink/config_flow.py +++ b/homeassistant/components/iaqualink/config_flow.py @@ -9,7 +9,7 @@ AqualinkServiceException, AqualinkServiceUnauthorizedException, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_RECONFIGURE, @@ -22,10 +22,10 @@ from .const import DOMAIN -CREDENTIALS_DATA_SCHEMA = vol.Schema( +CREDENTIALS_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/ibeacon/config_flow.py b/homeassistant/components/ibeacon/config_flow.py index 8df2425f1d026..49eb80cd4477f 100644 --- a/homeassistant/components/ibeacon/config_flow.py +++ b/homeassistant/components/ibeacon/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from uuid import UUID -import voluptuous as vol +import probatio from homeassistant.components import bluetooth from homeassistant.config_entries import ( @@ -76,18 +76,18 @@ async def async_step_init(self, user_input: dict | None = None) -> ConfigFlowRes return self.async_create_entry(title="", data=data) schema: VolDictType = { - vol.Optional( + probatio.Optional( "new_uuid", description={"suggested_value": new_uuid}, ): str, } if current_uuids: schema |= { - vol.Optional( + probatio.Optional( "allow_nameless_uuids", default=current_uuids, ): cv.multi_select(sorted(current_uuids)) } return self.async_show_form( - step_id="init", errors=errors, data_schema=vol.Schema(schema) + step_id="init", errors=errors, data_schema=probatio.Schema(schema) ) diff --git a/homeassistant/components/icloud/config_flow.py b/homeassistant/components/icloud/config_flow.py index f0610d6bc1d11..3e41bc1c902d8 100644 --- a/homeassistant/components/icloud/config_flow.py +++ b/homeassistant/components/icloud/config_flow.py @@ -5,6 +5,7 @@ import os from typing import TYPE_CHECKING, Any, override +import probatio from pyicloud import PyiCloudService from pyicloud.exceptions import ( PyiCloudException, @@ -12,7 +13,6 @@ PyiCloudNoDevicesException, PyiCloudServiceNotActivatedException, ) -import voluptuous as vol from homeassistant.config_entries import SOURCE_USER, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -65,27 +65,27 @@ def _show_setup_form(self, user_input=None, errors=None, step_id="user"): if step_id == "user": schema = { - vol.Required( + probatio.Required( CONF_USERNAME, default=user_input.get(CONF_USERNAME, "") ): str, - vol.Required( + probatio.Required( CONF_PASSWORD, default=user_input.get(CONF_PASSWORD, "") ): str, - vol.Optional( + probatio.Optional( CONF_WITH_FAMILY, default=user_input.get(CONF_WITH_FAMILY, DEFAULT_WITH_FAMILY), ): bool, } else: schema = { - vol.Required( + probatio.Required( CONF_PASSWORD, default=user_input.get(CONF_PASSWORD, "") ): str, } return self.async_show_form( step_id=step_id, - data_schema=vol.Schema(schema), + data_schema=probatio.Schema(schema), errors=errors or {}, description_placeholders=self._description_placeholders, ) @@ -289,10 +289,10 @@ async def _show_trusted_device_form( return self.async_show_form( step_id="trusted_device", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_TRUSTED_DEVICE): vol.All( - vol.Coerce(int), vol.In(trusted_devices) + probatio.Required(CONF_TRUSTED_DEVICE): probatio.All( + probatio.Coerce(int), probatio.In(trusted_devices) ) } ), @@ -370,10 +370,10 @@ async def _show_verification_code_form( return self.async_show_form( step_id="verification_code", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional(CONF_VERIFICATION_CODE): str, - vol.Optional(CONF_REQUEST_NEW_CODE, default=False): bool, + probatio.Optional(CONF_VERIFICATION_CODE): str, + probatio.Optional(CONF_REQUEST_NEW_CODE, default=False): bool, } ), errors=errors, diff --git a/homeassistant/components/icloud/services.py b/homeassistant/components/icloud/services.py index c3de04fba4289..e596943566cf3 100644 --- a/homeassistant/components/icloud/services.py +++ b/homeassistant/components/icloud/services.py @@ -1,6 +1,6 @@ """The iCloud component.""" -import voluptuous as vol +import probatio from homeassistant.core import HomeAssistant, ServiceCall, callback from homeassistant.helpers import config_validation as cv @@ -22,27 +22,30 @@ SERVICE_ICLOUD_LOST_DEVICE = "lost_device" SERVICE_ICLOUD_UPDATE = "update" -SERVICE_SCHEMA = vol.Schema({vol.Optional(ATTR_ACCOUNT): cv.string}) +SERVICE_SCHEMA = probatio.Schema({probatio.Optional(ATTR_ACCOUNT): cv.string}) -SERVICE_SCHEMA_PLAY_SOUND = vol.Schema( - {vol.Required(ATTR_ACCOUNT): cv.string, vol.Required(ATTR_DEVICE_NAME): cv.string} +SERVICE_SCHEMA_PLAY_SOUND = probatio.Schema( + { + probatio.Required(ATTR_ACCOUNT): cv.string, + probatio.Required(ATTR_DEVICE_NAME): cv.string, + } ) -SERVICE_SCHEMA_DISPLAY_MESSAGE = vol.Schema( +SERVICE_SCHEMA_DISPLAY_MESSAGE = probatio.Schema( { - vol.Required(ATTR_ACCOUNT): cv.string, - vol.Required(ATTR_DEVICE_NAME): cv.string, - vol.Required(ATTR_LOST_DEVICE_MESSAGE): cv.string, - vol.Optional(ATTR_LOST_DEVICE_SOUND): cv.boolean, + probatio.Required(ATTR_ACCOUNT): cv.string, + probatio.Required(ATTR_DEVICE_NAME): cv.string, + probatio.Required(ATTR_LOST_DEVICE_MESSAGE): cv.string, + probatio.Optional(ATTR_LOST_DEVICE_SOUND): cv.boolean, } ) -SERVICE_SCHEMA_LOST_DEVICE = vol.Schema( +SERVICE_SCHEMA_LOST_DEVICE = probatio.Schema( { - vol.Required(ATTR_ACCOUNT): cv.string, - vol.Required(ATTR_DEVICE_NAME): cv.string, - vol.Required(ATTR_LOST_DEVICE_NUMBER): cv.string, - vol.Required(ATTR_LOST_DEVICE_MESSAGE): cv.string, + probatio.Required(ATTR_ACCOUNT): cv.string, + probatio.Required(ATTR_DEVICE_NAME): cv.string, + probatio.Required(ATTR_LOST_DEVICE_NUMBER): cv.string, + probatio.Required(ATTR_LOST_DEVICE_MESSAGE): cv.string, } ) diff --git a/homeassistant/components/idasen_desk/config_flow.py b/homeassistant/components/idasen_desk/config_flow.py index 1b68e5d7e4dd8..c4e0354540f55 100644 --- a/homeassistant/components/idasen_desk/config_flow.py +++ b/homeassistant/components/idasen_desk/config_flow.py @@ -7,7 +7,7 @@ from bluetooth_data_tools import human_readable_name from idasen_ha import Desk from idasen_ha.errors import AuthFailedError -import voluptuous as vol +import probatio from homeassistant.components import bluetooth from homeassistant.components.bluetooth import ( @@ -102,9 +102,9 @@ async def async_step_user( if not self._discovered_devices: return self.async_abort(reason="no_devices_found") - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_ADDRESS): vol.In( + probatio.Required(CONF_ADDRESS): probatio.In( { service_info.address: ( f"{service_info.name} ({service_info.address})" diff --git a/homeassistant/components/idrive_e2/config_flow.py b/homeassistant/components/idrive_e2/config_flow.py index 56d99987d89f9..c35639089703d 100644 --- a/homeassistant/components/idrive_e2/config_flow.py +++ b/homeassistant/components/idrive_e2/config_flow.py @@ -7,7 +7,7 @@ from aiobotocore.session import AioSession from botocore.exceptions import ClientError, ConnectionError from idrive_e2 import CannotConnect, IDriveE2Client, InvalidAuth -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.helpers import config_validation as cv @@ -32,10 +32,10 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_ACCESS_KEY_ID): cv.string, - vol.Required(CONF_SECRET_ACCESS_KEY): TextSelector( + probatio.Required(CONF_ACCESS_KEY_ID): cv.string, + probatio.Required(CONF_SECRET_ACCESS_KEY): TextSelector( config=TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } @@ -139,9 +139,9 @@ async def async_step_bucket( # Show the bucket selection form with a dropdown selector return self.async_show_form( step_id="bucket", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_BUCKET): SelectSelector( + probatio.Required(CONF_BUCKET): SelectSelector( config=SelectSelectorConfig( options=self._buckets, mode=SelectSelectorMode.DROPDOWN ) diff --git a/homeassistant/components/idteck_prox/__init__.py b/homeassistant/components/idteck_prox/__init__.py index ef1efc933490e..aed9de17176de 100644 --- a/homeassistant/components/idteck_prox/__init__.py +++ b/homeassistant/components/idteck_prox/__init__.py @@ -2,8 +2,8 @@ import logging +import probatio from rfk101py.rfk101py import rfk101py -import voluptuous as vol from homeassistant.const import ( CONF_HOST, @@ -21,22 +21,22 @@ EVENT_IDTECK_PROX_KEYCARD = "idteck_prox_keycard" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.All( + DOMAIN: probatio.All( cv.ensure_list, [ - vol.Schema( + probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_PORT): cv.port, - vol.Required(CONF_NAME): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_PORT): cv.port, + probatio.Required(CONF_NAME): cv.string, } ) ], ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/ifttt/__init__.py b/homeassistant/components/ifttt/__init__.py index 607ce2195593a..24ced8070f66d 100644 --- a/homeassistant/components/ifttt/__init__.py +++ b/homeassistant/components/ifttt/__init__.py @@ -5,9 +5,9 @@ import logging from aiohttp import web +import probatio import pyfttt import requests -import voluptuous as vol from homeassistant.components import webhook from homeassistant.config_entries import ConfigEntry @@ -33,23 +33,27 @@ SERVICE_PUSH_ALARM_STATE = "push_alarm_state" SERVICE_TRIGGER = "trigger" -SERVICE_TRIGGER_SCHEMA = vol.Schema( +SERVICE_TRIGGER_SCHEMA = probatio.Schema( { - vol.Required(ATTR_EVENT): cv.string, - vol.Optional(ATTR_TARGET): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(ATTR_VALUE1): cv.string, - vol.Optional(ATTR_VALUE2): cv.string, - vol.Optional(ATTR_VALUE3): cv.string, + probatio.Required(ATTR_EVENT): cv.string, + probatio.Optional(ATTR_TARGET): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(ATTR_VALUE1): cv.string, + probatio.Optional(ATTR_VALUE2): cv.string, + probatio.Optional(ATTR_VALUE3): cv.string, } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Optional(DOMAIN): vol.Schema( - {vol.Required(CONF_KEY): vol.Any({cv.string: cv.string}, cv.string)} + probatio.Optional(DOMAIN): probatio.Schema( + { + probatio.Required(CONF_KEY): probatio.Any( + {cv.string: cv.string}, cv.string + ) + } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/ifttt/alarm_control_panel.py b/homeassistant/components/ifttt/alarm_control_panel.py index b4e2d8cd71de7..3e2f5ba3bcf9c 100644 --- a/homeassistant/components/ifttt/alarm_control_panel.py +++ b/homeassistant/components/ifttt/alarm_control_panel.py @@ -3,7 +3,7 @@ import logging from typing import override -import voluptuous as vol +import probatio from homeassistant.components.alarm_control_panel import ( PLATFORM_SCHEMA as ALARM_CONTROL_PANEL_PLATFORM_SCHEMA, @@ -52,19 +52,22 @@ PLATFORM_SCHEMA = ALARM_CONTROL_PANEL_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_CODE): cv.string, - vol.Optional(CONF_CODE_ARM_REQUIRED, default=True): cv.boolean, - vol.Optional(CONF_EVENT_AWAY, default=DEFAULT_EVENT_AWAY): cv.string, - vol.Optional(CONF_EVENT_HOME, default=DEFAULT_EVENT_HOME): cv.string, - vol.Optional(CONF_EVENT_NIGHT, default=DEFAULT_EVENT_NIGHT): cv.string, - vol.Optional(CONF_EVENT_DISARM, default=DEFAULT_EVENT_DISARM): cv.string, - vol.Optional(CONF_OPTIMISTIC, default=False): cv.boolean, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_CODE): cv.string, + probatio.Optional(CONF_CODE_ARM_REQUIRED, default=True): cv.boolean, + probatio.Optional(CONF_EVENT_AWAY, default=DEFAULT_EVENT_AWAY): cv.string, + probatio.Optional(CONF_EVENT_HOME, default=DEFAULT_EVENT_HOME): cv.string, + probatio.Optional(CONF_EVENT_NIGHT, default=DEFAULT_EVENT_NIGHT): cv.string, + probatio.Optional(CONF_EVENT_DISARM, default=DEFAULT_EVENT_DISARM): cv.string, + probatio.Optional(CONF_OPTIMISTIC, default=False): cv.boolean, } ) -PUSH_ALARM_STATE_SERVICE_SCHEMA = vol.Schema( - {vol.Required(ATTR_ENTITY_ID): cv.entity_ids, vol.Required(ATTR_STATE): cv.string} +PUSH_ALARM_STATE_SERVICE_SCHEMA = probatio.Schema( + { + probatio.Required(ATTR_ENTITY_ID): cv.entity_ids, + probatio.Required(ATTR_STATE): cv.string, + } ) diff --git a/homeassistant/components/iglo/light.py b/homeassistant/components/iglo/light.py index 5af98d7db1435..a873d98f4b915 100644 --- a/homeassistant/components/iglo/light.py +++ b/homeassistant/components/iglo/light.py @@ -4,7 +4,7 @@ from iglo import Lamp from iglo.lamp import MODE_WHITE -import voluptuous as vol +import probatio from homeassistant.components.light import ( ATTR_BRIGHTNESS, @@ -28,9 +28,9 @@ PLATFORM_SCHEMA = LIGHT_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, } ) diff --git a/homeassistant/components/igloohome/config_flow.py b/homeassistant/components/igloohome/config_flow.py index e5ee44de4c217..87e2f437355bf 100644 --- a/homeassistant/components/igloohome/config_flow.py +++ b/homeassistant/components/igloohome/config_flow.py @@ -5,7 +5,7 @@ from aiohttp import ClientError from igloohome_api import Auth as IgloohomeAuth, AuthException -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_CLIENT_ID, CONF_CLIENT_SECRET @@ -15,10 +15,10 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_CLIENT_ID): str, - vol.Required(CONF_CLIENT_SECRET): str, + probatio.Required(CONF_CLIENT_ID): str, + probatio.Required(CONF_CLIENT_SECRET): str, } ) diff --git a/homeassistant/components/ign_sismologia/geo_location.py b/homeassistant/components/ign_sismologia/geo_location.py index c5939c70afb54..6043c57e038e0 100644 --- a/homeassistant/components/ign_sismologia/geo_location.py +++ b/homeassistant/components/ign_sismologia/geo_location.py @@ -9,7 +9,7 @@ IgnSismologiaFeedEntry, IgnSismologiaFeedManager, ) -import voluptuous as vol +import probatio from homeassistant.components.geo_location import ( PLATFORM_SCHEMA as GEO_LOCATION_PLATFORM_SCHEMA, @@ -50,10 +50,12 @@ PLATFORM_SCHEMA = GEO_LOCATION_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_LATITUDE): cv.latitude, - vol.Optional(CONF_LONGITUDE): cv.longitude, - vol.Optional(CONF_RADIUS, default=DEFAULT_RADIUS_IN_KM): vol.Coerce(float), - vol.Optional( + probatio.Optional(CONF_LATITUDE): cv.latitude, + probatio.Optional(CONF_LONGITUDE): cv.longitude, + probatio.Optional(CONF_RADIUS, default=DEFAULT_RADIUS_IN_KM): probatio.Coerce( + float + ), + probatio.Optional( CONF_MINIMUM_MAGNITUDE, default=DEFAULT_MINIMUM_MAGNITUDE ): cv.positive_float, } diff --git a/homeassistant/components/ihc/__init__.py b/homeassistant/components/ihc/__init__.py index 0fded758890ea..56b0ab3ebc385 100644 --- a/homeassistant/components/ihc/__init__.py +++ b/homeassistant/components/ihc/__init__.py @@ -3,7 +3,7 @@ import logging from ihcsdk.ihccontroller import IHCController -import voluptuous as vol +import probatio from homeassistant.const import CONF_PASSWORD, CONF_URL, CONF_USERNAME from homeassistant.core import HomeAssistant @@ -24,8 +24,9 @@ _LOGGER = logging.getLogger(__name__) -CONFIG_SCHEMA = vol.Schema( - {DOMAIN: vol.Schema(vol.All(cv.ensure_list, [IHC_SCHEMA]))}, extra=vol.ALLOW_EXTRA +CONFIG_SCHEMA = probatio.Schema( + {DOMAIN: probatio.Schema(probatio.All(cv.ensure_list, [IHC_SCHEMA]))}, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/ihc/auto_setup.py b/homeassistant/components/ihc/auto_setup.py index 9b71187516748..fea4a0872defb 100644 --- a/homeassistant/components/ihc/auto_setup.py +++ b/homeassistant/components/ihc/auto_setup.py @@ -4,7 +4,7 @@ import os.path from defusedxml import ElementTree -import voluptuous as vol +import probatio from homeassistant.config import load_yaml_config_file from homeassistant.const import CONF_TYPE, CONF_UNIT_OF_MEASUREMENT, UnitOfTemperature @@ -28,54 +28,54 @@ _LOGGER = logging.getLogger(__name__) -AUTO_SETUP_SCHEMA = vol.Schema( +AUTO_SETUP_SCHEMA = probatio.Schema( { - vol.Optional(CONF_BINARY_SENSOR, default=[]): vol.All( + probatio.Optional(CONF_BINARY_SENSOR, default=[]): probatio.All( cv.ensure_list, [ - vol.All( + probatio.All( { - vol.Required(CONF_NODE): cv.string, - vol.Required(CONF_XPATH): cv.string, - vol.Optional(CONF_INVERTING, default=False): cv.boolean, - vol.Optional(CONF_TYPE): cv.string, + probatio.Required(CONF_NODE): cv.string, + probatio.Required(CONF_XPATH): cv.string, + probatio.Optional(CONF_INVERTING, default=False): cv.boolean, + probatio.Optional(CONF_TYPE): cv.string, } ) ], ), - vol.Optional(CONF_LIGHT, default=[]): vol.All( + probatio.Optional(CONF_LIGHT, default=[]): probatio.All( cv.ensure_list, [ - vol.All( + probatio.All( { - vol.Required(CONF_NODE): cv.string, - vol.Required(CONF_XPATH): cv.string, - vol.Optional(CONF_DIMMABLE, default=False): cv.boolean, + probatio.Required(CONF_NODE): cv.string, + probatio.Required(CONF_XPATH): cv.string, + probatio.Optional(CONF_DIMMABLE, default=False): cv.boolean, } ) ], ), - vol.Optional(CONF_SENSOR, default=[]): vol.All( + probatio.Optional(CONF_SENSOR, default=[]): probatio.All( cv.ensure_list, [ - vol.All( + probatio.All( { - vol.Required(CONF_NODE): cv.string, - vol.Required(CONF_XPATH): cv.string, - vol.Optional( + probatio.Required(CONF_NODE): cv.string, + probatio.Required(CONF_XPATH): cv.string, + probatio.Optional( CONF_UNIT_OF_MEASUREMENT, default=UnitOfTemperature.CELSIUS ): cv.string, } ) ], ), - vol.Optional(CONF_SWITCH, default=[]): vol.All( + probatio.Optional(CONF_SWITCH, default=[]): probatio.All( cv.ensure_list, [ - vol.All( + probatio.All( { - vol.Required(CONF_NODE): cv.string, - vol.Required(CONF_XPATH): cv.string, + probatio.Required(CONF_NODE): cv.string, + probatio.Required(CONF_XPATH): cv.string, } ) ], @@ -98,7 +98,7 @@ def autosetup_ihc_products(hass: HomeAssistant, config, ihc_controller, controll yaml = load_yaml_config_file(yaml_path) try: auto_setup_conf = AUTO_SETUP_SCHEMA(yaml) - except vol.Invalid as exception: + except probatio.Invalid as exception: _LOGGER.error("Invalid IHC auto setup data: %s", exception) return False diff --git a/homeassistant/components/ihc/manual_setup.py b/homeassistant/components/ihc/manual_setup.py index fd2a31f557f18..1b91ee4e36ec3 100644 --- a/homeassistant/components/ihc/manual_setup.py +++ b/homeassistant/components/ihc/manual_setup.py @@ -2,7 +2,7 @@ import logging -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import DEVICE_CLASSES_SCHEMA from homeassistant.const import ( @@ -48,59 +48,59 @@ def validate_name(config): return config -DEVICE_SCHEMA = vol.Schema( +DEVICE_SCHEMA = probatio.Schema( { - vol.Required(CONF_ID): cv.positive_int, - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_NOTE): cv.string, - vol.Optional(CONF_POSITION): cv.string, + probatio.Required(CONF_ID): cv.positive_int, + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_NOTE): cv.string, + probatio.Optional(CONF_POSITION): cv.string, } ) SWITCH_SCHEMA = DEVICE_SCHEMA.extend( { - vol.Optional(CONF_OFF_ID, default=0): cv.positive_int, - vol.Optional(CONF_ON_ID, default=0): cv.positive_int, + probatio.Optional(CONF_OFF_ID, default=0): cv.positive_int, + probatio.Optional(CONF_ON_ID, default=0): cv.positive_int, } ) BINARY_SENSOR_SCHEMA = DEVICE_SCHEMA.extend( { - vol.Optional(CONF_INVERTING, default=False): cv.boolean, - vol.Optional(CONF_TYPE): DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_INVERTING, default=False): cv.boolean, + probatio.Optional(CONF_TYPE): DEVICE_CLASSES_SCHEMA, } ) LIGHT_SCHEMA = DEVICE_SCHEMA.extend( { - vol.Optional(CONF_DIMMABLE, default=False): cv.boolean, - vol.Optional(CONF_OFF_ID, default=0): cv.positive_int, - vol.Optional(CONF_ON_ID, default=0): cv.positive_int, + probatio.Optional(CONF_DIMMABLE, default=False): cv.boolean, + probatio.Optional(CONF_OFF_ID, default=0): cv.positive_int, + probatio.Optional(CONF_ON_ID, default=0): cv.positive_int, } ) SENSOR_SCHEMA = DEVICE_SCHEMA.extend( - {vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string} + {probatio.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string} ) -IHC_SCHEMA = vol.Schema( +IHC_SCHEMA = probatio.Schema( { - vol.Required(CONF_PASSWORD): cv.string, - vol.Required(CONF_URL): cv.string, - vol.Required(CONF_USERNAME): cv.string, - vol.Optional(CONF_AUTOSETUP, default=True): cv.boolean, - vol.Optional(CONF_BINARY_SENSOR, default=[]): vol.All( - cv.ensure_list, [vol.All(BINARY_SENSOR_SCHEMA, validate_name)] + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_URL): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Optional(CONF_AUTOSETUP, default=True): cv.boolean, + probatio.Optional(CONF_BINARY_SENSOR, default=[]): probatio.All( + cv.ensure_list, [probatio.All(BINARY_SENSOR_SCHEMA, validate_name)] ), - vol.Optional(CONF_INFO, default=True): cv.boolean, - vol.Optional(CONF_LIGHT, default=[]): vol.All( - cv.ensure_list, [vol.All(LIGHT_SCHEMA, validate_name)] + probatio.Optional(CONF_INFO, default=True): cv.boolean, + probatio.Optional(CONF_LIGHT, default=[]): probatio.All( + cv.ensure_list, [probatio.All(LIGHT_SCHEMA, validate_name)] ), - vol.Optional(CONF_SENSOR, default=[]): vol.All( - cv.ensure_list, [vol.All(SENSOR_SCHEMA, validate_name)] + probatio.Optional(CONF_SENSOR, default=[]): probatio.All( + cv.ensure_list, [probatio.All(SENSOR_SCHEMA, validate_name)] ), - vol.Optional(CONF_SWITCH, default=[]): vol.All( - cv.ensure_list, [vol.All(SWITCH_SCHEMA, validate_name)] + probatio.Optional(CONF_SWITCH, default=[]): probatio.All( + cv.ensure_list, [probatio.All(SWITCH_SCHEMA, validate_name)] ), } ) diff --git a/homeassistant/components/ihc/services.py b/homeassistant/components/ihc/services.py index f6b1766e297e1..b84cd69791854 100644 --- a/homeassistant/components/ihc/services.py +++ b/homeassistant/components/ihc/services.py @@ -1,6 +1,6 @@ """Support for IHC services.""" -import voluptuous as vol +import probatio from homeassistant.core import HomeAssistant from homeassistant.helpers import config_validation as cv @@ -19,34 +19,34 @@ ) from .util import async_pulse, async_set_bool, async_set_float, async_set_int -SET_RUNTIME_VALUE_BOOL_SCHEMA = vol.Schema( +SET_RUNTIME_VALUE_BOOL_SCHEMA = probatio.Schema( { - vol.Required(ATTR_IHC_ID): cv.positive_int, - vol.Required(ATTR_VALUE): cv.boolean, - vol.Optional(ATTR_CONTROLLER_ID, default=0): cv.positive_int, + probatio.Required(ATTR_IHC_ID): cv.positive_int, + probatio.Required(ATTR_VALUE): cv.boolean, + probatio.Optional(ATTR_CONTROLLER_ID, default=0): cv.positive_int, } ) -SET_RUNTIME_VALUE_INT_SCHEMA = vol.Schema( +SET_RUNTIME_VALUE_INT_SCHEMA = probatio.Schema( { - vol.Required(ATTR_IHC_ID): cv.positive_int, - vol.Required(ATTR_VALUE): vol.Coerce(int), - vol.Optional(ATTR_CONTROLLER_ID, default=0): cv.positive_int, + probatio.Required(ATTR_IHC_ID): cv.positive_int, + probatio.Required(ATTR_VALUE): probatio.Coerce(int), + probatio.Optional(ATTR_CONTROLLER_ID, default=0): cv.positive_int, } ) -SET_RUNTIME_VALUE_FLOAT_SCHEMA = vol.Schema( +SET_RUNTIME_VALUE_FLOAT_SCHEMA = probatio.Schema( { - vol.Required(ATTR_IHC_ID): cv.positive_int, - vol.Required(ATTR_VALUE): vol.Coerce(float), - vol.Optional(ATTR_CONTROLLER_ID, default=0): cv.positive_int, + probatio.Required(ATTR_IHC_ID): cv.positive_int, + probatio.Required(ATTR_VALUE): probatio.Coerce(float), + probatio.Optional(ATTR_CONTROLLER_ID, default=0): cv.positive_int, } ) -PULSE_SCHEMA = vol.Schema( +PULSE_SCHEMA = probatio.Schema( { - vol.Required(ATTR_IHC_ID): cv.positive_int, - vol.Optional(ATTR_CONTROLLER_ID, default=0): cv.positive_int, + probatio.Required(ATTR_IHC_ID): cv.positive_int, + probatio.Optional(ATTR_CONTROLLER_ID, default=0): cv.positive_int, } ) diff --git a/homeassistant/components/image/__init__.py b/homeassistant/components/image/__init__.py index 6b4a4e8af1105..0fbbe2ebeb2ce 100644 --- a/homeassistant/components/image/__init__.py +++ b/homeassistant/components/image/__init__.py @@ -12,8 +12,8 @@ from aiohttp import hdrs, web import httpx +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.components.http import KEY_AUTHENTICATED, KEY_HASS, HomeAssistantView from homeassistant.config_entries import ConfigEntry @@ -70,7 +70,7 @@ FRAME_SEPARATOR = bytes(f"\r\n--{FRAME_BOUNDARY}\r\n", "utf-8") LAST_FRAME_MARKER = bytes(f"\r\n--{FRAME_BOUNDARY}--\r\n", "utf-8") -IMAGE_SERVICE_SNAPSHOT: VolDictType = {vol.Required(ATTR_FILENAME): cv.string} +IMAGE_SERVICE_SNAPSHOT: VolDictType = {probatio.Required(ATTR_FILENAME): cv.string} MAP_MAGIC_NUMBERS_TO_CONTENT_TYPE = { b"\x89PNG": "image/png", diff --git a/homeassistant/components/image_processing/__init__.py b/homeassistant/components/image_processing/__init__.py index 8ddcc0521de21..852b31b41eafb 100644 --- a/homeassistant/components/image_processing/__init__.py +++ b/homeassistant/components/image_processing/__init__.py @@ -6,7 +6,7 @@ import logging from typing import Any, Final, TypedDict, final, override -import voluptuous as vol +import probatio from homeassistant.components.camera import async_get_image from homeassistant.const import ( @@ -62,18 +62,18 @@ class ImageProcessingDeviceClass(StrEnum): DEFAULT_TIMEOUT = 10 DEFAULT_CONFIDENCE = 80 -SOURCE_SCHEMA = vol.Schema( +SOURCE_SCHEMA = probatio.Schema( { - vol.Required(CONF_ENTITY_ID): cv.entity_domain("camera"), - vol.Optional(CONF_NAME): cv.string, + probatio.Required(CONF_ENTITY_ID): cv.entity_domain("camera"), + probatio.Optional(CONF_NAME): cv.string, } ) PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_SOURCE): vol.All(cv.ensure_list, [SOURCE_SCHEMA]), - vol.Optional(CONF_CONFIDENCE, default=DEFAULT_CONFIDENCE): vol.All( - vol.Coerce(float), vol.Range(min=0, max=100) + probatio.Optional(CONF_SOURCE): probatio.All(cv.ensure_list, [SOURCE_SCHEMA]), + probatio.Optional(CONF_CONFIDENCE, default=DEFAULT_CONFIDENCE): probatio.All( + probatio.Coerce(float), probatio.Range(min=0, max=100) ), } ) diff --git a/homeassistant/components/image_upload/__init__.py b/homeassistant/components/image_upload/__init__.py index 166c6d4b6fcbe..e5855529babcf 100644 --- a/homeassistant/components/image_upload/__init__.py +++ b/homeassistant/components/image_upload/__init__.py @@ -10,7 +10,7 @@ from aiohttp import hdrs, web from aiohttp.web_request import FileField from PIL import Image, ImageOps, UnidentifiedImageError -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.components.http import KEY_HASS, HomeAssistantView @@ -31,11 +31,11 @@ MAX_SIZE = 1024 * 1024 * 10 CREATE_FIELDS: VolDictType = { - vol.Required("file"): FileField, + probatio.Required("file"): FileField, } UPDATE_FIELDS: VolDictType = { - vol.Optional("name"): vol.All(str, vol.Length(min=1)), + probatio.Optional("name"): probatio.All(str, probatio.Length(min=1)), } CONFIG_SCHEMA = cv.empty_config_schema(DOMAIN) @@ -62,8 +62,8 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: class ImageStorageCollection(collection.DictStorageCollection): """Image collection stored in storage.""" - CREATE_SCHEMA = vol.Schema(CREATE_FIELDS) - UPDATE_SCHEMA = vol.Schema(UPDATE_FIELDS) + CREATE_SCHEMA = probatio.Schema(CREATE_FIELDS) + UPDATE_SCHEMA = probatio.Schema(UPDATE_FIELDS) def __init__(self, hass: HomeAssistant, image_dir: pathlib.Path) -> None: """Initialize media storage collection.""" @@ -84,7 +84,7 @@ async def _process_create_data(self, data: dict[str, Any]) -> dict[str, Any]: "image/jpeg", "image/png", ): - raise vol.Invalid("Only jpeg, png, and gif images are allowed") + raise probatio.Invalid("Only jpeg, png, and gif images are allowed") data[CONF_ID] = secrets.token_hex(16) data["filesize"] = await self.hass.async_add_executor_job(self._move_data, data) @@ -103,7 +103,7 @@ def _move_data(self, data: dict[str, Any]) -> int: try: image = Image.open(uploaded_file.file) except UnidentifiedImageError as err: - raise vol.Invalid("Unable to identify image file") from err + raise probatio.Invalid("Unable to identify image file") from err # Reset content uploaded_file.file.seek(0) diff --git a/homeassistant/components/imap/__init__.py b/homeassistant/components/imap/__init__.py index 51d6d49cba17a..1cd0d37e1c6d1 100644 --- a/homeassistant/components/imap/__init__.py +++ b/homeassistant/components/imap/__init__.py @@ -6,7 +6,7 @@ from typing import Any from aioimaplib import IMAP4_SSL, AioImapException, Response -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigEntry, ConfigEntryState from homeassistant.const import EVENT_HOMEASSISTANT_STOP, Platform @@ -50,25 +50,25 @@ CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN) -_SERVICE_UID_SCHEMA = vol.Schema( +_SERVICE_UID_SCHEMA = probatio.Schema( { - vol.Required(CONF_ENTRY): cv.string, - vol.Required(CONF_UID): cv.string, + probatio.Required(CONF_ENTRY): cv.string, + probatio.Required(CONF_UID): cv.string, } ) SERVICE_SEEN_SCHEMA = _SERVICE_UID_SCHEMA SERVICE_MOVE_SCHEMA = _SERVICE_UID_SCHEMA.extend( { - vol.Optional(CONF_SEEN): cv.boolean, - vol.Required(CONF_TARGET_FOLDER): cv.string, + probatio.Optional(CONF_SEEN): cv.boolean, + probatio.Required(CONF_TARGET_FOLDER): cv.string, } ) SERVICE_DELETE_SCHEMA = _SERVICE_UID_SCHEMA SERVICE_FETCH_TEXT_SCHEMA = _SERVICE_UID_SCHEMA SERVICE_FETCH_PART_SCHEMA = _SERVICE_UID_SCHEMA.extend( { - vol.Required(CONF_PART): cv.string, + probatio.Required(CONF_PART): cv.string, } ) diff --git a/homeassistant/components/imap/config_flow.py b/homeassistant/components/imap/config_flow.py index 5467621212099..8e0bb4e247b6f 100644 --- a/homeassistant/components/imap/config_flow.py +++ b/homeassistant/components/imap/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from aioimaplib import AioImapException -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, OptionsFlow from homeassistant.const import ( @@ -65,38 +65,42 @@ ) ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Required(CONF_SERVER): str, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_CHARSET, default="utf-8"): str, - vol.Optional(CONF_FOLDER, default="INBOX"): str, - vol.Optional(CONF_SEARCH, default="UnSeen UnDeleted"): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Required(CONF_SERVER): str, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_CHARSET, default="utf-8"): str, + probatio.Optional(CONF_FOLDER, default="INBOX"): str, + probatio.Optional(CONF_SEARCH, default="UnSeen UnDeleted"): str, # The default for new entries is to not include text and headers - vol.Optional(CONF_EVENT_MESSAGE_DATA, default=[]): EVENT_MESSAGE_DATA_SELECTOR, - vol.Optional( + probatio.Optional( + CONF_EVENT_MESSAGE_DATA, default=[] + ): EVENT_MESSAGE_DATA_SELECTOR, + probatio.Optional( CONF_SSL_CIPHER_LIST, default=SSLCipherList.PYTHON_DEFAULT ): CIPHER_SELECTOR, - vol.Optional(CONF_VERIFY_SSL, default=True): BOOLEAN_SELECTOR, + probatio.Optional(CONF_VERIFY_SSL, default=True): BOOLEAN_SELECTOR, } ) -OPTIONS_SCHEMA = vol.Schema( +OPTIONS_SCHEMA = probatio.Schema( { - vol.Optional(CONF_FOLDER, default="INBOX"): str, - vol.Optional(CONF_SEARCH, default="UnSeen UnDeleted"): str, + probatio.Optional(CONF_FOLDER, default="INBOX"): str, + probatio.Optional(CONF_SEARCH, default="UnSeen UnDeleted"): str, # The default for older entries is to include text and headers - vol.Optional( + probatio.Optional( CONF_EVENT_MESSAGE_DATA, default=MESSAGE_DATA_OPTIONS ): EVENT_MESSAGE_DATA_SELECTOR, - vol.Optional(CONF_CUSTOM_EVENT_DATA_TEMPLATE): TEMPLATE_SELECTOR, - vol.Optional(CONF_MAX_MESSAGE_SIZE, default=DEFAULT_MAX_MESSAGE_SIZE): vol.All( + probatio.Optional(CONF_CUSTOM_EVENT_DATA_TEMPLATE): TEMPLATE_SELECTOR, + probatio.Optional( + CONF_MAX_MESSAGE_SIZE, default=DEFAULT_MAX_MESSAGE_SIZE + ): probatio.All( cv.positive_int, - vol.Range(min=DEFAULT_MAX_MESSAGE_SIZE, max=MAX_MESSAGE_SIZE_LIMIT), + probatio.Range(min=DEFAULT_MAX_MESSAGE_SIZE, max=MAX_MESSAGE_SIZE_LIMIT), ), - vol.Optional(CONF_ENABLE_PUSH, default=True): BOOLEAN_SELECTOR, + probatio.Optional(CONF_ENABLE_PUSH, default=True): BOOLEAN_SELECTOR, } ) @@ -191,9 +195,9 @@ async def async_step_reauth_confirm( CONF_NAME: reauth_entry.title, }, step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, diff --git a/homeassistant/components/imeon_inverter/config_flow.py b/homeassistant/components/imeon_inverter/config_flow.py index 0cfe18083de44..a0c2b7b5f91fc 100644 --- a/homeassistant/components/imeon_inverter/config_flow.py +++ b/homeassistant/components/imeon_inverter/config_flow.py @@ -5,7 +5,7 @@ from urllib.parse import urlparse from imeon_inverter_api.inverter import Inverter -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME @@ -76,16 +76,16 @@ async def async_step_user( ) host_schema: VolDictType = ( - {vol.Required(CONF_HOST): str} if not self._host else {} + {probatio.Required(CONF_HOST): str} if not self._host else {} ) return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { **host_schema, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, diff --git a/homeassistant/components/imgw_pib/config_flow.py b/homeassistant/components/imgw_pib/config_flow.py index fc3114ac38332..ea3d8dc499fb6 100644 --- a/homeassistant/components/imgw_pib/config_flow.py +++ b/homeassistant/components/imgw_pib/config_flow.py @@ -6,7 +6,7 @@ from aiohttp import ClientError from imgw_pib import ImgwPib from imgw_pib.exceptions import ApiError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.helpers.aiohttp_client import async_get_clientsession @@ -69,9 +69,9 @@ async def async_step_user( for station_id, station_name in imgwpib.hydrological_stations.items() ] - schema: vol.Schema = vol.Schema( + schema: probatio.Schema = probatio.Schema( { - vol.Required(CONF_STATION_ID): SelectSelector( + probatio.Required(CONF_STATION_ID): SelectSelector( SelectSelectorConfig( options=options, multiple=False, diff --git a/homeassistant/components/immich/config_flow.py b/homeassistant/components/immich/config_flow.py index 5c83cb88e14c5..516fa2d410624 100644 --- a/homeassistant/components/immich/config_flow.py +++ b/homeassistant/components/immich/config_flow.py @@ -8,7 +8,7 @@ from aioimmich.const import CONNECT_ERRORS from aioimmich.exceptions import ImmichUnauthorizedError from aioimmich.users.models import ImmichUser -import voluptuous as vol +import probatio from yarl import URL from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -38,15 +38,15 @@ class InvalidUrl(HomeAssistantError): _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_URL): TextSelector( + probatio.Required(CONF_URL): TextSelector( config=TextSelectorConfig(type=TextSelectorType.URL) ), - vol.Required(CONF_API_KEY): TextSelector( + probatio.Required(CONF_API_KEY): TextSelector( config=TextSelectorConfig(type=TextSelectorType.PASSWORD) ), - vol.Required(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): bool, + probatio.Required(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): bool, } ) @@ -168,7 +168,7 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema({vol.Required(CONF_API_KEY): str}), + data_schema=probatio.Schema({probatio.Required(CONF_API_KEY): str}), description_placeholders={"name": self._name}, errors=errors, ) @@ -223,12 +223,12 @@ async def async_step_reconfigure( return self.async_show_form( step_id="reconfigure", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_URL, default=url): TextSelector( + probatio.Required(CONF_URL, default=url): TextSelector( config=TextSelectorConfig(type=TextSelectorType.URL) ), - vol.Required(CONF_VERIFY_SSL, default=verify_ssl): bool, + probatio.Required(CONF_VERIFY_SSL, default=verify_ssl): bool, } ), errors=errors, diff --git a/homeassistant/components/immich/services.py b/homeassistant/components/immich/services.py index d38b605dc24c0..32bfe0870f990 100644 --- a/homeassistant/components/immich/services.py +++ b/homeassistant/components/immich/services.py @@ -3,7 +3,7 @@ import logging from aioimmich.exceptions import ImmichError -import voluptuous as vol +import probatio from homeassistant.components.media_source import async_resolve_media from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -21,11 +21,11 @@ CONF_FILE = "file" SERVICE_UPLOAD_FILE = "upload_file" -SERVICE_SCHEMA_UPLOAD_FILE = vol.Schema( +SERVICE_SCHEMA_UPLOAD_FILE = probatio.Schema( { - vol.Required(CONF_CONFIG_ENTRY_ID): str, - vol.Required(CONF_FILE): MediaSelector({"accept": ["image/*", "video/*"]}), - vol.Optional(CONF_ALBUM_ID): str, + probatio.Required(CONF_CONFIG_ENTRY_ID): str, + probatio.Required(CONF_FILE): MediaSelector({"accept": ["image/*", "video/*"]}), + probatio.Optional(CONF_ALBUM_ID): str, } ) diff --git a/homeassistant/components/imou/config_flow.py b/homeassistant/components/imou/config_flow.py index 8eddc540357d0..383d05196816f 100644 --- a/homeassistant/components/imou/config_flow.py +++ b/homeassistant/components/imou/config_flow.py @@ -4,6 +4,7 @@ import logging from typing import Any, override +import probatio from pyimouapi.exceptions import ( ConnectFailedException, ImouException, @@ -11,7 +12,6 @@ RequestFailedException, ) from pyimouapi.openapi import ImouOpenApiClient -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.helpers.selector import ( @@ -27,9 +27,9 @@ _LOGGER = logging.getLogger(__name__) -REAUTH_SCHEMA = vol.Schema( +REAUTH_SCHEMA = probatio.Schema( { - vol.Required(CONF_APP_SECRET): TextSelector( + probatio.Required(CONF_APP_SECRET): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", @@ -86,11 +86,11 @@ async def async_step_user( ) return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_APP_ID): str, - vol.Required(CONF_APP_SECRET): str, - vol.Required(CONF_API_URL, default="sg"): SelectSelector( + probatio.Required(CONF_APP_ID): str, + probatio.Required(CONF_APP_SECRET): str, + probatio.Required(CONF_API_URL, default="sg"): SelectSelector( SelectSelectorConfig( options=list(API_URLS), translation_key="api_url", diff --git a/homeassistant/components/improv_ble/config_flow.py b/homeassistant/components/improv_ble/config_flow.py index 0c48427f7d620..2746c091f6bf0 100644 --- a/homeassistant/components/improv_ble/config_flow.py +++ b/homeassistant/components/improv_ble/config_flow.py @@ -17,7 +17,7 @@ device_filter, errors as improv_ble_errors, ) -import voluptuous as vol +import probatio from homeassistant.components import bluetooth from homeassistant.config_entries import ( @@ -36,10 +36,10 @@ _LOGGER = logging.getLogger(__name__) -STEP_PROVISION_SCHEMA = vol.Schema( +STEP_PROVISION_SCHEMA = probatio.Schema( { - vol.Required("ssid"): str, - vol.Optional("password"): str, + probatio.Required("ssid"): str, + probatio.Optional("password"): str, } ) @@ -100,9 +100,9 @@ async def async_step_user( if not self._discovered_devices: return self.async_abort(reason="no_devices_found") - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_ADDRESS): vol.In( + probatio.Required(CONF_ADDRESS): probatio.In( { service_info.address: ( f"{service_info.name} ({service_info.address})" diff --git a/homeassistant/components/incomfort/config_flow.py b/homeassistant/components/incomfort/config_flow.py index 0c39db2b92362..42f27eeaa1862 100644 --- a/homeassistant/components/incomfort/config_flow.py +++ b/homeassistant/components/incomfort/config_flow.py @@ -9,7 +9,7 @@ InvalidGateway, InvalidHeaterList, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_RECONFIGURE, @@ -38,43 +38,43 @@ _LOGGER = logging.getLogger(__name__) TITLE = "Intergas InComfort/Intouch Lan2RF gateway" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): TextSelector( + probatio.Required(CONF_HOST): TextSelector( TextSelectorConfig(type=TextSelectorType.TEXT) ), - vol.Optional(CONF_USERNAME): TextSelector( + probatio.Optional(CONF_USERNAME): TextSelector( TextSelectorConfig(type=TextSelectorType.TEXT, autocomplete="admin") ), - vol.Optional(CONF_PASSWORD): TextSelector( + probatio.Optional(CONF_PASSWORD): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } ) -DHCP_CONFIG_SCHEMA = vol.Schema( +DHCP_CONFIG_SCHEMA = probatio.Schema( { - vol.Optional(CONF_USERNAME): TextSelector( + probatio.Optional(CONF_USERNAME): TextSelector( TextSelectorConfig(type=TextSelectorType.TEXT, autocomplete="admin") ), - vol.Optional(CONF_PASSWORD): TextSelector( + probatio.Optional(CONF_PASSWORD): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } ) -REAUTH_SCHEMA = vol.Schema( +REAUTH_SCHEMA = probatio.Schema( { - vol.Optional(CONF_PASSWORD): TextSelector( + probatio.Optional(CONF_PASSWORD): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } ) -OPTIONS_SCHEMA = vol.Schema( +OPTIONS_SCHEMA = probatio.Schema( { - vol.Optional(CONF_LEGACY_SETPOINT_STATUS, default=False): BooleanSelector( + probatio.Optional(CONF_LEGACY_SETPOINT_STATUS, default=False): BooleanSelector( BooleanSelectorConfig() ) } @@ -166,7 +166,7 @@ async def async_step_dhcp_auth( ) -> ConfigFlowResult: """Handle the initial set up via DHCP.""" errors: dict[str, str] | None = None - data_schema: vol.Schema = DHCP_CONFIG_SCHEMA + data_schema: probatio.Schema = DHCP_CONFIG_SCHEMA if user_input is not None: user_input[CONF_HOST] = self._discovered_host if ( @@ -188,7 +188,7 @@ async def async_step_user( ) -> ConfigFlowResult: """Handle the initial step.""" errors: dict[str, str] | None = None - data_schema: vol.Schema = CONFIG_SCHEMA + data_schema: probatio.Schema = CONFIG_SCHEMA if is_reconfigure := (self.source == SOURCE_RECONFIGURE): reconfigure_entry = self._get_reconfigure_entry() data_schema = self.add_suggested_values_to_schema( diff --git a/homeassistant/components/indevolt/config_flow.py b/homeassistant/components/indevolt/config_flow.py index 4824fdf975b76..9fa9f8399ea89 100644 --- a/homeassistant/components/indevolt/config_flow.py +++ b/homeassistant/components/indevolt/config_flow.py @@ -5,7 +5,7 @@ from aiohttp import ClientError from indevolt_api import IndevoltAPI -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_MODEL @@ -57,7 +57,7 @@ async def async_step_user( # Retrieve user input return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_HOST): str}), + data_schema=probatio.Schema({probatio.Required(CONF_HOST): str}), errors=errors, ) @@ -87,7 +87,7 @@ async def async_step_reconfigure( return self.async_show_form( step_id="reconfigure", data_schema=self.add_suggested_values_to_schema( - vol.Schema({vol.Required(CONF_HOST): str}), + probatio.Schema({probatio.Required(CONF_HOST): str}), reconfigure_entry.data, ), errors=errors, diff --git a/homeassistant/components/indevolt/services.py b/homeassistant/components/indevolt/services.py index f94c6da499c56..209d02fc32965 100644 --- a/homeassistant/components/indevolt/services.py +++ b/homeassistant/components/indevolt/services.py @@ -8,7 +8,7 @@ PowerExceedsMaxError, SocBelowMinimumError, ) -import voluptuous as vol +import probatio from homeassistant.core import HomeAssistant, ServiceCall, callback from homeassistant.exceptions import HomeAssistantError, ServiceValidationError @@ -18,19 +18,19 @@ from .const import DOMAIN from .coordinator import IndevoltCoordinator -RT_ACTION_SERVICE_SCHEMA: Final = vol.Schema( +RT_ACTION_SERVICE_SCHEMA: Final = probatio.Schema( { - vol.Required("device_id"): vol.All( + probatio.Required("device_id"): probatio.All( cv.ensure_list, [cv.string], ), - vol.Required("target_soc"): vol.All( - vol.Coerce(int), - vol.Range(min=0, max=100), + probatio.Required("target_soc"): probatio.All( + probatio.Coerce(int), + probatio.Range(min=0, max=100), ), - vol.Required("power"): vol.All( - vol.Coerce(int), - vol.Range(min=0, max=10800), + probatio.Required("power"): probatio.All( + probatio.Coerce(int), + probatio.Range(min=0, max=10800), ), } ) diff --git a/homeassistant/components/influxdb/__init__.py b/homeassistant/components/influxdb/__init__.py index fb11066fbb097..bcab3ad323809 100644 --- a/homeassistant/components/influxdb/__init__.py +++ b/homeassistant/components/influxdb/__init__.py @@ -14,9 +14,9 @@ from influxdb_client import InfluxDBClient as InfluxDBClientV2 from influxdb_client.client.write_api import ASYNCHRONOUS, SYNCHRONOUS from influxdb_client.rest import ApiException +import probatio import requests.exceptions import urllib3.exceptions -import voluptuous as vol from homeassistant import config as conf_util from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry @@ -140,19 +140,19 @@ def validate_version_specific_config(conf: dict) -> dict: """Ensure correct config fields are provided based on API version used.""" if conf.get(CONF_API_VERSION, DEFAULT_API_VERSION) == API_VERSION_2: if CONF_TOKEN not in conf: - raise vol.Invalid( + raise probatio.Invalid( f"{CONF_TOKEN} and {CONF_BUCKET} are required when" f" {CONF_API_VERSION} is {API_VERSION_2}" ) if CONF_USERNAME in conf: - raise vol.Invalid( + raise probatio.Invalid( f"{CONF_USERNAME} and {CONF_PASSWORD} are only allowed when" f" {CONF_API_VERSION} is {DEFAULT_API_VERSION}" ) elif CONF_TOKEN in conf: - raise vol.Invalid( + raise probatio.Invalid( f"{CONF_TOKEN} and {CONF_BUCKET} are only allowed when" f" {CONF_API_VERSION} is {API_VERSION_2}" ) @@ -160,35 +160,39 @@ def validate_version_specific_config(conf: dict) -> dict: return conf -_CUSTOMIZE_ENTITY_SCHEMA = vol.Schema( +_CUSTOMIZE_ENTITY_SCHEMA = probatio.Schema( { - vol.Optional(CONF_OVERRIDE_MEASUREMENT): cv.string, - vol.Optional(CONF_IGNORE_ATTRIBUTES): vol.All(cv.ensure_list, [cv.string]), + probatio.Optional(CONF_OVERRIDE_MEASUREMENT): cv.string, + probatio.Optional(CONF_IGNORE_ATTRIBUTES): probatio.All( + cv.ensure_list, [cv.string] + ), } ) _INFLUX_BASE_SCHEMA = INCLUDE_EXCLUDE_BASE_FILTER_SCHEMA.extend( { - vol.Optional(CONF_RETRY_COUNT, default=0): cv.positive_int, - vol.Optional(CONF_DEFAULT_MEASUREMENT): cv.string, - vol.Optional(CONF_MEASUREMENT_ATTR, default=DEFAULT_MEASUREMENT_ATTR): vol.In( - ["unit_of_measurement", "domain__device_class", "entity_id"] + probatio.Optional(CONF_RETRY_COUNT, default=0): cv.positive_int, + probatio.Optional(CONF_DEFAULT_MEASUREMENT): cv.string, + probatio.Optional( + CONF_MEASUREMENT_ATTR, default=DEFAULT_MEASUREMENT_ATTR + ): probatio.In(["unit_of_measurement", "domain__device_class", "entity_id"]), + probatio.Optional(CONF_OVERRIDE_MEASUREMENT): cv.string, + probatio.Optional(CONF_TAGS, default={}): probatio.Schema( + {cv.string: cv.string} ), - vol.Optional(CONF_OVERRIDE_MEASUREMENT): cv.string, - vol.Optional(CONF_TAGS, default={}): vol.Schema({cv.string: cv.string}), - vol.Optional(CONF_TAGS_ATTRIBUTES, default=[]): vol.All( + probatio.Optional(CONF_TAGS_ATTRIBUTES, default=[]): probatio.All( cv.ensure_list, [cv.string] ), - vol.Optional(CONF_IGNORE_ATTRIBUTES, default=[]): vol.All( + probatio.Optional(CONF_IGNORE_ATTRIBUTES, default=[]): probatio.All( cv.ensure_list, [cv.string] ), - vol.Optional(CONF_COMPONENT_CONFIG, default={}): vol.Schema( + probatio.Optional(CONF_COMPONENT_CONFIG, default={}): probatio.Schema( {cv.entity_id: _CUSTOMIZE_ENTITY_SCHEMA} ), - vol.Optional(CONF_COMPONENT_CONFIG_GLOB, default={}): vol.Schema( + probatio.Optional(CONF_COMPONENT_CONFIG_GLOB, default={}): probatio.Schema( {cv.string: _CUSTOMIZE_ENTITY_SCHEMA} ), - vol.Optional(CONF_COMPONENT_CONFIG_DOMAIN, default={}): vol.Schema( + probatio.Optional(CONF_COMPONENT_CONFIG_DOMAIN, default={}): probatio.Schema( {cv.string: _CUSTOMIZE_ENTITY_SCHEMA} ), } @@ -199,9 +203,9 @@ def validate_version_specific_config(conf: dict) -> dict: ) -CONFIG_SCHEMA = vol.Schema( - {DOMAIN: vol.All(INFLUX_SCHEMA, validate_version_specific_config)}, - extra=vol.ALLOW_EXTRA, +CONFIG_SCHEMA = probatio.Schema( + {DOMAIN: probatio.All(INFLUX_SCHEMA, validate_version_specific_config)}, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/influxdb/config_flow.py b/homeassistant/components/influxdb/config_flow.py index 7246c325dd23a..8dddefc847b24 100644 --- a/homeassistant/components/influxdb/config_flow.py +++ b/homeassistant/components/influxdb/config_flow.py @@ -5,7 +5,7 @@ import shutil from typing import Any, override -import voluptuous as vol +import probatio from yarl import URL from homeassistant.components.file_upload import process_uploaded_file @@ -49,9 +49,9 @@ _LOGGER = logging.getLogger(__name__) -INFLUXDB_V1_SCHEMA = vol.Schema( +INFLUXDB_V1_SCHEMA = probatio.Schema( { - vol.Required( + probatio.Required( CONF_URL, default=f"http://{DEFAULT_HOST}:{DEFAULT_PORT}" ): TextSelector( TextSelectorConfig( @@ -59,55 +59,55 @@ autocomplete="url", ), ), - vol.Required(CONF_VERIFY_SSL, default=False): bool, - vol.Required(CONF_DB_NAME): TextSelector( + probatio.Required(CONF_VERIFY_SSL, default=False): bool, + probatio.Required(CONF_DB_NAME): TextSelector( TextSelectorConfig( type=TextSelectorType.TEXT, ), ), - vol.Optional(CONF_USERNAME): TextSelector( + probatio.Optional(CONF_USERNAME): TextSelector( TextSelectorConfig( type=TextSelectorType.TEXT, autocomplete="username", ), ), - vol.Optional(CONF_PASSWORD): TextSelector( + probatio.Optional(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", ), ), - vol.Optional(CONF_SSL_CA_CERT): FileSelector( + probatio.Optional(CONF_SSL_CA_CERT): FileSelector( FileSelectorConfig(accept=".pem,.crt,.cer,.der") ), } ) -INFLUXDB_V2_SCHEMA = vol.Schema( +INFLUXDB_V2_SCHEMA = probatio.Schema( { - vol.Required(CONF_URL, default="https://"): TextSelector( + probatio.Required(CONF_URL, default="https://"): TextSelector( TextSelectorConfig( type=TextSelectorType.URL, autocomplete="url", ), ), - vol.Required(CONF_VERIFY_SSL, default=False): bool, - vol.Required(CONF_ORG): TextSelector( + probatio.Required(CONF_VERIFY_SSL, default=False): bool, + probatio.Required(CONF_ORG): TextSelector( TextSelectorConfig( type=TextSelectorType.TEXT, ), ), - vol.Required(CONF_BUCKET): TextSelector( + probatio.Required(CONF_BUCKET): TextSelector( TextSelectorConfig( type=TextSelectorType.TEXT, ), ), - vol.Required(CONF_TOKEN): TextSelector( + probatio.Required(CONF_TOKEN): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, ), ), - vol.Optional(CONF_SSL_CA_CERT): FileSelector( + probatio.Optional(CONF_SSL_CA_CERT): FileSelector( FileSelectorConfig(accept=".pem,.crt,.cer,.der") ), } diff --git a/homeassistant/components/influxdb/const.py b/homeassistant/components/influxdb/const.py index cb3a45be38e81..c19c04aafa2de 100644 --- a/homeassistant/components/influxdb/const.py +++ b/homeassistant/components/influxdb/const.py @@ -3,7 +3,7 @@ from datetime import timedelta import re -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_API_VERSION, @@ -134,33 +134,33 @@ COMPONENT_CONFIG_SCHEMA_CONNECTION = { - vol.Optional(CONF_API_VERSION, default=DEFAULT_API_VERSION): vol.All( - vol.Coerce(str), - vol.In([DEFAULT_API_VERSION, API_VERSION_2]), + probatio.Optional(CONF_API_VERSION, default=DEFAULT_API_VERSION): probatio.All( + probatio.Coerce(str), + probatio.In([DEFAULT_API_VERSION, API_VERSION_2]), ), - vol.Optional(CONF_HOST): cv.string, - vol.Optional(CONF_PATH): cv.string, - vol.Optional(CONF_PORT): cv.port, - vol.Optional(CONF_SSL): cv.boolean, - vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, - vol.Optional(CONF_SSL_CA_CERT): cv.isfile, - vol.Optional(CONF_PRECISION): vol.In(["ms", "s", "us", "ns"]), + probatio.Optional(CONF_HOST): cv.string, + probatio.Optional(CONF_PATH): cv.string, + probatio.Optional(CONF_PORT): cv.port, + probatio.Optional(CONF_SSL): cv.boolean, + probatio.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, + probatio.Optional(CONF_SSL_CA_CERT): cv.isfile, + probatio.Optional(CONF_PRECISION): probatio.In(["ms", "s", "us", "ns"]), # Connection config for V1 API only. - vol.Inclusive(CONF_USERNAME, "authentication"): cv.string, - vol.Inclusive(CONF_PASSWORD, "authentication"): cv.string, - vol.Optional(CONF_DB_NAME, default=DEFAULT_DATABASE): cv.string, + probatio.Inclusive(CONF_USERNAME, "authentication"): cv.string, + probatio.Inclusive(CONF_PASSWORD, "authentication"): cv.string, + probatio.Optional(CONF_DB_NAME, default=DEFAULT_DATABASE): cv.string, # Connection config for V2 API only. - vol.Inclusive(CONF_TOKEN, "v2_authentication"): cv.string, - vol.Inclusive(CONF_ORG, "v2_authentication"): cv.string, - vol.Optional(CONF_BUCKET, default=DEFAULT_BUCKET): cv.string, + probatio.Inclusive(CONF_TOKEN, "v2_authentication"): cv.string, + probatio.Inclusive(CONF_ORG, "v2_authentication"): cv.string, + probatio.Optional(CONF_BUCKET, default=DEFAULT_BUCKET): cv.string, } # Same keys without defaults, used in CONFIG_SCHEMA to validate # without injecting default values (so we can detect explicit keys). COMPONENT_CONFIG_SCHEMA_CONNECTION_VALIDATORS = { ( - vol.Optional(k.schema) - if isinstance(k, vol.Optional) and k.default is not vol.UNDEFINED + probatio.Optional(k.schema) + if isinstance(k, probatio.Optional) and k.default is not probatio.UNDEFINED else k ): v for k, v in COMPONENT_CONFIG_SCHEMA_CONNECTION.items() diff --git a/homeassistant/components/influxdb/sensor.py b/homeassistant/components/influxdb/sensor.py index 3091014f8c36b..a3edb4be62cf4 100644 --- a/homeassistant/components/influxdb/sensor.py +++ b/homeassistant/components/influxdb/sensor.py @@ -4,7 +4,7 @@ import logging from typing import Final, override -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -80,7 +80,7 @@ def validate_query_format_for_version(conf: dict) -> dict: """Ensure queries are provided in correct format based on API version.""" if conf[CONF_API_VERSION] == API_VERSION_2: if CONF_QUERIES_FLUX not in conf: - raise vol.Invalid( + raise probatio.Invalid( f"{CONF_QUERIES_FLUX} is required when {CONF_API_VERSION} is" f" {API_VERSION_2}" ) @@ -93,7 +93,7 @@ def validate_query_format_for_version(conf: dict) -> dict: else: if CONF_QUERIES not in conf: - raise vol.Invalid( + raise probatio.Invalid( f"{CONF_QUERIES} is required when {CONF_API_VERSION} is" f" {DEFAULT_API_VERSION}" ) @@ -107,44 +107,48 @@ def validate_query_format_for_version(conf: dict) -> dict: return conf -_QUERY_SENSOR_SCHEMA = vol.Schema( +_QUERY_SENSOR_SCHEMA = probatio.Schema( { - vol.Required(CONF_NAME): cv.string, - vol.Optional(CONF_UNIQUE_ID): cv.string, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, - vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, + probatio.Required(CONF_NAME): cv.string, + probatio.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Optional(CONF_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, } ) _QUERY_SCHEMA = { LANGUAGE_INFLUXQL: _QUERY_SENSOR_SCHEMA.extend( { - vol.Optional(CONF_DB_NAME): cv.string, - vol.Required(CONF_MEASUREMENT_NAME): cv.string, - vol.Optional( + probatio.Optional(CONF_DB_NAME): cv.string, + probatio.Required(CONF_MEASUREMENT_NAME): cv.string, + probatio.Optional( CONF_GROUP_FUNCTION, default=DEFAULT_GROUP_FUNCTION ): cv.string, - vol.Optional(CONF_FIELD, default=DEFAULT_FIELD): cv.string, - vol.Required(CONF_WHERE): cv.template, + probatio.Optional(CONF_FIELD, default=DEFAULT_FIELD): cv.string, + probatio.Required(CONF_WHERE): cv.template, } ), LANGUAGE_FLUX: _QUERY_SENSOR_SCHEMA.extend( { - vol.Optional(CONF_BUCKET): cv.string, - vol.Optional(CONF_RANGE_START, default=DEFAULT_RANGE_START): cv.string, - vol.Optional(CONF_RANGE_STOP, default=DEFAULT_RANGE_STOP): cv.string, - vol.Required(CONF_QUERY): cv.template, - vol.Optional(CONF_IMPORTS): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(CONF_GROUP_FUNCTION): cv.string, + probatio.Optional(CONF_BUCKET): cv.string, + probatio.Optional(CONF_RANGE_START, default=DEFAULT_RANGE_START): cv.string, + probatio.Optional(CONF_RANGE_STOP, default=DEFAULT_RANGE_STOP): cv.string, + probatio.Required(CONF_QUERY): cv.template, + probatio.Optional(CONF_IMPORTS): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(CONF_GROUP_FUNCTION): cv.string, } ), } -PLATFORM_SCHEMA = vol.All( +PLATFORM_SCHEMA = probatio.All( SENSOR_PLATFORM_SCHEMA.extend(COMPONENT_CONFIG_SCHEMA_CONNECTION).extend( { - vol.Exclusive(CONF_QUERIES, "queries"): [_QUERY_SCHEMA[LANGUAGE_INFLUXQL]], - vol.Exclusive(CONF_QUERIES_FLUX, "queries"): [_QUERY_SCHEMA[LANGUAGE_FLUX]], + probatio.Exclusive(CONF_QUERIES, "queries"): [ + _QUERY_SCHEMA[LANGUAGE_INFLUXQL] + ], + probatio.Exclusive(CONF_QUERIES_FLUX, "queries"): [ + _QUERY_SCHEMA[LANGUAGE_FLUX] + ], } ), validate_version_specific_config, diff --git a/homeassistant/components/infrared/helpers.py b/homeassistant/components/infrared/helpers.py index 38698a6334707..54954dc26da53 100644 --- a/homeassistant/components/infrared/helpers.py +++ b/homeassistant/components/infrared/helpers.py @@ -6,7 +6,7 @@ from typing import override from infrared_protocols.commands import Command as InfraredCommand -import voluptuous as vol +import probatio from homeassistant.const import STATE_UNAVAILABLE from homeassistant.core import ( @@ -87,7 +87,7 @@ def async_subscribe_receiver( ent_reg = er.async_get(hass) try: entity_id = er.async_validate_entity_id(ent_reg, entity_id_or_uuid) - except vol.Invalid as err: + except probatio.Invalid as err: raise HomeAssistantError( translation_domain=DOMAIN, translation_key="receiver_not_found", diff --git a/homeassistant/components/inkbird/config_flow.py b/homeassistant/components/inkbird/config_flow.py index 940bb7e464c8b..72c87acc42024 100644 --- a/homeassistant/components/inkbird/config_flow.py +++ b/homeassistant/components/inkbird/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from inkbird_ble import INKBIRDBluetoothDeviceData as DeviceData -import voluptuous as vol +import probatio from homeassistant.components import bluetooth from homeassistant.components.bluetooth import ( @@ -95,7 +95,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_ADDRESS): vol.In(self._discovered_devices)} + data_schema=probatio.Schema( + {probatio.Required(CONF_ADDRESS): probatio.In(self._discovered_devices)} ), ) diff --git a/homeassistant/components/input_boolean/__init__.py b/homeassistant/components/input_boolean/__init__.py index 68e18e3d1d0f5..68f908dd8f580 100644 --- a/homeassistant/components/input_boolean/__init__.py +++ b/homeassistant/components/input_boolean/__init__.py @@ -3,7 +3,7 @@ import logging from typing import Any, Self, override -import voluptuous as vol +import probatio from homeassistant.const import ( # noqa: F401 ATTR_EDITABLE, @@ -34,28 +34,28 @@ CONF_INITIAL = "initial" STORAGE_FIELDS: VolDictType = { - vol.Required(CONF_NAME): vol.All(str, vol.Length(min=1)), - vol.Optional(CONF_INITIAL): cv.boolean, - vol.Optional(CONF_ICON): cv.icon, + probatio.Required(CONF_NAME): probatio.All(str, probatio.Length(min=1)), + probatio.Optional(CONF_INITIAL): cv.boolean, + probatio.Optional(CONF_ICON): cv.icon, } -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { DOMAIN: cv.schema_with_slug_keys( - vol.Any( + probatio.Any( { - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_INITIAL): cv.boolean, - vol.Optional(CONF_ICON): cv.icon, + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_INITIAL): cv.boolean, + probatio.Optional(CONF_ICON): cv.icon, }, None, ) ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -RELOAD_SERVICE_SCHEMA = vol.Schema({}) +RELOAD_SERVICE_SCHEMA = probatio.Schema({}) STORAGE_KEY = DOMAIN STORAGE_VERSION = 1 @@ -63,7 +63,7 @@ class InputBooleanStorageCollection(collection.DictStorageCollection): """Input boolean collection stored in storage.""" - CREATE_UPDATE_SCHEMA = vol.Schema(STORAGE_FIELDS) + CREATE_UPDATE_SCHEMA = probatio.Schema(STORAGE_FIELDS) @override async def _process_create_data(self, data: dict) -> dict: diff --git a/homeassistant/components/input_button/__init__.py b/homeassistant/components/input_button/__init__.py index 5eb8eac146281..40c7a6b403c73 100644 --- a/homeassistant/components/input_button/__init__.py +++ b/homeassistant/components/input_button/__init__.py @@ -3,7 +3,7 @@ import logging from typing import Self, cast, override -import voluptuous as vol +import probatio from homeassistant.components.button import SERVICE_PRESS, ButtonEntity from homeassistant.const import ( @@ -26,26 +26,26 @@ _LOGGER = logging.getLogger(__name__) STORAGE_FIELDS: VolDictType = { - vol.Required(CONF_NAME): vol.All(str, vol.Length(min=1)), - vol.Optional(CONF_ICON): cv.icon, + probatio.Required(CONF_NAME): probatio.All(str, probatio.Length(min=1)), + probatio.Optional(CONF_ICON): cv.icon, } -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { DOMAIN: cv.schema_with_slug_keys( - vol.Any( + probatio.Any( { - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_ICON): cv.icon, + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_ICON): cv.icon, }, None, ) ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -RELOAD_SERVICE_SCHEMA = vol.Schema({}) +RELOAD_SERVICE_SCHEMA = probatio.Schema({}) STORAGE_KEY = DOMAIN STORAGE_VERSION = 1 @@ -53,7 +53,7 @@ class InputButtonStorageCollection(collection.DictStorageCollection): """Input button collection stored in storage.""" - CREATE_UPDATE_SCHEMA = vol.Schema(STORAGE_FIELDS) + CREATE_UPDATE_SCHEMA = probatio.Schema(STORAGE_FIELDS) @override async def _process_create_data(self, data: dict) -> dict[str, str]: diff --git a/homeassistant/components/input_datetime/__init__.py b/homeassistant/components/input_datetime/__init__.py index 9d581badd1ac5..bb48401c91207 100644 --- a/homeassistant/components/input_datetime/__init__.py +++ b/homeassistant/components/input_datetime/__init__.py @@ -4,7 +4,7 @@ import logging from typing import Any, Self, override -import voluptuous as vol +import probatio from homeassistant.const import ( # noqa: F401 ATTR_DATE, @@ -54,7 +54,7 @@ def validate_set_datetime_attrs(config): sum([has_date_or_time_attr, ATTR_DATETIME in config, ATTR_TIMESTAMP in config]) > 1 ): - raise vol.Invalid(f"Cannot use together: {', '.join(config.keys())}") + raise probatio.Invalid(f"Cannot use together: {', '.join(config.keys())}") return config @@ -62,11 +62,11 @@ def validate_set_datetime_attrs(config): STORAGE_VERSION = 1 STORAGE_FIELDS: VolDictType = { - vol.Required(CONF_NAME): vol.All(str, vol.Length(min=1)), - vol.Optional(CONF_HAS_DATE, default=False): cv.boolean, - vol.Optional(CONF_HAS_TIME, default=False): cv.boolean, - vol.Optional(CONF_ICON): cv.icon, - vol.Optional(CONF_INITIAL): cv.string, + probatio.Required(CONF_NAME): probatio.All(str, probatio.Length(min=1)), + probatio.Optional(CONF_HAS_DATE, default=False): cv.boolean, + probatio.Optional(CONF_HAS_TIME, default=False): cv.boolean, + probatio.Optional(CONF_ICON): cv.icon, + probatio.Optional(CONF_INITIAL): cv.string, } @@ -75,7 +75,7 @@ def has_date_or_time(conf): if conf[CONF_HAS_DATE] or conf[CONF_HAS_TIME]: return conf - raise vol.Invalid("Entity needs at least a date or a time") + raise probatio.Invalid("Entity needs at least a date or a time") def valid_initial(conf: dict[str, Any]) -> dict[str, Any]: @@ -83,7 +83,7 @@ def valid_initial(conf: dict[str, Any]) -> dict[str, Any]: if not (conf.get(CONF_INITIAL)): return conf - # Ensure we can parse the initial value, raise vol.Invalid on failure + # Ensure we can parse the initial value, raise probatio.Invalid on failure parse_initial_datetime(conf) return conf @@ -95,37 +95,39 @@ def parse_initial_datetime(conf: dict[str, Any]) -> py_datetime.datetime: if conf[CONF_HAS_DATE] and conf[CONF_HAS_TIME]: if (datetime := dt_util.parse_datetime(initial)) is not None: return datetime - raise vol.Invalid(f"Initial value '{initial}' can't be parsed as a datetime") + raise probatio.Invalid( + f"Initial value '{initial}' can't be parsed as a datetime" + ) if conf[CONF_HAS_DATE]: if (date := dt_util.parse_date(initial)) is not None: return py_datetime.datetime.combine(date, DEFAULT_TIME) - raise vol.Invalid(f"Initial value '{initial}' can't be parsed as a date") + raise probatio.Invalid(f"Initial value '{initial}' can't be parsed as a date") if (time := dt_util.parse_time(initial)) is not None: return py_datetime.datetime.combine(dt_util.now().date(), time) - raise vol.Invalid(f"Initial value '{initial}' can't be parsed as a time") + raise probatio.Invalid(f"Initial value '{initial}' can't be parsed as a time") -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { DOMAIN: cv.schema_with_slug_keys( - vol.All( + probatio.All( { - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_HAS_DATE, default=False): cv.boolean, - vol.Optional(CONF_HAS_TIME, default=False): cv.boolean, - vol.Optional(CONF_ICON): cv.icon, - vol.Optional(CONF_INITIAL): cv.string, + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_HAS_DATE, default=False): cv.boolean, + probatio.Optional(CONF_HAS_TIME, default=False): cv.boolean, + probatio.Optional(CONF_ICON): cv.icon, + probatio.Optional(CONF_INITIAL): cv.string, }, has_date_or_time, valid_initial, ) ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -RELOAD_SERVICE_SCHEMA = vol.Schema({}) +RELOAD_SERVICE_SCHEMA = probatio.Schema({}) async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: @@ -175,13 +177,13 @@ async def reload_service_handler(service_call: ServiceCall) -> None: component.async_register_entity_service( "set_datetime", - vol.All( + probatio.All( cv.make_entity_service_schema( { - vol.Optional(ATTR_DATE): cv.date, - vol.Optional(ATTR_TIME): cv.time, - vol.Optional(ATTR_DATETIME): cv.datetime, - vol.Optional(ATTR_TIMESTAMP): vol.Coerce(float), + probatio.Optional(ATTR_DATE): cv.date, + probatio.Optional(ATTR_TIME): cv.time, + probatio.Optional(ATTR_DATETIME): cv.datetime, + probatio.Optional(ATTR_TIMESTAMP): probatio.Coerce(float), }, ), cv.has_at_least_one_key( @@ -198,7 +200,9 @@ async def reload_service_handler(service_call: ServiceCall) -> None: class DateTimeStorageCollection(collection.DictStorageCollection): """Input storage based collection.""" - CREATE_UPDATE_SCHEMA = vol.Schema(vol.All(STORAGE_FIELDS, has_date_or_time)) + CREATE_UPDATE_SCHEMA = probatio.Schema( + probatio.All(STORAGE_FIELDS, has_date_or_time) + ) @override async def _process_create_data(self, data: dict) -> dict: @@ -425,7 +429,7 @@ def async_set_datetime(self, date=None, time=None, datetime=None, timestamp=None time = None if not date and not time: - raise vol.Invalid("Nothing to set") + raise probatio.Invalid("Nothing to set") if not date: date = self._current_datetime.date() diff --git a/homeassistant/components/input_number/__init__.py b/homeassistant/components/input_number/__init__.py index 8558f203d12a1..1a0ad931042d2 100644 --- a/homeassistant/components/input_number/__init__.py +++ b/homeassistant/components/input_number/__init__.py @@ -4,7 +4,7 @@ import logging from typing import Any, Self, override -import voluptuous as vol +import probatio from homeassistant.components.number import NumberEntity from homeassistant.const import ( # noqa: F401 @@ -50,45 +50,51 @@ def _cv_input_number(cfg): - """Configure validation helper for input number (voluptuous).""" + """Configure validation helper for input number (probatio).""" minimum = cfg.get(CONF_MIN) maximum = cfg.get(CONF_MAX) if minimum >= maximum: - raise vol.Invalid( + raise probatio.Invalid( f"Maximum ({minimum}) is not greater than minimum ({maximum})" ) state = cfg.get(CONF_INITIAL) if state is not None and (state < minimum or state > maximum): - raise vol.Invalid(f"Initial value {state} not in range {minimum}-{maximum}") + raise probatio.Invalid( + f"Initial value {state} not in range {minimum}-{maximum}" + ) return cfg STORAGE_FIELDS: VolDictType = { - vol.Required(CONF_NAME): vol.All(str, vol.Length(min=1)), - vol.Required(CONF_MIN): vol.Coerce(float), - vol.Required(CONF_MAX): vol.Coerce(float), - vol.Optional(CONF_INITIAL): vol.Coerce(float), - vol.Optional(CONF_STEP, default=1): vol.All(vol.Coerce(float), vol.Range(min=1e-9)), - vol.Optional(CONF_ICON): cv.icon, - vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, - vol.Optional(CONF_MODE, default=MODE_SLIDER): vol.In([MODE_BOX, MODE_SLIDER]), + probatio.Required(CONF_NAME): probatio.All(str, probatio.Length(min=1)), + probatio.Required(CONF_MIN): probatio.Coerce(float), + probatio.Required(CONF_MAX): probatio.Coerce(float), + probatio.Optional(CONF_INITIAL): probatio.Coerce(float), + probatio.Optional(CONF_STEP, default=1): probatio.All( + probatio.Coerce(float), probatio.Range(min=1e-9) + ), + probatio.Optional(CONF_ICON): cv.icon, + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, + probatio.Optional(CONF_MODE, default=MODE_SLIDER): probatio.In( + [MODE_BOX, MODE_SLIDER] + ), } -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { DOMAIN: cv.schema_with_slug_keys( - vol.All( + probatio.All( { - vol.Optional(CONF_NAME): cv.string, - vol.Required(CONF_MIN): vol.Coerce(float), - vol.Required(CONF_MAX): vol.Coerce(float), - vol.Optional(CONF_INITIAL): vol.Coerce(float), - vol.Optional(CONF_STEP, default=1): vol.All( - vol.Coerce(float), vol.Range(min=1e-9) + probatio.Optional(CONF_NAME): cv.string, + probatio.Required(CONF_MIN): probatio.Coerce(float), + probatio.Required(CONF_MAX): probatio.Coerce(float), + probatio.Optional(CONF_INITIAL): probatio.Coerce(float), + probatio.Optional(CONF_STEP, default=1): probatio.All( + probatio.Coerce(float), probatio.Range(min=1e-9) ), - vol.Optional(CONF_ICON): cv.icon, - vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, - vol.Optional(CONF_MODE, default=MODE_SLIDER): vol.In( + probatio.Optional(CONF_ICON): cv.icon, + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, + probatio.Optional(CONF_MODE, default=MODE_SLIDER): probatio.In( [MODE_BOX, MODE_SLIDER] ), }, @@ -96,9 +102,9 @@ def _cv_input_number(cfg): ) ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -RELOAD_SERVICE_SCHEMA = vol.Schema({}) +RELOAD_SERVICE_SCHEMA = probatio.Schema({}) STORAGE_KEY = DOMAIN STORAGE_VERSION = 1 @@ -150,7 +156,7 @@ async def reload_service_handler(service_call: ServiceCall) -> None: component.async_register_entity_service( SERVICE_SET_VALUE, - {vol.Required(ATTR_VALUE): vol.Coerce(float)}, + {probatio.Required(ATTR_VALUE): probatio.Coerce(float)}, "async_set_native_value", ) @@ -164,7 +170,7 @@ async def reload_service_handler(service_call: ServiceCall) -> None: class NumberStorageCollection(collection.DictStorageCollection): """Input storage based collection.""" - SCHEMA = vol.Schema(vol.All(STORAGE_FIELDS, _cv_input_number)) + SCHEMA = probatio.Schema(probatio.All(STORAGE_FIELDS, _cv_input_number)) @override async def _process_create_data(self, data: dict) -> dict: @@ -280,7 +286,7 @@ async def async_set_native_value(self, value): num_value = float(value) if num_value < self.native_min_value or num_value > self.native_max_value: - raise vol.Invalid( + raise probatio.Invalid( f"Invalid value for {self.entity_id}: {value} (range " f"{self.native_min_value} - {self.native_max_value})" ) diff --git a/homeassistant/components/input_number/reproduce_state.py b/homeassistant/components/input_number/reproduce_state.py index f82490d255593..ad58ddf2ed258 100644 --- a/homeassistant/components/input_number/reproduce_state.py +++ b/homeassistant/components/input_number/reproduce_state.py @@ -5,7 +5,7 @@ import logging from typing import Any -import voluptuous as vol +import probatio from homeassistant.const import ATTR_ENTITY_ID from homeassistant.core import Context, HomeAssistant, State @@ -46,7 +46,7 @@ async def _async_reproduce_state( await hass.services.async_call( DOMAIN, service, service_data, context=context, blocking=True ) - except vol.Invalid as err: + except probatio.Invalid as err: # If value out of range. _LOGGER.warning("Unable to reproduce state for %s: %s", state.entity_id, err) diff --git a/homeassistant/components/input_select/__init__.py b/homeassistant/components/input_select/__init__.py index ac220c1a24b64..7e6f503331198 100644 --- a/homeassistant/components/input_select/__init__.py +++ b/homeassistant/components/input_select/__init__.py @@ -3,7 +3,7 @@ import logging from typing import Any, Self, cast, override -import voluptuous as vol +import probatio from homeassistant.components.select import ( ATTR_CYCLE, @@ -50,18 +50,18 @@ def _unique(options: Any) -> Any: try: - return vol.Unique()(options) - except vol.Invalid as exc: + return probatio.Unique()(options) + except probatio.Invalid as exc: raise HomeAssistantError("Duplicate options are not allowed") from exc STORAGE_FIELDS: VolDictType = { - vol.Required(CONF_NAME): vol.All(str, vol.Length(min=1)), - vol.Required(CONF_OPTIONS): vol.All( - cv.ensure_list, vol.Length(min=1), _unique, [cv.string] + probatio.Required(CONF_NAME): probatio.All(str, probatio.Length(min=1)), + probatio.Required(CONF_OPTIONS): probatio.All( + cv.ensure_list, probatio.Length(min=1), _unique, [cv.string] ), - vol.Optional(CONF_INITIAL): cv.string, - vol.Optional(CONF_ICON): cv.icon, + probatio.Optional(CONF_INITIAL): cv.string, + probatio.Optional(CONF_ICON): cv.icon, } @@ -83,36 +83,36 @@ def _remove_duplicates(options: list[str], name: str | None) -> list[str]: def _cv_input_select(cfg: dict[str, Any]) -> dict[str, Any]: - """Configure validation helper for input select (voluptuous).""" + """Configure validation helper for input select (probatio).""" options = cfg[CONF_OPTIONS] initial = cfg.get(CONF_INITIAL) if initial is not None and initial not in options: - raise vol.Invalid( + raise probatio.Invalid( f"initial state {initial} is not part of the options: {','.join(options)}" ) cfg[CONF_OPTIONS] = _remove_duplicates(options, cfg.get(CONF_NAME)) return cfg -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { DOMAIN: cv.schema_with_slug_keys( - vol.All( + probatio.All( { - vol.Optional(CONF_NAME): cv.string, - vol.Required(CONF_OPTIONS): vol.All( - cv.ensure_list, vol.Length(min=1), [cv.string] + probatio.Optional(CONF_NAME): cv.string, + probatio.Required(CONF_OPTIONS): probatio.All( + cv.ensure_list, probatio.Length(min=1), [cv.string] ), - vol.Optional(CONF_INITIAL): cv.string, - vol.Optional(CONF_ICON): cv.icon, + probatio.Optional(CONF_INITIAL): cv.string, + probatio.Optional(CONF_ICON): cv.icon, }, _cv_input_select, ) ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -RELOAD_SERVICE_SCHEMA = vol.Schema({}) +RELOAD_SERVICE_SCHEMA = probatio.Schema({}) class InputSelectStore(Store): @@ -194,27 +194,27 @@ async def reload_service_handler(service_call: ServiceCall) -> None: component.async_register_entity_service( SERVICE_SELECT_NEXT, - {vol.Optional(ATTR_CYCLE, default=True): bool}, + {probatio.Optional(ATTR_CYCLE, default=True): bool}, InputSelect.async_next.__name__, ) component.async_register_entity_service( SERVICE_SELECT_OPTION, - {vol.Required(ATTR_OPTION): cv.string}, + {probatio.Required(ATTR_OPTION): cv.string}, InputSelect.async_select_option.__name__, ) component.async_register_entity_service( SERVICE_SELECT_PREVIOUS, - {vol.Optional(ATTR_CYCLE, default=True): bool}, + {probatio.Optional(ATTR_CYCLE, default=True): bool}, InputSelect.async_previous.__name__, ) component.async_register_entity_service( SERVICE_SET_OPTIONS, { - vol.Required(ATTR_OPTIONS): vol.All( - cv.ensure_list, vol.Length(min=1), [cv.string] + probatio.Required(ATTR_OPTIONS): probatio.All( + cv.ensure_list, probatio.Length(min=1), [cv.string] ) }, "async_set_options", @@ -226,7 +226,9 @@ async def reload_service_handler(service_call: ServiceCall) -> None: class InputSelectStorageCollection(collection.DictStorageCollection): """Input storage based collection.""" - CREATE_UPDATE_SCHEMA = vol.Schema(vol.All(STORAGE_FIELDS, _cv_input_select)) + CREATE_UPDATE_SCHEMA = probatio.Schema( + probatio.All(STORAGE_FIELDS, _cv_input_select) + ) @override async def _process_create_data(self, data: dict[str, Any]) -> dict[str, Any]: diff --git a/homeassistant/components/input_text/__init__.py b/homeassistant/components/input_text/__init__.py index 577f703c3a3a3..85edc76650255 100644 --- a/homeassistant/components/input_text/__init__.py +++ b/homeassistant/components/input_text/__init__.py @@ -3,7 +3,7 @@ import logging from typing import Any, Self, override -import voluptuous as vol +import probatio from homeassistant.components.text import TextEntity from homeassistant.const import ( # noqa: F401 @@ -51,55 +51,57 @@ STORAGE_VERSION = 1 STORAGE_FIELDS: VolDictType = { - vol.Required(CONF_NAME): vol.All(str, vol.Length(min=1)), - vol.Optional(CONF_MIN, default=CONF_MIN_VALUE): vol.All( - vol.Coerce(int), vol.Range(0, MAX_LENGTH_STATE_STATE) + probatio.Required(CONF_NAME): probatio.All(str, probatio.Length(min=1)), + probatio.Optional(CONF_MIN, default=CONF_MIN_VALUE): probatio.All( + probatio.Coerce(int), probatio.Range(0, MAX_LENGTH_STATE_STATE) ), - vol.Optional(CONF_MAX, default=CONF_MAX_VALUE): vol.All( - vol.Coerce(int), vol.Range(1, MAX_LENGTH_STATE_STATE) + probatio.Optional(CONF_MAX, default=CONF_MAX_VALUE): probatio.All( + probatio.Coerce(int), probatio.Range(1, MAX_LENGTH_STATE_STATE) + ), + probatio.Optional(CONF_INITIAL, ""): cv.string, + probatio.Optional(CONF_ICON): cv.icon, + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, + probatio.Optional(CONF_PATTERN): cv.string, + probatio.Optional(CONF_MODE, default=MODE_TEXT): probatio.In( + [MODE_TEXT, MODE_PASSWORD] ), - vol.Optional(CONF_INITIAL, ""): cv.string, - vol.Optional(CONF_ICON): cv.icon, - vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, - vol.Optional(CONF_PATTERN): cv.string, - vol.Optional(CONF_MODE, default=MODE_TEXT): vol.In([MODE_TEXT, MODE_PASSWORD]), } def _cv_input_text(config: dict[str, Any]) -> dict[str, Any]: - """Configure validation helper for input box (voluptuous).""" + """Configure validation helper for input box (probatio).""" minimum: int = config[CONF_MIN] maximum: int = config[CONF_MAX] if minimum > maximum: - raise vol.Invalid( + raise probatio.Invalid( f"Max len ({minimum}) is not greater than min len ({maximum})" ) state: str | None = config.get(CONF_INITIAL) if state is not None and (len(state) < minimum or len(state) > maximum): - raise vol.Invalid( + raise probatio.Invalid( f"Initial value {state} length not in range {minimum}-{maximum}" ) return config -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { DOMAIN: cv.schema_with_slug_keys( - vol.All( + probatio.All( lambda value: value or {}, { - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_MIN, default=CONF_MIN_VALUE): vol.All( - vol.Coerce(int), vol.Range(0, MAX_LENGTH_STATE_STATE) + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_MIN, default=CONF_MIN_VALUE): probatio.All( + probatio.Coerce(int), probatio.Range(0, MAX_LENGTH_STATE_STATE) ), - vol.Optional(CONF_MAX, default=CONF_MAX_VALUE): vol.All( - vol.Coerce(int), vol.Range(1, MAX_LENGTH_STATE_STATE) + probatio.Optional(CONF_MAX, default=CONF_MAX_VALUE): probatio.All( + probatio.Coerce(int), probatio.Range(1, MAX_LENGTH_STATE_STATE) ), - vol.Optional(CONF_INITIAL): cv.string, - vol.Optional(CONF_ICON): cv.icon, - vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, - vol.Optional(CONF_PATTERN): cv.string, - vol.Optional(CONF_MODE, default=MODE_TEXT): vol.In( + probatio.Optional(CONF_INITIAL): cv.string, + probatio.Optional(CONF_ICON): cv.icon, + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, + probatio.Optional(CONF_PATTERN): cv.string, + probatio.Optional(CONF_MODE, default=MODE_TEXT): probatio.In( [MODE_TEXT, MODE_PASSWORD] ), }, @@ -107,9 +109,9 @@ def _cv_input_text(config: dict[str, Any]) -> dict[str, Any]: ), ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -RELOAD_SERVICE_SCHEMA = vol.Schema({}) +RELOAD_SERVICE_SCHEMA = probatio.Schema({}) async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: @@ -158,7 +160,7 @@ async def reload_service_handler(service_call: ServiceCall) -> None: ) component.async_register_entity_service( - SERVICE_SET_VALUE, {vol.Required(ATTR_VALUE): cv.string}, "async_set_value" + SERVICE_SET_VALUE, {probatio.Required(ATTR_VALUE): cv.string}, "async_set_value" ) return True @@ -167,7 +169,7 @@ async def reload_service_handler(service_call: ServiceCall) -> None: class InputTextStorageCollection(collection.DictStorageCollection): """Input storage based collection.""" - CREATE_UPDATE_SCHEMA = vol.Schema(vol.All(STORAGE_FIELDS, _cv_input_text)) + CREATE_UPDATE_SCHEMA = probatio.Schema(probatio.All(STORAGE_FIELDS, _cv_input_text)) @override async def _process_create_data(self, data: dict[str, Any]) -> dict[str, Any]: diff --git a/homeassistant/components/insteon/api/aldb.py b/homeassistant/components/insteon/api/aldb.py index 759172329c8fd..b8fab130cee6d 100644 --- a/homeassistant/components/insteon/api/aldb.py +++ b/homeassistant/components/insteon/api/aldb.py @@ -2,9 +2,9 @@ from typing import Any +import probatio from pyinsteon import devices from pyinsteon.constants import ALDBStatus -import voluptuous as vol from homeassistant.components import websocket_api from homeassistant.core import HomeAssistant, callback @@ -16,19 +16,19 @@ from .device import notify_device_not_found ALDB_RECORD = "record" -ALDB_RECORD_SCHEMA = vol.Schema( +ALDB_RECORD_SCHEMA = probatio.Schema( { - vol.Required("mem_addr"): int, - vol.Required("in_use"): bool, - vol.Required("group"): vol.Range(0, 255), - vol.Required("is_controller"): bool, - vol.Optional("highwater"): bool, - vol.Required("target"): str, - vol.Optional("target_name"): str, - vol.Required("data1"): vol.Range(0, 255), - vol.Required("data2"): vol.Range(0, 255), - vol.Required("data3"): vol.Range(0, 255), - vol.Optional("dirty"): bool, + probatio.Required("mem_addr"): int, + probatio.Required("in_use"): bool, + probatio.Required("group"): probatio.Range(0, 255), + probatio.Required("is_controller"): bool, + probatio.Optional("highwater"): bool, + probatio.Required("target"): str, + probatio.Optional("target_name"): str, + probatio.Required("data1"): probatio.Range(0, 255), + probatio.Required("data2"): probatio.Range(0, 255), + probatio.Required("data3"): probatio.Range(0, 255), + probatio.Optional("dirty"): bool, } ) @@ -71,7 +71,10 @@ def any_aldb_loading() -> bool: @websocket_api.websocket_command( - {vol.Required(TYPE): "insteon/aldb/get", vol.Required(DEVICE_ADDRESS): str} + { + probatio.Required(TYPE): "insteon/aldb/get", + probatio.Required(DEVICE_ADDRESS): str, + } ) @websocket_api.require_admin @websocket_api.async_response @@ -105,9 +108,9 @@ async def websocket_get_aldb( @websocket_api.websocket_command( { - vol.Required(TYPE): "insteon/aldb/change", - vol.Required(DEVICE_ADDRESS): str, - vol.Required(ALDB_RECORD): ALDB_RECORD_SCHEMA, + probatio.Required(TYPE): "insteon/aldb/change", + probatio.Required(DEVICE_ADDRESS): str, + probatio.Required(ALDB_RECORD): ALDB_RECORD_SCHEMA, } ) @websocket_api.require_admin @@ -138,9 +141,9 @@ async def websocket_change_aldb_record( @websocket_api.websocket_command( { - vol.Required(TYPE): "insteon/aldb/create", - vol.Required(DEVICE_ADDRESS): str, - vol.Required(ALDB_RECORD): ALDB_RECORD_SCHEMA, + probatio.Required(TYPE): "insteon/aldb/create", + probatio.Required(DEVICE_ADDRESS): str, + probatio.Required(ALDB_RECORD): ALDB_RECORD_SCHEMA, } ) @websocket_api.require_admin @@ -169,8 +172,8 @@ async def websocket_create_aldb_record( @websocket_api.websocket_command( { - vol.Required(TYPE): "insteon/aldb/write", - vol.Required(DEVICE_ADDRESS): str, + probatio.Required(TYPE): "insteon/aldb/write", + probatio.Required(DEVICE_ADDRESS): str, } ) @websocket_api.require_admin @@ -192,8 +195,8 @@ async def websocket_write_aldb( @websocket_api.websocket_command( { - vol.Required(TYPE): "insteon/aldb/load", - vol.Required(DEVICE_ADDRESS): str, + probatio.Required(TYPE): "insteon/aldb/load", + probatio.Required(DEVICE_ADDRESS): str, } ) @websocket_api.require_admin @@ -214,8 +217,8 @@ async def websocket_load_aldb( @websocket_api.websocket_command( { - vol.Required(TYPE): "insteon/aldb/reset", - vol.Required(DEVICE_ADDRESS): str, + probatio.Required(TYPE): "insteon/aldb/reset", + probatio.Required(DEVICE_ADDRESS): str, } ) @websocket_api.require_admin @@ -236,8 +239,8 @@ async def websocket_reset_aldb( @websocket_api.websocket_command( { - vol.Required(TYPE): "insteon/aldb/add_default_links", - vol.Required(DEVICE_ADDRESS): str, + probatio.Required(TYPE): "insteon/aldb/add_default_links", + probatio.Required(DEVICE_ADDRESS): str, } ) @websocket_api.require_admin @@ -260,8 +263,8 @@ async def websocket_add_default_links( @websocket_api.websocket_command( { - vol.Required(TYPE): "insteon/aldb/notify", - vol.Required(DEVICE_ADDRESS): str, + probatio.Required(TYPE): "insteon/aldb/notify", + probatio.Required(DEVICE_ADDRESS): str, } ) @websocket_api.require_admin @@ -307,7 +310,7 @@ def async_cleanup() -> None: connection.send_result(msg[ID]) -@websocket_api.websocket_command({vol.Required(TYPE): "insteon/aldb/notify_all"}) +@websocket_api.websocket_command({probatio.Required(TYPE): "insteon/aldb/notify_all"}) @websocket_api.require_admin @websocket_api.async_response async def websocket_notify_on_aldb_status_all( diff --git a/homeassistant/components/insteon/api/config.py b/homeassistant/components/insteon/api/config.py index e2a438b45c4e3..1ff522f8da38e 100644 --- a/homeassistant/components/insteon/api/config.py +++ b/homeassistant/components/insteon/api/config.py @@ -2,13 +2,12 @@ from typing import Any, TypedDict -from probatio import to_field_list +import probatio from pyinsteon import async_close, async_connect, devices from pyinsteon.address import Address from pyinsteon.aldb.aldb_record import ALDBRecord from pyinsteon.constants import LinkStatus from pyinsteon.managers.link_manager import get_broken_links -import voluptuous as vol from homeassistant.components import websocket_api from homeassistant.config_entries import ConfigEntry @@ -175,7 +174,7 @@ async def _async_connect(**kwargs): return True -@websocket_api.websocket_command({vol.Required(TYPE): "insteon/config/get"}) +@websocket_api.websocket_command({probatio.Required(TYPE): "insteon/config/get"}) @websocket_api.require_admin @websocket_api.async_response async def websocket_get_config( @@ -201,7 +200,7 @@ async def websocket_get_config( @websocket_api.websocket_command( { - vol.Required(TYPE): "insteon/config/get_modem_schema", + probatio.Required(TYPE): "insteon/config/get_modem_schema", } ) @websocket_api.require_admin @@ -216,17 +215,21 @@ async def websocket_get_modem_schema( config_data = config_entry.data if device := config_data.get(CONF_DEVICE): ports = await async_get_usb_ports(hass=hass) - plm_schema = to_field_list(build_plm_schema(ports=ports, device=device)) + plm_schema = probatio.to_field_list( + build_plm_schema(ports=ports, device=device) + ) connection.send_result(msg[ID], plm_schema) else: - hub_schema = to_field_list(build_hub_schema(**config_data)) + hub_schema = probatio.to_field_list(build_hub_schema(**config_data)) connection.send_result(msg[ID], hub_schema) @websocket_api.websocket_command( { - vol.Required(TYPE): "insteon/config/update_modem_config", - vol.Required("config"): vol.Any(PLM_SCHEMA, HUB_V2_SCHEMA, HUB_V1_SCHEMA), + probatio.Required(TYPE): "insteon/config/update_modem_config", + probatio.Required("config"): probatio.Any( + PLM_SCHEMA, HUB_V2_SCHEMA, HUB_V1_SCHEMA + ), } ) @websocket_api.require_admin @@ -259,8 +262,8 @@ async def websocket_update_modem_config( @websocket_api.websocket_command( { - vol.Required(TYPE): "insteon/config/device_override/add", - vol.Required(OVERRIDE): DEVICE_OVERRIDE_SCHEMA, + probatio.Required(TYPE): "insteon/config/device_override/add", + probatio.Required(OVERRIDE): DEVICE_OVERRIDE_SCHEMA, } ) @websocket_api.require_admin @@ -282,8 +285,8 @@ async def websocket_add_device_override( @websocket_api.websocket_command( { - vol.Required(TYPE): "insteon/config/device_override/remove", - vol.Required(DEVICE_ADDRESS): str, + probatio.Required(TYPE): "insteon/config/device_override/remove", + probatio.Required(DEVICE_ADDRESS): str, } ) @websocket_api.require_admin @@ -301,7 +304,7 @@ async def websocket_remove_device_override( @websocket_api.websocket_command( - {vol.Required(TYPE): "insteon/config/get_broken_links"} + {probatio.Required(TYPE): "insteon/config/get_broken_links"} ) @websocket_api.require_admin @websocket_api.async_response @@ -323,7 +326,7 @@ async def websocket_get_broken_links( @websocket_api.websocket_command( - {vol.Required(TYPE): "insteon/config/get_unknown_devices"} + {probatio.Required(TYPE): "insteon/config/get_unknown_devices"} ) @websocket_api.require_admin @websocket_api.async_response diff --git a/homeassistant/components/insteon/api/device.py b/homeassistant/components/insteon/api/device.py index 0588643f82c98..22c2144c143c0 100644 --- a/homeassistant/components/insteon/api/device.py +++ b/homeassistant/components/insteon/api/device.py @@ -2,10 +2,10 @@ from typing import Any +import probatio from pyinsteon import devices from pyinsteon.address import Address from pyinsteon.constants import DeviceAction -import voluptuous as vol from homeassistant.components import websocket_api from homeassistant.core import HomeAssistant, callback @@ -56,7 +56,7 @@ def notify_device_not_found(connection, msg, text): @websocket_api.websocket_command( - {vol.Required(TYPE): "insteon/device/get", vol.Required(DEVICE_ID): str} + {probatio.Required(TYPE): "insteon/device/get", probatio.Required(DEVICE_ID): str} ) @websocket_api.require_admin @websocket_api.async_response @@ -93,9 +93,9 @@ async def websocket_get_device( @websocket_api.websocket_command( { - vol.Required(TYPE): "insteon/device/add", - vol.Required(MULTIPLE): bool, - vol.Optional(DEVICE_ADDRESS): str, + probatio.Required(TYPE): "insteon/device/add", + probatio.Required(MULTIPLE): bool, + probatio.Optional(DEVICE_ADDRESS): str, } ) @websocket_api.require_admin @@ -133,7 +133,7 @@ def async_cleanup() -> None: connection.send_result(msg[ID]) -@websocket_api.websocket_command({vol.Required(TYPE): "insteon/device/add/cancel"}) +@websocket_api.websocket_command({probatio.Required(TYPE): "insteon/device/add/cancel"}) @websocket_api.require_admin @websocket_api.async_response async def websocket_cancel_add_device( @@ -148,9 +148,9 @@ async def websocket_cancel_add_device( @websocket_api.websocket_command( { - vol.Required(TYPE): "insteon/device/remove", - vol.Required(DEVICE_ADDRESS): str, - vol.Required(REMOVE_ALL_REFS): bool, + probatio.Required(TYPE): "insteon/device/remove", + probatio.Required(DEVICE_ADDRESS): str, + probatio.Required(REMOVE_ALL_REFS): bool, } ) @websocket_api.require_admin @@ -182,8 +182,8 @@ async def websocket_remove_device( @websocket_api.websocket_command( { - vol.Required(TYPE): "insteon/device/add_x10", - vol.Required(X10_DEVICE): X10_DEVICE_SCHEMA, + probatio.Required(TYPE): "insteon/device/add_x10", + probatio.Required(X10_DEVICE): X10_DEVICE_SCHEMA, } ) @websocket_api.require_admin diff --git a/homeassistant/components/insteon/api/properties.py b/homeassistant/components/insteon/api/properties.py index f7f1683e05686..9472164dfd6bb 100644 --- a/homeassistant/components/insteon/api/properties.py +++ b/homeassistant/components/insteon/api/properties.py @@ -2,7 +2,7 @@ from typing import Any -from probatio import to_field_list +import probatio from pyinsteon import devices from pyinsteon.config import ( LOAD_BUTTON, @@ -18,7 +18,6 @@ ToggleMode, ) from pyinsteon.device_types.device_base import Device -import voluptuous as vol from homeassistant.components import websocket_api from homeassistant.core import HomeAssistant @@ -43,34 +42,36 @@ def _bool_schema(name): - return to_field_list(vol.Schema({vol.Required(name): bool}))[0] + return probatio.to_field_list(probatio.Schema({probatio.Required(name): bool}))[0] def _byte_schema(name): - return to_field_list(vol.Schema({vol.Required(name): cv.byte}))[0] + return probatio.to_field_list(probatio.Schema({probatio.Required(name): cv.byte}))[ + 0 + ] def _float_schema(name): - return to_field_list(vol.Schema({vol.Required(name): float}))[0] + return probatio.to_field_list(probatio.Schema({probatio.Required(name): float}))[0] def _list_schema(name, values): - return to_field_list( - vol.Schema({vol.Required(name): vol.In(values)}), + return probatio.to_field_list( + probatio.Schema({probatio.Required(name): probatio.In(values)}), custom_serializer=cv.custom_serializer, )[0] def _multi_select_schema(name, values): - return to_field_list( - vol.Schema({vol.Optional(name): cv.multi_select(values)}), + return probatio.to_field_list( + probatio.Schema({probatio.Optional(name): cv.multi_select(values)}), custom_serializer=cv.custom_serializer, )[0] def _read_only_schema(name, value): """Return a constant value schema.""" - return to_field_list(vol.Schema({vol.Required(name): value}))[0] + return probatio.to_field_list(probatio.Schema({probatio.Required(name): value}))[0] def get_schema(prop, name, groups): @@ -157,9 +158,9 @@ def update_property(device, prop_name, value): @websocket_api.websocket_command( { - vol.Required(TYPE): "insteon/properties/get", - vol.Required(DEVICE_ADDRESS): str, - vol.Required(SHOW_ADVANCED): bool, + probatio.Required(TYPE): "insteon/properties/get", + probatio.Required(DEVICE_ADDRESS): str, + probatio.Required(SHOW_ADVANCED): bool, } ) @websocket_api.require_admin @@ -181,10 +182,10 @@ async def websocket_get_properties( @websocket_api.websocket_command( { - vol.Required(TYPE): "insteon/properties/change", - vol.Required(DEVICE_ADDRESS): str, - vol.Required(PROPERTY_NAME): str, - vol.Required(PROPERTY_VALUE): vol.Any(list, int, float, bool, str), + probatio.Required(TYPE): "insteon/properties/change", + probatio.Required(DEVICE_ADDRESS): str, + probatio.Required(PROPERTY_NAME): str, + probatio.Required(PROPERTY_VALUE): probatio.Any(list, int, float, bool, str), } ) @websocket_api.require_admin @@ -205,8 +206,8 @@ async def websocket_change_properties_record( @websocket_api.websocket_command( { - vol.Required(TYPE): "insteon/properties/write", - vol.Required(DEVICE_ADDRESS): str, + probatio.Required(TYPE): "insteon/properties/write", + probatio.Required(DEVICE_ADDRESS): str, } ) @websocket_api.require_admin @@ -235,8 +236,8 @@ async def websocket_write_properties( @websocket_api.websocket_command( { - vol.Required(TYPE): "insteon/properties/load", - vol.Required(DEVICE_ADDRESS): str, + probatio.Required(TYPE): "insteon/properties/load", + probatio.Required(DEVICE_ADDRESS): str, } ) @websocket_api.require_admin @@ -266,8 +267,8 @@ async def websocket_load_properties( @websocket_api.websocket_command( { - vol.Required(TYPE): "insteon/properties/reset", - vol.Required(DEVICE_ADDRESS): str, + probatio.Required(TYPE): "insteon/properties/reset", + probatio.Required(DEVICE_ADDRESS): str, } ) @websocket_api.require_admin diff --git a/homeassistant/components/insteon/api/scenes.py b/homeassistant/components/insteon/api/scenes.py index 894ae2da6a22b..9e63c3d432c73 100644 --- a/homeassistant/components/insteon/api/scenes.py +++ b/homeassistant/components/insteon/api/scenes.py @@ -1,5 +1,6 @@ """Web socket API for Insteon scenes.""" +import probatio from pyinsteon import devices from pyinsteon.constants import ResponseStatus from pyinsteon.managers.scene_manager import ( @@ -9,7 +10,6 @@ async_get_scene, async_get_scenes, ) -import voluptuous as vol from homeassistant.components import websocket_api from homeassistant.core import HomeAssistant @@ -36,7 +36,7 @@ def _scene_to_dict(scene): return {"name": scene["name"], "group": scene["group"], "devices": device_dict} -@websocket_api.websocket_command({vol.Required(TYPE): "insteon/scenes/get"}) +@websocket_api.websocket_command({probatio.Required(TYPE): "insteon/scenes/get"}) @websocket_api.require_admin @websocket_api.async_response async def websocket_get_scenes( @@ -53,7 +53,7 @@ async def websocket_get_scenes( @websocket_api.websocket_command( - {vol.Required(TYPE): "insteon/scene/get", vol.Required("scene_id"): int} + {probatio.Required(TYPE): "insteon/scene/get", probatio.Required("scene_id"): int} ) @websocket_api.require_admin @websocket_api.async_response @@ -70,10 +70,10 @@ async def websocket_get_scene( @websocket_api.websocket_command( { - vol.Required(TYPE): "insteon/scene/save", - vol.Required("name"): str, - vol.Required("scene_id"): int, - vol.Required("links"): DeviceLinkSchema, + probatio.Required(TYPE): "insteon/scene/save", + probatio.Required("name"): str, + probatio.Required("scene_id"): int, + probatio.Required("links"): DeviceLinkSchema, } ) @websocket_api.require_admin @@ -99,8 +99,8 @@ async def websocket_save_scene( @websocket_api.websocket_command( { - vol.Required(TYPE): "insteon/scene/delete", - vol.Required("scene_id"): int, + probatio.Required(TYPE): "insteon/scene/delete", + probatio.Required("scene_id"): int, } ) @websocket_api.require_admin diff --git a/homeassistant/components/insteon/schemas.py b/homeassistant/components/insteon/schemas.py index 13cb9039cd68a..8575ec5d56d0c 100644 --- a/homeassistant/components/insteon/schemas.py +++ b/homeassistant/components/insteon/schemas.py @@ -1,7 +1,7 @@ """Schemas used by insteon component.""" +import probatio from pyinsteon.constants import HC_LOOKUP -import voluptuous as vol from homeassistant.const import ( CONF_ADDRESS, @@ -35,74 +35,86 @@ X10_PLATFORMS, ) -ADD_ALL_LINK_SCHEMA = vol.Schema( +ADD_ALL_LINK_SCHEMA = probatio.Schema( { - vol.Required(SRV_ALL_LINK_GROUP): vol.Range(min=0, max=255), - vol.Required(SRV_ALL_LINK_MODE): vol.In([SRV_CONTROLLER, SRV_RESPONDER]), + probatio.Required(SRV_ALL_LINK_GROUP): probatio.Range(min=0, max=255), + probatio.Required(SRV_ALL_LINK_MODE): probatio.In( + [SRV_CONTROLLER, SRV_RESPONDER] + ), } ) -DEL_ALL_LINK_SCHEMA = vol.Schema( - {vol.Required(SRV_ALL_LINK_GROUP): vol.Range(min=0, max=255)} +DEL_ALL_LINK_SCHEMA = probatio.Schema( + {probatio.Required(SRV_ALL_LINK_GROUP): probatio.Range(min=0, max=255)} ) -LOAD_ALDB_SCHEMA = vol.Schema( +LOAD_ALDB_SCHEMA = probatio.Schema( { - vol.Required(CONF_ENTITY_ID): vol.Any(cv.entity_id, ENTITY_MATCH_ALL), - vol.Optional(SRV_LOAD_DB_RELOAD, default=False): cv.boolean, + probatio.Required(CONF_ENTITY_ID): probatio.Any(cv.entity_id, ENTITY_MATCH_ALL), + probatio.Optional(SRV_LOAD_DB_RELOAD, default=False): cv.boolean, } ) -PRINT_ALDB_SCHEMA = vol.Schema({vol.Required(CONF_ENTITY_ID): cv.entity_id}) +PRINT_ALDB_SCHEMA = probatio.Schema({probatio.Required(CONF_ENTITY_ID): cv.entity_id}) -X10_HOUSECODE_SCHEMA = vol.Schema({vol.Required(SRV_HOUSECODE): vol.In(HOUSECODES)}) +X10_HOUSECODE_SCHEMA = probatio.Schema( + {probatio.Required(SRV_HOUSECODE): probatio.In(HOUSECODES)} +) -TRIGGER_SCENE_SCHEMA = vol.Schema( - {vol.Required(SRV_ALL_LINK_GROUP): vol.Range(min=0, max=255)} +TRIGGER_SCENE_SCHEMA = probatio.Schema( + {probatio.Required(SRV_ALL_LINK_GROUP): probatio.Range(min=0, max=255)} ) -ADD_DEFAULT_LINKS_SCHEMA = vol.Schema({vol.Required(CONF_ENTITY_ID): cv.entity_id}) +ADD_DEFAULT_LINKS_SCHEMA = probatio.Schema( + {probatio.Required(CONF_ENTITY_ID): cv.entity_id} +) def build_device_override_schema( - address=vol.UNDEFINED, - cat=vol.UNDEFINED, - subcat=vol.UNDEFINED, - firmware=vol.UNDEFINED, + address=probatio.UNDEFINED, + cat=probatio.UNDEFINED, + subcat=probatio.UNDEFINED, + firmware=probatio.UNDEFINED, ): """Build the device override schema for config flow.""" - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_ADDRESS, default=address): str, - vol.Optional(CONF_CAT, default=cat): str, - vol.Optional(CONF_SUBCAT, default=subcat): str, + probatio.Required(CONF_ADDRESS, default=address): str, + probatio.Optional(CONF_CAT, default=cat): str, + probatio.Optional(CONF_SUBCAT, default=subcat): str, } ) def build_x10_schema( - housecode=vol.UNDEFINED, - unitcode=vol.UNDEFINED, - platform=vol.UNDEFINED, + housecode=probatio.UNDEFINED, + unitcode=probatio.UNDEFINED, + platform=probatio.UNDEFINED, dim_steps=22, ): """Build the X10 schema for config flow.""" if platform == "light": - dim_steps_schema = vol.Required(CONF_DIM_STEPS, default=dim_steps) + dim_steps_schema = probatio.Required(CONF_DIM_STEPS, default=dim_steps) else: - dim_steps_schema = vol.Optional(CONF_DIM_STEPS, default=dim_steps) - return vol.Schema( + dim_steps_schema = probatio.Optional(CONF_DIM_STEPS, default=dim_steps) + return probatio.Schema( { - vol.Required(CONF_HOUSECODE, default=housecode): vol.In(HC_LOOKUP.keys()), - vol.Required(CONF_UNITCODE, default=unitcode): vol.In(range(1, 17)), - vol.Required(CONF_PLATFORM, default=platform): vol.In(X10_PLATFORMS), - dim_steps_schema: vol.Range(min=0, max=255), + probatio.Required(CONF_HOUSECODE, default=housecode): probatio.In( + HC_LOOKUP.keys() + ), + probatio.Required(CONF_UNITCODE, default=unitcode): probatio.In( + range(1, 17) + ), + probatio.Required(CONF_PLATFORM, default=platform): probatio.In( + X10_PLATFORMS + ), + dim_steps_schema: probatio.Range(min=0, max=255), } ) @@ -114,37 +126,39 @@ def _find_likely_port(ports): for test_string in test_strings: if test_string in name: return port - return vol.UNDEFINED + return probatio.UNDEFINED -def build_plm_schema(ports: dict[str, str], device=vol.UNDEFINED): +def build_plm_schema(ports: dict[str, str], device=probatio.UNDEFINED): """Build the PLM schema for config flow.""" - if not device or device == vol.UNDEFINED: + if not device or device == probatio.UNDEFINED: device = _find_likely_port(ports) - return vol.Schema({vol.Required(CONF_DEVICE, default=device): vol.In(ports)}) + return probatio.Schema( + {probatio.Required(CONF_DEVICE, default=device): probatio.In(ports)} + ) -def build_plm_manual_schema(device=vol.UNDEFINED): +def build_plm_manual_schema(device=probatio.UNDEFINED): """Build the manual PLM schema for config flow.""" - return vol.Schema({vol.Required(CONF_DEVICE, default=device): str}) + return probatio.Schema({probatio.Required(CONF_DEVICE, default=device): str}) def build_hub_schema( hub_version, - host=vol.UNDEFINED, - port=vol.UNDEFINED, - username=vol.UNDEFINED, - password=vol.UNDEFINED, + host=probatio.UNDEFINED, + port=probatio.UNDEFINED, + username=probatio.UNDEFINED, + password=probatio.UNDEFINED, ): """Build the Hub schema for config flow.""" - if port == vol.UNDEFINED: + if port == probatio.UNDEFINED: port = PORT_HUB_V2 if hub_version == 2 else PORT_HUB_V1 schema = { - vol.Required(CONF_HOST, default=host): str, - vol.Required(CONF_PORT, default=port): int, - vol.Required(CONF_HUB_VERSION, default=hub_version): int, + probatio.Required(CONF_HOST, default=host): str, + probatio.Required(CONF_PORT, default=port): int, + probatio.Required(CONF_HUB_VERSION, default=hub_version): int, } if hub_version == 2: - schema[vol.Required(CONF_USERNAME, default=username)] = str - schema[vol.Required(CONF_PASSWORD, default=password)] = str - return vol.Schema(schema) + schema[probatio.Required(CONF_USERNAME, default=username)] = str + schema[probatio.Required(CONF_PASSWORD, default=password)] = str + return probatio.Schema(schema) diff --git a/homeassistant/components/integration/config_flow.py b/homeassistant/components/integration/config_flow.py index e4361b6d9d393..cb2c481dd9a8f 100644 --- a/homeassistant/components/integration/config_flow.py +++ b/homeassistant/components/integration/config_flow.py @@ -3,7 +3,7 @@ from collections.abc import Mapping from typing import Any, cast, override -import voluptuous as vol +import probatio from homeassistant.components.counter import DOMAIN as COUNTER_DOMAIN from homeassistant.components.input_number import DOMAIN as INPUT_NUMBER_DOMAIN @@ -90,38 +90,40 @@ async def _get_options_dict(handler: SchemaCommonFlowHandler | None) -> dict: entity_selector = entity_selector_compatible(handler.parent_handler) return { - vol.Required(CONF_SOURCE_SENSOR): entity_selector, - vol.Required(CONF_METHOD, default=METHOD_TRAPEZOIDAL): selector.SelectSelector( + probatio.Required(CONF_SOURCE_SENSOR): entity_selector, + probatio.Required( + CONF_METHOD, default=METHOD_TRAPEZOIDAL + ): selector.SelectSelector( selector.SelectSelectorConfig( options=INTEGRATION_METHODS, translation_key=CONF_METHOD ), ), - vol.Optional(CONF_ROUND_DIGITS): selector.NumberSelector( + probatio.Optional(CONF_ROUND_DIGITS): selector.NumberSelector( selector.NumberSelectorConfig( min=0, max=6, mode=selector.NumberSelectorMode.BOX ), ), - vol.Optional(CONF_MAX_SUB_INTERVAL): selector.DurationSelector( + probatio.Optional(CONF_MAX_SUB_INTERVAL): selector.DurationSelector( selector.DurationSelectorConfig(allow_negative=False) ), } -async def _get_options_schema(handler: SchemaCommonFlowHandler) -> vol.Schema: - return vol.Schema(await _get_options_dict(handler)) +async def _get_options_schema(handler: SchemaCommonFlowHandler) -> probatio.Schema: + return probatio.Schema(await _get_options_dict(handler)) -async def _get_config_schema(handler: SchemaCommonFlowHandler) -> vol.Schema: +async def _get_config_schema(handler: SchemaCommonFlowHandler) -> probatio.Schema: options = await _get_options_dict(handler) - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_NAME): selector.TextSelector(), - vol.Optional(CONF_UNIT_PREFIX): selector.SelectSelector( + probatio.Required(CONF_NAME): selector.TextSelector(), + probatio.Optional(CONF_UNIT_PREFIX): selector.SelectSelector( selector.SelectSelectorConfig( options=UNIT_PREFIXES, mode=selector.SelectSelectorMode.DROPDOWN ) ), - vol.Required( + probatio.Required( CONF_UNIT_TIME, default=UnitOfTime.HOURS ): selector.SelectSelector( selector.SelectSelectorConfig( diff --git a/homeassistant/components/integration/sensor.py b/homeassistant/components/integration/sensor.py index b445f8be9abd3..6af837f9320b1 100644 --- a/homeassistant/components/integration/sensor.py +++ b/homeassistant/components/integration/sensor.py @@ -8,7 +8,7 @@ import logging from typing import TYPE_CHECKING, Any, Final, Self, override -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( DEVICE_CLASS_UNITS, @@ -85,21 +85,23 @@ DEFAULT_ROUND = 3 -PLATFORM_SCHEMA = vol.All( +PLATFORM_SCHEMA = probatio.All( cv.removed(CONF_UNIT_OF_MEASUREMENT), SENSOR_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_UNIQUE_ID): cv.string, - vol.Required(CONF_SOURCE_SENSOR): cv.entity_id, - vol.Optional(CONF_ROUND_DIGITS, default=DEFAULT_ROUND): vol.Any( - None, vol.Coerce(int) + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Required(CONF_SOURCE_SENSOR): cv.entity_id, + probatio.Optional(CONF_ROUND_DIGITS, default=DEFAULT_ROUND): probatio.Any( + None, probatio.Coerce(int) ), - vol.Optional(CONF_UNIT_PREFIX): vol.In(UNIT_PREFIXES), - vol.Optional(CONF_UNIT_TIME, default=UnitOfTime.HOURS): vol.In(UNIT_TIME), - vol.Remove(CONF_UNIT_OF_MEASUREMENT): cv.string, - vol.Optional(CONF_MAX_SUB_INTERVAL): cv.positive_time_period, - vol.Optional(CONF_METHOD, default=METHOD_TRAPEZOIDAL): vol.In( + probatio.Optional(CONF_UNIT_PREFIX): probatio.In(UNIT_PREFIXES), + probatio.Optional(CONF_UNIT_TIME, default=UnitOfTime.HOURS): probatio.In( + UNIT_TIME + ), + probatio.Remove(CONF_UNIT_OF_MEASUREMENT): cv.string, + probatio.Optional(CONF_MAX_SUB_INTERVAL): cv.positive_time_period, + probatio.Optional(CONF_METHOD, default=METHOD_TRAPEZOIDAL): probatio.In( INTEGRATION_METHODS ), } diff --git a/homeassistant/components/intelliclima/config_flow.py b/homeassistant/components/intelliclima/config_flow.py index dbb5ac7e49644..897cf40cd0aa2 100644 --- a/homeassistant/components/intelliclima/config_flow.py +++ b/homeassistant/components/intelliclima/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from pyintelliclima import IntelliClimaAPI, IntelliClimaAPIError, IntelliClimaAuthError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -11,10 +11,10 @@ from .const import DOMAIN, LOGGER -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/intellifire/config_flow.py b/homeassistant/components/intellifire/config_flow.py index 34908d365a3e3..afee262c957db 100644 --- a/homeassistant/components/intellifire/config_flow.py +++ b/homeassistant/components/intellifire/config_flow.py @@ -9,7 +9,7 @@ from intellifire4py.exceptions import LoginError from intellifire4py.local_api import IntelliFireAPILocal from intellifire4py.model import IntelliFireCommonFireplaceData -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -43,7 +43,7 @@ ) from .coordinator import IntellifireConfigEntry -STEP_USER_DATA_SCHEMA = vol.Schema({vol.Required(CONF_HOST): str}) +STEP_USER_DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_HOST): str}) MANUAL_ENTRY_STRING = "IP Address" # Simplified so it does not have to be translated @@ -141,10 +141,10 @@ async def async_step_cloud_api( return self.async_show_form( step_id="cloud_api", errors=errors, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ), ) @@ -203,9 +203,9 @@ async def async_step_pick_cloud_device( return self.async_show_form( step_id="pick_cloud_device", errors=errors, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_SERIAL): vol.In( + probatio.Required(CONF_SERIAL): probatio.In( [fp.serial for fp in available_fireplaces] ) } @@ -339,15 +339,15 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_READ_MODE, default=user_input.get(CONF_READ_MODE, existing_read) if user_input else existing_read, ): selector.SelectSelector(cloud_local_options), - vol.Required( + probatio.Required( CONF_CONTROL_MODE, default=user_input.get(CONF_CONTROL_MODE, existing_control) if user_input diff --git a/homeassistant/components/intent/__init__.py b/homeassistant/components/intent/__init__.py index 050b951eadd98..5ed14070dde38 100644 --- a/homeassistant/components/intent/__init__.py +++ b/homeassistant/components/intent/__init__.py @@ -5,7 +5,7 @@ from typing import Any, Protocol, override from aiohttp import web -import voluptuous as vol +import probatio from homeassistant.components import http, sensor from homeassistant.components.button import ( @@ -284,12 +284,12 @@ class GetStateIntentHandler(intent.IntentHandler): intent_type = intent.INTENT_GET_STATE description = "Gets or checks the state of a device or entity" slot_schema = { - vol.Any("name", "area", "floor"): cv.string, - vol.Optional("domain"): vol.All(cv.ensure_list, [cv.string]), - vol.Optional("device_class"): vol.All(cv.ensure_list, [cv.string]), - vol.Optional("state"): vol.All(cv.ensure_list, [cv.string]), - vol.Optional("preferred_area_id"): cv.string, - vol.Optional("preferred_floor_id"): cv.string, + probatio.Any("name", "area", "floor"): cv.string, + probatio.Optional("domain"): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional("device_class"): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional("state"): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional("preferred_area_id"): cv.string, + probatio.Optional("preferred_floor_id"): cv.string, } @override @@ -427,7 +427,9 @@ def __init__(self) -> None: super().__init__( intent.INTENT_SET_POSITION, required_slots={ - ATTR_POSITION: vol.All(vol.Coerce(int), vol.Range(min=0, max=100)) + ATTR_POSITION: probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) + ) }, description="Sets the position of a device or entity", platforms={COVER_DOMAIN, VALVE_DOMAIN}, @@ -507,7 +509,7 @@ class RespondIntentHandler(intent.IntentHandler): description = "Returns the provided response with no action." slot_schema = { - vol.Optional("response"): cv.string, + probatio.Optional("response"): cv.string, } @override @@ -528,11 +530,11 @@ class GetTemperatureIntent(intent.IntentHandler): intent_type = intent.INTENT_GET_TEMPERATURE description = "Gets the current temperature of a climate device or entity" slot_schema = { - vol.Optional("area"): intent.non_empty_string, - vol.Optional("name"): intent.non_empty_string, - vol.Optional("floor"): intent.non_empty_string, - vol.Optional("preferred_area_id"): cv.string, - vol.Optional("preferred_floor_id"): cv.string, + probatio.Optional("area"): intent.non_empty_string, + probatio.Optional("name"): intent.non_empty_string, + probatio.Optional("floor"): intent.non_empty_string, + probatio.Optional("preferred_area_id"): cv.string, + probatio.Optional("preferred_floor_id"): cv.string, } platforms = {CLIMATE_DOMAIN} @@ -640,14 +642,14 @@ class IntentHandleView(http.HomeAssistantView): name = "api:intent:handle" @RequestDataValidator( - vol.Schema( + probatio.Schema( { - vol.Required("name"): cv.string, - vol.Optional("data"): vol.Schema({cv.string: object}), - vol.Optional("language"): cv.string, - vol.Optional("assistant"): vol.Any(cv.string, None), - vol.Optional("device_id"): vol.Any(cv.string, None), - vol.Optional("satellite_id"): vol.Any(cv.string, None), + probatio.Required("name"): cv.string, + probatio.Optional("data"): probatio.Schema({cv.string: object}), + probatio.Optional("language"): cv.string, + probatio.Optional("assistant"): probatio.Any(cv.string, None), + probatio.Optional("device_id"): probatio.Any(cv.string, None), + probatio.Optional("satellite_id"): probatio.Any(cv.string, None), } ) ) diff --git a/homeassistant/components/intent/timers.py b/homeassistant/components/intent/timers.py index a54137142e898..9b4524cf9b0c2 100644 --- a/homeassistant/components/intent/timers.py +++ b/homeassistant/components/intent/timers.py @@ -8,8 +8,8 @@ import time from typing import Any, override +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.const import ATTR_DEVICE_ID, ATTR_ID, ATTR_NAME from homeassistant.core import Context, HomeAssistant, callback @@ -829,9 +829,9 @@ class StartTimerIntentHandler(intent.IntentHandler): intent_type = intent.INTENT_START_TIMER description = "Starts a new timer" slot_schema = { - vol.Required(vol.Any("hours", "minutes", "seconds")): cv.positive_int, - vol.Optional("name"): cv.string, - vol.Optional("conversation_command"): cv.string, + probatio.Required(probatio.Any("hours", "minutes", "seconds")): cv.positive_int, + probatio.Optional("name"): cv.string, + probatio.Optional("conversation_command"): cv.string, } @override @@ -938,9 +938,9 @@ class CancelTimerIntentHandler(intent.IntentHandler): intent_type = intent.INTENT_CANCEL_TIMER description = "Cancels a timer" slot_schema = { - vol.Any("start_hours", "start_minutes", "start_seconds"): cv.positive_int, - vol.Optional("name"): cv.string, - vol.Optional("area"): cv.string, + probatio.Any("start_hours", "start_minutes", "start_seconds"): cv.positive_int, + probatio.Optional("name"): cv.string, + probatio.Optional("area"): cv.string, } @override @@ -961,7 +961,7 @@ class CancelAllTimersIntentHandler(intent.IntentHandler): intent_type = intent.INTENT_CANCEL_ALL_TIMERS description = "Cancels all timers" slot_schema = { - vol.Optional("area"): cv.string, + probatio.Optional("area"): cv.string, } @override @@ -992,10 +992,10 @@ class IncreaseTimerIntentHandler(intent.IntentHandler): intent_type = intent.INTENT_INCREASE_TIMER description = "Adds more time to a timer" slot_schema = { - vol.Any("hours", "minutes", "seconds"): cv.positive_int, - vol.Any("start_hours", "start_minutes", "start_seconds"): cv.positive_int, - vol.Optional("name"): cv.string, - vol.Optional("area"): cv.string, + probatio.Any("hours", "minutes", "seconds"): cv.positive_int, + probatio.Any("start_hours", "start_minutes", "start_seconds"): cv.positive_int, + probatio.Optional("name"): cv.string, + probatio.Optional("area"): cv.string, } @override @@ -1017,10 +1017,10 @@ class DecreaseTimerIntentHandler(intent.IntentHandler): intent_type = intent.INTENT_DECREASE_TIMER description = "Removes time from a timer" slot_schema = { - vol.Required(vol.Any("hours", "minutes", "seconds")): cv.positive_int, - vol.Any("start_hours", "start_minutes", "start_seconds"): cv.positive_int, - vol.Optional("name"): cv.string, - vol.Optional("area"): cv.string, + probatio.Required(probatio.Any("hours", "minutes", "seconds")): cv.positive_int, + probatio.Any("start_hours", "start_minutes", "start_seconds"): cv.positive_int, + probatio.Optional("name"): cv.string, + probatio.Optional("area"): cv.string, } @override @@ -1042,9 +1042,9 @@ class PauseTimerIntentHandler(intent.IntentHandler): intent_type = intent.INTENT_PAUSE_TIMER description = "Pauses a running timer" slot_schema = { - vol.Any("start_hours", "start_minutes", "start_seconds"): cv.positive_int, - vol.Optional("name"): cv.string, - vol.Optional("area"): cv.string, + probatio.Any("start_hours", "start_minutes", "start_seconds"): cv.positive_int, + probatio.Optional("name"): cv.string, + probatio.Optional("area"): cv.string, } @override @@ -1067,9 +1067,9 @@ class UnpauseTimerIntentHandler(intent.IntentHandler): intent_type = intent.INTENT_UNPAUSE_TIMER description = "Resumes a paused timer" slot_schema = { - vol.Any("start_hours", "start_minutes", "start_seconds"): cv.positive_int, - vol.Optional("name"): cv.string, - vol.Optional("area"): cv.string, + probatio.Any("start_hours", "start_minutes", "start_seconds"): cv.positive_int, + probatio.Optional("name"): cv.string, + probatio.Optional("area"): cv.string, } @override @@ -1092,9 +1092,9 @@ class TimerStatusIntentHandler(intent.IntentHandler): intent_type = intent.INTENT_TIMER_STATUS description = "Reports the current status of timers" slot_schema = { - vol.Any("start_hours", "start_minutes", "start_seconds"): cv.positive_int, - vol.Optional("name"): cv.string, - vol.Optional("area"): cv.string, + probatio.Any("start_hours", "start_minutes", "start_seconds"): cv.positive_int, + probatio.Optional("name"): cv.string, + probatio.Optional("area"): cv.string, } @override diff --git a/homeassistant/components/intent_script/__init__.py b/homeassistant/components/intent_script/__init__.py index e130f3a88baf3..3e845029c581c 100644 --- a/homeassistant/components/intent_script/__init__.py +++ b/homeassistant/components/intent_script/__init__.py @@ -3,7 +3,7 @@ import logging from typing import Any, TypedDict, override -import voluptuous as vol +import probatio from homeassistant.components.script import CONF_MODE from homeassistant.const import CONF_ACTION, CONF_DESCRIPTION, CONF_TYPE, SERVICE_RELOAD @@ -37,36 +37,38 @@ DEFAULT_CONF_ASYNC_ACTION = False -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { DOMAIN: { cv.string: { - vol.Optional(CONF_DESCRIPTION): cv.string, - vol.Optional(CONF_PLATFORMS): vol.All([cv.string], vol.Coerce(set)), - vol.Optional(CONF_ACTION): cv.SCRIPT_SCHEMA, - vol.Optional( + probatio.Optional(CONF_DESCRIPTION): cv.string, + probatio.Optional(CONF_PLATFORMS): probatio.All( + [cv.string], probatio.Coerce(set) + ), + probatio.Optional(CONF_ACTION): cv.SCRIPT_SCHEMA, + probatio.Optional( CONF_ASYNC_ACTION, default=DEFAULT_CONF_ASYNC_ACTION ): cv.boolean, - vol.Optional(CONF_MODE, default=script.DEFAULT_SCRIPT_MODE): vol.In( - script.SCRIPT_MODE_CHOICES - ), - vol.Optional(CONF_CARD): { - vol.Optional(CONF_TYPE, default="simple"): cv.string, - vol.Required(CONF_TITLE): cv.template, - vol.Required(CONF_CONTENT): cv.template, + probatio.Optional( + CONF_MODE, default=script.DEFAULT_SCRIPT_MODE + ): probatio.In(script.SCRIPT_MODE_CHOICES), + probatio.Optional(CONF_CARD): { + probatio.Optional(CONF_TYPE, default="simple"): cv.string, + probatio.Required(CONF_TITLE): cv.template, + probatio.Required(CONF_CONTENT): cv.template, }, - vol.Optional(CONF_SPEECH): { - vol.Optional(CONF_TYPE, default="plain"): cv.string, - vol.Required(CONF_TEXT): cv.template, + probatio.Optional(CONF_SPEECH): { + probatio.Optional(CONF_TYPE, default="plain"): cv.string, + probatio.Required(CONF_TEXT): cv.template, }, - vol.Optional(CONF_REPROMPT): { - vol.Optional(CONF_TYPE, default="plain"): cv.string, - vol.Required(CONF_TEXT): cv.template, + probatio.Optional(CONF_REPROMPT): { + probatio.Optional(CONF_TYPE, default="plain"): cv.string, + probatio.Required(CONF_TEXT): cv.template, }, } } }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) @@ -99,7 +101,7 @@ async def async_load_intents( if CONF_ACTION in conf: try: actions = await async_validate_actions_config(hass, conf[CONF_ACTION]) - except (vol.Invalid, HomeAssistantError) as exc: + except (probatio.Invalid, HomeAssistantError) as exc: _LOGGER.error( "Failed to validate actions for intent %s: %s", intent_type, exc ) @@ -156,11 +158,11 @@ class ScriptIntentHandler(intent.IntentHandler): """Respond to an intent with a script.""" slot_schema = { - vol.Any("name", "area", "floor"): cv.string, - vol.Optional("domain"): vol.All(cv.ensure_list, [cv.string]), - vol.Optional("device_class"): vol.All(cv.ensure_list, [cv.string]), - vol.Optional("preferred_area_id"): cv.string, - vol.Optional("preferred_floor_id"): cv.string, + probatio.Any("name", "area", "floor"): cv.string, + probatio.Optional("domain"): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional("device_class"): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional("preferred_area_id"): cv.string, + probatio.Optional("preferred_floor_id"): cv.string, } def __init__(self, intent_type: str, config: ConfigType) -> None: diff --git a/homeassistant/components/intesishome/climate.py b/homeassistant/components/intesishome/climate.py index eca6bf75a0bd3..d2b6e640aa4b1 100644 --- a/homeassistant/components/intesishome/climate.py +++ b/homeassistant/components/intesishome/climate.py @@ -3,8 +3,8 @@ import logging from typing import Any, NamedTuple, override +import probatio from pyintesishome import IHAuthenticationError, IHConnectionError, IntesisHome -import voluptuous as vol from homeassistant.components.climate import ( ATTR_HVAC_MODE, @@ -43,9 +43,9 @@ PLATFORM_SCHEMA = CLIMATE_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_DEVICE, default=IH_DEVICE_INTESISHOME): vol.In( + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_DEVICE, default=IH_DEVICE_INTESISHOME): probatio.In( [IH_DEVICE_AIRCONWITHME, IH_DEVICE_ANYWAIR, IH_DEVICE_INTESISHOME] ), } diff --git a/homeassistant/components/iometer/config_flow.py b/homeassistant/components/iometer/config_flow.py index 86f65c053d86c..17db62a2fb427 100644 --- a/homeassistant/components/iometer/config_flow.py +++ b/homeassistant/components/iometer/config_flow.py @@ -8,7 +8,7 @@ IOmeterNoStatusError, IOmeterTimeoutError, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST @@ -17,7 +17,7 @@ from .const import DOMAIN -CONFIG_SCHEMA: Final = vol.Schema({vol.Required(CONF_HOST): str}) +CONFIG_SCHEMA: Final = probatio.Schema({probatio.Required(CONF_HOST): str}) class IOMeterConfigFlow(ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/components/ios/__init__.py b/homeassistant/components/ios/__init__.py index 3c4f0940e9aef..7d7fe07baf102 100644 --- a/homeassistant/components/ios/__init__.py +++ b/homeassistant/components/ios/__init__.py @@ -4,7 +4,7 @@ from typing import Any, cast from aiohttp import web -import voluptuous as vol +import probatio from homeassistant import config_entries from homeassistant.components.http import KEY_HASS, HomeAssistantView @@ -93,61 +93,61 @@ ATTR_DEVICES = "devices" -PUSH_ACTION_SCHEMA = vol.Schema( +PUSH_ACTION_SCHEMA = probatio.Schema( { - vol.Required(CONF_PUSH_ACTIONS_IDENTIFIER): vol.Upper, - vol.Required(CONF_PUSH_ACTIONS_TITLE): cv.string, - vol.Optional( + probatio.Required(CONF_PUSH_ACTIONS_IDENTIFIER): probatio.Upper, + probatio.Required(CONF_PUSH_ACTIONS_TITLE): cv.string, + probatio.Optional( CONF_PUSH_ACTIONS_ACTIVATION_MODE, default=ATTR_BACKGROUND - ): vol.In(ACTIVATION_MODES), - vol.Optional( + ): probatio.In(ACTIVATION_MODES), + probatio.Optional( CONF_PUSH_ACTIONS_AUTHENTICATION_REQUIRED, default=False ): cv.boolean, - vol.Optional(CONF_PUSH_ACTIONS_DESTRUCTIVE, default=False): cv.boolean, - vol.Optional(CONF_PUSH_ACTIONS_BEHAVIOR, default=ATTR_DEFAULT_BEHAVIOR): vol.In( - BEHAVIORS - ), - vol.Optional(CONF_PUSH_ACTIONS_TEXT_INPUT_BUTTON_TITLE): cv.string, - vol.Optional(CONF_PUSH_ACTIONS_TEXT_INPUT_PLACEHOLDER): cv.string, + probatio.Optional(CONF_PUSH_ACTIONS_DESTRUCTIVE, default=False): cv.boolean, + probatio.Optional( + CONF_PUSH_ACTIONS_BEHAVIOR, default=ATTR_DEFAULT_BEHAVIOR + ): probatio.In(BEHAVIORS), + probatio.Optional(CONF_PUSH_ACTIONS_TEXT_INPUT_BUTTON_TITLE): cv.string, + probatio.Optional(CONF_PUSH_ACTIONS_TEXT_INPUT_PLACEHOLDER): cv.string, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -PUSH_ACTION_LIST_SCHEMA = vol.All(cv.ensure_list, [PUSH_ACTION_SCHEMA]) +PUSH_ACTION_LIST_SCHEMA = probatio.All(cv.ensure_list, [PUSH_ACTION_SCHEMA]) -PUSH_CATEGORY_SCHEMA = vol.Schema( +PUSH_CATEGORY_SCHEMA = probatio.Schema( { - vol.Required(CONF_PUSH_CATEGORIES_NAME): cv.string, - vol.Required(CONF_PUSH_CATEGORIES_IDENTIFIER): vol.Lower, - vol.Required(CONF_PUSH_CATEGORIES_ACTIONS): PUSH_ACTION_LIST_SCHEMA, + probatio.Required(CONF_PUSH_CATEGORIES_NAME): cv.string, + probatio.Required(CONF_PUSH_CATEGORIES_IDENTIFIER): probatio.Lower, + probatio.Required(CONF_PUSH_CATEGORIES_ACTIONS): PUSH_ACTION_LIST_SCHEMA, } ) -PUSH_CATEGORY_LIST_SCHEMA = vol.All(cv.ensure_list, [PUSH_CATEGORY_SCHEMA]) +PUSH_CATEGORY_LIST_SCHEMA = probatio.All(cv.ensure_list, [PUSH_CATEGORY_SCHEMA]) -ACTION_SCHEMA = vol.Schema( +ACTION_SCHEMA = probatio.Schema( { - vol.Required(CONF_ACTION_NAME): cv.string, - vol.Optional(CONF_ACTION_BACKGROUND_COLOR): cv.string, - vol.Optional(CONF_ACTION_LABEL): { - vol.Optional(CONF_ACTION_LABEL_TEXT): cv.string, - vol.Optional(CONF_ACTION_LABEL_COLOR): cv.string, + probatio.Required(CONF_ACTION_NAME): cv.string, + probatio.Optional(CONF_ACTION_BACKGROUND_COLOR): cv.string, + probatio.Optional(CONF_ACTION_LABEL): { + probatio.Optional(CONF_ACTION_LABEL_TEXT): cv.string, + probatio.Optional(CONF_ACTION_LABEL_COLOR): cv.string, }, - vol.Optional(CONF_ACTION_ICON): { - vol.Optional(CONF_ACTION_ICON_ICON): cv.string, - vol.Optional(CONF_ACTION_ICON_COLOR): cv.string, + probatio.Optional(CONF_ACTION_ICON): { + probatio.Optional(CONF_ACTION_ICON_ICON): cv.string, + probatio.Optional(CONF_ACTION_ICON_COLOR): cv.string, }, - vol.Optional(CONF_ACTION_SHOW_IN_CARPLAY): cv.boolean, - vol.Optional(CONF_ACTION_SHOW_IN_WATCH): cv.boolean, - vol.Optional(CONF_ACTION_USE_CUSTOM_COLORS): cv.boolean, + probatio.Optional(CONF_ACTION_SHOW_IN_CARPLAY): cv.boolean, + probatio.Optional(CONF_ACTION_SHOW_IN_WATCH): cv.boolean, + probatio.Optional(CONF_ACTION_USE_CUSTOM_COLORS): cv.boolean, }, ) -ACTION_LIST_SCHEMA = vol.All(cv.ensure_list, [ACTION_SCHEMA]) +ACTION_LIST_SCHEMA = probatio.All(cv.ensure_list, [ACTION_SCHEMA]) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.All( + DOMAIN: probatio.All( cv.deprecated(CONF_PUSH), { CONF_PUSH: {CONF_PUSH_CATEGORIES: PUSH_CATEGORY_LIST_SCHEMA}, @@ -155,57 +155,59 @@ }, ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -IDENTIFY_DEVICE_SCHEMA = vol.Schema( +IDENTIFY_DEVICE_SCHEMA = probatio.Schema( { - vol.Required(ATTR_DEVICE_NAME): cv.string, - vol.Required(ATTR_DEVICE_LOCALIZED_MODEL): cv.string, - vol.Required(ATTR_DEVICE_MODEL): cv.string, - vol.Required(ATTR_DEVICE_PERMANENT_ID): cv.string, - vol.Required(ATTR_DEVICE_SYSTEM_VERSION): cv.string, - vol.Required(ATTR_DEVICE_TYPE): cv.string, - vol.Required(ATTR_DEVICE_SYSTEM_NAME): cv.string, + probatio.Required(ATTR_DEVICE_NAME): cv.string, + probatio.Required(ATTR_DEVICE_LOCALIZED_MODEL): cv.string, + probatio.Required(ATTR_DEVICE_MODEL): cv.string, + probatio.Required(ATTR_DEVICE_PERMANENT_ID): cv.string, + probatio.Required(ATTR_DEVICE_SYSTEM_VERSION): cv.string, + probatio.Required(ATTR_DEVICE_TYPE): cv.string, + probatio.Required(ATTR_DEVICE_SYSTEM_NAME): cv.string, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -IDENTIFY_DEVICE_SCHEMA_CONTAINER = vol.All(dict, IDENTIFY_DEVICE_SCHEMA) +IDENTIFY_DEVICE_SCHEMA_CONTAINER = probatio.All(dict, IDENTIFY_DEVICE_SCHEMA) -IDENTIFY_APP_SCHEMA = vol.Schema( +IDENTIFY_APP_SCHEMA = probatio.Schema( { - vol.Required(ATTR_APP_BUNDLE_IDENTIFIER): cv.string, - vol.Required(ATTR_APP_BUILD_NUMBER): cv.positive_int, - vol.Optional(ATTR_APP_VERSION_NUMBER): cv.string, + probatio.Required(ATTR_APP_BUNDLE_IDENTIFIER): cv.string, + probatio.Required(ATTR_APP_BUILD_NUMBER): cv.positive_int, + probatio.Optional(ATTR_APP_VERSION_NUMBER): cv.string, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -IDENTIFY_APP_SCHEMA_CONTAINER = vol.All(dict, IDENTIFY_APP_SCHEMA) +IDENTIFY_APP_SCHEMA_CONTAINER = probatio.All(dict, IDENTIFY_APP_SCHEMA) -IDENTIFY_BATTERY_SCHEMA = vol.Schema( +IDENTIFY_BATTERY_SCHEMA = probatio.Schema( { - vol.Required(ATTR_BATTERY_LEVEL): cv.positive_int, - vol.Required(ATTR_BATTERY_STATE): vol.In(BATTERY_STATES), + probatio.Required(ATTR_BATTERY_LEVEL): cv.positive_int, + probatio.Required(ATTR_BATTERY_STATE): probatio.In(BATTERY_STATES), }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -IDENTIFY_BATTERY_SCHEMA_CONTAINER = vol.All(dict, IDENTIFY_BATTERY_SCHEMA) +IDENTIFY_BATTERY_SCHEMA_CONTAINER = probatio.All(dict, IDENTIFY_BATTERY_SCHEMA) -IDENTIFY_SCHEMA = vol.Schema( +IDENTIFY_SCHEMA = probatio.Schema( { - vol.Required(ATTR_DEVICE): IDENTIFY_DEVICE_SCHEMA_CONTAINER, - vol.Required(ATTR_BATTERY): IDENTIFY_BATTERY_SCHEMA_CONTAINER, - vol.Required(ATTR_PUSH_TOKEN): cv.string, - vol.Required(ATTR_APP): IDENTIFY_APP_SCHEMA_CONTAINER, - vol.Required(ATTR_PERMISSIONS): vol.All(cv.ensure_list, [vol.In(PERMISSIONS)]), - vol.Required(ATTR_PUSH_ID): cv.string, - vol.Required(ATTR_DEVICE_ID): cv.string, - vol.Optional(ATTR_PUSH_SOUNDS): list, + probatio.Required(ATTR_DEVICE): IDENTIFY_DEVICE_SCHEMA_CONTAINER, + probatio.Required(ATTR_BATTERY): IDENTIFY_BATTERY_SCHEMA_CONTAINER, + probatio.Required(ATTR_PUSH_TOKEN): cv.string, + probatio.Required(ATTR_APP): IDENTIFY_APP_SCHEMA_CONTAINER, + probatio.Required(ATTR_PERMISSIONS): probatio.All( + cv.ensure_list, [probatio.In(PERMISSIONS)] + ), + probatio.Required(ATTR_PUSH_ID): cv.string, + probatio.Required(ATTR_DEVICE_ID): cv.string, + probatio.Optional(ATTR_PUSH_SOUNDS): list, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) CONFIGURATION_FILE = ".ios.conf" diff --git a/homeassistant/components/iotawatt/config_flow.py b/homeassistant/components/iotawatt/config_flow.py index 339ae5e15ef4c..edcff546d8199 100644 --- a/homeassistant/components/iotawatt/config_flow.py +++ b/homeassistant/components/iotawatt/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from iotawattpy.iotawatt import Iotawatt -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME @@ -57,9 +57,11 @@ async def async_step_user( if user_input is None: user_input = {} - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required(CONF_HOST, default=user_input.get(CONF_HOST, "")): str, + probatio.Required( + CONF_HOST, default=user_input.get(CONF_HOST, "") + ): str, } ) if not user_input: @@ -81,12 +83,12 @@ async def async_step_auth( if user_input is None: user_input = {} - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required( + probatio.Required( CONF_USERNAME, default=user_input.get(CONF_USERNAME, "") ): str, - vol.Required( + probatio.Required( CONF_PASSWORD, default=user_input.get(CONF_PASSWORD, "") ): str, } diff --git a/homeassistant/components/iperf3/__init__.py b/homeassistant/components/iperf3/__init__.py index 40fd45f2322cc..08c51ccf4dcce 100644 --- a/homeassistant/components/iperf3/__init__.py +++ b/homeassistant/components/iperf3/__init__.py @@ -4,7 +4,7 @@ import logging import iperf3 -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( DOMAIN as SENSOR_DOMAIN, @@ -70,35 +70,45 @@ PROTOCOLS = ["tcp", "udp"] -HOST_CONFIG_SCHEMA = vol.Schema( +HOST_CONFIG_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_DURATION, default=DEFAULT_DURATION): vol.Range(5, 10), - vol.Optional(CONF_PARALLEL, default=DEFAULT_PARALLEL): vol.Range(1, 20), - vol.Optional(CONF_PROTOCOL, default=DEFAULT_PROTOCOL): vol.In(PROTOCOLS), + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_DURATION, default=DEFAULT_DURATION): probatio.Range( + 5, 10 + ), + probatio.Optional(CONF_PARALLEL, default=DEFAULT_PARALLEL): probatio.Range( + 1, 20 + ), + probatio.Optional(CONF_PROTOCOL, default=DEFAULT_PROTOCOL): probatio.In( + PROTOCOLS + ), } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_HOSTS): vol.All(cv.ensure_list, [HOST_CONFIG_SCHEMA]), - vol.Optional(CONF_MONITORED_CONDITIONS, default=SENSOR_KEYS): vol.All( - cv.ensure_list, [vol.In(SENSOR_KEYS)] + probatio.Required(CONF_HOSTS): probatio.All( + cv.ensure_list, [HOST_CONFIG_SCHEMA] ), - vol.Optional(CONF_SCAN_INTERVAL, default=DEFAULT_INTERVAL): vol.All( - cv.time_period, cv.positive_timedelta - ), - vol.Optional(CONF_MANUAL, default=False): cv.boolean, + probatio.Optional( + CONF_MONITORED_CONDITIONS, default=SENSOR_KEYS + ): probatio.All(cv.ensure_list, [probatio.In(SENSOR_KEYS)]), + probatio.Optional( + CONF_SCAN_INTERVAL, default=DEFAULT_INTERVAL + ): probatio.All(cv.time_period, cv.positive_timedelta), + probatio.Optional(CONF_MANUAL, default=False): cv.boolean, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -SERVICE_SCHEMA = vol.Schema({vol.Optional(ATTR_HOST, default=None): cv.string}) +SERVICE_SCHEMA = probatio.Schema( + {probatio.Optional(ATTR_HOST, default=None): cv.string} +) async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: diff --git a/homeassistant/components/ipma/config_flow.py b/homeassistant/components/ipma/config_flow.py index d1bd889da0316..682eb872f4b5d 100644 --- a/homeassistant/components/ipma/config_flow.py +++ b/homeassistant/components/ipma/config_flow.py @@ -3,10 +3,10 @@ import logging from typing import Any, override +import probatio from pyipma import IPMAException from pyipma.api import IPMA_API from pyipma.location import Location -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_LATITUDE, CONF_LONGITUDE @@ -50,10 +50,10 @@ async def async_step_user( return self.async_show_form( step_id="user", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_LATITUDE): cv.latitude, - vol.Required(CONF_LONGITUDE): cv.longitude, + probatio.Required(CONF_LATITUDE): cv.latitude, + probatio.Required(CONF_LONGITUDE): cv.longitude, } ), { diff --git a/homeassistant/components/ipp/config_flow.py b/homeassistant/components/ipp/config_flow.py index 7c86a2ef92400..6d555d1f999aa 100644 --- a/homeassistant/components/ipp/config_flow.py +++ b/homeassistant/components/ipp/config_flow.py @@ -3,6 +3,7 @@ import logging from typing import Any, override +import probatio from pyipp import ( IPP, IPPConnectionError, @@ -12,7 +13,6 @@ IPPResponseError, IPPVersionNotSupportedError, ) -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -209,13 +209,13 @@ def _show_setup_form(self, errors: dict | None = None) -> ConfigFlowResult: """Show the setup form to the user.""" return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=631): int, - vol.Required(CONF_BASE_PATH, default="/ipp/print"): str, - vol.Required(CONF_SSL, default=False): bool, - vol.Required(CONF_VERIFY_SSL, default=False): bool, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=631): int, + probatio.Required(CONF_BASE_PATH, default="/ipp/print"): str, + probatio.Required(CONF_SSL, default=False): bool, + probatio.Required(CONF_VERIFY_SSL, default=False): bool, } ), errors=errors or {}, diff --git a/homeassistant/components/iqvia/config_flow.py b/homeassistant/components/iqvia/config_flow.py index e6ea6160ffdf4..e3f8b2d224ad5 100644 --- a/homeassistant/components/iqvia/config_flow.py +++ b/homeassistant/components/iqvia/config_flow.py @@ -2,9 +2,9 @@ from typing import Any, override +import probatio from pyiqvia import Client from pyiqvia.errors import InvalidZipError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.helpers import aiohttp_client @@ -19,7 +19,7 @@ class IqviaConfigFlow(ConfigFlow, domain=DOMAIN): def __init__(self) -> None: """Initialize the config flow.""" - self.data_schema = vol.Schema({vol.Required(CONF_ZIP_CODE): str}) + self.data_schema = probatio.Schema({probatio.Required(CONF_ZIP_CODE): str}) @override async def async_step_user( diff --git a/homeassistant/components/irish_rail_transport/sensor.py b/homeassistant/components/irish_rail_transport/sensor.py index cee957cf14703..8acd54136047c 100644 --- a/homeassistant/components/irish_rail_transport/sensor.py +++ b/homeassistant/components/irish_rail_transport/sensor.py @@ -3,8 +3,8 @@ from datetime import timedelta from typing import Any, override +import probatio from pyirishrail.pyirishrail import IrishRailRTPI -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -40,11 +40,11 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_STATION): cv.string, - vol.Optional(CONF_DIRECTION): cv.string, - vol.Optional(CONF_DESTINATION): cv.string, - vol.Optional(CONF_STOPS_AT): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_STATION): cv.string, + probatio.Optional(CONF_DIRECTION): cv.string, + probatio.Optional(CONF_DESTINATION): cv.string, + probatio.Optional(CONF_STOPS_AT): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/irm_kmi/config_flow.py b/homeassistant/components/irm_kmi/config_flow.py index 9be84498dbf73..afa9a92e112db 100644 --- a/homeassistant/components/irm_kmi/config_flow.py +++ b/homeassistant/components/irm_kmi/config_flow.py @@ -4,7 +4,7 @@ from typing import override from irm_kmi_api import IrmKmiApiClient, IrmKmiApiError -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigFlow, @@ -94,9 +94,9 @@ async def async_step_user(self, user_input: dict | None = None) -> ConfigFlowRes default_location = user_input[CONF_LOCATION] return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_LOCATION, default=default_location ): LocationSelector() } @@ -119,9 +119,9 @@ async def async_step_init(self, user_input: dict | None = None) -> ConfigFlowRes return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_LANGUAGE_OVERRIDE, default=self.config_entry.options.get( CONF_LANGUAGE_OVERRIDE, "none" diff --git a/homeassistant/components/iron_os/config_flow.py b/homeassistant/components/iron_os/config_flow.py index e75c270026f3b..513561c2bc13e 100644 --- a/homeassistant/components/iron_os/config_flow.py +++ b/homeassistant/components/iron_os/config_flow.py @@ -5,8 +5,8 @@ from bleak.exc import BleakError from habluetooth import BluetoothServiceInfoBleak +import probatio from pynecil import CommunicationError, Pynecil -import voluptuous as vol from homeassistant.components.bluetooth.api import async_discovered_service_info from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -114,8 +114,8 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_ADDRESS): vol.In(self._discovered_devices)} + data_schema=probatio.Schema( + {probatio.Required(CONF_ADDRESS): probatio.In(self._discovered_devices)} ), errors=errors, ) diff --git a/homeassistant/components/iseo_argo_ble/config_flow.py b/homeassistant/components/iseo_argo_ble/config_flow.py index 15fa4bd257f4d..94d293ee48e41 100644 --- a/homeassistant/components/iseo_argo_ble/config_flow.py +++ b/homeassistant/components/iseo_argo_ble/config_flow.py @@ -11,7 +11,7 @@ IseoConnectionError, is_iseo_advertisement, ) -import voluptuous as vol +import probatio from homeassistant.components.bluetooth import ( BluetoothServiceInfoBleak, @@ -119,9 +119,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_ADDRESS): SelectSelector( + probatio.Required(CONF_ADDRESS): SelectSelector( SelectSelectorConfig( options=[ SelectOptionDict( diff --git a/homeassistant/components/iskra/config_flow.py b/homeassistant/components/iskra/config_flow.py index abfe8e82261e7..8cc29bcf5b036 100644 --- a/homeassistant/components/iskra/config_flow.py +++ b/homeassistant/components/iskra/config_flow.py @@ -3,6 +3,7 @@ import logging from typing import Any, override +import probatio from pyiskra.adapters import Modbus, RestAPI from pyiskra.exceptions import ( DeviceConnectionError, @@ -11,7 +12,6 @@ NotAuthorised, ) from pyiskra.helper import BasicInfo -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -37,10 +37,10 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PROTOCOL, default="rest_api"): SelectSelector( + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PROTOCOL, default="rest_api"): SelectSelector( SelectSelectorConfig( options=["rest_api", "modbus_tcp"], mode=SelectSelectorMode.LIST, @@ -50,21 +50,21 @@ } ) -STEP_AUTHENTICATION_DATA_SCHEMA = vol.Schema( +STEP_AUTHENTICATION_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) # CONF_ADDRESS validation is done later in code, as if -# ranges are set in voluptuous it turns into a slider -STEP_MODBUS_TCP_DATA_SCHEMA = vol.Schema( +# ranges are set in probatio it turns into a slider +STEP_MODBUS_TCP_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_PORT, default=10001): vol.All( - vol.Coerce(int), vol.Range(min=0, max=65535) + probatio.Required(CONF_PORT, default=10001): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=65535) ), - vol.Required(CONF_ADDRESS, default=33): NumberSelector( + probatio.Required(CONF_ADDRESS, default=33): NumberSelector( NumberSelectorConfig(min=1, max=255, mode=NumberSelectorMode.BOX) ), } diff --git a/homeassistant/components/islamic_prayer_times/config_flow.py b/homeassistant/components/islamic_prayer_times/config_flow.py index 688331a08c57b..623cfbc70a5a9 100644 --- a/homeassistant/components/islamic_prayer_times/config_flow.py +++ b/homeassistant/components/islamic_prayer_times/config_flow.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -78,9 +78,9 @@ async def async_step_user( } return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_LOCATION, default=home_location ): LocationSelector(), } @@ -99,7 +99,7 @@ async def async_step_init( return self.async_create_entry(title="", data=user_input) options = { - vol.Optional( + probatio.Optional( CONF_CALC_METHOD, default=self.config_entry.options.get( CONF_CALC_METHOD, DEFAULT_CALC_METHOD @@ -111,7 +111,7 @@ async def async_step_init( translation_key=CONF_CALC_METHOD, ) ), - vol.Optional( + probatio.Optional( CONF_LAT_ADJ_METHOD, default=self.config_entry.options.get( CONF_LAT_ADJ_METHOD, DEFAULT_LAT_ADJ_METHOD @@ -123,7 +123,7 @@ async def async_step_init( translation_key=CONF_LAT_ADJ_METHOD, ) ), - vol.Optional( + probatio.Optional( CONF_MIDNIGHT_MODE, default=self.config_entry.options.get( CONF_MIDNIGHT_MODE, DEFAULT_MIDNIGHT_MODE @@ -135,7 +135,7 @@ async def async_step_init( translation_key=CONF_MIDNIGHT_MODE, ) ), - vol.Optional( + probatio.Optional( CONF_SCHOOL, default=self.config_entry.options.get(CONF_SCHOOL, DEFAULT_SCHOOL), ): SelectSelector( @@ -147,4 +147,6 @@ async def async_step_init( ), } - return self.async_show_form(step_id="init", data_schema=vol.Schema(options)) + return self.async_show_form( + step_id="init", data_schema=probatio.Schema(options) + ) diff --git a/homeassistant/components/israel_rail/config_flow.py b/homeassistant/components/israel_rail/config_flow.py index 399544f4072bf..20dff9a90ee8e 100644 --- a/homeassistant/components/israel_rail/config_flow.py +++ b/homeassistant/components/israel_rail/config_flow.py @@ -5,7 +5,7 @@ from israelrailapi import TrainSchedule from israelrailapi.stations import STATIONS -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -14,10 +14,10 @@ STATIONS_NAMES = [station["Heb"] for station in STATIONS.values()] STATIONS_NAMES.sort() -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_START): vol.In(STATIONS_NAMES), - vol.Required(CONF_DESTINATION): vol.In(STATIONS_NAMES), + probatio.Required(CONF_START): probatio.In(STATIONS_NAMES), + probatio.Required(CONF_DESTINATION): probatio.In(STATIONS_NAMES), } ) diff --git a/homeassistant/components/iss/config_flow.py b/homeassistant/components/iss/config_flow.py index efd203f3e6d70..af1466baeef37 100644 --- a/homeassistant/components/iss/config_flow.py +++ b/homeassistant/components/iss/config_flow.py @@ -2,7 +2,7 @@ from typing import override -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, OptionsFlow from homeassistant.const import CONF_SHOW_ON_MAP @@ -49,9 +49,9 @@ async def async_step_init(self, user_input=None) -> ConfigFlowResult: return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_SHOW_ON_MAP, default=self.config_entry.options.get(CONF_SHOW_ON_MAP, False), ): bool, diff --git a/homeassistant/components/ista_ecotrend/config_flow.py b/homeassistant/components/ista_ecotrend/config_flow.py index 5a4dfeaaade7e..3f21524c1afe4 100644 --- a/homeassistant/components/ista_ecotrend/config_flow.py +++ b/homeassistant/components/ista_ecotrend/config_flow.py @@ -4,8 +4,8 @@ import logging from typing import TYPE_CHECKING, Any, override +import probatio from pyecotrend_ista import KeycloakError, LoginError, PyEcotrendIsta, ServerError -import voluptuous as vol from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_EMAIL, CONF_NAME, CONF_PASSWORD @@ -19,15 +19,15 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_EMAIL): TextSelector( + probatio.Required(CONF_EMAIL): TextSelector( TextSelectorConfig( type=TextSelectorType.EMAIL, autocomplete="email", ) ), - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", diff --git a/homeassistant/components/isy994/__init__.py b/homeassistant/components/isy994/__init__.py index fde36f3b930a8..c3fec39feb9a4 100644 --- a/homeassistant/components/isy994/__init__.py +++ b/homeassistant/components/isy994/__init__.py @@ -4,9 +4,9 @@ from urllib.parse import urlparse from aiohttp import CookieJar +import probatio from pyisy import ISY, ISYConnectionError, ISYInvalidAuthError, ISYResponseParseError from pyisy.constants import CONFIG_NETWORKING, CONFIG_PORTAL -import voluptuous as vol from homeassistant.const import ( CONF_HOST, @@ -49,9 +49,9 @@ from .services import async_setup_services from .util import _async_cleanup_registry_entries -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( cv.deprecated(DOMAIN), - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/isy994/config_flow.py b/homeassistant/components/isy994/config_flow.py index e6ad19a5ca185..f77385b33f4b7 100644 --- a/homeassistant/components/isy994/config_flow.py +++ b/homeassistant/components/isy994/config_flow.py @@ -8,10 +8,10 @@ import aiohttp from aiohttp import CookieJar +import probatio from pyisy import ISYConnectionError, ISYInvalidAuthError, ISYResponseParseError from pyisy.configuration import Configuration from pyisy.connection import Connection -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_IGNORE, @@ -62,16 +62,16 @@ _LOGGER = logging.getLogger(__name__) -def _data_schema(schema_input: dict[str, str]) -> vol.Schema: +def _data_schema(schema_input: dict[str, str]) -> probatio.Schema: """Generate schema with defaults.""" - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_HOST, default=schema_input.get(CONF_HOST, "")): str, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): bool, + probatio.Required(CONF_HOST, default=schema_input.get(CONF_HOST, "")): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): bool, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) @@ -327,12 +327,12 @@ async def async_step_reauth_confirm( "sample_ip": "http://192.168.10.100:80", }, step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_USERNAME, default=existing_data[CONF_USERNAME] ): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, @@ -359,12 +359,14 @@ async def async_step_init( CONF_VAR_SENSOR_STRING, DEFAULT_VAR_SENSOR_STRING ) - options_schema = vol.Schema( + options_schema = probatio.Schema( { - vol.Optional(CONF_IGNORE_STRING, default=ignore_string): str, - vol.Optional(CONF_SENSOR_STRING, default=sensor_string): str, - vol.Optional(CONF_VAR_SENSOR_STRING, default=var_sensor_string): str, - vol.Required( + probatio.Optional(CONF_IGNORE_STRING, default=ignore_string): str, + probatio.Optional(CONF_SENSOR_STRING, default=sensor_string): str, + probatio.Optional( + CONF_VAR_SENSOR_STRING, default=var_sensor_string + ): str, + probatio.Required( CONF_RESTORE_LIGHT_STATE, default=restore_light_state ): bool, } diff --git a/homeassistant/components/isy994/services.py b/homeassistant/components/isy994/services.py index 6da0a0e93453a..9fd897b9b6739 100644 --- a/homeassistant/components/isy994/services.py +++ b/homeassistant/components/isy994/services.py @@ -2,8 +2,8 @@ from typing import Any +import probatio from pyisy.constants import COMMAND_FRIENDLY_NAME -import voluptuous as vol from homeassistant.const import ( CONF_ADDRESS, @@ -76,49 +76,57 @@ def valid_isy_commands(value: Any) -> str: if value in COMMAND_FRIENDLY_NAME: assert isinstance(value, str) return value - raise vol.Invalid("Invalid ISY Command.") + raise probatio.Invalid("Invalid ISY Command.") SCHEMA_GROUP = "name-address" SERVICE_SEND_RAW_NODE_COMMAND_SCHEMA = { - vol.Required(CONF_COMMAND): vol.All(cv.string, valid_isy_commands), - vol.Optional(CONF_VALUE): vol.All(vol.Coerce(int), vol.Range(0, 255)), - vol.Optional(CONF_UNIT_OF_MEASUREMENT): vol.All(vol.Coerce(int), vol.Range(0, 120)), - vol.Optional(CONF_PARAMETERS, default={}): {cv.string: cv.string}, + probatio.Required(CONF_COMMAND): probatio.All(cv.string, valid_isy_commands), + probatio.Optional(CONF_VALUE): probatio.All( + probatio.Coerce(int), probatio.Range(0, 255) + ), + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): probatio.All( + probatio.Coerce(int), probatio.Range(0, 120) + ), + probatio.Optional(CONF_PARAMETERS, default={}): {cv.string: cv.string}, } SERVICE_SEND_NODE_COMMAND_SCHEMA = { - vol.Required(CONF_COMMAND): vol.In(VALID_NODE_COMMANDS) + probatio.Required(CONF_COMMAND): probatio.In(VALID_NODE_COMMANDS) } -SERVICE_RENAME_NODE_SCHEMA = {vol.Required(CONF_NAME): cv.string} +SERVICE_RENAME_NODE_SCHEMA = {probatio.Required(CONF_NAME): cv.string} -SERVICE_GET_ZWAVE_PARAMETER_SCHEMA = {vol.Required(CONF_PARAMETER): vol.Coerce(int)} +SERVICE_GET_ZWAVE_PARAMETER_SCHEMA = { + probatio.Required(CONF_PARAMETER): probatio.Coerce(int) +} SERVICE_SET_ZWAVE_PARAMETER_SCHEMA = { - vol.Required(CONF_PARAMETER): vol.Coerce(int), - vol.Required(CONF_VALUE): vol.Coerce(int), - vol.Required(CONF_SIZE): vol.All(vol.Coerce(int), vol.In(VALID_PARAMETER_SIZES)), + probatio.Required(CONF_PARAMETER): probatio.Coerce(int), + probatio.Required(CONF_VALUE): probatio.Coerce(int), + probatio.Required(CONF_SIZE): probatio.All( + probatio.Coerce(int), probatio.In(VALID_PARAMETER_SIZES) + ), } SERVICE_SET_USER_CODE_SCHEMA: VolDictType = { - vol.Required(CONF_USER_NUM): vol.Coerce(int), - vol.Required(CONF_CODE): vol.Coerce(int), + probatio.Required(CONF_USER_NUM): probatio.Coerce(int), + probatio.Required(CONF_CODE): probatio.Coerce(int), } SERVICE_DELETE_USER_CODE_SCHEMA: VolDictType = { - vol.Required(CONF_USER_NUM): vol.Coerce(int) + probatio.Required(CONF_USER_NUM): probatio.Coerce(int) } -SERVICE_SEND_PROGRAM_COMMAND_SCHEMA = vol.All( +SERVICE_SEND_PROGRAM_COMMAND_SCHEMA = probatio.All( cv.has_at_least_one_key(CONF_ADDRESS, CONF_NAME), - vol.Schema( + probatio.Schema( { - vol.Exclusive(CONF_NAME, SCHEMA_GROUP): cv.string, - vol.Exclusive(CONF_ADDRESS, SCHEMA_GROUP): cv.string, - vol.Required(CONF_COMMAND): vol.In(VALID_PROGRAM_COMMANDS), - vol.Optional(CONF_ISY): cv.string, + probatio.Exclusive(CONF_NAME, SCHEMA_GROUP): cv.string, + probatio.Exclusive(CONF_ADDRESS, SCHEMA_GROUP): cv.string, + probatio.Required(CONF_COMMAND): probatio.In(VALID_PROGRAM_COMMANDS), + probatio.Optional(CONF_ISY): cv.string, } ), ) diff --git a/homeassistant/components/itach/remote.py b/homeassistant/components/itach/remote.py index 78b80dec72cad..707f07c0e7310 100644 --- a/homeassistant/components/itach/remote.py +++ b/homeassistant/components/itach/remote.py @@ -4,8 +4,8 @@ import logging from typing import Any, override +import probatio import pyitachip2ir -import voluptuous as vol from homeassistant.components import remote from homeassistant.components.remote import ( @@ -44,23 +44,23 @@ PLATFORM_SCHEMA = REMOTE_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_MAC): cv.string, - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Required(CONF_DEVICES): vol.All( + probatio.Optional(CONF_MAC): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Required(CONF_DEVICES): probatio.All( cv.ensure_list, [ { - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_MODADDR): cv.positive_int, - vol.Required(CONF_CONNADDR): cv.positive_int, - vol.Optional(CONF_IR_COUNT): cv.positive_int, - vol.Required(CONF_COMMANDS): vol.All( + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_MODADDR): cv.positive_int, + probatio.Required(CONF_CONNADDR): cv.positive_int, + probatio.Optional(CONF_IR_COUNT): cv.positive_int, + probatio.Required(CONF_COMMANDS): probatio.All( cv.ensure_list, [ { - vol.Required(CONF_NAME): cv.string, - vol.Required(CONF_DATA): cv.string, + probatio.Required(CONF_NAME): cv.string, + probatio.Required(CONF_DATA): cv.string, } ], ), diff --git a/homeassistant/components/itunes/media_player.py b/homeassistant/components/itunes/media_player.py index dbac353bfe80a..44d71723833b3 100644 --- a/homeassistant/components/itunes/media_player.py +++ b/homeassistant/components/itunes/media_player.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio import requests -import voluptuous as vol from homeassistant.components.media_player import ( PLATFORM_SCHEMA as MEDIA_PLAYER_PLATFORM_SCHEMA, @@ -27,10 +27,10 @@ PLATFORM_SCHEMA = MEDIA_PLAYER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, } ) diff --git a/homeassistant/components/ituran/config_flow.py b/homeassistant/components/ituran/config_flow.py index 02ad22ab0aab2..26c3832577035 100644 --- a/homeassistant/components/ituran/config_flow.py +++ b/homeassistant/components/ituran/config_flow.py @@ -4,9 +4,9 @@ import logging from typing import Any, override +import probatio from pyituran import Ituran from pyituran.exceptions import IturanApiError, IturanAuthError -import voluptuous as vol from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult @@ -20,16 +20,16 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_ID_OR_PASSPORT): str, - vol.Required(CONF_PHONE_NUMBER): str, + probatio.Required(CONF_ID_OR_PASSPORT): str, + probatio.Required(CONF_PHONE_NUMBER): str, } ) -STEP_OTP_DATA_SCHEMA = vol.Schema( +STEP_OTP_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_OTP): str, + probatio.Required(CONF_OTP): str, } ) @@ -129,7 +129,7 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema({}), + data_schema=probatio.Schema({}), description_placeholders={ "phone_number": self._user_info[CONF_PHONE_NUMBER] }, diff --git a/homeassistant/components/izone/__init__.py b/homeassistant/components/izone/__init__.py index 030fa13a4aed4..e73b694d5f876 100644 --- a/homeassistant/components/izone/__init__.py +++ b/homeassistant/components/izone/__init__.py @@ -1,7 +1,7 @@ """The iZone integration.""" import pizone -import voluptuous as vol +import probatio from homeassistant import config_entries from homeassistant.const import CONF_EXCLUDE, CONF_HOST, Platform @@ -22,17 +22,17 @@ PLATFORMS = [Platform.CLIMATE, Platform.SENSOR] -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Optional(CONF_EXCLUDE, default=[]): vol.All( + probatio.Optional(CONF_EXCLUDE, default=[]): probatio.All( cv.ensure_list, [cv.string] ) } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/izone/climate.py b/homeassistant/components/izone/climate.py index edd5845b6e578..fd68cb302f9f4 100644 --- a/homeassistant/components/izone/climate.py +++ b/homeassistant/components/izone/climate.py @@ -5,7 +5,7 @@ from typing import Any, override from pizone import Controller, Zone -import voluptuous as vol +import probatio from homeassistant.components.climate import ( FAN_AUTO, @@ -52,10 +52,10 @@ IZONE_SERVICE_AIRFLOW_MAX = "airflow_max" IZONE_SERVICE_AIRFLOW_SCHEMA: VolDictType = { - vol.Required(ATTR_AIRFLOW): vol.All( - vol.Coerce(float), - vol.In(range(0, 101, 5)), - vol.Coerce(int), + probatio.Required(ATTR_AIRFLOW): probatio.All( + probatio.Coerce(float), + probatio.In(range(0, 101, 5)), + probatio.Coerce(int), msg="invalid airflow", ), } diff --git a/homeassistant/components/izone/config_flow.py b/homeassistant/components/izone/config_flow.py index 9b7f6c5db0f1b..88e43a62f58aa 100644 --- a/homeassistant/components/izone/config_flow.py +++ b/homeassistant/components/izone/config_flow.py @@ -8,7 +8,7 @@ import pizone from pizone.discovery import SCAN_TIMEOUT -import voluptuous as vol +import probatio from homeassistant import config_entries from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, FlowType @@ -161,9 +161,9 @@ async def async_step_discovery_done( next_flow=(FlowType.CONFIG_FLOW, candidates[0].flow_id), ) - selection_schema = vol.Schema( + selection_schema = probatio.Schema( { - vol.Required( + probatio.Required( SELECTED_CONTROLLER_UID, default=candidates[0].uid, ): SelectSelector( diff --git a/homeassistant/components/jellyfin/config_flow.py b/homeassistant/components/jellyfin/config_flow.py index c4f8dd63c9eca..9992463a82bae 100644 --- a/homeassistant/components/jellyfin/config_flow.py +++ b/homeassistant/components/jellyfin/config_flow.py @@ -4,7 +4,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, OptionsFlow from homeassistant.const import CONF_PASSWORD, CONF_URL, CONF_USERNAME @@ -17,23 +17,23 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_URL): str, - vol.Required(CONF_USERNAME): str, - vol.Optional(CONF_PASSWORD, default=""): str, + probatio.Required(CONF_URL): str, + probatio.Required(CONF_USERNAME): str, + probatio.Optional(CONF_PASSWORD, default=""): str, } ) -REAUTH_DATA_SCHEMA = vol.Schema( +REAUTH_DATA_SCHEMA = probatio.Schema( { - vol.Optional(CONF_PASSWORD, default=""): str, + probatio.Optional(CONF_PASSWORD, default=""): str, } ) -OPTIONAL_DATA_SCHEMA = vol.Schema( - {vol.Optional("audio_codec"): vol.In(SUPPORTED_AUDIO_CODECS)} +OPTIONAL_DATA_SCHEMA = probatio.Schema( + {probatio.Optional("audio_codec"): probatio.In(SUPPORTED_AUDIO_CODECS)} ) diff --git a/homeassistant/components/jellyfin/services.py b/homeassistant/components/jellyfin/services.py index c45c7e485677a..ca9e6c420ce97 100644 --- a/homeassistant/components/jellyfin/services.py +++ b/homeassistant/components/jellyfin/services.py @@ -2,7 +2,7 @@ from typing import Any -import voluptuous as vol +import probatio from homeassistant.components.media_player import ( ATTR_MEDIA, @@ -16,7 +16,7 @@ from .const import DOMAIN JELLYFIN_PLAY_MEDIA_SHUFFLE_SCHEMA = { - vol.Required(ATTR_MEDIA_CONTENT_ID): cv.string, + probatio.Required(ATTR_MEDIA_CONTENT_ID): cv.string, } @@ -24,7 +24,7 @@ def _promote_media_fields(data: dict[str, Any]) -> dict[str, Any]: """If 'media' key exists, promote its fields to the top level.""" if ATTR_MEDIA in data and isinstance(data[ATTR_MEDIA], dict): if ATTR_MEDIA_CONTENT_ID in data: - raise vol.Invalid( + raise probatio.Invalid( "Play media cannot contain both" f" '{ATTR_MEDIA}' and" f" '{ATTR_MEDIA_CONTENT_ID}'" @@ -47,7 +47,7 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, "play_media_shuffle", entity_domain=MP_DOMAIN, - schema=vol.All( + schema=probatio.All( _promote_media_fields, cv.make_entity_service_schema(JELLYFIN_PLAY_MEDIA_SHUFFLE_SCHEMA), ), diff --git a/homeassistant/components/jewish_calendar/config_flow.py b/homeassistant/components/jewish_calendar/config_flow.py index bc92cccbab6f6..17004e56d3553 100644 --- a/homeassistant/components/jewish_calendar/config_flow.py +++ b/homeassistant/components/jewish_calendar/config_flow.py @@ -5,7 +5,7 @@ import zoneinfo from hdate.translator import Language -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigFlow, @@ -51,13 +51,13 @@ ) from .entity import JewishCalendarConfigEntry -OPTIONS_SCHEMA = vol.Schema( +OPTIONS_SCHEMA = probatio.Schema( { - vol.Optional(CONF_CANDLE_LIGHT_MINUTES, default=DEFAULT_CANDLE_LIGHT): int, - vol.Optional( + probatio.Optional(CONF_CANDLE_LIGHT_MINUTES, default=DEFAULT_CANDLE_LIGHT): int, + probatio.Optional( CONF_HAVDALAH_OFFSET_MINUTES, default=DEFAULT_HAVDALAH_OFFSET_MINUTES ): int, - vol.Optional( + probatio.Optional( CONF_DAILY_EVENTS, default=DEFAULT_CALENDAR_EVENTS[CONF_DAILY_EVENTS], ): SelectSelector( @@ -68,7 +68,7 @@ translation_key=CONF_DAILY_EVENTS, ) ), - vol.Optional( + probatio.Optional( CONF_LEARNING_SCHEDULE, default=DEFAULT_CALENDAR_EVENTS[CONF_LEARNING_SCHEDULE], ): SelectSelector( @@ -79,7 +79,7 @@ translation_key=CONF_LEARNING_SCHEDULE, ) ), - vol.Optional( + probatio.Optional( CONF_YEARLY_EVENTS, default=DEFAULT_CALENDAR_EVENTS[CONF_YEARLY_EVENTS], ): SelectSelector( @@ -97,7 +97,7 @@ _LOGGER = logging.getLogger(__name__) -async def _get_data_schema(hass: HomeAssistant) -> vol.Schema: +async def _get_data_schema(hass: HomeAssistant) -> probatio.Schema: default_location = { CONF_LATITUDE: hass.config.latitude, CONF_LONGITUDE: hass.config.longitude, @@ -105,17 +105,23 @@ async def _get_data_schema(hass: HomeAssistant) -> vol.Schema: get_timezones: list[str] = list( await hass.async_add_executor_job(zoneinfo.available_timezones) ) - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_DIASPORA, default=DEFAULT_DIASPORA): BooleanSelector(), - vol.Required(CONF_LANGUAGE, default=DEFAULT_LANGUAGE): LanguageSelector( + probatio.Required( + CONF_DIASPORA, default=DEFAULT_DIASPORA + ): BooleanSelector(), + probatio.Required( + CONF_LANGUAGE, default=DEFAULT_LANGUAGE + ): LanguageSelector( LanguageSelectorConfig(languages=list(get_args(Language))) ), - vol.Optional(CONF_LOCATION, default=default_location): LocationSelector(), - vol.Optional(CONF_ELEVATION, default=hass.config.elevation): int, - vol.Optional(CONF_TIME_ZONE, default=hass.config.time_zone): SelectSelector( - SelectSelectorConfig(options=get_timezones, sort=True) - ), + probatio.Optional( + CONF_LOCATION, default=default_location + ): LocationSelector(), + probatio.Optional(CONF_ELEVATION, default=hass.config.elevation): int, + probatio.Optional( + CONF_TIME_ZONE, default=hass.config.time_zone + ): SelectSelector(SelectSelectorConfig(options=get_timezones, sort=True)), } ) diff --git a/homeassistant/components/jewish_calendar/services.py b/homeassistant/components/jewish_calendar/services.py index 08714282a9d65..f672e7185002a 100644 --- a/homeassistant/components/jewish_calendar/services.py +++ b/homeassistant/components/jewish_calendar/services.py @@ -7,7 +7,7 @@ from hdate import HebrewDate from hdate.omer import Nusach, Omer from hdate.translator import Language, set_language -import voluptuous as vol +import probatio from homeassistant.const import ATTR_DATE, CONF_LANGUAGE, SUN_EVENT_SUNSET from homeassistant.core import ( @@ -26,14 +26,14 @@ from .const import ATTR_AFTER_SUNSET, ATTR_NUSACH, DOMAIN, SERVICE_COUNT_OMER _LOGGER = logging.getLogger(__name__) -OMER_SCHEMA = vol.Schema( +OMER_SCHEMA = probatio.Schema( { - vol.Optional(ATTR_DATE): cv.date, - vol.Optional(ATTR_AFTER_SUNSET, default=True): cv.boolean, - vol.Required(ATTR_NUSACH, default="sfarad"): vol.In( + probatio.Optional(ATTR_DATE): cv.date, + probatio.Optional(ATTR_AFTER_SUNSET, default=True): cv.boolean, + probatio.Required(ATTR_NUSACH, default="sfarad"): probatio.In( [nusach.name.lower() for nusach in Nusach] ), - vol.Optional(CONF_LANGUAGE, default="he"): LanguageSelector( + probatio.Optional(CONF_LANGUAGE, default="he"): LanguageSelector( LanguageSelectorConfig(languages=list(get_args(Language))) ), } diff --git a/homeassistant/components/joaoapps_join/__init__.py b/homeassistant/components/joaoapps_join/__init__.py index 89b5748a714f7..dc85294d3ebdb 100644 --- a/homeassistant/components/joaoapps_join/__init__.py +++ b/homeassistant/components/joaoapps_join/__init__.py @@ -2,6 +2,7 @@ import logging +import probatio from pyjoin import ( get_devices, ring_device, @@ -11,7 +12,6 @@ send_url, set_wallpaper, ) -import voluptuous as vol from homeassistant.const import CONF_API_KEY, CONF_DEVICE_ID, CONF_NAME from homeassistant.core import HomeAssistant, ServiceCall @@ -25,22 +25,22 @@ CONF_DEVICE_IDS = "device_ids" CONF_DEVICE_NAMES = "device_names" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.All( + DOMAIN: probatio.All( cv.ensure_list, [ { - vol.Required(CONF_API_KEY): cv.string, - vol.Optional(CONF_DEVICE_ID): cv.string, - vol.Optional(CONF_DEVICE_IDS): cv.string, - vol.Optional(CONF_DEVICE_NAMES): cv.string, - vol.Optional(CONF_NAME): cv.string, + probatio.Required(CONF_API_KEY): cv.string, + probatio.Optional(CONF_DEVICE_ID): cv.string, + probatio.Optional(CONF_DEVICE_IDS): cv.string, + probatio.Optional(CONF_DEVICE_NAMES): cv.string, + probatio.Optional(CONF_NAME): cv.string, } ], ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/joaoapps_join/notify.py b/homeassistant/components/joaoapps_join/notify.py index d7e74b9eaca87..c1cfce08e7b3d 100644 --- a/homeassistant/components/joaoapps_join/notify.py +++ b/homeassistant/components/joaoapps_join/notify.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from pyjoin import get_devices, send_notification -import voluptuous as vol from homeassistant.components.notify import ( ATTR_DATA, @@ -25,10 +25,10 @@ PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_API_KEY): cv.string, - vol.Optional(CONF_DEVICE_ID): cv.string, - vol.Optional(CONF_DEVICE_IDS): cv.string, - vol.Optional(CONF_DEVICE_NAMES): cv.string, + probatio.Required(CONF_API_KEY): cv.string, + probatio.Optional(CONF_DEVICE_ID): cv.string, + probatio.Optional(CONF_DEVICE_IDS): cv.string, + probatio.Optional(CONF_DEVICE_NAMES): cv.string, } ) diff --git a/homeassistant/components/justnimbus/config_flow.py b/homeassistant/components/justnimbus/config_flow.py index 573baad21450a..b0a48c92a19fc 100644 --- a/homeassistant/components/justnimbus/config_flow.py +++ b/homeassistant/components/justnimbus/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override import justnimbus -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_CLIENT_ID @@ -15,10 +15,10 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_CLIENT_ID): cv.string, - vol.Required(CONF_ZIP_CODE): cv.string, + probatio.Required(CONF_CLIENT_ID): cv.string, + probatio.Required(CONF_ZIP_CODE): cv.string, }, ) diff --git a/homeassistant/components/jvc_projector/config_flow.py b/homeassistant/components/jvc_projector/config_flow.py index 432f7b87c0471..44bd2d5bdef35 100644 --- a/homeassistant/components/jvc_projector/config_flow.py +++ b/homeassistant/components/jvc_projector/config_flow.py @@ -10,7 +10,7 @@ command as cmd, ) from jvcprojector.projector import DEFAULT_PORT -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_PORT @@ -65,11 +65,11 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, - vol.Optional(CONF_PASSWORD): str, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Optional(CONF_PASSWORD): str, } ), errors=errors, @@ -106,7 +106,7 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema({vol.Optional(CONF_PASSWORD): str}), + data_schema=probatio.Schema({probatio.Optional(CONF_PASSWORD): str}), errors=errors, ) diff --git a/homeassistant/components/kaco_modbus/config_flow.py b/homeassistant/components/kaco_modbus/config_flow.py index 99cfea8153216..740c22a48ab04 100644 --- a/homeassistant/components/kaco_modbus/config_flow.py +++ b/homeassistant/components/kaco_modbus/config_flow.py @@ -5,7 +5,7 @@ from kaco_modbus import KacoError, KacoInverter, NotAKacoInverterError from modbus_connection import ModbusError, ModbusTcpParams -import voluptuous as vol +import probatio from homeassistant.components.modbus import async_get_temporary_unit from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -22,20 +22,20 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): TextSelector(), - vol.Required(CONF_PORT, default=DEFAULT_PORT): vol.All( + probatio.Required(CONF_HOST): TextSelector(), + probatio.Required(CONF_PORT, default=DEFAULT_PORT): probatio.All( NumberSelector( NumberSelectorConfig(mode=NumberSelectorMode.BOX, min=1, max=65535) ), - vol.Coerce(int), + probatio.Coerce(int), ), - vol.Required(CONF_UNIT_ID, default=DEFAULT_UNIT_ID): vol.All( + probatio.Required(CONF_UNIT_ID, default=DEFAULT_UNIT_ID): probatio.All( NumberSelector( NumberSelectorConfig(mode=NumberSelectorMode.BOX, min=1, max=247) ), - vol.Coerce(int), + probatio.Coerce(int), ), } ) diff --git a/homeassistant/components/kaiterra/__init__.py b/homeassistant/components/kaiterra/__init__.py index 67fcfbe482c44..d128e2ed83d26 100644 --- a/homeassistant/components/kaiterra/__init__.py +++ b/homeassistant/components/kaiterra/__init__.py @@ -1,6 +1,6 @@ """Support for Kaiterra devices.""" -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_API_KEY, @@ -31,29 +31,33 @@ PLATFORMS, ) -KAITERRA_DEVICE_SCHEMA = vol.Schema( +KAITERRA_DEVICE_SCHEMA = probatio.Schema( { - vol.Required(CONF_DEVICE_ID): cv.string, - vol.Required(CONF_TYPE): vol.In(AVAILABLE_DEVICE_TYPES), - vol.Optional(CONF_NAME): cv.string, + probatio.Required(CONF_DEVICE_ID): cv.string, + probatio.Required(CONF_TYPE): probatio.In(AVAILABLE_DEVICE_TYPES), + probatio.Optional(CONF_NAME): cv.string, } ) -KAITERRA_SCHEMA = vol.Schema( +KAITERRA_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_KEY): cv.string, - vol.Required(CONF_DEVICES): vol.All(cv.ensure_list, [KAITERRA_DEVICE_SCHEMA]), - vol.Optional(CONF_AQI_STANDARD, default=DEFAULT_AQI_STANDARD): vol.In( - AVAILABLE_AQI_STANDARDS + probatio.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_DEVICES): probatio.All( + cv.ensure_list, [KAITERRA_DEVICE_SCHEMA] ), - vol.Optional(CONF_PREFERRED_UNITS, default=DEFAULT_PREFERRED_UNIT): vol.All( - cv.ensure_list, [vol.In(AVAILABLE_UNITS)] + probatio.Optional(CONF_AQI_STANDARD, default=DEFAULT_AQI_STANDARD): probatio.In( + AVAILABLE_AQI_STANDARDS ), - vol.Optional(CONF_SCAN_INTERVAL, default=DEFAULT_SCAN_INTERVAL): cv.time_period, + probatio.Optional( + CONF_PREFERRED_UNITS, default=DEFAULT_PREFERRED_UNIT + ): probatio.All(cv.ensure_list, [probatio.In(AVAILABLE_UNITS)]), + probatio.Optional( + CONF_SCAN_INTERVAL, default=DEFAULT_SCAN_INTERVAL + ): cv.time_period, } ) -CONFIG_SCHEMA = vol.Schema({DOMAIN: KAITERRA_SCHEMA}, extra=vol.ALLOW_EXTRA) +CONFIG_SCHEMA = probatio.Schema({DOMAIN: KAITERRA_SCHEMA}, extra=probatio.ALLOW_EXTRA) async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: diff --git a/homeassistant/components/kaleidescape/config_flow.py b/homeassistant/components/kaleidescape/config_flow.py index 89503d8877cdd..0c132e937faaf 100644 --- a/homeassistant/components/kaleidescape/config_flow.py +++ b/homeassistant/components/kaleidescape/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, cast, override from urllib.parse import urlparse -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST @@ -55,7 +55,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_HOST, default=host): str}), + data_schema=probatio.Schema( + {probatio.Required(CONF_HOST, default=host): str} + ), errors=errors, ) diff --git a/homeassistant/components/kankun/switch.py b/homeassistant/components/kankun/switch.py index c716c358797a8..0357e5c416a05 100644 --- a/homeassistant/components/kankun/switch.py +++ b/homeassistant/components/kankun/switch.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio import requests -import voluptuous as vol from homeassistant.components.switch import ( PLATFORM_SCHEMA as SWITCH_PLATFORM_SCHEMA, @@ -29,19 +29,19 @@ DEFAULT_PORT = 80 DEFAULT_PATH = "/cgi-bin/json.cgi" -SWITCH_SCHEMA = vol.Schema( +SWITCH_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_PATH, default=DEFAULT_PATH): cv.string, - vol.Optional(CONF_USERNAME): cv.string, - vol.Optional(CONF_PASSWORD): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_PATH, default=DEFAULT_PATH): cv.string, + probatio.Optional(CONF_USERNAME): cv.string, + probatio.Optional(CONF_PASSWORD): cv.string, } ) PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_SWITCHES): cv.schema_with_slug_keys(SWITCH_SCHEMA)} + {probatio.Required(CONF_SWITCHES): cv.schema_with_slug_keys(SWITCH_SCHEMA)} ) diff --git a/homeassistant/components/karakeep/config_flow.py b/homeassistant/components/karakeep/config_flow.py index 72bf593c80eaa..7b8b8ab068195 100644 --- a/homeassistant/components/karakeep/config_flow.py +++ b/homeassistant/components/karakeep/config_flow.py @@ -11,7 +11,7 @@ KarakeepConnectionError, KarakeepInvalidResponseError, ) -import voluptuous as vol +import probatio from yarl import URL from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -22,14 +22,14 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_URL): str, - vol.Required(CONF_TOKEN): str, - vol.Required(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): bool, + probatio.Required(CONF_URL): str, + probatio.Required(CONF_TOKEN): str, + probatio.Required(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): bool, } ) -STEP_REAUTH_DATA_SCHEMA = vol.Schema({vol.Required(CONF_TOKEN): str}) +STEP_REAUTH_DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_TOKEN): str}) class KarakeepConfigFlow(ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/components/keba/__init__.py b/homeassistant/components/keba/__init__.py index 2c372cf1a25ae..6ed70942346a0 100644 --- a/homeassistant/components/keba/__init__.py +++ b/homeassistant/components/keba/__init__.py @@ -4,7 +4,7 @@ import logging from keba_kecontact.connection import KebaKeContact -import voluptuous as vol +import probatio from homeassistant.const import CONF_HOST, Platform from homeassistant.core import HomeAssistant, ServiceCall @@ -26,21 +26,21 @@ MAX_POLLING_INTERVAL = 5 # in seconds MAX_FAST_POLLING_COUNT = 4 -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_RFID, default="00845500"): cv.string, - vol.Optional(CONF_FS, default=False): cv.boolean, - vol.Optional(CONF_FS_TIMEOUT, default=30): cv.positive_int, - vol.Optional(CONF_FS_FALLBACK, default=6): cv.positive_int, - vol.Optional(CONF_FS_PERSIST, default=0): cv.positive_int, - vol.Optional(CONF_FS_INTERVAL, default=5): cv.positive_int, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_RFID, default="00845500"): cv.string, + probatio.Optional(CONF_FS, default=False): cv.boolean, + probatio.Optional(CONF_FS_TIMEOUT, default=30): cv.positive_int, + probatio.Optional(CONF_FS_FALLBACK, default=6): cv.positive_int, + probatio.Optional(CONF_FS_PERSIST, default=0): cv.positive_int, + probatio.Optional(CONF_FS_INTERVAL, default=5): cv.positive_int, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) _SERVICE_MAP = { diff --git a/homeassistant/components/keenetic_ndms2/config_flow.py b/homeassistant/components/keenetic_ndms2/config_flow.py index 943e439c61939..8f76d3ae1a23f 100644 --- a/homeassistant/components/keenetic_ndms2/config_flow.py +++ b/homeassistant/components/keenetic_ndms2/config_flow.py @@ -4,7 +4,7 @@ from urllib.parse import urlparse from ndms2_client import Client, ConnectionException, InterfaceInfo, TelnetConnection -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_RECONFIGURE, @@ -97,17 +97,17 @@ async def async_step_user( ) host_schema: VolDictType = ( - {vol.Required(CONF_HOST): str} if not self._host else {} + {probatio.Required(CONF_HOST): str} if not self._host else {} ) return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { **host_schema, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Optional(CONF_PORT, default=DEFAULT_TELNET_PORT): int, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Optional(CONF_PORT, default=DEFAULT_TELNET_PORT): int, } ), errors=errors, @@ -197,23 +197,23 @@ async def async_step_user( if user_input is not None: return self.async_create_entry(title="", data=user_input) - options = vol.Schema( + options = probatio.Schema( { # Polling interval is user-configurable, which is no longer allowed # pylint: disable-next=home-assistant-config-flow-polling-field - vol.Required( + probatio.Required( CONF_SCAN_INTERVAL, default=self.config_entry.options.get( CONF_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL ), ): int, - vol.Required( + probatio.Required( CONF_CONSIDER_HOME, default=self.config_entry.options.get( CONF_CONSIDER_HOME, DEFAULT_CONSIDER_HOME ), ): int, - vol.Required( + probatio.Required( CONF_INTERFACES, default=[ item @@ -223,15 +223,15 @@ async def async_step_user( if item in self._interface_options ], ): cv.multi_select(self._interface_options), - vol.Optional( + probatio.Optional( CONF_TRY_HOTSPOT, default=self.config_entry.options.get(CONF_TRY_HOTSPOT, True), ): bool, - vol.Optional( + probatio.Optional( CONF_INCLUDE_ARP, default=self.config_entry.options.get(CONF_INCLUDE_ARP, True), ): bool, - vol.Optional( + probatio.Optional( CONF_INCLUDE_ASSOCIATED, default=self.config_entry.options.get( CONF_INCLUDE_ASSOCIATED, True diff --git a/homeassistant/components/kef/media_player.py b/homeassistant/components/kef/media_player.py index 956133ce44ad2..23aa42e5e0630 100644 --- a/homeassistant/components/kef/media_player.py +++ b/homeassistant/components/kef/media_player.py @@ -9,7 +9,7 @@ from aiokef import AsyncKefSpeaker from aiokef.aiokef import DSP_OPTION_MAPPING from getmac import get_mac_address -import voluptuous as vol +import probatio from homeassistant.components.media_player import ( PLATFORM_SCHEMA as MEDIA_PLAYER_PLATFORM_SCHEMA, @@ -60,17 +60,19 @@ PLATFORM_SCHEMA = MEDIA_PLAYER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_TYPE): vol.In(["LS50", "LSX"]), - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_MAX_VOLUME, default=DEFAULT_MAX_VOLUME): cv.small_float, - vol.Optional(CONF_VOLUME_STEP, default=DEFAULT_VOLUME_STEP): cv.small_float, - vol.Optional( + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_TYPE): probatio.In(["LS50", "LSX"]), + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_MAX_VOLUME, default=DEFAULT_MAX_VOLUME): cv.small_float, + probatio.Optional( + CONF_VOLUME_STEP, default=DEFAULT_VOLUME_STEP + ): cv.small_float, + probatio.Optional( CONF_INVERSE_SPEAKER_MODE, default=DEFAULT_INVERSE_SPEAKER_MODE ): cv.boolean, - vol.Optional(CONF_SUPPORTS_ON, default=DEFAULT_SUPPORTS_ON): cv.boolean, - vol.Optional(CONF_STANDBY_TIME): vol.In([20, 60]), + probatio.Optional(CONF_SUPPORTS_ON, default=DEFAULT_SUPPORTS_ON): cv.boolean, + probatio.Optional(CONF_STANDBY_TIME): probatio.In([20, 60]), } ) @@ -151,12 +153,14 @@ async def async_setup_platform( platform.async_register_entity_service( SERVICE_MODE, { - vol.Optional("desk_mode"): cv.boolean, - vol.Optional("wall_mode"): cv.boolean, - vol.Optional("phase_correction"): cv.boolean, - vol.Optional("high_pass"): cv.boolean, - vol.Optional("sub_polarity"): vol.In(["-", "+"]), - vol.Optional("bass_extension"): vol.In(["Less", "Standard", "Extra"]), + probatio.Optional("desk_mode"): cv.boolean, + probatio.Optional("wall_mode"): cv.boolean, + probatio.Optional("phase_correction"): cv.boolean, + probatio.Optional("high_pass"): cv.boolean, + probatio.Optional("sub_polarity"): probatio.In(["-", "+"]), + probatio.Optional("bass_extension"): probatio.In( + ["Less", "Standard", "Extra"] + ), }, "set_mode", ) @@ -168,8 +172,8 @@ def add_service(name, which, option): platform.async_register_entity_service( name, { - vol.Required(option): vol.All( - vol.Coerce(float), vol.Coerce(dtype), vol.In(options) + probatio.Required(option): probatio.All( + probatio.Coerce(float), probatio.Coerce(dtype), probatio.In(options) ) }, f"set_{which}", diff --git a/homeassistant/components/kegtron/config_flow.py b/homeassistant/components/kegtron/config_flow.py index d3739aad0e4d4..d306bd411f147 100644 --- a/homeassistant/components/kegtron/config_flow.py +++ b/homeassistant/components/kegtron/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from kegtron_ble import KegtronBluetoothDeviceData as DeviceData -import voluptuous as vol +import probatio from homeassistant.components.bluetooth import ( BluetoothServiceInfoBleak, @@ -88,7 +88,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_ADDRESS): vol.In(self._discovered_devices)} + data_schema=probatio.Schema( + {probatio.Required(CONF_ADDRESS): probatio.In(self._discovered_devices)} ), ) diff --git a/homeassistant/components/keyboard_remote/__init__.py b/homeassistant/components/keyboard_remote/__init__.py index 9e66629ae823e..40e6a7a7e360e 100644 --- a/homeassistant/components/keyboard_remote/__init__.py +++ b/homeassistant/components/keyboard_remote/__init__.py @@ -8,7 +8,7 @@ from asyncinotify import Inotify, Mask from evdev import InputDevice, categorize, ecodes, list_devices -import voluptuous as vol +import probatio from homeassistant.const import EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP from homeassistant.core import HomeAssistant @@ -38,28 +38,32 @@ DEVINPUT = "/dev/input" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.All( + DOMAIN: probatio.All( cv.ensure_list, [ - vol.Schema( + probatio.Schema( { - vol.Exclusive(DEVICE_DESCRIPTOR, DEVICE_ID_GROUP): cv.string, - vol.Exclusive(DEVICE_NAME, DEVICE_ID_GROUP): cv.string, - vol.Optional(TYPE, default=["key_up"]): vol.All( - cv.ensure_list, [vol.In(KEY_VALUE)] + probatio.Exclusive( + DEVICE_DESCRIPTOR, DEVICE_ID_GROUP + ): cv.string, + probatio.Exclusive(DEVICE_NAME, DEVICE_ID_GROUP): cv.string, + probatio.Optional(TYPE, default=["key_up"]): probatio.All( + cv.ensure_list, [probatio.In(KEY_VALUE)] ), - vol.Optional(EMULATE_KEY_HOLD, default=False): cv.boolean, - vol.Optional(EMULATE_KEY_HOLD_DELAY, default=0.250): float, - vol.Optional(EMULATE_KEY_HOLD_REPEAT, default=0.033): float, + probatio.Optional(EMULATE_KEY_HOLD, default=False): cv.boolean, + probatio.Optional(EMULATE_KEY_HOLD_DELAY, default=0.250): float, + probatio.Optional( + EMULATE_KEY_HOLD_REPEAT, default=0.033 + ): float, } ), cv.has_at_least_one_key(DEVICE_DESCRIPTOR, DEVICE_ID_GROUP), ], ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/keymitt_ble/config_flow.py b/homeassistant/components/keymitt_ble/config_flow.py index abf9d13485df8..8f640303f9897 100644 --- a/homeassistant/components/keymitt_ble/config_flow.py +++ b/homeassistant/components/keymitt_ble/config_flow.py @@ -10,7 +10,7 @@ parse_advertisement_data, randomid, ) -import voluptuous as vol +import probatio from homeassistant.components import bluetooth from homeassistant.components.bluetooth import ( @@ -112,9 +112,9 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_ADDRESS): vol.In( + probatio.Required(CONF_ADDRESS): probatio.In( { address: f"{parsed.data['local_name']} ({address})" for address, parsed in self._discovered_advs.items() diff --git a/homeassistant/components/keymitt_ble/switch.py b/homeassistant/components/keymitt_ble/switch.py index 351e44caf5202..fde512266a7b3 100644 --- a/homeassistant/components/keymitt_ble/switch.py +++ b/homeassistant/components/keymitt_ble/switch.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.switch import SwitchEntity from homeassistant.core import HomeAssistant @@ -18,9 +18,9 @@ CALIBRATE = "calibrate" CALIBRATE_SCHEMA: VolDictType = { - vol.Required("depth"): cv.positive_int, - vol.Required("duration"): cv.positive_int, - vol.Required("mode"): vol.In(["normal", "invert", "toggle"]), + probatio.Required("depth"): cv.positive_int, + probatio.Required("duration"): cv.positive_int, + probatio.Required("mode"): probatio.In(["normal", "invert", "toggle"]), } diff --git a/homeassistant/components/kiosker/config_flow.py b/homeassistant/components/kiosker/config_flow.py index 9e2d51ab6d8c0..0a4e9867352ae 100644 --- a/homeassistant/components/kiosker/config_flow.py +++ b/homeassistant/components/kiosker/config_flow.py @@ -13,7 +13,7 @@ PingError, TLSVerificationError, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_TOKEN, CONF_HOST, CONF_SSL, CONF_VERIFY_SSL @@ -24,23 +24,23 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_API_TOKEN): str, - vol.Optional(CONF_SSL, default=DEFAULT_SSL): bool, - vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_SSL_VERIFY): bool, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_API_TOKEN): str, + probatio.Optional(CONF_SSL, default=DEFAULT_SSL): bool, + probatio.Optional(CONF_VERIFY_SSL, default=DEFAULT_SSL_VERIFY): bool, } ) -STEP_ZEROCONF_CONFIRM_DATA_SCHEMA = vol.Schema( +STEP_ZEROCONF_CONFIRM_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_TOKEN): str, - vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_SSL_VERIFY): bool, + probatio.Required(CONF_API_TOKEN): str, + probatio.Optional(CONF_VERIFY_SSL, default=DEFAULT_SSL_VERIFY): bool, } ) -STEP_REAUTH_DATA_SCHEMA = vol.Schema( +STEP_REAUTH_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_TOKEN): str, + probatio.Required(CONF_API_TOKEN): str, } ) diff --git a/homeassistant/components/kiosker/services.py b/homeassistant/components/kiosker/services.py index 7729aa107035f..1ff7110a4fbaa 100644 --- a/homeassistant/components/kiosker/services.py +++ b/homeassistant/components/kiosker/services.py @@ -12,7 +12,7 @@ IPAuthenticationError, TLSVerificationError, ) -import voluptuous as vol +import probatio from homeassistant.const import ATTR_DEVICE_ID, ATTR_ICON from homeassistant.core import HomeAssistant, ServiceCall, ServiceResponse, callback @@ -35,35 +35,37 @@ ) from .coordinator import KioskerConfigEntry, KioskerDataUpdateCoordinator -NAVIGATE_URL_SCHEMA = vol.Schema( +NAVIGATE_URL_SCHEMA = probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): str, - vol.Required(ATTR_URL): str, + probatio.Required(ATTR_DEVICE_ID): str, + probatio.Required(ATTR_URL): str, } ) -SET_BLACKOUT_SCHEMA = vol.Schema( +SET_BLACKOUT_SCHEMA = probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): str, - vol.Optional(ATTR_VISIBLE, default=True): cv.boolean, - vol.Optional(ATTR_TEXT): str, - vol.Optional(ATTR_BACKGROUND, default=[0, 0, 0]): selector.ColorRGBSelector(), - vol.Optional( + probatio.Required(ATTR_DEVICE_ID): str, + probatio.Optional(ATTR_VISIBLE, default=True): cv.boolean, + probatio.Optional(ATTR_TEXT): str, + probatio.Optional( + ATTR_BACKGROUND, default=[0, 0, 0] + ): selector.ColorRGBSelector(), + probatio.Optional( ATTR_FOREGROUND, default=[255, 255, 255] ): selector.ColorRGBSelector(), - vol.Optional(ATTR_ICON): str, - vol.Optional(ATTR_EXPIRE, default=60): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100000) + probatio.Optional(ATTR_ICON): str, + probatio.Optional(ATTR_EXPIRE, default=60): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100000) ), - vol.Optional(ATTR_DISMISSIBLE, default=False): cv.boolean, - vol.Optional( + probatio.Optional(ATTR_DISMISSIBLE, default=False): cv.boolean, + probatio.Optional( ATTR_BUTTON_BACKGROUND, default=[255, 255, 255] ): selector.ColorRGBSelector(), - vol.Optional( + probatio.Optional( ATTR_BUTTON_FOREGROUND, default=[0, 0, 0] ): selector.ColorRGBSelector(), - vol.Optional(ATTR_BUTTON_TEXT): str, - vol.Optional(ATTR_SOUND): str, + probatio.Optional(ATTR_BUTTON_TEXT): str, + probatio.Optional(ATTR_SOUND): str, } ) diff --git a/homeassistant/components/kira/__init__.py b/homeassistant/components/kira/__init__.py index 8ffbf66ecf4a1..8bd706eb65ff9 100644 --- a/homeassistant/components/kira/__init__.py +++ b/homeassistant/components/kira/__init__.py @@ -3,9 +3,9 @@ import logging import os +import probatio +from probatio.error import Error as ProbatioError import pykira -import voluptuous as vol -from voluptuous.error import Error as VoluptuousError import yaml from homeassistant.const import ( @@ -37,42 +37,42 @@ CODES_YAML = f"{DOMAIN}_codes.yaml" -CODE_SCHEMA = vol.Schema( +CODE_SCHEMA = probatio.Schema( { - vol.Required(CONF_NAME): cv.string, - vol.Required(CONF_CODE): cv.string, - vol.Optional(CONF_TYPE): cv.string, - vol.Optional(CONF_DEVICE): cv.string, - vol.Optional(CONF_REPEAT): cv.positive_int, + probatio.Required(CONF_NAME): cv.string, + probatio.Required(CONF_CODE): cv.string, + probatio.Optional(CONF_TYPE): cv.string, + probatio.Optional(CONF_DEVICE): cv.string, + probatio.Optional(CONF_REPEAT): cv.positive_int, } ) -SENSOR_SCHEMA = vol.Schema( +SENSOR_SCHEMA = probatio.Schema( { - vol.Optional(CONF_NAME, default=DOMAIN): cv.string, - vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_NAME, default=DOMAIN): cv.string, + probatio.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, } ) -REMOTE_SCHEMA = vol.Schema( +REMOTE_SCHEMA = probatio.Schema( { - vol.Optional(CONF_NAME, default=DOMAIN): cv.string, - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_NAME, default=DOMAIN): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Optional(CONF_SENSORS): [SENSOR_SCHEMA], - vol.Optional(CONF_REMOTES): [REMOTE_SCHEMA], + probatio.Optional(CONF_SENSORS): [SENSOR_SCHEMA], + probatio.Optional(CONF_REMOTES): [REMOTE_SCHEMA], } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) @@ -85,7 +85,7 @@ def load_codes(path): for code in data: try: codes.append(CODE_SCHEMA(code)) - except VoluptuousError as exception: + except ProbatioError as exception: # keep going _LOGGER.warning("KIRA code invalid data: %s", exception) else: diff --git a/homeassistant/components/kitchen_sink/config_flow.py b/homeassistant/components/kitchen_sink/config_flow.py index 58865754f5692..b5a923ed17a5a 100644 --- a/homeassistant/components/kitchen_sink/config_flow.py +++ b/homeassistant/components/kitchen_sink/config_flow.py @@ -3,7 +3,7 @@ from collections.abc import Mapping from typing import Any, override -import voluptuous as vol +import probatio from homeassistant import data_entry_flow from homeassistant.components.infrared import ( @@ -90,18 +90,18 @@ async def async_step_options_1( if user_input is not None: return self.async_create_entry(data=self.config_entry.options | user_input) - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required("section_1"): data_entry_flow.section( - vol.Schema( + probatio.Required("section_1"): data_entry_flow.section( + probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_BOOLEAN, default=self.config_entry.options.get( CONF_BOOLEAN, False ), ): bool, - vol.Optional(CONF_INT): cv.positive_int, + probatio.Optional(CONF_INT): cv.positive_int, } ), {"collapsed": False}, @@ -135,10 +135,10 @@ async def async_step_add_sensor( return self.async_show_form( step_id="add_sensor", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required("name"): str, - vol.Required("state"): int, + probatio.Required("name"): str, + probatio.Required("state"): int, } ), ) @@ -164,10 +164,10 @@ async def async_step_reconfigure_sensor( return self.async_show_form( step_id="reconfigure_sensor", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required("name"): str, - vol.Required("state"): int, + probatio.Required("name"): str, + probatio.Required("state"): int, } ), ) @@ -191,12 +191,12 @@ async def async_step_user( if not emitter_entities and not receiver_entities: return self.async_abort(reason="no_infrared_entities") - schema_dict: dict[vol.Marker, Any] = { - vol.Required("name"): str, + schema_dict: dict[probatio.Marker, Any] = { + probatio.Required("name"): str, } if emitter_entities: - schema_dict[vol.Optional(CONF_INFRARED_ENTITY_ID)] = EntitySelector( + schema_dict[probatio.Optional(CONF_INFRARED_ENTITY_ID)] = EntitySelector( EntitySelectorConfig( domain=INFRARED_DOMAIN, include_entities=emitter_entities, @@ -204,7 +204,7 @@ async def async_step_user( ) if receiver_entities: - schema_dict[vol.Optional(CONF_INFRARED_RECEIVER_ENTITY_ID)] = ( + schema_dict[probatio.Optional(CONF_INFRARED_RECEIVER_ENTITY_ID)] = ( EntitySelector( EntitySelectorConfig( domain=INFRARED_DOMAIN, @@ -213,4 +213,6 @@ async def async_step_user( ) ) - return self.async_show_form(step_id="user", data_schema=vol.Schema(schema_dict)) + return self.async_show_form( + step_id="user", data_schema=probatio.Schema(schema_dict) + ) diff --git a/homeassistant/components/kitchen_sink/repairs.py b/homeassistant/components/kitchen_sink/repairs.py index ef86301070086..86b8c569c7b80 100644 --- a/homeassistant/components/kitchen_sink/repairs.py +++ b/homeassistant/components/kitchen_sink/repairs.py @@ -1,6 +1,6 @@ """Repairs platform for the demo integration.""" -import voluptuous as vol +import probatio from homeassistant.components.repairs import ( ConfirmRepairFlow, @@ -27,7 +27,7 @@ async def async_step_confirm( if user_input is not None: return self.async_create_entry(data={}) - return self.async_show_form(step_id="confirm", data_schema=vol.Schema({})) + return self.async_show_form(step_id="confirm", data_schema=probatio.Schema({})) class DemoColdTeaFixFlow(RepairsFlow): diff --git a/homeassistant/components/kitchen_sink/services.py b/homeassistant/components/kitchen_sink/services.py index 6ebcbd1ba0130..a777f33f3a5ba 100644 --- a/homeassistant/components/kitchen_sink/services.py +++ b/homeassistant/components/kitchen_sink/services.py @@ -1,6 +1,6 @@ """Services for the Everything but the Kitchen Sink integration.""" -import voluptuous as vol +import probatio from homeassistant.components.device_tracker import DOMAIN as DEVICE_TRACKER_DOMAIN from homeassistant.const import ATTR_LATITUDE, ATTR_LONGITUDE @@ -9,12 +9,12 @@ from .const import DOMAIN -SCHEMA_SERVICE_TEST_SERVICE_1 = vol.Schema( +SCHEMA_SERVICE_TEST_SERVICE_1 = probatio.Schema( { - vol.Required("field_1"): vol.Coerce(int), - vol.Required("field_2"): vol.In(["off", "auto", "cool"]), - vol.Optional("field_3"): vol.Coerce(int), - vol.Optional("field_4"): vol.In(["forward", "reverse"]), + probatio.Required("field_1"): probatio.Coerce(int), + probatio.Required("field_2"): probatio.In(["off", "auto", "cool"]), + probatio.Optional("field_3"): probatio.Coerce(int), + probatio.Optional("field_4"): probatio.In(["forward", "reverse"]), } ) @@ -55,9 +55,11 @@ def service_handler(call: ServiceCall) -> ServiceResponse: SERVICE_SET_TRACKER_LOCATION, entity_domain=DEVICE_TRACKER_DOMAIN, schema={ - vol.Required(ATTR_LATITUDE): cv.latitude, - vol.Required(ATTR_LONGITUDE): cv.longitude, - vol.Required(ATTR_ACCURACY): vol.All(vol.Coerce(float), vol.Range(min=0)), + probatio.Required(ATTR_LATITUDE): cv.latitude, + probatio.Required(ATTR_LONGITUDE): cv.longitude, + probatio.Required(ATTR_ACCURACY): probatio.All( + probatio.Coerce(float), probatio.Range(min=0) + ), }, func="async_set_tracker_location", ) @@ -67,6 +69,6 @@ def service_handler(call: ServiceCall) -> ServiceResponse: DOMAIN, SERVICE_SET_SCANNER_CONNECTED, entity_domain=DEVICE_TRACKER_DOMAIN, - schema={vol.Required(ATTR_CONNECTED): cv.boolean}, + schema={probatio.Required(ATTR_CONNECTED): cv.boolean}, func="async_set_scanner_connected", ) diff --git a/homeassistant/components/kiwi/lock.py b/homeassistant/components/kiwi/lock.py index 4cd03a8e96539..e5517145702f7 100644 --- a/homeassistant/components/kiwi/lock.py +++ b/homeassistant/components/kiwi/lock.py @@ -4,7 +4,7 @@ from typing import Any, override from kiwiki import KiwiClient, KiwiException -import voluptuous as vol +import probatio from homeassistant.components.lock import ( PLATFORM_SCHEMA as LOCK_PLATFORM_SCHEMA, @@ -32,7 +32,10 @@ UNLOCK_MAINTAIN_TIME = 5 PLATFORM_SCHEMA = LOCK_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_USERNAME): cv.string, vol.Required(CONF_PASSWORD): cv.string} + { + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + } ) diff --git a/homeassistant/components/klik_aan_klik_uit/config_flow.py b/homeassistant/components/klik_aan_klik_uit/config_flow.py index 833fc824689a9..44b1830181da5 100644 --- a/homeassistant/components/klik_aan_klik_uit/config_flow.py +++ b/homeassistant/components/klik_aan_klik_uit/config_flow.py @@ -2,9 +2,9 @@ from typing import Any, override +import probatio from rf_protocols.commands import ModulationType from rf_protocols.commands.kaku import KakuCommand -import voluptuous as vol from homeassistant.components.radio_frequency import ( async_get_transmitters, @@ -91,7 +91,7 @@ async def async_step_pairing_mode( if user_input is None: return self.async_show_form( step_id="pairing_mode", - data_schema=vol.Schema({}), + data_schema=probatio.Schema({}), ) assert self._device_data is not None @@ -129,9 +129,9 @@ async def async_step_pairing_result( return self.async_show_form( step_id="pairing_result", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( _CONF_DEVICE_RESPONDED, default=False, ): selector.BooleanSelector() @@ -143,7 +143,7 @@ def _async_user_schema( self, transmitters: list[str], user_input: dict[str, Any] | None = None, - ) -> vol.Schema: + ) -> probatio.Schema: """Build the one-step add form schema.""" if user_input is None: user_input = {} @@ -156,12 +156,12 @@ def _async_user_schema( suggested_values.update(user_input) return self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_TRANSMITTER): selector.EntitySelector( + probatio.Required(CONF_TRANSMITTER): selector.EntitySelector( selector.EntitySelectorConfig(include_entities=transmitters), ), - vol.Required(CONF_DEVICE_ID): vol.All( + probatio.Required(CONF_DEVICE_ID): probatio.All( selector.NumberSelector( selector.NumberSelectorConfig( min=0, @@ -169,9 +169,9 @@ def _async_user_schema( mode=selector.NumberSelectorMode.BOX, ) ), - vol.Coerce(int), + probatio.Coerce(int), ), - vol.Required(CONF_CHANNEL): vol.All( + probatio.Required(CONF_CHANNEL): probatio.All( selector.NumberSelector( selector.NumberSelectorConfig( min=1, @@ -179,9 +179,9 @@ def _async_user_schema( mode=selector.NumberSelectorMode.BOX, ) ), - vol.Coerce(int), + probatio.Coerce(int), ), - vol.Required(CONF_GROUP): selector.BooleanSelector(), + probatio.Required(CONF_GROUP): selector.BooleanSelector(), } ), suggested_values, diff --git a/homeassistant/components/kmtronic/config_flow.py b/homeassistant/components/kmtronic/config_flow.py index 56cac0e1cc035..1297258c1ee6c 100644 --- a/homeassistant/components/kmtronic/config_flow.py +++ b/homeassistant/components/kmtronic/config_flow.py @@ -4,9 +4,9 @@ from typing import Any, override import aiohttp +import probatio from pykmtronic.auth import Auth from pykmtronic.hub import KMTronicHubAPI -import voluptuous as vol from homeassistant.config_entries import ( ConfigEntry, @@ -23,11 +23,11 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) @@ -111,9 +111,9 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_REVERSE, default=self.config_entry.options.get(CONF_REVERSE), ): bool, diff --git a/homeassistant/components/knocki/config_flow.py b/homeassistant/components/knocki/config_flow.py index 2d44c6e84aa8d..78e4a71f3b581 100644 --- a/homeassistant/components/knocki/config_flow.py +++ b/homeassistant/components/knocki/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from knocki import KnockiClient, KnockiConnectionError, KnockiInvalidAuthError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_TOKEN, CONF_USERNAME @@ -14,10 +14,10 @@ from .const import DOMAIN, LOGGER -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/knx/__init__.py b/homeassistant/components/knx/__init__.py index f2b85cb97f0a1..5a93ecfd1050b 100644 --- a/homeassistant/components/knx/__init__.py +++ b/homeassistant/components/knx/__init__.py @@ -5,7 +5,7 @@ from pathlib import Path from typing import Final -import voluptuous as vol +import probatio from xknx.exceptions import XKNXException from homeassistant.config_entries import ConfigEntry @@ -70,10 +70,10 @@ _LOGGER = logging.getLogger(__name__) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.All( - vol.Schema( + DOMAIN: probatio.All( + probatio.Schema( { **EventSchema.SCHEMA, **ExposeSchema.platform_node(), @@ -98,7 +98,7 @@ ), ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/knx/config_flow.py b/homeassistant/components/knx/config_flow.py index c612f26714d4d..c86ce853acdfd 100644 --- a/homeassistant/components/knx/config_flow.py +++ b/homeassistant/components/knx/config_flow.py @@ -7,7 +7,7 @@ from knx_telegram_store import ConnectionErrorKind from knx_telegram_store.backends.postgres import PostgresStore -import voluptuous as vol +import probatio from xknx import XKNX from xknx.exceptions.exception import ( CommunicationError, @@ -118,13 +118,13 @@ _IA_SELECTOR = selector.TextSelector() _IP_SELECTOR = selector.TextSelector() -_PORT_SELECTOR = vol.All( +_PORT_SELECTOR = probatio.All( selector.NumberSelector( selector.NumberSelectorConfig( min=1, max=65535, mode=selector.NumberSelectorMode.BOX ), ), - vol.Coerce(int), + probatio.Coerce(int), ) @@ -314,12 +314,12 @@ async def async_step_connection_type( default_connection_type = CONF_KNX_TUNNELING fields = { - vol.Required( + probatio.Required( CONF_KNX_CONNECTION_TYPE, default=default_connection_type - ): vol.In(supported_connection_types) + ): probatio.In(supported_connection_types) } return self.async_show_form( - step_id="connection_type", data_schema=vol.Schema(fields) + step_id="connection_type", data_schema=probatio.Schema(fields) ) async def async_step_tunnel( @@ -393,10 +393,10 @@ async def async_step_tunnel( for tunnel in self._found_tunnels if tunnel.ip_addr == self.initial_data.get(CONF_HOST) ), - vol.UNDEFINED, + probatio.UNDEFINED, ) fields = { - vol.Required( + probatio.Required( CONF_KNX_GATEWAY, default=default_tunnel ): selector.SelectSelector( selector.SelectSelectorConfig( @@ -405,7 +405,9 @@ async def async_step_tunnel( ) ) } - return self.async_show_form(step_id="tunnel", data_schema=vol.Schema(fields)) + return self.async_show_form( + step_id="tunnel", data_schema=probatio.Schema(fields) + ) async def async_step_tcp_tunnel_endpoint( self, user_input: dict | None = None @@ -458,9 +460,9 @@ async def async_step_tcp_tunnel_endpoint( ) return self.async_show_form( step_id="tcp_tunnel_endpoint", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_KNX_TUNNEL_ENDPOINT_IA, default=default_endpoint ): selector.SelectSelector( selector.SelectSelectorConfig( @@ -486,7 +488,7 @@ async def async_step_manual_tunnel( _host = user_input[CONF_HOST] _host_ip = await xknx_validate_ip(_host) ip_v4_validator(_host_ip, multicast=False) - except vol.Invalid, XKNXException: + except probatio.Invalid, XKNXException: errors[CONF_HOST] = "invalid_ip_address" _local_ip = None @@ -494,7 +496,7 @@ async def async_step_manual_tunnel( try: _local_ip = await xknx_validate_ip(_local) ip_v4_validator(_local_ip, multicast=False) - except vol.Invalid, XKNXException: + except probatio.Invalid, XKNXException: errors[CONF_KNX_LOCAL_IP] = "invalid_ip_address" selected_tunneling_type = user_input[CONF_KNX_TUNNELING_TYPE] @@ -579,21 +581,21 @@ async def async_step_manual_tunnel( ) fields: VolDictType = { - vol.Required(CONF_KNX_TUNNELING_TYPE, default=default_type): vol.In( - CONF_KNX_TUNNELING_TYPE_LABELS - ), - vol.Required(CONF_HOST, default=ip_address): _IP_SELECTOR, - vol.Required(CONF_PORT, default=port): _PORT_SELECTOR, - vol.Required( + probatio.Required( + CONF_KNX_TUNNELING_TYPE, default=default_type + ): probatio.In(CONF_KNX_TUNNELING_TYPE_LABELS), + probatio.Required(CONF_HOST, default=ip_address): _IP_SELECTOR, + probatio.Required(CONF_PORT, default=port): _PORT_SELECTOR, + probatio.Required( CONF_KNX_ROUTE_BACK, default=_route_back ): selector.BooleanSelector(), - vol.Optional(CONF_KNX_LOCAL_IP): _IP_SELECTOR, + probatio.Optional(CONF_KNX_LOCAL_IP): _IP_SELECTOR, } if not self._found_tunnels and not errors.get("base"): errors["base"] = "no_tunnel_discovered" return self.async_show_form( - step_id="manual_tunnel", data_schema=vol.Schema(fields), errors=errors + step_id="manual_tunnel", data_schema=probatio.Schema(fields), errors=errors ) async def async_step_secure_tunnel_manual( @@ -613,24 +615,24 @@ async def async_step_secure_tunnel_manual( return self.finish_flow() fields = { - vol.Required( + probatio.Required( CONF_KNX_SECURE_USER_ID, default=self.initial_data.get(CONF_KNX_SECURE_USER_ID, 2), - ): vol.All( + ): probatio.All( selector.NumberSelector( selector.NumberSelectorConfig( min=1, max=127, mode=selector.NumberSelectorMode.BOX ), ), - vol.Coerce(int), + probatio.Coerce(int), ), - vol.Required( + probatio.Required( CONF_KNX_SECURE_USER_PASSWORD, default=self.initial_data.get(CONF_KNX_SECURE_USER_PASSWORD), ): selector.TextSelector( selector.TextSelectorConfig(type=selector.TextSelectorType.PASSWORD), ), - vol.Required( + probatio.Required( CONF_KNX_SECURE_DEVICE_AUTHENTICATION, default=self.initial_data.get(CONF_KNX_SECURE_DEVICE_AUTHENTICATION), ): selector.TextSelector( @@ -639,7 +641,7 @@ async def async_step_secure_tunnel_manual( } return self.async_show_form( step_id="secure_tunnel_manual", - data_schema=vol.Schema(fields), + data_schema=probatio.Schema(fields), errors=errors, ) @@ -670,17 +672,17 @@ async def async_step_secure_routing_manual( return self.finish_flow() fields = { - vol.Required( + probatio.Required( CONF_KNX_ROUTING_BACKBONE_KEY, default=self.initial_data.get(CONF_KNX_ROUTING_BACKBONE_KEY), ): selector.TextSelector( selector.TextSelectorConfig(type=selector.TextSelectorType.PASSWORD), ), - vol.Required( + probatio.Required( CONF_KNX_ROUTING_SYNC_LATENCY_TOLERANCE, default=self.initial_data.get(CONF_KNX_ROUTING_SYNC_LATENCY_TOLERANCE) or 1000, - ): vol.All( + ): probatio.All( selector.NumberSelector( selector.NumberSelectorConfig( min=400, @@ -689,12 +691,12 @@ async def async_step_secure_routing_manual( mode=selector.NumberSelectorMode.BOX, ), ), - vol.Coerce(int), + probatio.Coerce(int), ), } return self.async_show_form( step_id="secure_routing_manual", - data_schema=vol.Schema(fields), + data_schema=probatio.Schema(fields), errors=errors, ) @@ -737,17 +739,17 @@ async def async_step_secure_knxkeys( return await self.async_step_knxkeys_tunnel_select() fields = { - vol.Required(CONF_KEYRING_FILE): selector.FileSelector( + probatio.Required(CONF_KEYRING_FILE): selector.FileSelector( config=selector.FileSelectorConfig(accept=".knxkeys") ), - vol.Required( + probatio.Required( CONF_KNX_KNXKEY_PASSWORD, default=self.initial_data.get(CONF_KNX_KNXKEY_PASSWORD), ): selector.TextSelector(), } return self.async_show_form( step_id="secure_knxkeys", - data_schema=vol.Schema(fields), + data_schema=probatio.Schema(fields), errors=errors, ) @@ -826,9 +828,9 @@ async def async_step_knxkeys_tunnel_select( ) return self.async_show_form( step_id="knxkeys_tunnel_select", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_KNX_TUNNEL_ENDPOINT_IA, default=default_endpoint ): selector.SelectSelector( selector.SelectSelectorConfig( @@ -866,17 +868,17 @@ async def async_step_routing( if user_input is not None: try: ia_validator(_individual_address) - except vol.Invalid: + except probatio.Invalid: errors[CONF_KNX_INDIVIDUAL_ADDRESS] = "invalid_individual_address" try: ip_v4_validator(_multicast_group, multicast=True) - except vol.Invalid: + except probatio.Invalid: errors[CONF_KNX_MCAST_GRP] = "invalid_ip_address" if _local := (user_input.get(CONF_KNX_LOCAL_IP) or None): try: _local_ip = await xknx_validate_ip(_local) ip_v4_validator(_local_ip, multicast=False) - except vol.Invalid, XKNXException: + except probatio.Invalid, XKNXException: errors[CONF_KNX_LOCAL_IP] = "invalid_ip_address" if not errors: @@ -910,18 +912,22 @@ async def async_step_routing( ) fields: VolDictType = { - vol.Required( + probatio.Required( CONF_KNX_INDIVIDUAL_ADDRESS, default=_individual_address ): _IA_SELECTOR, - vol.Required( + probatio.Required( CONF_KNX_ROUTING_SECURE, default=default_secure_routing_enable ): selector.BooleanSelector(), - vol.Required(CONF_KNX_MCAST_GRP, default=_multicast_group): _IP_SELECTOR, - vol.Required(CONF_KNX_MCAST_PORT, default=_multicast_port): _PORT_SELECTOR, - vol.Optional(CONF_KNX_LOCAL_IP): _IP_SELECTOR, + probatio.Required( + CONF_KNX_MCAST_GRP, default=_multicast_group + ): _IP_SELECTOR, + probatio.Required( + CONF_KNX_MCAST_PORT, default=_multicast_port + ): _PORT_SELECTOR, + probatio.Optional(CONF_KNX_LOCAL_IP): _IP_SELECTOR, } return self.async_show_form( - step_id="routing", data_schema=vol.Schema(fields), errors=errors + step_id="routing", data_schema=probatio.Schema(fields), errors=errors ) async def async_step_secure_key_source_menu_tunnel( @@ -988,18 +994,18 @@ async def async_step_communication_settings( return self.finish_flow() data_schema = { - vol.Required( + probatio.Required( CONF_KNX_STATE_UPDATER, default=self.initial_options.get( CONF_KNX_STATE_UPDATER, CONF_KNX_DEFAULT_STATE_UPDATER ), ): selector.BooleanSelector(), - vol.Required( + probatio.Required( CONF_KNX_RATE_LIMIT, default=self.initial_options.get( CONF_KNX_RATE_LIMIT, CONF_KNX_DEFAULT_RATE_LIMIT ), - ): vol.All( + ): probatio.All( selector.NumberSelector( selector.NumberSelectorConfig( min=0, @@ -1007,18 +1013,18 @@ async def async_step_communication_settings( mode=selector.NumberSelectorMode.BOX, ), ), - vol.Coerce(int), + probatio.Coerce(int), ), - vol.Required(CONF_KNX_TELEGRAM_STORE_SECTION): data_entry_flow.section( - vol.Schema( + probatio.Required(CONF_KNX_TELEGRAM_STORE_SECTION): data_entry_flow.section( + probatio.Schema( { - vol.Required( + probatio.Required( CONF_KNX_TELEGRAM_DB_LOAD_HOURS, default=self.initial_options.get( CONF_KNX_TELEGRAM_DB_LOAD_HOURS, KNX_TELEGRAM_LOAD_HOURS_DEFAULT, ), - ): vol.All( + ): probatio.All( selector.NumberSelector( selector.NumberSelectorConfig( min=1, @@ -1026,15 +1032,15 @@ async def async_step_communication_settings( unit_of_measurement="h", ), ), - vol.Coerce(int), + probatio.Coerce(int), ), - vol.Required( + probatio.Required( CONF_KNX_TELEGRAM_DB_RETENTION_DAYS, default=self.initial_options.get( CONF_KNX_TELEGRAM_DB_RETENTION_DAYS, KNX_TELEGRAM_DB_RETENTION_DEFAULT, ), - ): vol.All( + ): probatio.All( selector.NumberSelector( selector.NumberSelectorConfig( min=0, @@ -1042,9 +1048,9 @@ async def async_step_communication_settings( unit_of_measurement="days", ), ), - vol.Coerce(int), + probatio.Coerce(int), ), - vol.Required( + probatio.Required( CONF_KNX_TELEGRAM_DB_BACKEND, default=self.initial_options.get( CONF_KNX_TELEGRAM_DB_BACKEND, @@ -1066,7 +1072,7 @@ async def async_step_communication_settings( } return self.async_show_form( step_id="communication_settings", - data_schema=vol.Schema(data_schema), + data_schema=probatio.Schema(data_schema), last_step=False, ) @@ -1095,16 +1101,16 @@ async def async_step_telegram_store_postgres( ) return self.finish_flow() - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required( + probatio.Required( CONF_KNX_TELEGRAM_DB_HOST, default=parsed.get(CONF_KNX_TELEGRAM_DB_HOST, "localhost"), ): selector.TextSelector(), - vol.Required( + probatio.Required( CONF_KNX_TELEGRAM_DB_PORT, default=parsed.get(CONF_KNX_TELEGRAM_DB_PORT, 5432), - ): vol.All( + ): probatio.All( selector.NumberSelector( selector.NumberSelectorConfig( min=1, @@ -1112,22 +1118,22 @@ async def async_step_telegram_store_postgres( mode=selector.NumberSelectorMode.BOX, ) ), - vol.Coerce(int), + probatio.Coerce(int), ), - vol.Required( + probatio.Required( CONF_KNX_TELEGRAM_DB_USER, default=parsed.get(CONF_KNX_TELEGRAM_DB_USER, ""), ): selector.TextSelector(), - vol.Required( + probatio.Required( CONF_KNX_TELEGRAM_DB_PASSWORD, default="" ): selector.TextSelector( selector.TextSelectorConfig(type=selector.TextSelectorType.PASSWORD) ), - vol.Required( + probatio.Required( CONF_KNX_TELEGRAM_DB_DATABASE, default=parsed.get(CONF_KNX_TELEGRAM_DB_DATABASE, "knx_telegrams"), ): selector.TextSelector(), - vol.Required( + probatio.Required( CONF_KNX_TELEGRAM_DB_TLS, default=parsed.get(CONF_KNX_TELEGRAM_DB_TLS, False), ): selector.BooleanSelector(), diff --git a/homeassistant/components/knx/const.py b/homeassistant/components/knx/const.py index 66bbcc850f4bc..5f89df8c22852 100644 --- a/homeassistant/components/knx/const.py +++ b/homeassistant/components/knx/const.py @@ -165,7 +165,7 @@ class KNXConfigEntryOptions(TypedDict, total=False): class ColorTempModes(Enum): """Color temperature modes for config validation.""" - # YAML uses Enum.name (with vol.Upper), UI uses Enum.value for lookup + # YAML uses Enum.name (with probatio.Upper), UI uses Enum.value for lookup ABSOLUTE = "7.600" ABSOLUTE_FLOAT = "9" RELATIVE = "5.001" diff --git a/homeassistant/components/knx/diagnostics.py b/homeassistant/components/knx/diagnostics.py index d637eb5518880..0bebe89eded80 100644 --- a/homeassistant/components/knx/diagnostics.py +++ b/homeassistant/components/knx/diagnostics.py @@ -2,7 +2,7 @@ from typing import Any -import voluptuous as vol +import probatio from homeassistant import config as conf_util from homeassistant.components.diagnostics import async_redact_data @@ -54,7 +54,7 @@ async def async_get_config_entry_diagnostics( diag["configuration_yaml"] = raw_config.get(DOMAIN) try: CONFIG_SCHEMA(raw_config) - except vol.Invalid as ex: + except probatio.Invalid as ex: diag["yaml_configuration_error"] = str(ex) else: diag["yaml_configuration_error"] = None diff --git a/homeassistant/components/knx/repairs.py b/homeassistant/components/knx/repairs.py index 4a3b90e4becd8..c2fec8c679fed 100644 --- a/homeassistant/components/knx/repairs.py +++ b/homeassistant/components/knx/repairs.py @@ -5,7 +5,7 @@ import logging from typing import TYPE_CHECKING, Any, Final -import voluptuous as vol +import probatio from xknx.exceptions.exception import InvalidSecureConfiguration from xknx.telegram import GroupAddress, IndividualAddress, Telegram @@ -175,14 +175,14 @@ async def async_step_secure_knxkeys( return self.finish_flow(new_entry_data) fields = { - vol.Required(CONF_KEYRING_FILE): selector.FileSelector( + probatio.Required(CONF_KEYRING_FILE): selector.FileSelector( config=selector.FileSelectorConfig(accept=".knxkeys") ), - vol.Required(CONF_KNX_KNXKEY_PASSWORD): selector.TextSelector(), + probatio.Required(CONF_KNX_KNXKEY_PASSWORD): selector.TextSelector(), } return self.async_show_form( step_id="secure_knxkeys", - data_schema=vol.Schema(fields), + data_schema=probatio.Schema(fields), errors=errors, ) diff --git a/homeassistant/components/knx/schema.py b/homeassistant/components/knx/schema.py index c6bb4134a364a..5a80850e175f3 100644 --- a/homeassistant/components/knx/schema.py +++ b/homeassistant/components/knx/schema.py @@ -1,11 +1,11 @@ -"""Voluptuous schemas for the KNX integration.""" +"""Probatio schemas for the KNX integration.""" from abc import ABC from collections import OrderedDict from datetime import timedelta from typing import ClassVar, Final -import voluptuous as vol +import probatio from xknx.devices.climate import FanSpeedMode, SetpointShiftMode from xknx.dpt import DPTBase, DPTNumeric from xknx.dpt.dpt_20 import HVACControllerMode, HVACOperationMode @@ -114,13 +114,13 @@ def button_payload_sub_validator(entity_config: OrderedDict) -> OrderedDict: if _type := entity_config.get(CONF_TYPE): _payload = entity_config[CONF_VALUE] if (transcoder := DPTBase.parse_transcoder(_type)) is None: - raise vol.Invalid(f"'type: {_type}' is not a valid sensor type.") + raise probatio.Invalid(f"'type: {_type}' is not a valid sensor type.") entity_config[CONF_PAYLOAD_LENGTH] = transcoder.payload_length try: _dpt_payload = transcoder.to_knx(_payload) _raw_payload = transcoder.validate_payload(_dpt_payload) except (ConversionError, CouldNotParseTelegram) as ex: - raise vol.Invalid( + raise probatio.Invalid( f"'payload: {_payload}' not valid for 'type: {_type}'" ) from ex entity_config[CONF_PAYLOAD] = int.from_bytes(_raw_payload, byteorder="big") @@ -129,7 +129,7 @@ def button_payload_sub_validator(entity_config: OrderedDict) -> OrderedDict: _payload = entity_config[CONF_PAYLOAD] _payload_length = entity_config[CONF_PAYLOAD_LENGTH] if _payload > (max_payload := _max_payload_value(_payload_length)): - raise vol.Invalid( + raise probatio.Invalid( f"'payload: {_payload}' exceeds possible maximum for " f"payload_length {_payload_length}: {max_payload}" ) @@ -146,15 +146,17 @@ def select_options_sub_validator(entity_config: OrderedDict) -> OrderedDict: option = opt[SelectConf.OPTION] payload = opt[CONF_PAYLOAD] if payload > (max_payload := _max_payload_value(payload_length)): - raise vol.Invalid( + raise probatio.Invalid( f"'payload: {payload}' for 'option: {option}' exceeds possible" f" maximum of 'payload_length: {payload_length}': {max_payload}" ) if option in options_seen: - raise vol.Invalid(f"duplicate item for 'option' not allowed: {option}") + raise probatio.Invalid(f"duplicate item for 'option' not allowed: {option}") options_seen.add(option) if payload in payloads_seen: - raise vol.Invalid(f"duplicate item for 'payload' not allowed: {payload}") + raise probatio.Invalid( + f"duplicate item for 'payload' not allowed: {payload}" + ) payloads_seen.add(payload) return entity_config @@ -174,17 +176,17 @@ def _sensor_attribute_sub_validator(config: dict) -> dict: class EventSchema: - """Voluptuous schema for KNX events.""" + """Probatio schema for KNX events.""" - KNX_EVENT_FILTER_SCHEMA = vol.Schema( + KNX_EVENT_FILTER_SCHEMA = probatio.Schema( { - vol.Required(KNX_ADDRESS): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(CONF_TYPE): dpt_base_type_validator, + probatio.Required(KNX_ADDRESS): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(CONF_TYPE): dpt_base_type_validator, } ) SCHEMA = { - vol.Optional(CONF_EVENT, default=[]): vol.All( + probatio.Optional(CONF_EVENT, default=[]): probatio.All( cv.ensure_list, [KNX_EVENT_FILTER_SCHEMA] ) } @@ -206,22 +208,22 @@ def _unique_id_duplicate_validator(entities: list[dict]) -> list[dict]: if (unique_id := entity.get(CONF_UNIQUE_ID)) is None: continue if unique_id in seen: - raise vol.Invalid(f"duplicate 'unique_id' not allowed: {unique_id}") + raise probatio.Invalid(f"duplicate 'unique_id' not allowed: {unique_id}") seen.add(unique_id) return entities class KNXPlatformSchema(ABC): - """Voluptuous schema for KNX platform entity configuration.""" + """Probatio schema for KNX platform entity configuration.""" PLATFORM: ClassVar[Platform | str] - ENTITY_SCHEMA: ClassVar[vol.Schema | vol.All | vol.Any] + ENTITY_SCHEMA: ClassVar[probatio.Schema | probatio.All | probatio.Any] @classmethod - def platform_node(cls) -> dict[vol.Optional, vol.All]: + def platform_node(cls) -> dict[probatio.Optional, probatio.All]: """Return a schema node for the platform.""" return { - vol.Optional(str(cls.PLATFORM)): vol.All( + probatio.Optional(str(cls.PLATFORM)): probatio.All( cv.ensure_list, [cls.ENTITY_SCHEMA], _unique_id_duplicate_validator ) } @@ -242,52 +244,58 @@ def _device_id(value: str) -> str: return slugify(value) -def _entity_base_schema(platform: Platform) -> vol.Schema: +def _entity_base_schema(platform: Platform) -> probatio.Schema: """Return a base schema for KNX entities.""" - return vol.Schema( + return probatio.Schema( { - vol.Optional(CONF_NAME, default=""): cv.string, - vol.Optional(CONF_DEVICE): vol.Schema( + probatio.Optional(CONF_NAME, default=""): cv.string, + probatio.Optional(CONF_DEVICE): probatio.Schema( { - vol.Required(CONF_ID): vol.All( - cv.string, _device_id, vol.Length(min=1) + probatio.Required(CONF_ID): probatio.All( + cv.string, _device_id, probatio.Length(min=1) ), - vol.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_NAME): cv.string, } ), - vol.Optional(CONF_DEFAULT_ENTITY_ID): vol.All( + probatio.Optional(CONF_DEFAULT_ENTITY_ID): probatio.All( cv.entity_id, cv.entity_domain(platform) ), - vol.Optional(CONF_ENTITY_CATEGORY): ENTITY_CATEGORIES_SCHEMA, - vol.Optional(CONF_UNIQUE_ID): vol.All(cv.string, vol.Length(min=1)), + probatio.Optional(CONF_ENTITY_CATEGORY): ENTITY_CATEGORIES_SCHEMA, + probatio.Optional(CONF_UNIQUE_ID): probatio.All( + cv.string, probatio.Length(min=1) + ), } ) class BinarySensorSchema(KNXPlatformSchema): - """Voluptuous schema for KNX binary sensors.""" + """Probatio schema for KNX binary sensors.""" PLATFORM = Platform.BINARY_SENSOR - ENTITY_SCHEMA = vol.All( + ENTITY_SCHEMA = probatio.All( _entity_base_schema(PLATFORM).extend( { - vol.Optional(CONF_SYNC_STATE, default=True): sync_state_validator, - vol.Optional(CONF_IGNORE_INTERNAL_STATE, default=False): cv.boolean, - vol.Optional(CONF_INVERT, default=False): cv.boolean, - vol.Required(CONF_STATE_ADDRESS): ga_list_validator, - vol.Optional(CONF_CONTEXT_TIMEOUT): vol.All( - vol.Coerce(float), vol.Range(min=0, max=10) + probatio.Optional(CONF_SYNC_STATE, default=True): sync_state_validator, + probatio.Optional( + CONF_IGNORE_INTERNAL_STATE, default=False + ): cv.boolean, + probatio.Optional(CONF_INVERT, default=False): cv.boolean, + probatio.Required(CONF_STATE_ADDRESS): ga_list_validator, + probatio.Optional(CONF_CONTEXT_TIMEOUT): probatio.All( + probatio.Coerce(float), probatio.Range(min=0, max=10) ), - vol.Optional(CONF_DEVICE_CLASS): BINARY_SENSOR_DEVICE_CLASSES_SCHEMA, - vol.Optional(CONF_RESET_AFTER): cv.positive_float, + probatio.Optional( + CONF_DEVICE_CLASS + ): BINARY_SENSOR_DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_RESET_AFTER): cv.positive_float, } ), ) class ButtonSchema(KNXPlatformSchema): - """Voluptuous schema for KNX buttons.""" + """Probatio schema for KNX buttons.""" PLATFORM = Platform.BUTTON @@ -296,44 +304,44 @@ class ButtonSchema(KNXPlatformSchema): f"Please use only one of `{CONF_PAYLOAD_LENGTH}` or `{CONF_TYPE}`" ) - ENTITY_SCHEMA = vol.All( + ENTITY_SCHEMA = probatio.All( _entity_base_schema(PLATFORM).extend( { - vol.Required(KNX_ADDRESS): ga_validator, - vol.Exclusive( + probatio.Required(KNX_ADDRESS): ga_validator, + probatio.Exclusive( CONF_PAYLOAD, "payload_or_value", msg=payload_or_value_msg ): object, - vol.Exclusive( + probatio.Exclusive( CONF_VALUE, "payload_or_value", msg=payload_or_value_msg ): object, - vol.Exclusive( + probatio.Exclusive( CONF_PAYLOAD_LENGTH, "length_or_type", msg=length_or_type_msg ): object, - vol.Exclusive( + probatio.Exclusive( CONF_TYPE, "length_or_type", msg=length_or_type_msg ): object, } ), - vol.Any( - vol.Schema( + probatio.Any( + probatio.Schema( # encoded value { - vol.Required(CONF_VALUE): vol.Any(int, float, str), - vol.Required(CONF_TYPE): sensor_type_validator, + probatio.Required(CONF_VALUE): probatio.Any(int, float, str), + probatio.Required(CONF_TYPE): sensor_type_validator, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ), - vol.Schema( + probatio.Schema( # raw payload - default is DPT 1 style True { - vol.Optional(CONF_PAYLOAD, default=1): cv.positive_int, - vol.Optional(CONF_PAYLOAD_LENGTH, default=0): vol.All( - vol.Coerce(int), vol.Range(min=0, max=14) + probatio.Optional(CONF_PAYLOAD, default=1): cv.positive_int, + probatio.Optional(CONF_PAYLOAD_LENGTH, default=0): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=14) ), - vol.Optional(CONF_VALUE): None, - vol.Optional(CONF_TYPE): None, + probatio.Optional(CONF_VALUE): None, + probatio.Optional(CONF_TYPE): None, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ), ), # calculate raw CONF_PAYLOAD and CONF_PAYLOAD_LENGTH @@ -343,7 +351,7 @@ class ButtonSchema(KNXPlatformSchema): class ClimateSchema(KNXPlatformSchema): - """Voluptuous schema for KNX climate devices.""" + """Probatio schema for KNX climate devices.""" PLATFORM = Platform.CLIMATE @@ -386,22 +394,24 @@ class ClimateSchema(KNXPlatformSchema): DEFAULT_ON_OFF_INVERT = False DEFAULT_FAN_SPEED_MODE = "percent" - ENTITY_SCHEMA = vol.All( + ENTITY_SCHEMA = probatio.All( _entity_base_schema(PLATFORM).extend( { - vol.Optional( + probatio.Optional( ClimateConf.SETPOINT_SHIFT_MAX, default=DEFAULT_SETPOINT_SHIFT_MAX - ): vol.All(int, vol.Range(min=0, max=32)), - vol.Optional( + ): probatio.All(int, probatio.Range(min=0, max=32)), + probatio.Optional( ClimateConf.SETPOINT_SHIFT_MIN, default=DEFAULT_SETPOINT_SHIFT_MIN - ): vol.All(int, vol.Range(min=-32, max=0)), - vol.Optional( + ): probatio.All(int, probatio.Range(min=-32, max=0)), + probatio.Optional( ClimateConf.TEMPERATURE_STEP, default=DEFAULT_TEMPERATURE_STEP - ): vol.All(float, vol.Range(min=0, max=2)), - vol.Required(CONF_TEMPERATURE_ADDRESS): ga_list_validator, - vol.Required(CONF_TARGET_TEMPERATURE_STATE_ADDRESS): ga_list_validator, - vol.Optional(CONF_TARGET_TEMPERATURE_ADDRESS): ga_list_validator, - vol.Inclusive( + ): probatio.All(float, probatio.Range(min=0, max=2)), + probatio.Required(CONF_TEMPERATURE_ADDRESS): ga_list_validator, + probatio.Required( + CONF_TARGET_TEMPERATURE_STATE_ADDRESS + ): ga_list_validator, + probatio.Optional(CONF_TARGET_TEMPERATURE_ADDRESS): ga_list_validator, + probatio.Inclusive( CONF_SETPOINT_SHIFT_ADDRESS, "setpoint_shift", msg=( @@ -409,7 +419,7 @@ class ClimateSchema(KNXPlatformSchema): "are required for setpoint_shift configuration" ), ): ga_list_validator, - vol.Inclusive( + probatio.Inclusive( CONF_SETPOINT_SHIFT_STATE_ADDRESS, "setpoint_shift", msg=( @@ -417,58 +427,68 @@ class ClimateSchema(KNXPlatformSchema): "are required for setpoint_shift configuration" ), ): ga_list_validator, - vol.Optional(CONF_SETPOINT_SHIFT_MODE): vol.Maybe( - vol.All(vol.Upper, cv.enum(SetpointShiftMode)) + probatio.Optional(CONF_SETPOINT_SHIFT_MODE): probatio.Maybe( + probatio.All(probatio.Upper, cv.enum(SetpointShiftMode)) ), - vol.Optional(CONF_ACTIVE_STATE_ADDRESS): ga_list_validator, - vol.Optional(CONF_COMMAND_VALUE_STATE_ADDRESS): ga_list_validator, - vol.Optional(CONF_OPERATION_MODE_ADDRESS): ga_list_validator, - vol.Optional(CONF_OPERATION_MODE_STATE_ADDRESS): ga_list_validator, - vol.Optional(CONF_CONTROLLER_STATUS_ADDRESS): ga_list_validator, - vol.Optional(CONF_CONTROLLER_STATUS_STATE_ADDRESS): ga_list_validator, - vol.Optional(CONF_CONTROLLER_MODE_ADDRESS): ga_list_validator, - vol.Optional(CONF_CONTROLLER_MODE_STATE_ADDRESS): ga_list_validator, - vol.Optional(CONF_HEAT_COOL_ADDRESS): ga_list_validator, - vol.Optional(CONF_HEAT_COOL_STATE_ADDRESS): ga_list_validator, - vol.Optional( + probatio.Optional(CONF_ACTIVE_STATE_ADDRESS): ga_list_validator, + probatio.Optional(CONF_COMMAND_VALUE_STATE_ADDRESS): ga_list_validator, + probatio.Optional(CONF_OPERATION_MODE_ADDRESS): ga_list_validator, + probatio.Optional(CONF_OPERATION_MODE_STATE_ADDRESS): ga_list_validator, + probatio.Optional(CONF_CONTROLLER_STATUS_ADDRESS): ga_list_validator, + probatio.Optional( + CONF_CONTROLLER_STATUS_STATE_ADDRESS + ): ga_list_validator, + probatio.Optional(CONF_CONTROLLER_MODE_ADDRESS): ga_list_validator, + probatio.Optional( + CONF_CONTROLLER_MODE_STATE_ADDRESS + ): ga_list_validator, + probatio.Optional(CONF_HEAT_COOL_ADDRESS): ga_list_validator, + probatio.Optional(CONF_HEAT_COOL_STATE_ADDRESS): ga_list_validator, + probatio.Optional( CONF_OPERATION_MODE_FROST_PROTECTION_ADDRESS ): ga_list_validator, - vol.Optional(CONF_OPERATION_MODE_NIGHT_ADDRESS): ga_list_validator, - vol.Optional(CONF_OPERATION_MODE_COMFORT_ADDRESS): ga_list_validator, - vol.Optional(CONF_OPERATION_MODE_STANDBY_ADDRESS): ga_list_validator, - vol.Optional(CONF_ON_OFF_ADDRESS): ga_list_validator, - vol.Optional(CONF_ON_OFF_STATE_ADDRESS): ga_list_validator, - vol.Optional( + probatio.Optional(CONF_OPERATION_MODE_NIGHT_ADDRESS): ga_list_validator, + probatio.Optional( + CONF_OPERATION_MODE_COMFORT_ADDRESS + ): ga_list_validator, + probatio.Optional( + CONF_OPERATION_MODE_STANDBY_ADDRESS + ): ga_list_validator, + probatio.Optional(CONF_ON_OFF_ADDRESS): ga_list_validator, + probatio.Optional(CONF_ON_OFF_STATE_ADDRESS): ga_list_validator, + probatio.Optional( ClimateConf.ON_OFF_INVERT, default=DEFAULT_ON_OFF_INVERT ): cv.boolean, - vol.Optional(ClimateConf.OPERATION_MODES): vol.All( + probatio.Optional(ClimateConf.OPERATION_MODES): probatio.All( cv.ensure_list, [backwards_compatible_xknx_climate_enum_member(HVACOperationMode)], ), - vol.Optional(ClimateConf.CONTROLLER_MODES): vol.All( + probatio.Optional(ClimateConf.CONTROLLER_MODES): probatio.All( cv.ensure_list, [backwards_compatible_xknx_climate_enum_member(HVACControllerMode)], ), - vol.Optional( + probatio.Optional( ClimateConf.DEFAULT_CONTROLLER_MODE, default=HVACMode.HEAT - ): vol.Coerce(HVACMode), - vol.Optional(ClimateConf.MIN_TEMP): vol.Coerce(float), - vol.Optional(ClimateConf.MAX_TEMP): vol.Coerce(float), - vol.Optional(CONF_FAN_SPEED_ADDRESS): ga_list_validator, - vol.Optional(CONF_FAN_SPEED_STATE_ADDRESS): ga_list_validator, - vol.Optional(ClimateConf.FAN_MAX_STEP, default=3): cv.byte, - vol.Optional( + ): probatio.Coerce(HVACMode), + probatio.Optional(ClimateConf.MIN_TEMP): probatio.Coerce(float), + probatio.Optional(ClimateConf.MAX_TEMP): probatio.Coerce(float), + probatio.Optional(CONF_FAN_SPEED_ADDRESS): ga_list_validator, + probatio.Optional(CONF_FAN_SPEED_STATE_ADDRESS): ga_list_validator, + probatio.Optional(ClimateConf.FAN_MAX_STEP, default=3): cv.byte, + probatio.Optional( ClimateConf.FAN_SPEED_MODE, default=DEFAULT_FAN_SPEED_MODE - ): vol.All(vol.Upper, cv.enum(FanSpeedMode)), - vol.Optional(ClimateConf.FAN_ZERO_MODE, default=FAN_OFF): vol.Coerce( - FanZeroMode - ), - vol.Optional(CONF_SWING_ADDRESS): ga_list_validator, - vol.Optional(CONF_SWING_STATE_ADDRESS): ga_list_validator, - vol.Optional(CONF_SWING_HORIZONTAL_ADDRESS): ga_list_validator, - vol.Optional(CONF_SWING_HORIZONTAL_STATE_ADDRESS): ga_list_validator, - vol.Optional(CONF_HUMIDITY_STATE_ADDRESS): ga_list_validator, - vol.Optional( + ): probatio.All(probatio.Upper, cv.enum(FanSpeedMode)), + probatio.Optional( + ClimateConf.FAN_ZERO_MODE, default=FAN_OFF + ): probatio.Coerce(FanZeroMode), + probatio.Optional(CONF_SWING_ADDRESS): ga_list_validator, + probatio.Optional(CONF_SWING_STATE_ADDRESS): ga_list_validator, + probatio.Optional(CONF_SWING_HORIZONTAL_ADDRESS): ga_list_validator, + probatio.Optional( + CONF_SWING_HORIZONTAL_STATE_ADDRESS + ): ga_list_validator, + probatio.Optional(CONF_HUMIDITY_STATE_ADDRESS): ga_list_validator, + probatio.Optional( CONF_SYNC_STATE, default=True ): sync_state_no_false_validator, } @@ -477,7 +497,7 @@ class ClimateSchema(KNXPlatformSchema): class CoverSchema(KNXPlatformSchema): - """Voluptuous schema for KNX covers.""" + """Probatio schema for KNX covers.""" PLATFORM = Platform.COVER @@ -491,39 +511,39 @@ class CoverSchema(KNXPlatformSchema): DEFAULT_TRAVEL_TIME = 25 - ENTITY_SCHEMA = vol.All( + ENTITY_SCHEMA = probatio.All( _entity_base_schema(PLATFORM).extend( { - vol.Optional(CONF_MOVE_LONG_ADDRESS): ga_list_validator, - vol.Optional(CONF_MOVE_SHORT_ADDRESS): ga_list_validator, - vol.Optional(CONF_STOP_ADDRESS): ga_list_validator, - vol.Optional(CONF_POSITION_ADDRESS): ga_list_validator, - vol.Optional(CONF_POSITION_STATE_ADDRESS): ga_list_validator, - vol.Optional(CONF_ANGLE_ADDRESS): ga_list_validator, - vol.Optional(CONF_ANGLE_STATE_ADDRESS): ga_list_validator, - vol.Optional( + probatio.Optional(CONF_MOVE_LONG_ADDRESS): ga_list_validator, + probatio.Optional(CONF_MOVE_SHORT_ADDRESS): ga_list_validator, + probatio.Optional(CONF_STOP_ADDRESS): ga_list_validator, + probatio.Optional(CONF_POSITION_ADDRESS): ga_list_validator, + probatio.Optional(CONF_POSITION_STATE_ADDRESS): ga_list_validator, + probatio.Optional(CONF_ANGLE_ADDRESS): ga_list_validator, + probatio.Optional(CONF_ANGLE_STATE_ADDRESS): ga_list_validator, + probatio.Optional( CoverConf.TRAVELLING_TIME_DOWN, default=DEFAULT_TRAVEL_TIME ): cv.positive_float, - vol.Optional( + probatio.Optional( CoverConf.TRAVELLING_TIME_UP, default=DEFAULT_TRAVEL_TIME ): cv.positive_float, - vol.Optional(CoverConf.INVERT_UPDOWN, default=False): cv.boolean, - vol.Optional(CoverConf.INVERT_POSITION, default=False): cv.boolean, - vol.Optional(CoverConf.INVERT_ANGLE, default=False): cv.boolean, - vol.Optional(CONF_DEVICE_CLASS): COVER_DEVICE_CLASSES_SCHEMA, - vol.Optional( + probatio.Optional(CoverConf.INVERT_UPDOWN, default=False): cv.boolean, + probatio.Optional(CoverConf.INVERT_POSITION, default=False): cv.boolean, + probatio.Optional(CoverConf.INVERT_ANGLE, default=False): cv.boolean, + probatio.Optional(CONF_DEVICE_CLASS): COVER_DEVICE_CLASSES_SCHEMA, + probatio.Optional( CONF_SYNC_STATE, default=True ): sync_state_no_false_validator, } ), - vol.Any( - vol.Schema( - {vol.Required(CONF_MOVE_LONG_ADDRESS): object}, - extra=vol.ALLOW_EXTRA, + probatio.Any( + probatio.Schema( + {probatio.Required(CONF_MOVE_LONG_ADDRESS): object}, + extra=probatio.ALLOW_EXTRA, ), - vol.Schema( - {vol.Required(CONF_POSITION_ADDRESS): object}, - extra=vol.ALLOW_EXTRA, + probatio.Schema( + {probatio.Required(CONF_POSITION_ADDRESS): object}, + extra=probatio.ALLOW_EXTRA, ), msg=( f"At least one of '{CONF_MOVE_LONG_ADDRESS}' or" @@ -534,37 +554,37 @@ class CoverSchema(KNXPlatformSchema): class DateSchema(KNXPlatformSchema): - """Voluptuous schema for KNX date.""" + """Probatio schema for KNX date.""" PLATFORM = Platform.DATE ENTITY_SCHEMA = _entity_base_schema(PLATFORM).extend( { - vol.Optional(CONF_RESPOND_TO_READ, default=False): cv.boolean, - vol.Optional(CONF_SYNC_STATE, default=True): sync_state_validator, - vol.Required(KNX_ADDRESS): ga_list_validator, - vol.Optional(CONF_STATE_ADDRESS): ga_list_validator, + probatio.Optional(CONF_RESPOND_TO_READ, default=False): cv.boolean, + probatio.Optional(CONF_SYNC_STATE, default=True): sync_state_validator, + probatio.Required(KNX_ADDRESS): ga_list_validator, + probatio.Optional(CONF_STATE_ADDRESS): ga_list_validator, } ) class DateTimeSchema(KNXPlatformSchema): - """Voluptuous schema for KNX date.""" + """Probatio schema for KNX date.""" PLATFORM = Platform.DATETIME ENTITY_SCHEMA = _entity_base_schema(PLATFORM).extend( { - vol.Optional(CONF_RESPOND_TO_READ, default=False): cv.boolean, - vol.Optional(CONF_SYNC_STATE, default=True): sync_state_validator, - vol.Required(KNX_ADDRESS): ga_list_validator, - vol.Optional(CONF_STATE_ADDRESS): ga_list_validator, + probatio.Optional(CONF_RESPOND_TO_READ, default=False): cv.boolean, + probatio.Optional(CONF_SYNC_STATE, default=True): sync_state_validator, + probatio.Required(KNX_ADDRESS): ga_list_validator, + probatio.Optional(CONF_STATE_ADDRESS): ga_list_validator, } ) class ExposeSchema(KNXPlatformSchema): - """Voluptuous schema for KNX exposures.""" + """Probatio schema for KNX exposures.""" PLATFORM = CONF_KNX_EXPOSE @@ -580,39 +600,39 @@ class ExposeSchema(KNXPlatformSchema): CONF_DATETIME = "datetime" EXPOSE_TIME_TYPES: Final = [CONF_TIME, CONF_DATE, CONF_DATETIME] - EXPOSE_TIME_SCHEMA = vol.Schema( + EXPOSE_TIME_SCHEMA = probatio.Schema( { - vol.Required(CONF_KNX_EXPOSE_TYPE): vol.All( - cv.string, str.lower, vol.In(EXPOSE_TIME_TYPES) + probatio.Required(CONF_KNX_EXPOSE_TYPE): probatio.All( + cv.string, str.lower, probatio.In(EXPOSE_TIME_TYPES) ), - vol.Required(KNX_ADDRESS): ga_validator, + probatio.Required(KNX_ADDRESS): ga_validator, } ) - EXPOSE_SENSOR_SCHEMA = vol.Schema( + EXPOSE_SENSOR_SCHEMA = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_KNX_EXPOSE_COOLDOWN, default=timedelta(0) ): cv.positive_time_period, - vol.Optional(CONF_KNX_EXPOSE_SEND_ON_INIT, default=False): cv.boolean, - vol.Optional( + probatio.Optional(CONF_KNX_EXPOSE_SEND_ON_INIT, default=False): cv.boolean, + probatio.Optional( CONF_KNX_EXPOSE_PERIODIC_SEND, default=timedelta(0) ): cv.positive_time_period, - vol.Optional(CONF_RESPOND_TO_READ, default=True): cv.boolean, - vol.Required(CONF_KNX_EXPOSE_TYPE): vol.Any( + probatio.Optional(CONF_RESPOND_TO_READ, default=True): cv.boolean, + probatio.Required(CONF_KNX_EXPOSE_TYPE): probatio.Any( CONF_KNX_EXPOSE_BINARY, sensor_type_validator ), - vol.Required(KNX_ADDRESS): ga_validator, - vol.Required(CONF_ENTITY_ID): cv.entity_id, - vol.Optional(CONF_KNX_EXPOSE_ATTRIBUTE): cv.string, - vol.Optional(CONF_KNX_EXPOSE_DEFAULT): cv.match_all, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, + probatio.Required(KNX_ADDRESS): ga_validator, + probatio.Required(CONF_ENTITY_ID): cv.entity_id, + probatio.Optional(CONF_KNX_EXPOSE_ATTRIBUTE): cv.string, + probatio.Optional(CONF_KNX_EXPOSE_DEFAULT): cv.match_all, + probatio.Optional(CONF_VALUE_TEMPLATE): cv.template, } ) - ENTITY_SCHEMA = vol.Any(EXPOSE_SENSOR_SCHEMA, EXPOSE_TIME_SCHEMA) + ENTITY_SCHEMA = probatio.Any(EXPOSE_SENSOR_SCHEMA, EXPOSE_TIME_SCHEMA) class FanSchema(KNXPlatformSchema): - """Voluptuous schema for KNX fans.""" + """Probatio schema for KNX fans.""" PLATFORM = Platform.FAN @@ -622,27 +642,27 @@ class FanSchema(KNXPlatformSchema): CONF_SWITCH_ADDRESS = "switch_address" CONF_SWITCH_STATE_ADDRESS = "switch_state_address" - ENTITY_SCHEMA = vol.All( + ENTITY_SCHEMA = probatio.All( _entity_base_schema(PLATFORM).extend( { - vol.Optional(KNX_ADDRESS): ga_list_validator, - vol.Optional(CONF_STATE_ADDRESS): ga_list_validator, - vol.Optional(CONF_SWITCH_ADDRESS): ga_list_validator, - vol.Optional(CONF_SWITCH_STATE_ADDRESS): ga_list_validator, - vol.Optional(CONF_OSCILLATION_ADDRESS): ga_list_validator, - vol.Optional(CONF_OSCILLATION_STATE_ADDRESS): ga_list_validator, - vol.Optional(FanConf.MAX_STEP): cv.byte, - vol.Optional(CONF_SYNC_STATE, default=True): sync_state_validator, + probatio.Optional(KNX_ADDRESS): ga_list_validator, + probatio.Optional(CONF_STATE_ADDRESS): ga_list_validator, + probatio.Optional(CONF_SWITCH_ADDRESS): ga_list_validator, + probatio.Optional(CONF_SWITCH_STATE_ADDRESS): ga_list_validator, + probatio.Optional(CONF_OSCILLATION_ADDRESS): ga_list_validator, + probatio.Optional(CONF_OSCILLATION_STATE_ADDRESS): ga_list_validator, + probatio.Optional(FanConf.MAX_STEP): cv.byte, + probatio.Optional(CONF_SYNC_STATE, default=True): sync_state_validator, } ), - vol.Any( - vol.Schema( - {vol.Required(KNX_ADDRESS): object}, - extra=vol.ALLOW_EXTRA, + probatio.Any( + probatio.Schema( + {probatio.Required(KNX_ADDRESS): object}, + extra=probatio.ALLOW_EXTRA, ), - vol.Schema( - {vol.Required(CONF_SWITCH_ADDRESS): object}, - extra=vol.ALLOW_EXTRA, + probatio.Schema( + {probatio.Required(CONF_SWITCH_ADDRESS): object}, + extra=probatio.ALLOW_EXTRA, ), msg=( f"At least one of '{KNX_ADDRESS}' or" @@ -653,7 +673,7 @@ class FanSchema(KNXPlatformSchema): class LightSchema(KNXPlatformSchema): - """Voluptuous schema for KNX lights.""" + """Probatio schema for KNX lights.""" PLATFORM = Platform.LIGHT @@ -691,30 +711,30 @@ class LightSchema(KNXPlatformSchema): " are required for hs_color configuration" ) HS_COLOR_SCHEMA = { - vol.Optional(CONF_HUE_ADDRESS): ga_list_validator, - vol.Optional(CONF_HUE_STATE_ADDRESS): ga_list_validator, - vol.Optional(CONF_SATURATION_ADDRESS): ga_list_validator, - vol.Optional(CONF_SATURATION_STATE_ADDRESS): ga_list_validator, + probatio.Optional(CONF_HUE_ADDRESS): ga_list_validator, + probatio.Optional(CONF_HUE_STATE_ADDRESS): ga_list_validator, + probatio.Optional(CONF_SATURATION_ADDRESS): ga_list_validator, + probatio.Optional(CONF_SATURATION_STATE_ADDRESS): ga_list_validator, } - INDIVIDUAL_COLOR_SCHEMA = vol.Schema( + INDIVIDUAL_COLOR_SCHEMA = probatio.Schema( { - vol.Optional(KNX_ADDRESS): ga_list_validator, - vol.Optional(CONF_STATE_ADDRESS): ga_list_validator, - vol.Required(CONF_BRIGHTNESS_ADDRESS): ga_list_validator, - vol.Optional(CONF_BRIGHTNESS_STATE_ADDRESS): ga_list_validator, + probatio.Optional(KNX_ADDRESS): ga_list_validator, + probatio.Optional(CONF_STATE_ADDRESS): ga_list_validator, + probatio.Required(CONF_BRIGHTNESS_ADDRESS): ga_list_validator, + probatio.Optional(CONF_BRIGHTNESS_STATE_ADDRESS): ga_list_validator, } ) - ENTITY_SCHEMA = vol.All( + ENTITY_SCHEMA = probatio.All( _entity_base_schema(PLATFORM).extend( { - vol.Optional(KNX_ADDRESS): ga_list_validator, - vol.Optional(CONF_STATE_ADDRESS): ga_list_validator, - vol.Optional(CONF_BRIGHTNESS_ADDRESS): ga_list_validator, - vol.Optional(CONF_BRIGHTNESS_STATE_ADDRESS): ga_list_validator, - vol.Exclusive(CONF_INDIVIDUAL_COLORS, "color"): { - vol.Inclusive( + probatio.Optional(KNX_ADDRESS): ga_list_validator, + probatio.Optional(CONF_STATE_ADDRESS): ga_list_validator, + probatio.Optional(CONF_BRIGHTNESS_ADDRESS): ga_list_validator, + probatio.Optional(CONF_BRIGHTNESS_STATE_ADDRESS): ga_list_validator, + probatio.Exclusive(CONF_INDIVIDUAL_COLORS, "color"): { + probatio.Inclusive( CONF_RED, "individual_colors", msg=( @@ -722,7 +742,7 @@ class LightSchema(KNXPlatformSchema): " colors configuration" ), ): INDIVIDUAL_COLOR_SCHEMA, - vol.Inclusive( + probatio.Inclusive( CONF_GREEN, "individual_colors", msg=( @@ -730,7 +750,7 @@ class LightSchema(KNXPlatformSchema): " colors configuration" ), ): INDIVIDUAL_COLOR_SCHEMA, - vol.Inclusive( + probatio.Inclusive( CONF_BLUE, "individual_colors", msg=( @@ -738,63 +758,63 @@ class LightSchema(KNXPlatformSchema): " colors configuration" ), ): INDIVIDUAL_COLOR_SCHEMA, - vol.Optional(CONF_WHITE): INDIVIDUAL_COLOR_SCHEMA, + probatio.Optional(CONF_WHITE): INDIVIDUAL_COLOR_SCHEMA, }, - vol.Exclusive(CONF_COLOR_ADDRESS, "color"): ga_list_validator, - vol.Optional(CONF_COLOR_STATE_ADDRESS): ga_list_validator, - vol.Optional(CONF_COLOR_TEMP_ADDRESS): ga_list_validator, - vol.Optional(CONF_COLOR_TEMP_STATE_ADDRESS): ga_list_validator, - vol.Optional( + probatio.Exclusive(CONF_COLOR_ADDRESS, "color"): ga_list_validator, + probatio.Optional(CONF_COLOR_STATE_ADDRESS): ga_list_validator, + probatio.Optional(CONF_COLOR_TEMP_ADDRESS): ga_list_validator, + probatio.Optional(CONF_COLOR_TEMP_STATE_ADDRESS): ga_list_validator, + probatio.Optional( CONF_COLOR_TEMP_MODE, default=DEFAULT_COLOR_TEMP_MODE - ): vol.All(vol.Upper, cv.enum(ColorTempModes)), + ): probatio.All(probatio.Upper, cv.enum(ColorTempModes)), **HS_COLOR_SCHEMA, - vol.Exclusive(CONF_RGBW_ADDRESS, "color"): ga_list_validator, - vol.Optional(CONF_RGBW_STATE_ADDRESS): ga_list_validator, - vol.Exclusive(CONF_XYY_ADDRESS, "color"): ga_list_validator, - vol.Optional(CONF_XYY_STATE_ADDRESS): ga_list_validator, - vol.Optional(CONF_MIN_KELVIN, default=DEFAULT_MIN_KELVIN): vol.All( - vol.Coerce(int), vol.Range(min=1) - ), - vol.Optional(CONF_MAX_KELVIN, default=DEFAULT_MAX_KELVIN): vol.All( - vol.Coerce(int), vol.Range(min=1) - ), - vol.Optional( + probatio.Exclusive(CONF_RGBW_ADDRESS, "color"): ga_list_validator, + probatio.Optional(CONF_RGBW_STATE_ADDRESS): ga_list_validator, + probatio.Exclusive(CONF_XYY_ADDRESS, "color"): ga_list_validator, + probatio.Optional(CONF_XYY_STATE_ADDRESS): ga_list_validator, + probatio.Optional( + CONF_MIN_KELVIN, default=DEFAULT_MIN_KELVIN + ): probatio.All(probatio.Coerce(int), probatio.Range(min=1)), + probatio.Optional( + CONF_MAX_KELVIN, default=DEFAULT_MAX_KELVIN + ): probatio.All(probatio.Coerce(int), probatio.Range(min=1)), + probatio.Optional( CONF_SYNC_STATE, default=True ): sync_state_no_false_validator, } ), - vol.Any( - vol.Schema( - {vol.Required(KNX_ADDRESS): object}, - extra=vol.ALLOW_EXTRA, + probatio.Any( + probatio.Schema( + {probatio.Required(KNX_ADDRESS): object}, + extra=probatio.ALLOW_EXTRA, ), - vol.Schema( # brightness addresses are required in INDIVIDUAL_COLOR_SCHEMA - {vol.Required(CONF_INDIVIDUAL_COLORS): object}, - extra=vol.ALLOW_EXTRA, + probatio.Schema( # brightness addresses are required in INDIVIDUAL_COLOR_SCHEMA + {probatio.Required(CONF_INDIVIDUAL_COLORS): object}, + extra=probatio.ALLOW_EXTRA, ), msg="either 'address' or 'individual_colors' is required", ), - vol.Any( - vol.Schema( # 'brightness' is non-optional for hs-color + probatio.Any( + probatio.Schema( # 'brightness' is non-optional for hs-color { - vol.Inclusive( + probatio.Inclusive( CONF_BRIGHTNESS_ADDRESS, "hs_color", msg=_hs_color_inclusion_msg ): object, - vol.Inclusive( + probatio.Inclusive( CONF_HUE_ADDRESS, "hs_color", msg=_hs_color_inclusion_msg ): object, - vol.Inclusive( + probatio.Inclusive( CONF_SATURATION_ADDRESS, "hs_color", msg=_hs_color_inclusion_msg ): object, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ), - vol.Schema( # hs-colors not used + probatio.Schema( # hs-colors not used { - vol.Optional(CONF_HUE_ADDRESS): None, - vol.Optional(CONF_SATURATION_ADDRESS): None, + probatio.Optional(CONF_HUE_ADDRESS): None, + probatio.Optional(CONF_SATURATION_ADDRESS): None, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ), msg=_hs_color_inclusion_msg, ), @@ -802,39 +822,39 @@ class LightSchema(KNXPlatformSchema): class NotifySchema(KNXPlatformSchema): - """Voluptuous schema for KNX notifications.""" + """Probatio schema for KNX notifications.""" PLATFORM = Platform.NOTIFY ENTITY_SCHEMA = _entity_base_schema(PLATFORM).extend( { - vol.Optional(CONF_TYPE, default="latin_1"): string_type_validator, - vol.Required(KNX_ADDRESS): ga_validator, + probatio.Optional(CONF_TYPE, default="latin_1"): string_type_validator, + probatio.Required(KNX_ADDRESS): ga_validator, } ) class NumberSchema(KNXPlatformSchema): - """Voluptuous schema for KNX numbers.""" + """Probatio schema for KNX numbers.""" PLATFORM = Platform.NUMBER - ENTITY_SCHEMA = vol.All( + ENTITY_SCHEMA = probatio.All( _entity_base_schema(PLATFORM).extend( { - vol.Optional(CONF_RESPOND_TO_READ, default=False): cv.boolean, - vol.Optional(CONF_MODE, default=NumberMode.AUTO): vol.Coerce( + probatio.Optional(CONF_RESPOND_TO_READ, default=False): cv.boolean, + probatio.Optional(CONF_MODE, default=NumberMode.AUTO): probatio.Coerce( NumberMode ), - vol.Required(CONF_TYPE): numeric_type_validator, - vol.Required(KNX_ADDRESS): ga_list_validator, - vol.Optional(CONF_STATE_ADDRESS): ga_list_validator, - vol.Optional(NumberConf.MAX): vol.Coerce(float), - vol.Optional(NumberConf.MIN): vol.Coerce(float), - vol.Optional(NumberConf.STEP): cv.positive_float, - vol.Optional(CONF_DEVICE_CLASS): NUMBER_DEVICE_CLASSES_SCHEMA, - vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, - vol.Optional( + probatio.Required(CONF_TYPE): numeric_type_validator, + probatio.Required(KNX_ADDRESS): ga_list_validator, + probatio.Optional(CONF_STATE_ADDRESS): ga_list_validator, + probatio.Optional(NumberConf.MAX): probatio.Coerce(float), + probatio.Optional(NumberConf.MIN): probatio.Coerce(float), + probatio.Optional(NumberConf.STEP): cv.positive_float, + probatio.Optional(CONF_DEVICE_CLASS): NUMBER_DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, + probatio.Optional( CONF_SYNC_STATE, default=True ): sync_state_no_false_validator, } @@ -844,7 +864,7 @@ class NumberSchema(KNXPlatformSchema): class SceneSchema(KNXPlatformSchema): - """Voluptuous schema for KNX scenes.""" + """Probatio schema for KNX scenes.""" PLATFORM = Platform.SCENE @@ -852,35 +872,35 @@ class SceneSchema(KNXPlatformSchema): ENTITY_SCHEMA = _entity_base_schema(PLATFORM).extend( { - vol.Required(KNX_ADDRESS): ga_list_validator, - vol.Required(SceneConf.SCENE_NUMBER): vol.All( - vol.Coerce(int), vol.Range(min=1, max=64) + probatio.Required(KNX_ADDRESS): ga_list_validator, + probatio.Required(SceneConf.SCENE_NUMBER): probatio.All( + probatio.Coerce(int), probatio.Range(min=1, max=64) ), } ) class SelectSchema(KNXPlatformSchema): - """Voluptuous schema for KNX selects.""" + """Probatio schema for KNX selects.""" PLATFORM = Platform.SELECT - ENTITY_SCHEMA = vol.All( + ENTITY_SCHEMA = probatio.All( _entity_base_schema(PLATFORM).extend( { - vol.Optional(CONF_SYNC_STATE, default=True): sync_state_validator, - vol.Optional(CONF_RESPOND_TO_READ, default=False): cv.boolean, - vol.Required(CONF_PAYLOAD_LENGTH): vol.All( - vol.Coerce(int), vol.Range(min=0, max=14) + probatio.Optional(CONF_SYNC_STATE, default=True): sync_state_validator, + probatio.Optional(CONF_RESPOND_TO_READ, default=False): cv.boolean, + probatio.Required(CONF_PAYLOAD_LENGTH): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=14) ), - vol.Required(SelectConf.OPTIONS): [ + probatio.Required(SelectConf.OPTIONS): [ { - vol.Required(SelectConf.OPTION): vol.Coerce(str), - vol.Required(CONF_PAYLOAD): cv.positive_int, + probatio.Required(SelectConf.OPTION): probatio.Coerce(str), + probatio.Required(CONF_PAYLOAD): cv.positive_int, } ], - vol.Required(KNX_ADDRESS): ga_list_validator, - vol.Optional(CONF_STATE_ADDRESS): ga_list_validator, + probatio.Required(KNX_ADDRESS): ga_list_validator, + probatio.Optional(CONF_STATE_ADDRESS): ga_list_validator, } ), select_options_sub_validator, @@ -888,7 +908,7 @@ class SelectSchema(KNXPlatformSchema): class SensorSchema(KNXPlatformSchema): - """Voluptuous schema for KNX sensors.""" + """Probatio schema for KNX sensors.""" PLATFORM = Platform.SENSOR @@ -896,16 +916,16 @@ class SensorSchema(KNXPlatformSchema): CONF_STATE_ADDRESS = CONF_STATE_ADDRESS CONF_SYNC_STATE = CONF_SYNC_STATE - ENTITY_SCHEMA = vol.All( + ENTITY_SCHEMA = probatio.All( _entity_base_schema(PLATFORM).extend( { - vol.Optional(CONF_SYNC_STATE, default=True): sync_state_validator, - vol.Optional(CONF_ALWAYS_CALLBACK, default=False): cv.boolean, - vol.Optional(CONF_SENSOR_STATE_CLASS): STATE_CLASSES_SCHEMA, - vol.Required(CONF_TYPE): sensor_type_validator, - vol.Required(CONF_STATE_ADDRESS): ga_list_validator, - vol.Optional(CONF_DEVICE_CLASS): SENSOR_DEVICE_CLASSES_SCHEMA, - vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, + probatio.Optional(CONF_SYNC_STATE, default=True): sync_state_validator, + probatio.Optional(CONF_ALWAYS_CALLBACK, default=False): cv.boolean, + probatio.Optional(CONF_SENSOR_STATE_CLASS): STATE_CLASSES_SCHEMA, + probatio.Required(CONF_TYPE): sensor_type_validator, + probatio.Required(CONF_STATE_ADDRESS): ga_list_validator, + probatio.Optional(CONF_DEVICE_CLASS): SENSOR_DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, } ), _sensor_attribute_sub_validator, @@ -913,7 +933,7 @@ class SensorSchema(KNXPlatformSchema): class SwitchSchema(KNXPlatformSchema): - """Voluptuous schema for KNX switches.""" + """Probatio schema for KNX switches.""" PLATFORM = Platform.SWITCH @@ -922,50 +942,56 @@ class SwitchSchema(KNXPlatformSchema): ENTITY_SCHEMA = _entity_base_schema(PLATFORM).extend( { - vol.Optional(CONF_INVERT, default=False): cv.boolean, - vol.Optional(CONF_RESPOND_TO_READ, default=False): cv.boolean, - vol.Required(KNX_ADDRESS): ga_list_validator, - vol.Optional(CONF_STATE_ADDRESS): ga_list_validator, - vol.Optional(CONF_DEVICE_CLASS): SWITCH_DEVICE_CLASSES_SCHEMA, - vol.Optional(CONF_SYNC_STATE, default=True): sync_state_no_false_validator, + probatio.Optional(CONF_INVERT, default=False): cv.boolean, + probatio.Optional(CONF_RESPOND_TO_READ, default=False): cv.boolean, + probatio.Required(KNX_ADDRESS): ga_list_validator, + probatio.Optional(CONF_STATE_ADDRESS): ga_list_validator, + probatio.Optional(CONF_DEVICE_CLASS): SWITCH_DEVICE_CLASSES_SCHEMA, + probatio.Optional( + CONF_SYNC_STATE, default=True + ): sync_state_no_false_validator, } ) class TextSchema(KNXPlatformSchema): - """Voluptuous schema for KNX text.""" + """Probatio schema for KNX text.""" PLATFORM = Platform.TEXT ENTITY_SCHEMA = _entity_base_schema(PLATFORM).extend( { - vol.Optional(CONF_RESPOND_TO_READ, default=False): cv.boolean, - vol.Optional(CONF_TYPE, default="latin_1"): string_type_validator, - vol.Optional(CONF_MODE, default=TextMode.TEXT): vol.Coerce(TextMode), - vol.Required(KNX_ADDRESS): ga_list_validator, - vol.Optional(CONF_STATE_ADDRESS): ga_list_validator, - vol.Optional(CONF_SYNC_STATE, default=True): sync_state_no_false_validator, + probatio.Optional(CONF_RESPOND_TO_READ, default=False): cv.boolean, + probatio.Optional(CONF_TYPE, default="latin_1"): string_type_validator, + probatio.Optional(CONF_MODE, default=TextMode.TEXT): probatio.Coerce( + TextMode + ), + probatio.Required(KNX_ADDRESS): ga_list_validator, + probatio.Optional(CONF_STATE_ADDRESS): ga_list_validator, + probatio.Optional( + CONF_SYNC_STATE, default=True + ): sync_state_no_false_validator, } ) class TimeSchema(KNXPlatformSchema): - """Voluptuous schema for KNX time.""" + """Probatio schema for KNX time.""" PLATFORM = Platform.TIME ENTITY_SCHEMA = _entity_base_schema(PLATFORM).extend( { - vol.Optional(CONF_RESPOND_TO_READ, default=False): cv.boolean, - vol.Optional(CONF_SYNC_STATE, default=True): sync_state_validator, - vol.Required(KNX_ADDRESS): ga_list_validator, - vol.Optional(CONF_STATE_ADDRESS): ga_list_validator, + probatio.Optional(CONF_RESPOND_TO_READ, default=False): cv.boolean, + probatio.Optional(CONF_SYNC_STATE, default=True): sync_state_validator, + probatio.Required(KNX_ADDRESS): ga_list_validator, + probatio.Optional(CONF_STATE_ADDRESS): ga_list_validator, } ) class WeatherSchema(KNXPlatformSchema): - """Voluptuous schema for KNX weather station.""" + """Probatio schema for KNX weather station.""" PLATFORM = Platform.WEATHER @@ -986,19 +1012,19 @@ class WeatherSchema(KNXPlatformSchema): ENTITY_SCHEMA = _entity_base_schema(PLATFORM).extend( { - vol.Optional(CONF_SYNC_STATE, default=True): sync_state_validator, - vol.Required(CONF_KNX_TEMPERATURE_ADDRESS): ga_list_validator, - vol.Optional(CONF_KNX_BRIGHTNESS_SOUTH_ADDRESS): ga_list_validator, - vol.Optional(CONF_KNX_BRIGHTNESS_EAST_ADDRESS): ga_list_validator, - vol.Optional(CONF_KNX_BRIGHTNESS_WEST_ADDRESS): ga_list_validator, - vol.Optional(CONF_KNX_BRIGHTNESS_NORTH_ADDRESS): ga_list_validator, - vol.Optional(CONF_KNX_WIND_SPEED_ADDRESS): ga_list_validator, - vol.Optional(CONF_KNX_WIND_BEARING_ADDRESS): ga_list_validator, - vol.Optional(CONF_KNX_RAIN_ALARM_ADDRESS): ga_list_validator, - vol.Optional(CONF_KNX_FROST_ALARM_ADDRESS): ga_list_validator, - vol.Optional(CONF_KNX_WIND_ALARM_ADDRESS): ga_list_validator, - vol.Optional(CONF_KNX_DAY_NIGHT_ADDRESS): ga_list_validator, - vol.Optional(CONF_KNX_AIR_PRESSURE_ADDRESS): ga_list_validator, - vol.Optional(CONF_KNX_HUMIDITY_ADDRESS): ga_list_validator, + probatio.Optional(CONF_SYNC_STATE, default=True): sync_state_validator, + probatio.Required(CONF_KNX_TEMPERATURE_ADDRESS): ga_list_validator, + probatio.Optional(CONF_KNX_BRIGHTNESS_SOUTH_ADDRESS): ga_list_validator, + probatio.Optional(CONF_KNX_BRIGHTNESS_EAST_ADDRESS): ga_list_validator, + probatio.Optional(CONF_KNX_BRIGHTNESS_WEST_ADDRESS): ga_list_validator, + probatio.Optional(CONF_KNX_BRIGHTNESS_NORTH_ADDRESS): ga_list_validator, + probatio.Optional(CONF_KNX_WIND_SPEED_ADDRESS): ga_list_validator, + probatio.Optional(CONF_KNX_WIND_BEARING_ADDRESS): ga_list_validator, + probatio.Optional(CONF_KNX_RAIN_ALARM_ADDRESS): ga_list_validator, + probatio.Optional(CONF_KNX_FROST_ALARM_ADDRESS): ga_list_validator, + probatio.Optional(CONF_KNX_WIND_ALARM_ADDRESS): ga_list_validator, + probatio.Optional(CONF_KNX_DAY_NIGHT_ADDRESS): ga_list_validator, + probatio.Optional(CONF_KNX_AIR_PRESSURE_ADDRESS): ga_list_validator, + probatio.Optional(CONF_KNX_HUMIDITY_ADDRESS): ga_list_validator, } ) diff --git a/homeassistant/components/knx/services.py b/homeassistant/components/knx/services.py index 3341abd209abf..a3b5d168f565e 100644 --- a/homeassistant/components/knx/services.py +++ b/homeassistant/components/knx/services.py @@ -3,7 +3,7 @@ import logging from typing import TYPE_CHECKING -import voluptuous as vol +import probatio from xknx.dpt import DPTArray, DPTBase, DPTBinary from xknx.exceptions import ConversionError from xknx.telegram import Telegram @@ -97,14 +97,14 @@ def get_knx_module(hass: HomeAssistant) -> KNXModule: ) from err -SERVICE_KNX_EVENT_REGISTER_SCHEMA = vol.Schema( +SERVICE_KNX_EVENT_REGISTER_SCHEMA = probatio.Schema( { - vol.Required(KNX_ADDRESS): vol.All( + probatio.Required(KNX_ADDRESS): probatio.All( cv.ensure_list, [ga_validator], ), - vol.Optional(CONF_TYPE): dpt_base_type_validator, - vol.Optional(SERVICE_KNX_ATTR_REMOVE, default=False): cv.boolean, + probatio.Optional(CONF_TYPE): dpt_base_type_validator, + probatio.Optional(SERVICE_KNX_ATTR_REMOVE, default=False): cv.boolean, } ) @@ -152,19 +152,19 @@ async def service_event_register_modify(call: ServiceCall) -> None: ) -SERVICE_KNX_EXPOSURE_REGISTER_SCHEMA = vol.Any( +SERVICE_KNX_EXPOSURE_REGISTER_SCHEMA = probatio.Any( ExposeSchema.EXPOSE_SENSOR_SCHEMA.extend( { - vol.Optional(SERVICE_KNX_ATTR_REMOVE, default=False): cv.boolean, + probatio.Optional(SERVICE_KNX_ATTR_REMOVE, default=False): cv.boolean, } ), - vol.Schema( + probatio.Schema( # for removing only `address` is required { - vol.Required(KNX_ADDRESS): ga_validator, - vol.Required(SERVICE_KNX_ATTR_REMOVE): vol.All(cv.boolean, True), + probatio.Required(KNX_ADDRESS): ga_validator, + probatio.Required(SERVICE_KNX_ATTR_REMOVE): probatio.All(cv.boolean, True), }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ), ) @@ -210,29 +210,29 @@ async def service_exposure_register_modify(call: ServiceCall) -> None: ) -SERVICE_KNX_SEND_SCHEMA = vol.Any( - vol.Schema( +SERVICE_KNX_SEND_SCHEMA = probatio.Any( + probatio.Schema( { - vol.Required(KNX_ADDRESS): vol.All( + probatio.Required(KNX_ADDRESS): probatio.All( cv.ensure_list, [ga_validator], ), - vol.Required(SERVICE_KNX_ATTR_PAYLOAD): cv.match_all, - vol.Required(SERVICE_KNX_ATTR_TYPE): dpt_base_type_validator, - vol.Optional(SERVICE_KNX_ATTR_RESPONSE, default=False): cv.boolean, + probatio.Required(SERVICE_KNX_ATTR_PAYLOAD): cv.match_all, + probatio.Required(SERVICE_KNX_ATTR_TYPE): dpt_base_type_validator, + probatio.Optional(SERVICE_KNX_ATTR_RESPONSE, default=False): cv.boolean, } ), - vol.Schema( + probatio.Schema( # without type given payload is treated as raw bytes { - vol.Required(KNX_ADDRESS): vol.All( + probatio.Required(KNX_ADDRESS): probatio.All( cv.ensure_list, [ga_validator], ), - vol.Required(SERVICE_KNX_ATTR_PAYLOAD): vol.Any( + probatio.Required(SERVICE_KNX_ATTR_PAYLOAD): probatio.Any( cv.positive_int, [cv.positive_int] ), - vol.Optional(SERVICE_KNX_ATTR_RESPONSE, default=False): cv.boolean, + probatio.Optional(SERVICE_KNX_ATTR_RESPONSE, default=False): cv.boolean, } ), ) @@ -280,9 +280,9 @@ async def service_send_to_knx_bus(call: ServiceCall) -> None: await knx_module.xknx.telegrams.put(telegram) -SERVICE_KNX_READ_SCHEMA = vol.Schema( +SERVICE_KNX_READ_SCHEMA = probatio.Schema( { - vol.Required(KNX_ADDRESS): vol.All( + probatio.Required(KNX_ADDRESS): probatio.All( cv.ensure_list, [ga_validator], ) diff --git a/homeassistant/components/knx/validation.py b/homeassistant/components/knx/validation.py index 3cf259456ffec..dd76188646b39 100644 --- a/homeassistant/components/knx/validation.py +++ b/homeassistant/components/knx/validation.py @@ -6,7 +6,7 @@ import math from typing import Any -import voluptuous as vol +import probatio from xknx.dpt import DPTBase, DPTNumeric, DPTString from xknx.exceptions import CouldNotParseAddress from xknx.telegram.address import IndividualAddress, parse_device_group_address @@ -37,7 +37,7 @@ def dpt_value_validator(value: Any) -> str | int: and dpt_base_class.parse_transcoder(value) is not None ): return value - raise vol.Invalid( + raise probatio.Invalid( f"type '{value}' is not a valid DPT identifier for" f" {dpt_base_class.__name__}." ) @@ -48,20 +48,20 @@ def dpt_value_validator(value: Any) -> str | int: dpt_base_type_validator = dpt_subclass_validator(DPTBase) # type: ignore[type-abstract] numeric_type_validator = dpt_subclass_validator(DPTNumeric) # type: ignore[type-abstract] string_type_validator = dpt_subclass_validator(DPTString) -sensor_type_validator = vol.Any(numeric_type_validator, string_type_validator) +sensor_type_validator = probatio.Any(numeric_type_validator, string_type_validator) def ga_validator(value: Any) -> str | int: """Validate that value is parsable as GroupAddress or InternalGroupAddress.""" if not isinstance(value, (str, int)): - raise vol.Invalid( + raise probatio.Invalid( f"'{value}' is not a valid KNX group address:" f" Invalid type '{type(value).__name__}'" ) try: parse_device_group_address(value) except CouldNotParseAddress as exc: - raise vol.Invalid( + raise probatio.Invalid( f"'{value}' is not a valid KNX group address: {exc.message}" ) from exc return value @@ -69,28 +69,34 @@ def ga_validator(value: Any) -> str | int: def maybe_ga_validator(value: Any) -> str | int | None: """Validate a group address or None.""" - # this is a version of vol.Maybe(ga_validator) that delivers the + # this is a version of probatio.Maybe(ga_validator) that delivers the # error message of ga_validator if validation fails. return ga_validator(value) if value is not None else None -ga_list_validator = vol.All( +ga_list_validator = probatio.All( cv.ensure_list, [ga_validator], - vol.IsTrue("value must be a group address or a list containing group addresses"), + probatio.IsTrue( + "value must be a group address or a list containing group addresses" + ), ) -ga_list_validator_optional = vol.Maybe( - vol.All( +ga_list_validator_optional = probatio.Maybe( + probatio.All( cv.ensure_list, [ga_validator], - vol.Any(vol.IsTrue(), vol.SetTo(None)), # avoid empty lists -> None + probatio.Any( + probatio.IsTrue(), probatio.SetTo(None) + ), # avoid empty lists -> None ) ) -ia_validator = vol.Any( - vol.All(str, str.strip, cv.matches_regex(IndividualAddress.ADDRESS_RE.pattern)), - vol.All(vol.Coerce(int), vol.Range(min=1, max=65535)), +ia_validator = probatio.Any( + probatio.All( + str, str.strip, cv.matches_regex(IndividualAddress.ADDRESS_RE.pattern) + ), + probatio.All(probatio.Coerce(int), probatio.Range(min=1, max=65535)), msg=( "value does not match pattern for KNX individual address" " '..' (eg.'1.1.100')" @@ -106,30 +112,34 @@ def ip_v4_validator(value: Any, multicast: bool | None = None) -> str: try: address = ipaddress.IPv4Address(value) except ipaddress.AddressValueError as ex: - raise vol.Invalid(f"value '{value}' is not a valid IPv4 address: {ex}") from ex + raise probatio.Invalid( + f"value '{value}' is not a valid IPv4 address: {ex}" + ) from ex if multicast is not None and address.is_multicast != multicast: - raise vol.Invalid( + raise probatio.Invalid( f"value '{value}' is not a valid IPv4" f" {'multicast' if multicast else 'unicast'} address" ) return str(address) -sync_state_validator = vol.Any( - vol.All(vol.Coerce(int), vol.Range(min=2, max=1440)), +sync_state_validator = probatio.Any( + probatio.All(probatio.Coerce(int), probatio.Range(min=2, max=1440)), cv.boolean, cv.matches_regex(r"^(init|expire|every)( \d*)?$"), ) # entities having a writable group address can omit the state address # instead of disabling state updates entirely -sync_state_no_false_validator = vol.All( +sync_state_no_false_validator = probatio.All( sync_state_validator, - vol.IsTrue("Sync state can not be disabled for this platform"), + probatio.IsTrue("Sync state can not be disabled for this platform"), ) -def backwards_compatible_xknx_climate_enum_member(enumClass: type[Enum]) -> vol.All: +def backwards_compatible_xknx_climate_enum_member( + enumClass: type[Enum], +) -> probatio.All: """Transform a string to an enum member. Backwards compatible with member names of xknx 2.x climate DPT Enums @@ -143,7 +153,7 @@ def _string_transform(value: Any) -> str: looked like `FAN_ONLY = "Fan only"`, therefore the upper & replace part. """ if not isinstance(value, str): - raise vol.Invalid("value should be a string") + raise probatio.Invalid("value should be a string") name = value.upper().replace(" ", "_") match name: case "NIGHT": @@ -155,9 +165,9 @@ def _string_transform(value: Any) -> str: case _: return name - return vol.All( + return probatio.All( _string_transform, - vol.In(enumClass.__members__), + probatio.In(enumClass.__members__), enumClass.__getitem__, ) @@ -178,29 +188,29 @@ def validate_number_attributes( # Infinity is not supported by Home Assistant frontend so user defined # config is required if xknx DPTNumeric subclass defines it as limit. if min_config is None and transcoder.value_min == -math.inf: - raise vol.Invalid( + raise probatio.Invalid( f"'min' key required for {_dpt_error_str}", path=[NumberConf.MIN], ) if min_config is not None and min_config < transcoder.value_min: - raise vol.Invalid( + raise probatio.Invalid( f"'min: {min_config}' undercuts possible minimum" f" of {_dpt_error_str}: {transcoder.value_min}", path=[NumberConf.MIN], ) if max_config is None and transcoder.value_max == math.inf: - raise vol.Invalid( + raise probatio.Invalid( f"'max' key required for {_dpt_error_str}", path=[NumberConf.MAX], ) if max_config is not None and max_config > transcoder.value_max: - raise vol.Invalid( + raise probatio.Invalid( f"'max: {max_config}' exceeds possible maximum" f" of {_dpt_error_str}: {transcoder.value_max}", path=[NumberConf.MAX], ) if step_config is not None and step_config < transcoder.resolution: - raise vol.Invalid( + raise probatio.Invalid( f"'step: {step_config}' undercuts possible minimum step" f" of {_dpt_error_str}: {transcoder.resolution}", path=[NumberConf.STEP], @@ -223,7 +233,7 @@ def validate_number_attributes( and unit_of_measurement not in d_c_units ): _options = ", ".join(sorted(map(str, d_c_units), key=str.casefold)) - raise vol.Invalid( + raise probatio.Invalid( f"Unit of measurement '{unit_of_measurement}'" f" is not valid for device class" f" '{device_class}'." @@ -265,7 +275,7 @@ def validate_sensor_attributes( and state_class not in state_classes ): _options = ", ".join(sorted(map(str, state_classes), key=str.casefold)) - raise vol.Invalid( + raise probatio.Invalid( f"State class '{state_class}' is not valid" f" for device class '{device_class}'." f" Valid options are: {_options}", @@ -277,7 +287,7 @@ def validate_sensor_attributes( and unit_of_measurement not in d_c_units ): _options = ", ".join(sorted(map(str, d_c_units), key=str.casefold)) - raise vol.Invalid( + raise probatio.Invalid( f"Unit of measurement '{unit_of_measurement}'" f" is not valid for device class" f" '{device_class}'." @@ -294,7 +304,7 @@ def validate_sensor_attributes( and unit_of_measurement not in s_c_units ): _options = ", ".join(sorted(map(str, s_c_units), key=str.casefold)) - raise vol.Invalid( + raise probatio.Invalid( f"Unit of measurement '{unit_of_measurement}'" f" is not valid for state class" f" '{state_class}'." diff --git a/homeassistant/components/knx/websocket.py b/homeassistant/components/knx/websocket.py index 8b9f52a9dafc4..21529cde03970 100644 --- a/homeassistant/components/knx/websocket.py +++ b/homeassistant/components/knx/websocket.py @@ -14,7 +14,7 @@ KnxTelegramStoreException, TelegramQuery, ) -import voluptuous as vol +import probatio from xknx.telegram import Telegram from xknxproject.exceptions import XknxProjectException @@ -182,7 +182,7 @@ def with_knx( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "knx/get_base_data", + probatio.Required("type"): "knx/get_base_data", } ) @provide_knx @@ -235,7 +235,7 @@ def ws_get_base_data( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "knx/get_knx_project", + probatio.Required("type"): "knx/get_knx_project", } ) @websocket_api.async_response @@ -257,9 +257,9 @@ async def ws_get_knx_project( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "knx/project_file_process", - vol.Required("file_id"): str, - vol.Required("password"): str, + probatio.Required("type"): "knx/project_file_process", + probatio.Required("file_id"): str, + probatio.Required("password"): str, } ) @websocket_api.async_response @@ -290,7 +290,7 @@ async def ws_project_file_process( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "knx/project_file_remove", + probatio.Required("type"): "knx/project_file_remove", } ) @websocket_api.async_response @@ -309,7 +309,7 @@ async def ws_project_file_remove( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "knx/group_monitor_info", + probatio.Required("type"): "knx/group_monitor_info", } ) @websocket_api.async_response @@ -357,7 +357,7 @@ async def ws_group_monitor_info( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "knx/group_telegrams", + probatio.Required("type"): "knx/group_telegrams", } ) @provide_knx @@ -378,19 +378,27 @@ def ws_group_telegrams( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "knx/query_telegrams", - vol.Optional("sources"): [str], - vol.Optional("destinations"): [str], - vol.Optional("telegram_types"): [str], - vol.Optional("directions"): [str], - vol.Optional("dpt_mains"): [vol.Coerce(int)], - vol.Optional("start_time"): cv.datetime, - vol.Optional("end_time"): cv.datetime, - vol.Optional("delta_before_ms"): vol.All(vol.Coerce(int), vol.Range(min=0)), - vol.Optional("delta_after_ms"): vol.All(vol.Coerce(int), vol.Range(min=0)), - vol.Optional("limit"): vol.All(vol.Coerce(int), vol.Range(min=1, max=100_000)), - vol.Optional("offset"): vol.All(vol.Coerce(int), vol.Range(min=0)), - vol.Optional("order_descending"): bool, + probatio.Required("type"): "knx/query_telegrams", + probatio.Optional("sources"): [str], + probatio.Optional("destinations"): [str], + probatio.Optional("telegram_types"): [str], + probatio.Optional("directions"): [str], + probatio.Optional("dpt_mains"): [probatio.Coerce(int)], + probatio.Optional("start_time"): cv.datetime, + probatio.Optional("end_time"): cv.datetime, + probatio.Optional("delta_before_ms"): probatio.All( + probatio.Coerce(int), probatio.Range(min=0) + ), + probatio.Optional("delta_after_ms"): probatio.All( + probatio.Coerce(int), probatio.Range(min=0) + ), + probatio.Optional("limit"): probatio.All( + probatio.Coerce(int), probatio.Range(min=1, max=100_000) + ), + probatio.Optional("offset"): probatio.All( + probatio.Coerce(int), probatio.Range(min=0) + ), + probatio.Optional("order_descending"): bool, } ) @websocket_api.async_response @@ -452,7 +460,7 @@ async def ws_query_telegrams( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "knx/subscribe_telegrams", + probatio.Required("type"): "knx/subscribe_telegrams", } ) @callback @@ -494,7 +502,7 @@ def forward_telegram(_telegram: Telegram, telegram_dict: TelegramDict) -> None: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "knx/validate_entity", + probatio.Required("type"): "knx/validate_entity", **CREATE_ENTITY_BASE_SCHEMA, } ) @@ -518,8 +526,8 @@ def ws_validate_entity( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "knx/get_schema", - vol.Required(CONF_PLATFORM): vol.Coerce(Platform), + probatio.Required("type"): "knx/get_schema", + probatio.Required(CONF_PLATFORM): probatio.Coerce(Platform), } ) @websocket_api.async_response @@ -540,7 +548,7 @@ async def ws_get_schema( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "knx/create_entity", + probatio.Required("type"): "knx/create_entity", **CREATE_ENTITY_BASE_SCHEMA, } ) @@ -577,7 +585,7 @@ async def ws_create_entity( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "knx/update_entity", + probatio.Required("type"): "knx/update_entity", **UPDATE_ENTITY_BASE_SCHEMA, } ) @@ -614,8 +622,8 @@ async def ws_update_entity( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "knx/delete_entity", - vol.Required(CONF_ENTITY_ID): str, + probatio.Required("type"): "knx/delete_entity", + probatio.Required(CONF_ENTITY_ID): str, } ) @websocket_api.async_response @@ -640,7 +648,7 @@ async def ws_delete_entity( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "knx/get_entities_by_group", + probatio.Required("type"): "knx/get_entities_by_group", } ) @provide_knx @@ -661,8 +669,8 @@ def ws_get_entities_by_group( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "knx/get_entity_config", - vol.Required(CONF_ENTITY_ID): str, + probatio.Required("type"): "knx/get_entity_config", + probatio.Required(CONF_ENTITY_ID): str, } ) @provide_knx @@ -687,9 +695,9 @@ def ws_get_entity_config( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "knx/create_device", - vol.Required("name"): str, - vol.Optional("area_id"): str, + probatio.Required("type"): "knx/create_device", + probatio.Required("name"): str, + probatio.Optional("area_id"): str, } ) @provide_knx @@ -725,7 +733,7 @@ def ws_create_device( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "knx/get_expose_groups", + probatio.Required("type"): "knx/get_expose_groups", } ) @provide_knx @@ -743,8 +751,8 @@ def ws_get_expose_groups( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "knx/get_expose_config", - vol.Required("entity_id"): str, + probatio.Required("type"): "knx/get_expose_config", + probatio.Required("entity_id"): str, } ) @provide_knx @@ -764,9 +772,9 @@ def ws_get_expose_config( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "knx/update_expose", - vol.Required("entity_id"): str, - vol.Required("data"): dict, # validation done in handler + probatio.Required("type"): "knx/update_expose", + probatio.Required("entity_id"): str, + probatio.Required("data"): dict, # validation done in handler } ) @websocket_api.async_response @@ -800,8 +808,8 @@ async def ws_update_expose( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "knx/delete_expose", - vol.Required("entity_id"): str, + probatio.Required("type"): "knx/delete_expose", + probatio.Required("entity_id"): str, } ) @websocket_api.async_response @@ -826,9 +834,9 @@ async def ws_delete_expose( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "knx/validate_expose", - vol.Required("entity_id"): str, - vol.Required("data"): dict, # validation done in handler + probatio.Required("type"): "knx/validate_expose", + probatio.Required("entity_id"): str, + probatio.Required("data"): dict, # validation done in handler } ) @callback @@ -856,7 +864,7 @@ def ws_validate_expose( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "knx/get_time_server_config", + probatio.Required("type"): "knx/get_time_server_config", } ) @provide_knx @@ -875,8 +883,8 @@ def ws_get_time_server_config( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "knx/update_time_server_config", - vol.Required("config"): dict, # validation done in handler + probatio.Required("type"): "knx/update_time_server_config", + probatio.Required("config"): dict, # validation done in handler } ) @websocket_api.async_response diff --git a/homeassistant/components/kodi/config_flow.py b/homeassistant/components/kodi/config_flow.py index d556868badea7..0a8341832c80b 100644 --- a/homeassistant/components/kodi/config_flow.py +++ b/homeassistant/components/kodi/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from pykodi import CannotConnectError, InvalidAuthError, Kodi, get_kodi_connection -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -237,12 +237,12 @@ async def async_step_ws_port( def _show_credentials_form( self, errors: dict[str, str] | None = None ) -> ConfigFlowResult: - schema = vol.Schema( + schema = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_USERNAME, description={"suggested_value": self._username} ): str, - vol.Optional( + probatio.Optional( CONF_PASSWORD, description={"suggested_value": self._password} ): str, } @@ -256,11 +256,11 @@ def _show_credentials_form( def _show_user_form(self, errors=None): default_port = self._port or DEFAULT_PORT default_ssl = self._ssl or DEFAULT_SSL - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required(CONF_HOST, default=self._host): str, - vol.Required(CONF_PORT, default=default_port): int, - vol.Required(CONF_SSL, default=default_ssl): bool, + probatio.Required(CONF_HOST, default=self._host): str, + probatio.Required(CONF_PORT, default=default_port): int, + probatio.Required(CONF_SSL, default=default_ssl): bool, } ) @@ -271,9 +271,9 @@ def _show_user_form(self, errors=None): @callback def _show_ws_port_form(self, errors=None): suggestion = self._ws_port or DEFAULT_WS_PORT - schema = vol.Schema( + schema = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_WS_PORT, description={"suggested_value": suggestion} ): int } diff --git a/homeassistant/components/kodi/device_trigger.py b/homeassistant/components/kodi/device_trigger.py index 2fe6f70e45f91..b0f127067fb4c 100644 --- a/homeassistant/components/kodi/device_trigger.py +++ b/homeassistant/components/kodi/device_trigger.py @@ -1,6 +1,6 @@ """Provides device automations for Kodi.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import DEVICE_TRIGGER_BASE_SCHEMA from homeassistant.components.media_player import DOMAIN as MEDIA_PLAYER_DOMAIN @@ -23,8 +23,8 @@ TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In(TRIGGER_TYPES), + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In(TRIGGER_TYPES), } ) diff --git a/homeassistant/components/kodi/notify.py b/homeassistant/components/kodi/notify.py index fcb3eadcf65d9..4716cc97e9f86 100644 --- a/homeassistant/components/kodi/notify.py +++ b/homeassistant/components/kodi/notify.py @@ -5,7 +5,7 @@ import aiohttp import jsonrpc_async -import voluptuous as vol +import probatio from homeassistant.components.notify import ( ATTR_DATA, @@ -35,11 +35,11 @@ PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_PROXY_SSL, default=DEFAULT_PROXY_SSL): cv.boolean, - vol.Inclusive(CONF_USERNAME, "auth"): cv.string, - vol.Inclusive(CONF_PASSWORD, "auth"): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_PROXY_SSL, default=DEFAULT_PROXY_SSL): cv.boolean, + probatio.Inclusive(CONF_USERNAME, "auth"): cv.string, + probatio.Inclusive(CONF_PASSWORD, "auth"): cv.string, } ) diff --git a/homeassistant/components/kodi/services.py b/homeassistant/components/kodi/services.py index 2e1139603d130..c62e823bf37c5 100644 --- a/homeassistant/components/kodi/services.py +++ b/homeassistant/components/kodi/services.py @@ -1,6 +1,6 @@ """Support for interfacing with the XBMC/Kodi JSON-RPC API.""" -import voluptuous as vol +import probatio from homeassistant.components.media_player import DOMAIN as MEDIA_PLAYER_DOMAIN from homeassistant.core import HomeAssistant, callback @@ -20,14 +20,14 @@ KODI_ADD_MEDIA_SCHEMA: VolDictType = { - vol.Required(ATTR_MEDIA_TYPE): cv.string, - vol.Optional(ATTR_MEDIA_ID): cv.string, - vol.Optional(ATTR_MEDIA_NAME): cv.string, - vol.Optional(ATTR_MEDIA_ARTIST_NAME): cv.string, + probatio.Required(ATTR_MEDIA_TYPE): cv.string, + probatio.Optional(ATTR_MEDIA_ID): cv.string, + probatio.Optional(ATTR_MEDIA_NAME): cv.string, + probatio.Optional(ATTR_MEDIA_ARTIST_NAME): cv.string, } KODI_CALL_METHOD_SCHEMA = cv.make_entity_service_schema( - {vol.Required(ATTR_METHOD): cv.string}, extra=vol.ALLOW_EXTRA + {probatio.Required(ATTR_METHOD): cv.string}, extra=probatio.ALLOW_EXTRA ) diff --git a/homeassistant/components/konnected/__init__.py b/homeassistant/components/konnected/__init__.py index 9333639220412..de49dfc16cf5a 100644 --- a/homeassistant/components/konnected/__init__.py +++ b/homeassistant/components/konnected/__init__.py @@ -1,6 +1,6 @@ """The Konnected.io integration.""" -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigEntry, ConfigEntryState from homeassistant.core import HomeAssistant @@ -9,7 +9,7 @@ from .const import DOMAIN -CONFIG_SCHEMA = vol.Schema({DOMAIN: cv.match_all}, extra=vol.ALLOW_EXTRA) +CONFIG_SCHEMA = probatio.Schema({DOMAIN: cv.match_all}, extra=probatio.ALLOW_EXTRA) async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: diff --git a/homeassistant/components/kostal_plenticore/config_flow.py b/homeassistant/components/kostal_plenticore/config_flow.py index 1ca53b7c0cc85..25ab84114cc18 100644 --- a/homeassistant/components/kostal_plenticore/config_flow.py +++ b/homeassistant/components/kostal_plenticore/config_flow.py @@ -4,8 +4,8 @@ from typing import Any, override from aiohttp.client_exceptions import ClientError +import probatio from pykoplenti import ApiClient, AuthenticationException -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_BASE, CONF_HOST, CONF_PASSWORD @@ -17,11 +17,11 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PASSWORD): str, - vol.Optional(CONF_SERVICE_CODE): str, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Optional(CONF_SERVICE_CODE): str, } ) diff --git a/homeassistant/components/kraken/config_flow.py b/homeassistant/components/kraken/config_flow.py index ccfbb8349319b..034ede7bd345f 100644 --- a/homeassistant/components/kraken/config_flow.py +++ b/homeassistant/components/kraken/config_flow.py @@ -3,8 +3,8 @@ from typing import Any, override import krakenex +import probatio from pykrakenapi.pykrakenapi import KrakenAPI -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, OptionsFlow from homeassistant.const import CONF_SCAN_INTERVAL @@ -78,16 +78,18 @@ async def async_step_init( options = { # Polling interval is user-configurable, which is no longer allowed # pylint: disable-next=home-assistant-config-flow-polling-field - vol.Optional( + probatio.Optional( CONF_SCAN_INTERVAL, default=self.config_entry.options.get( CONF_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL ), ): int, - vol.Optional( + probatio.Optional( CONF_TRACKED_ASSET_PAIRS, default=tracked_asset_pairs, ): cv.multi_select(tradable_asset_pairs_for_multi_select), } - return self.async_show_form(step_id="init", data_schema=vol.Schema(options)) + return self.async_show_form( + step_id="init", data_schema=probatio.Schema(options) + ) diff --git a/homeassistant/components/kulersky/config_flow.py b/homeassistant/components/kulersky/config_flow.py index 60861e0168e98..7f999f2d3dadb 100644 --- a/homeassistant/components/kulersky/config_flow.py +++ b/homeassistant/components/kulersky/config_flow.py @@ -4,8 +4,8 @@ from typing import Any, override from bluetooth_data_tools import human_readable_name +import probatio import pykulersky -import voluptuous as vol from homeassistant.components.bluetooth import ( BluetoothServiceInfoBleak, @@ -123,13 +123,13 @@ async def async_step_user( return self.async_abort(reason="no_devices_found") if self._discovery_info: - data_schema = vol.Schema( - {vol.Required(CONF_ADDRESS): self._discovery_info.address} + data_schema = probatio.Schema( + {probatio.Required(CONF_ADDRESS): self._discovery_info.address} ) else: - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_ADDRESS): vol.In( + probatio.Required(CONF_ADDRESS): probatio.In( { service_info.address: ( f"{service_info.name} ({service_info.address})" diff --git a/homeassistant/components/kwb/sensor.py b/homeassistant/components/kwb/sensor.py index e51c40017f7c0..ef416bbb1c620 100644 --- a/homeassistant/components/kwb/sensor.py +++ b/homeassistant/components/kwb/sensor.py @@ -2,8 +2,8 @@ from typing import override +import probatio from pykwb import kwb -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -32,24 +32,24 @@ SERIAL_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_RAW, default=DEFAULT_RAW): cv.boolean, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Required(CONF_DEVICE): cv.string, - vol.Required(CONF_TYPE): "serial", + probatio.Optional(CONF_RAW, default=DEFAULT_RAW): cv.boolean, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_DEVICE): cv.string, + probatio.Required(CONF_TYPE): "serial", } ) ETHERNET_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_RAW, default=DEFAULT_RAW): cv.boolean, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_PORT): cv.port, - vol.Required(CONF_TYPE): "tcp", + probatio.Optional(CONF_RAW, default=DEFAULT_RAW): cv.boolean, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_PORT): cv.port, + probatio.Required(CONF_TYPE): "tcp", } ) -PLATFORM_SCHEMA = vol.Schema(vol.Any(SERIAL_SCHEMA, ETHERNET_SCHEMA)) +PLATFORM_SCHEMA = probatio.Schema(probatio.Any(SERIAL_SCHEMA, ETHERNET_SCHEMA)) def setup_platform( diff --git a/homeassistant/components/labs/websocket_api.py b/homeassistant/components/labs/websocket_api.py index edf74d2ef2b99..1490c5297542c 100644 --- a/homeassistant/components/labs/websocket_api.py +++ b/homeassistant/components/labs/websocket_api.py @@ -2,7 +2,7 @@ from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.components.backup import async_get_manager @@ -27,7 +27,7 @@ def async_setup(hass: HomeAssistant) -> None: @callback @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required("type"): "labs/list"}) +@websocket_api.websocket_command({probatio.Required("type"): "labs/list"}) def websocket_list_preview_features( hass: HomeAssistant, connection: websocket_api.ActiveConnection, @@ -52,11 +52,11 @@ def websocket_list_preview_features( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "labs/update", - vol.Required("domain"): str, - vol.Required("preview_feature"): str, - vol.Required("enabled"): bool, - vol.Optional("create_backup", default=False): bool, + probatio.Required("type"): "labs/update", + probatio.Required("domain"): str, + probatio.Required("preview_feature"): str, + probatio.Required("enabled"): bool, + probatio.Optional("create_backup", default=False): bool, } ) @websocket_api.async_response @@ -103,9 +103,9 @@ async def websocket_update_preview_feature( @websocket_api.websocket_command( { - vol.Required("type"): "labs/subscribe", - vol.Required("domain"): str, - vol.Required("preview_feature"): str, + probatio.Required("type"): "labs/subscribe", + probatio.Required("domain"): str, + probatio.Required("preview_feature"): str, } ) @websocket_api.async_response diff --git a/homeassistant/components/lacrosse/sensor.py b/homeassistant/components/lacrosse/sensor.py index ec65d509d2428..e76622e00cdfb 100644 --- a/homeassistant/components/lacrosse/sensor.py +++ b/homeassistant/components/lacrosse/sensor.py @@ -4,9 +4,9 @@ import logging from typing import Any, override +import probatio import pylacrosse from serial import SerialException -import voluptuous as vol from homeassistant.components.sensor import ( ENTITY_ID_FORMAT, @@ -49,25 +49,25 @@ TYPES = ["battery", "humidity", "temperature"] -SENSOR_SCHEMA = vol.Schema( +SENSOR_SCHEMA = probatio.Schema( { - vol.Required(CONF_ID): cv.positive_int, - vol.Required(CONF_TYPE): vol.In(TYPES), - vol.Optional(CONF_EXPIRE_AFTER): cv.positive_int, - vol.Optional(CONF_NAME): cv.string, + probatio.Required(CONF_ID): cv.positive_int, + probatio.Required(CONF_TYPE): probatio.In(TYPES), + probatio.Optional(CONF_EXPIRE_AFTER): cv.positive_int, + probatio.Optional(CONF_NAME): cv.string, } ) PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_SENSORS): cv.schema_with_slug_keys(SENSOR_SCHEMA), - vol.Optional(CONF_BAUD, default=DEFAULT_BAUD): cv.positive_int, - vol.Optional(CONF_DATARATE): cv.positive_int, - vol.Optional(CONF_DEVICE, default=DEFAULT_DEVICE): cv.string, - vol.Optional(CONF_FREQUENCY): cv.positive_int, - vol.Optional(CONF_JEELINK_LED): cv.boolean, - vol.Optional(CONF_TOGGLE_INTERVAL): cv.positive_int, - vol.Optional(CONF_TOGGLE_MASK): cv.positive_int, + probatio.Required(CONF_SENSORS): cv.schema_with_slug_keys(SENSOR_SCHEMA), + probatio.Optional(CONF_BAUD, default=DEFAULT_BAUD): cv.positive_int, + probatio.Optional(CONF_DATARATE): cv.positive_int, + probatio.Optional(CONF_DEVICE, default=DEFAULT_DEVICE): cv.string, + probatio.Optional(CONF_FREQUENCY): cv.positive_int, + probatio.Optional(CONF_JEELINK_LED): cv.boolean, + probatio.Optional(CONF_TOGGLE_INTERVAL): cv.positive_int, + probatio.Optional(CONF_TOGGLE_MASK): cv.positive_int, } ) diff --git a/homeassistant/components/lacrosse_view/config_flow.py b/homeassistant/components/lacrosse_view/config_flow.py index 235d4e4343c27..2c2d3529d62ef 100644 --- a/homeassistant/components/lacrosse_view/config_flow.py +++ b/homeassistant/components/lacrosse_view/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from lacrosse_view import LaCrosse, Location, LoginError -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.core import HomeAssistant @@ -14,10 +14,10 @@ from .const import DOMAIN -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required("username"): str, - vol.Required("password"): str, + probatio.Required("username"): str, + probatio.Required("password"): str, } ) _LOGGER = logging.getLogger(__name__) @@ -103,9 +103,9 @@ async def async_step_location( _LOGGER.debug("Showing initial location selection") return self.async_show_form( step_id="location", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required("location"): vol.In( + probatio.Required("location"): probatio.In( {location.id: location.name for location in self.locations} ) } diff --git a/homeassistant/components/lamarzocco/config_flow.py b/homeassistant/components/lamarzocco/config_flow.py index a072b6edeff3e..dca97cd6eb00e 100644 --- a/homeassistant/components/lamarzocco/config_flow.py +++ b/homeassistant/components/lamarzocco/config_flow.py @@ -6,12 +6,12 @@ import uuid from aiohttp import ClientSession +import probatio from pylamarzocco import LaMarzoccoCloudClient from pylamarzocco.const import DeviceType from pylamarzocco.exceptions import AuthFail, RequestNotSuccessful from pylamarzocco.models import Thing from pylamarzocco.util import InstallationKey, generate_installation_key -import voluptuous as vol from homeassistant.components.bluetooth import ( BluetoothServiceInfo, @@ -144,14 +144,14 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_USERNAME): TextSelector( + probatio.Required(CONF_USERNAME): TextSelector( TextSelectorConfig( type=TextSelectorType.EMAIL, autocomplete="username" ) ), - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", @@ -209,9 +209,9 @@ async def async_step_machine_selection( for thing in self._things.values() ] - machine_selection_schema = vol.Schema( + machine_selection_schema = probatio.Schema( { - vol.Required( + probatio.Required( CONF_MACHINE, default=machine_options[0]["value"] ): SelectSelector( SelectSelectorConfig( @@ -251,9 +251,9 @@ async def async_step_bluetooth_selection( return self.async_show_form( step_id="bluetooth_selection", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_MAC): SelectSelector( + probatio.Required(CONF_MAC): SelectSelector( SelectSelectorConfig( options=bt_options, mode=SelectSelectorMode.DROPDOWN, @@ -329,9 +329,9 @@ async def async_step_reauth_confirm( if not user_input: return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ), ) @@ -346,16 +346,16 @@ async def async_step_reconfigure( reconfigure_entry = self._get_reconfigure_entry() return self.async_show_form( step_id="reconfigure", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_USERNAME, default=reconfigure_entry.data[CONF_USERNAME] ): TextSelector( TextSelectorConfig( type=TextSelectorType.EMAIL, autocomplete="username" ), ), - vol.Required( + probatio.Required( CONF_PASSWORD, default=reconfigure_entry.data[CONF_PASSWORD] ): TextSelector( TextSelectorConfig( @@ -395,13 +395,13 @@ async def async_step_init( errors[CONF_USE_BLUETOOTH] = "bluetooth_required_offline" else: return self.async_create_entry(title="", data=user_input) - options_schema = vol.Schema( + options_schema = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_USE_BLUETOOTH, default=self.config_entry.options.get(CONF_USE_BLUETOOTH, True), ): cv.boolean, - vol.Optional( + probatio.Optional( CONF_OFFLINE_MODE, default=self.config_entry.options.get(CONF_OFFLINE_MODE, False), ): cv.boolean, diff --git a/homeassistant/components/lametric/config_flow.py b/homeassistant/components/lametric/config_flow.py index 25a543b785bfc..10eda1c7c2b19 100644 --- a/homeassistant/components/lametric/config_flow.py +++ b/homeassistant/components/lametric/config_flow.py @@ -18,7 +18,7 @@ Simple, Sound, ) -import voluptuous as vol +import probatio from yarl import URL from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlowResult @@ -158,16 +158,16 @@ async def async_step_manual_entry( # Don't ask for a host if it was discovered schema = { - vol.Required(CONF_API_KEY): TextSelector( + probatio.Required(CONF_API_KEY): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ) } if not self.discovered and self.source != SOURCE_REAUTH: - schema = {vol.Required(CONF_HOST): TextSelector()} | schema + schema = {probatio.Required(CONF_HOST): TextSelector()} | schema return self.async_show_form( step_id="manual_entry", - data_schema=vol.Schema(schema), + data_schema=probatio.Schema(schema), description_placeholders={ "devices_url": DEVICES_URL, }, @@ -224,9 +224,9 @@ async def async_step_cloud_select_device( return self.async_show_form( step_id="cloud_select_device", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_DEVICE): SelectSelector( + probatio.Required(CONF_DEVICE): SelectSelector( SelectSelectorConfig( mode=SelectSelectorMode.DROPDOWN, options=[ diff --git a/homeassistant/components/lametric/services.py b/homeassistant/components/lametric/services.py index 8a59dade157d4..3e030554375b0 100644 --- a/homeassistant/components/lametric/services.py +++ b/homeassistant/components/lametric/services.py @@ -13,7 +13,7 @@ Simple, Sound, ) -import voluptuous as vol +import probatio from homeassistant.const import CONF_DEVICE_ID, CONF_ICON from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -35,32 +35,34 @@ from .coordinator import LaMetricDataUpdateCoordinator from .helpers import async_get_coordinator_by_device_id -SERVICE_BASE_SCHEMA = vol.Schema( +SERVICE_BASE_SCHEMA = probatio.Schema( { - vol.Required(CONF_DEVICE_ID): cv.string, - vol.Optional(CONF_CYCLES, default=1): cv.positive_int, - vol.Optional(CONF_ICON_TYPE, default=NotificationIconType.NONE): vol.Coerce( - NotificationIconType - ), - vol.Optional(CONF_PRIORITY, default=NotificationPriority.INFO): vol.Coerce( - NotificationPriority - ), - vol.Optional(CONF_SOUND): vol.Any( - vol.Coerce(AlarmSound), vol.Coerce(NotificationSound) + probatio.Required(CONF_DEVICE_ID): cv.string, + probatio.Optional(CONF_CYCLES, default=1): cv.positive_int, + probatio.Optional( + CONF_ICON_TYPE, default=NotificationIconType.NONE + ): probatio.Coerce(NotificationIconType), + probatio.Optional( + CONF_PRIORITY, default=NotificationPriority.INFO + ): probatio.Coerce(NotificationPriority), + probatio.Optional(CONF_SOUND): probatio.Any( + probatio.Coerce(AlarmSound), probatio.Coerce(NotificationSound) ), } ) SERVICE_MESSAGE_SCHEMA = SERVICE_BASE_SCHEMA.extend( { - vol.Required(CONF_MESSAGE): cv.string, - vol.Optional(CONF_ICON): cv.string, + probatio.Required(CONF_MESSAGE): cv.string, + probatio.Optional(CONF_ICON): cv.string, } ) SERVICE_CHART_SCHEMA = SERVICE_BASE_SCHEMA.extend( { - vol.Required(CONF_DATA): vol.All(cv.ensure_list, [vol.Coerce(int)]), + probatio.Required(CONF_DATA): probatio.All( + cv.ensure_list, [probatio.Coerce(int)] + ), } ) diff --git a/homeassistant/components/landisgyr_heat_meter/config_flow.py b/homeassistant/components/landisgyr_heat_meter/config_flow.py index ee47b637aac73..878799f362c11 100644 --- a/homeassistant/components/landisgyr_heat_meter/config_flow.py +++ b/homeassistant/components/landisgyr_heat_meter/config_flow.py @@ -4,9 +4,9 @@ import logging from typing import Any, override +import probatio import serialx import ultraheat_api -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_DEVICE @@ -18,9 +18,9 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_DEVICE): SerialPortSelector(), + probatio.Required(CONF_DEVICE): SerialPortSelector(), } ) diff --git a/homeassistant/components/lannouncer/notify.py b/homeassistant/components/lannouncer/notify.py index 0c6c85bac609d..a5e73b01ca1e0 100644 --- a/homeassistant/components/lannouncer/notify.py +++ b/homeassistant/components/lannouncer/notify.py @@ -1,6 +1,6 @@ """Lannouncer platform for notify component.""" -import voluptuous as vol +import probatio from homeassistant.components.notify import PLATFORM_SCHEMA as NOTIFY_PLATFORM_SCHEMA from homeassistant.core import HomeAssistant @@ -9,7 +9,7 @@ DOMAIN = "lannouncer" -PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend({}, extra=vol.ALLOW_EXTRA) +PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend({}, extra=probatio.ALLOW_EXTRA) async def async_get_service( diff --git a/homeassistant/components/lastfm/config_flow.py b/homeassistant/components/lastfm/config_flow.py index e8cfd397e2792..5feaf29935547 100644 --- a/homeassistant/components/lastfm/config_flow.py +++ b/homeassistant/components/lastfm/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from pylast import LastFMNetwork, PyLastError, User, WSError -import voluptuous as vol from homeassistant.config_entries import ( ConfigFlow, @@ -27,10 +27,10 @@ "privacy_settings_url": "https://www.last.fm/settings/privacy", } -CONFIG_SCHEMA: vol.Schema = vol.Schema( +CONFIG_SCHEMA: probatio.Schema = probatio.Schema( { - vol.Required(CONF_API_KEY): str, - vol.Required(CONF_MAIN_USER): str, + probatio.Required(CONF_API_KEY): str, + probatio.Required(CONF_MAIN_USER): str, } ) @@ -157,9 +157,9 @@ async def async_step_friends( errors=errors, description_placeholders=PLACEHOLDERS, data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_USERS): SelectSelector( + probatio.Required(CONF_USERS): SelectSelector( SelectSelectorConfig( options=friends, custom_value=True, multiple=True ) @@ -217,9 +217,9 @@ async def async_step_init( errors=errors, description_placeholders=PLACEHOLDERS, data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_USERS): SelectSelector( + probatio.Required(CONF_USERS): SelectSelector( SelectSelectorConfig( options=friends, custom_value=True, multiple=True ) diff --git a/homeassistant/components/laundrify/config_flow.py b/homeassistant/components/laundrify/config_flow.py index 7efe485d58ccf..0bb9ba37167cb 100644 --- a/homeassistant/components/laundrify/config_flow.py +++ b/homeassistant/components/laundrify/config_flow.py @@ -10,7 +10,7 @@ InvalidFormat, UnknownAuthCode, ) -from voluptuous import Required, Schema +from probatio import Required, Schema from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_ACCESS_TOKEN, CONF_CODE diff --git a/homeassistant/components/lcn/config_flow.py b/homeassistant/components/lcn/config_flow.py index 3d9fb886d9edf..1e8d6ffb64fab 100644 --- a/homeassistant/components/lcn/config_flow.py +++ b/homeassistant/components/lcn/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio import pypck -import voluptuous as vol from homeassistant import config_entries from homeassistant.const import ( @@ -26,19 +26,19 @@ _LOGGER = logging.getLogger(__name__) CONFIG_DATA = { - vol.Required(CONF_IP_ADDRESS, default=""): str, - vol.Required(CONF_PORT, default=4114): cv.positive_int, - vol.Required(CONF_USERNAME, default=""): str, - vol.Required(CONF_PASSWORD, default=""): str, - vol.Required(CONF_SK_NUM_TRIES, default=0): cv.positive_int, - vol.Required(CONF_DIM_MODE, default="STEPS200"): vol.In(DIM_MODES), - vol.Required(CONF_ACKNOWLEDGE, default=False): cv.boolean, + probatio.Required(CONF_IP_ADDRESS, default=""): str, + probatio.Required(CONF_PORT, default=4114): cv.positive_int, + probatio.Required(CONF_USERNAME, default=""): str, + probatio.Required(CONF_PASSWORD, default=""): str, + probatio.Required(CONF_SK_NUM_TRIES, default=0): cv.positive_int, + probatio.Required(CONF_DIM_MODE, default="STEPS200"): probatio.In(DIM_MODES), + probatio.Required(CONF_ACKNOWLEDGE, default=False): cv.boolean, } -USER_DATA = {vol.Required(CONF_HOST, default="pchk"): str, **CONFIG_DATA} +USER_DATA = {probatio.Required(CONF_HOST, default="pchk"): str, **CONFIG_DATA} -CONFIG_SCHEMA = vol.Schema(CONFIG_DATA) -USER_SCHEMA = vol.Schema(USER_DATA) +CONFIG_SCHEMA = probatio.Schema(CONFIG_DATA) +USER_SCHEMA = probatio.Schema(USER_DATA) async def validate_connection(data: ConfigType) -> str | None: diff --git a/homeassistant/components/lcn/device_trigger.py b/homeassistant/components/lcn/device_trigger.py index c7536555432e3..dc035e9f45637 100644 --- a/homeassistant/components/lcn/device_trigger.py +++ b/homeassistant/components/lcn/device_trigger.py @@ -2,7 +2,7 @@ from typing import Any -import voluptuous as vol +import probatio from homeassistant.components.device_automation import DEVICE_TRIGGER_BASE_SCHEMA from homeassistant.components.homeassistant.triggers import event @@ -17,35 +17,41 @@ TRIGGER_TYPES = {"transmitter", "transponder", "fingerprint", "codelock", "send_keys"} LCN_DEVICE_TRIGGER_BASE_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( - {vol.Required(CONF_TYPE): vol.In(TRIGGER_TYPES)} + {probatio.Required(CONF_TYPE): probatio.In(TRIGGER_TYPES)} ) -ACCESS_CONTROL_SCHEMA = {vol.Optional("code"): vol.All(vol.Lower, cv.string)} +ACCESS_CONTROL_SCHEMA = { + probatio.Optional("code"): probatio.All(probatio.Lower, cv.string) +} TRANSMITTER_SCHEMA = { **ACCESS_CONTROL_SCHEMA, - vol.Optional("level"): cv.positive_int, - vol.Optional("key"): cv.positive_int, - vol.Optional("action"): vol.In([action.lower() for action in KEY_ACTIONS]), + probatio.Optional("level"): cv.positive_int, + probatio.Optional("key"): cv.positive_int, + probatio.Optional("action"): probatio.In( + [action.lower() for action in KEY_ACTIONS] + ), } SENDKEYS_SCHEMA = { - vol.Optional("key"): vol.In([key.lower() for key in SENDKEYS]), - vol.Optional("action"): vol.In([action.lower() for action in KEY_ACTIONS]), + probatio.Optional("key"): probatio.In([key.lower() for key in SENDKEYS]), + probatio.Optional("action"): probatio.In( + [action.lower() for action in KEY_ACTIONS] + ), } -TRIGGER_SCHEMA = vol.Any( +TRIGGER_SCHEMA = probatio.Any( LCN_DEVICE_TRIGGER_BASE_SCHEMA.extend(ACCESS_CONTROL_SCHEMA), LCN_DEVICE_TRIGGER_BASE_SCHEMA.extend(TRANSMITTER_SCHEMA), LCN_DEVICE_TRIGGER_BASE_SCHEMA.extend(SENDKEYS_SCHEMA), ) TYPE_SCHEMAS = { - "transmitter": {"extra_fields": vol.Schema(TRANSMITTER_SCHEMA)}, - "transponder": {"extra_fields": vol.Schema(ACCESS_CONTROL_SCHEMA)}, - "fingerprint": {"extra_fields": vol.Schema(ACCESS_CONTROL_SCHEMA)}, - "codelock": {"extra_fields": vol.Schema(ACCESS_CONTROL_SCHEMA)}, - "send_keys": {"extra_fields": vol.Schema(SENDKEYS_SCHEMA)}, + "transmitter": {"extra_fields": probatio.Schema(TRANSMITTER_SCHEMA)}, + "transponder": {"extra_fields": probatio.Schema(ACCESS_CONTROL_SCHEMA)}, + "fingerprint": {"extra_fields": probatio.Schema(ACCESS_CONTROL_SCHEMA)}, + "codelock": {"extra_fields": probatio.Schema(ACCESS_CONTROL_SCHEMA)}, + "send_keys": {"extra_fields": probatio.Schema(SENDKEYS_SCHEMA)}, } @@ -103,6 +109,6 @@ async def async_attach_trigger( async def async_get_trigger_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List trigger capabilities.""" return TYPE_SCHEMAS.get(config[CONF_TYPE], {}) diff --git a/homeassistant/components/lcn/schemas.py b/homeassistant/components/lcn/schemas.py index fcc6044dd7759..d1e2f28a7afde 100644 --- a/homeassistant/components/lcn/schemas.py +++ b/homeassistant/components/lcn/schemas.py @@ -1,6 +1,6 @@ """Schema definitions for LCN configuration and websockets api.""" -import voluptuous as vol +import probatio from homeassistant.components.climate import DEFAULT_MAX_TEMP, DEFAULT_MIN_TEMP from homeassistant.const import ( @@ -42,79 +42,92 @@ VARIABLES, ) -ADDRESS_SCHEMA = vol.Coerce(tuple) +ADDRESS_SCHEMA = probatio.Coerce(tuple) # # Domain data # DOMAIN_DATA_BINARY_SENSOR: VolDictType = { - vol.Required(CONF_SOURCE): vol.All( - vol.Upper, vol.In(SETPOINTS + KEYS + BINSENSOR_PORTS) + probatio.Required(CONF_SOURCE): probatio.All( + probatio.Upper, probatio.In(SETPOINTS + KEYS + BINSENSOR_PORTS) ), } DOMAIN_DATA_CLIMATE: VolDictType = { - vol.Required(CONF_SOURCE): vol.All(vol.Upper, vol.In(VARIABLES)), - vol.Required(CONF_SETPOINT): vol.All(vol.Upper, vol.In(VARIABLES + SETPOINTS)), - vol.Optional(CONF_MAX_TEMP, default=DEFAULT_MAX_TEMP): vol.Coerce(float), - vol.Optional(CONF_MIN_TEMP, default=DEFAULT_MIN_TEMP): vol.Coerce(float), - vol.Optional(CONF_LOCKABLE, default=False): vol.Coerce(bool), - vol.Optional(CONF_TARGET_VALUE_LOCKED, default=-1): vol.Coerce(float), - vol.Optional(CONF_UNIT_OF_MEASUREMENT, default=UnitOfTemperature.CELSIUS): vol.In( - UnitOfTemperature.CELSIUS, UnitOfTemperature.FAHRENHEIT + probatio.Required(CONF_SOURCE): probatio.All( + probatio.Upper, probatio.In(VARIABLES) ), + probatio.Required(CONF_SETPOINT): probatio.All( + probatio.Upper, probatio.In(VARIABLES + SETPOINTS) + ), + probatio.Optional(CONF_MAX_TEMP, default=DEFAULT_MAX_TEMP): probatio.Coerce(float), + probatio.Optional(CONF_MIN_TEMP, default=DEFAULT_MIN_TEMP): probatio.Coerce(float), + probatio.Optional(CONF_LOCKABLE, default=False): probatio.Coerce(bool), + probatio.Optional(CONF_TARGET_VALUE_LOCKED, default=-1): probatio.Coerce(float), + probatio.Optional( + CONF_UNIT_OF_MEASUREMENT, default=UnitOfTemperature.CELSIUS + ): probatio.In(UnitOfTemperature.CELSIUS, UnitOfTemperature.FAHRENHEIT), } DOMAIN_DATA_COVER: VolDictType = { - vol.Required(CONF_MOTOR): vol.All(vol.Upper, vol.In(MOTOR_PORTS)), - vol.Optional(CONF_POSITIONING_MODE, default="none"): vol.All( - vol.Upper, vol.In(MOTOR_POSITIONING_MODES) + probatio.Required(CONF_MOTOR): probatio.All( + probatio.Upper, probatio.In(MOTOR_PORTS) + ), + probatio.Optional(CONF_POSITIONING_MODE, default="none"): probatio.All( + probatio.Upper, probatio.In(MOTOR_POSITIONING_MODES) ), - vol.Optional(CONF_REVERSE_TIME, default="rt1200"): vol.All( - vol.Upper, vol.In(MOTOR_REVERSE_TIMES) + probatio.Optional(CONF_REVERSE_TIME, default="rt1200"): probatio.All( + probatio.Upper, probatio.In(MOTOR_REVERSE_TIMES) ), } DOMAIN_DATA_LIGHT: VolDictType = { - vol.Required(CONF_OUTPUT): vol.All(vol.Upper, vol.In(OUTPUT_PORTS + RELAY_PORTS)), - vol.Optional(CONF_DIMMABLE, default=False): vol.Coerce(bool), - vol.Optional(CONF_TRANSITION, default=0): vol.All( - vol.Coerce(float), vol.Range(min=0.0, max=486.0) + probatio.Required(CONF_OUTPUT): probatio.All( + probatio.Upper, probatio.In(OUTPUT_PORTS + RELAY_PORTS) + ), + probatio.Optional(CONF_DIMMABLE, default=False): probatio.Coerce(bool), + probatio.Optional(CONF_TRANSITION, default=0): probatio.All( + probatio.Coerce(float), probatio.Range(min=0.0, max=486.0) ), } DOMAIN_DATA_SCENE: VolDictType = { - vol.Required(CONF_REGISTER): vol.All(vol.Coerce(int), vol.Range(0, 9)), - vol.Required(CONF_SCENE): vol.All(vol.Coerce(int), vol.Range(0, 9)), - vol.Optional(CONF_OUTPUTS, default=[]): vol.All( - cv.ensure_list, [vol.All(vol.Upper, vol.In(OUTPUT_PORTS + RELAY_PORTS))] + probatio.Required(CONF_REGISTER): probatio.All( + probatio.Coerce(int), probatio.Range(0, 9) + ), + probatio.Required(CONF_SCENE): probatio.All( + probatio.Coerce(int), probatio.Range(0, 9) + ), + probatio.Optional(CONF_OUTPUTS, default=[]): probatio.All( + cv.ensure_list, + [probatio.All(probatio.Upper, probatio.In(OUTPUT_PORTS + RELAY_PORTS))], ), - vol.Optional(CONF_TRANSITION, default=0): vol.Any( - vol.All(vol.Coerce(int), vol.Range(min=0.0, max=486.0)) + probatio.Optional(CONF_TRANSITION, default=0): probatio.Any( + probatio.All(probatio.Coerce(int), probatio.Range(min=0.0, max=486.0)) ), } DOMAIN_DATA_SENSOR: VolDictType = { - vol.Required(CONF_SOURCE): vol.All( - vol.Upper, - vol.In( + probatio.Required(CONF_SOURCE): probatio.All( + probatio.Upper, + probatio.In( VARIABLES + SETPOINTS + THRESHOLDS + S0_INPUTS + LED_PORTS + LOGICOP_PORTS ), ), - vol.Optional(CONF_UNIT_OF_MEASUREMENT, default="native"): vol.All( - vol.Upper, vol.In(VAR_UNITS) + probatio.Optional(CONF_UNIT_OF_MEASUREMENT, default="native"): probatio.All( + probatio.Upper, probatio.In(VAR_UNITS) ), } DOMAIN_DATA_SWITCH: VolDictType = { - vol.Required(CONF_OUTPUT): vol.All( - vol.Upper, - vol.In(OUTPUT_PORTS + RELAY_PORTS + SETPOINTS + KEYS), + probatio.Required(CONF_OUTPUT): probatio.All( + probatio.Upper, + probatio.In(OUTPUT_PORTS + RELAY_PORTS + SETPOINTS + KEYS), ), } diff --git a/homeassistant/components/lcn/services.py b/homeassistant/components/lcn/services.py index 4db077c4a654d..4734bac408e36 100644 --- a/homeassistant/components/lcn/services.py +++ b/homeassistant/components/lcn/services.py @@ -3,9 +3,9 @@ from enum import StrEnum, auto from typing import override +import probatio import pypck from pypck.device import DeviceConnection -import voluptuous as vol from homeassistant.const import ( CONF_BRIGHTNESS, @@ -57,9 +57,9 @@ class LcnServiceCall: """Parent class for all LCN service calls.""" - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required(CONF_DEVICE_ID): cv.string, + probatio.Required(CONF_DEVICE_ID): cv.string, } ) supports_response = SupportsResponse.NONE @@ -88,12 +88,14 @@ class OutputAbs(LcnServiceCall): schema = LcnServiceCall.schema.extend( { - vol.Required(CONF_OUTPUT): vol.All(vol.Upper, vol.In(OUTPUT_PORTS)), - vol.Required(CONF_BRIGHTNESS): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) + probatio.Required(CONF_OUTPUT): probatio.All( + probatio.Upper, probatio.In(OUTPUT_PORTS) ), - vol.Optional(CONF_TRANSITION, default=0): vol.All( - vol.Coerce(float), vol.Range(min=0.0, max=486.0) + probatio.Required(CONF_BRIGHTNESS): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) + ), + probatio.Optional(CONF_TRANSITION, default=0): probatio.All( + probatio.Coerce(float), probatio.Range(min=0.0, max=486.0) ), } ) @@ -116,9 +118,11 @@ class OutputRel(LcnServiceCall): schema = LcnServiceCall.schema.extend( { - vol.Required(CONF_OUTPUT): vol.All(vol.Upper, vol.In(OUTPUT_PORTS)), - vol.Required(CONF_BRIGHTNESS): vol.All( - vol.Coerce(int), vol.Range(min=-100, max=100) + probatio.Required(CONF_OUTPUT): probatio.All( + probatio.Upper, probatio.In(OUTPUT_PORTS) + ), + probatio.Required(CONF_BRIGHTNESS): probatio.All( + probatio.Coerce(int), probatio.Range(min=-100, max=100) ), } ) @@ -138,9 +142,11 @@ class OutputToggle(LcnServiceCall): schema = LcnServiceCall.schema.extend( { - vol.Required(CONF_OUTPUT): vol.All(vol.Upper, vol.In(OUTPUT_PORTS)), - vol.Optional(CONF_TRANSITION, default=0): vol.All( - vol.Coerce(float), vol.Range(min=0.0, max=486.0) + probatio.Required(CONF_OUTPUT): probatio.All( + probatio.Upper, probatio.In(OUTPUT_PORTS) + ), + probatio.Optional(CONF_TRANSITION, default=0): probatio.All( + probatio.Coerce(float), probatio.Range(min=0.0, max=486.0) ), } ) @@ -160,7 +166,9 @@ async def async_call_service(self, service: ServiceCall) -> None: class Relays(LcnServiceCall): """Set the relays status.""" - schema = LcnServiceCall.schema.extend({vol.Required(CONF_STATE): is_states_string}) + schema = LcnServiceCall.schema.extend( + {probatio.Required(CONF_STATE): is_states_string} + ) @override async def async_call_service(self, service: ServiceCall) -> None: @@ -179,8 +187,12 @@ class Led(LcnServiceCall): schema = LcnServiceCall.schema.extend( { - vol.Required(CONF_LED): vol.All(vol.Upper, vol.In(LED_PORTS)), - vol.Required(CONF_STATE): vol.All(vol.Upper, vol.In(LED_STATUS)), + probatio.Required(CONF_LED): probatio.All( + probatio.Upper, probatio.In(LED_PORTS) + ), + probatio.Required(CONF_STATE): probatio.All( + probatio.Upper, probatio.In(LED_STATUS) + ), } ) @@ -203,12 +215,12 @@ class VarAbs(LcnServiceCall): schema = LcnServiceCall.schema.extend( { - vol.Required(CONF_VARIABLE): vol.All( - vol.Upper, vol.In(VARIABLES + SETPOINTS) + probatio.Required(CONF_VARIABLE): probatio.All( + probatio.Upper, probatio.In(VARIABLES + SETPOINTS) ), - vol.Optional(CONF_VALUE, default=0): vol.Coerce(float), - vol.Optional(CONF_UNIT_OF_MEASUREMENT, default="native"): vol.All( - vol.Upper, vol.In(VAR_UNITS) + probatio.Optional(CONF_VALUE, default=0): probatio.Coerce(float), + probatio.Optional(CONF_UNIT_OF_MEASUREMENT, default="native"): probatio.All( + probatio.Upper, probatio.In(VAR_UNITS) ), } ) @@ -228,7 +240,11 @@ class VarReset(LcnServiceCall): """Reset value of variable or setpoint.""" schema = LcnServiceCall.schema.extend( - {vol.Required(CONF_VARIABLE): vol.All(vol.Upper, vol.In(VARIABLES + SETPOINTS))} + { + probatio.Required(CONF_VARIABLE): probatio.All( + probatio.Upper, probatio.In(VARIABLES + SETPOINTS) + ) + } ) @override @@ -245,15 +261,15 @@ class VarRel(LcnServiceCall): schema = LcnServiceCall.schema.extend( { - vol.Required(CONF_VARIABLE): vol.All( - vol.Upper, vol.In(VARIABLES + SETPOINTS + THRESHOLDS) + probatio.Required(CONF_VARIABLE): probatio.All( + probatio.Upper, probatio.In(VARIABLES + SETPOINTS + THRESHOLDS) ), - vol.Optional(CONF_VALUE, default=0): vol.Coerce(float), - vol.Optional(CONF_UNIT_OF_MEASUREMENT, default="native"): vol.All( - vol.Upper, vol.In(VAR_UNITS) + probatio.Optional(CONF_VALUE, default=0): probatio.Coerce(float), + probatio.Optional(CONF_UNIT_OF_MEASUREMENT, default="native"): probatio.All( + probatio.Upper, probatio.In(VAR_UNITS) ), - vol.Optional(CONF_RELVARREF, default="current"): vol.All( - vol.Upper, vol.In(RELVARREF) + probatio.Optional(CONF_RELVARREF, default="current"): probatio.All( + probatio.Upper, probatio.In(RELVARREF) ), } ) @@ -275,8 +291,10 @@ class LockRegulator(LcnServiceCall): schema = LcnServiceCall.schema.extend( { - vol.Required(CONF_SETPOINT): vol.All(vol.Upper, vol.In(SETPOINTS)), - vol.Optional(CONF_STATE, default=False): bool, + probatio.Required(CONF_SETPOINT): probatio.All( + probatio.Upper, probatio.In(SETPOINTS) + ), + probatio.Optional(CONF_STATE, default=False): bool, } ) @@ -296,15 +314,15 @@ class SendKeys(LcnServiceCall): schema = LcnServiceCall.schema.extend( { - vol.Required(CONF_KEYS): vol.All( - vol.Upper, cv.matches_regex(r"^([A-D][1-8])+$") + probatio.Required(CONF_KEYS): probatio.All( + probatio.Upper, cv.matches_regex(r"^([A-D][1-8])+$") ), - vol.Optional(CONF_STATE, default="hit"): vol.All( - vol.Upper, vol.In(SENDKEYCOMMANDS) + probatio.Optional(CONF_STATE, default="hit"): probatio.All( + probatio.Upper, probatio.In(SENDKEYCOMMANDS) ), - vol.Optional(CONF_TIME, default=0): cv.positive_int, - vol.Optional(CONF_TIME_UNIT, default="S"): vol.All( - vol.Upper, vol.In(TIME_UNITS) + probatio.Optional(CONF_TIME, default=0): cv.positive_int, + probatio.Optional(CONF_TIME_UNIT, default="S"): probatio.All( + probatio.Upper, probatio.In(TIME_UNITS) ), } ) @@ -344,13 +362,13 @@ class LockKeys(LcnServiceCall): schema = LcnServiceCall.schema.extend( { - vol.Optional(CONF_TABLE, default="a"): vol.All( - vol.Upper, cv.matches_regex(r"^[A-D]$") + probatio.Optional(CONF_TABLE, default="a"): probatio.All( + probatio.Upper, cv.matches_regex(r"^[A-D]$") ), - vol.Required(CONF_STATE): is_states_string, - vol.Optional(CONF_TIME, default=0): cv.positive_int, - vol.Optional(CONF_TIME_UNIT, default="S"): vol.All( - vol.Upper, vol.In(TIME_UNITS) + probatio.Required(CONF_STATE): is_states_string, + probatio.Optional(CONF_TIME, default=0): cv.positive_int, + probatio.Optional(CONF_TIME_UNIT, default="S"): probatio.All( + probatio.Upper, probatio.In(TIME_UNITS) ), } ) @@ -385,8 +403,10 @@ class DynText(LcnServiceCall): schema = LcnServiceCall.schema.extend( { - vol.Required(CONF_ROW): vol.All(int, vol.Range(min=1, max=4)), - vol.Required(CONF_TEXT): vol.All(str, vol.Length(max=60)), + probatio.Required(CONF_ROW): probatio.All( + int, probatio.Range(min=1, max=4) + ), + probatio.Required(CONF_TEXT): probatio.All(str, probatio.Length(max=60)), } ) @@ -403,7 +423,7 @@ async def async_call_service(self, service: ServiceCall) -> None: class Pck(LcnServiceCall): """Send arbitrary PCK command.""" - schema = LcnServiceCall.schema.extend({vol.Required(CONF_PCK): str}) + schema = LcnServiceCall.schema.extend({probatio.Required(CONF_PCK): str}) @override async def async_call_service(self, service: ServiceCall) -> None: diff --git a/homeassistant/components/lcn/websocket.py b/homeassistant/components/lcn/websocket.py index 1d182f07222d9..136d3ba69a7e4 100644 --- a/homeassistant/components/lcn/websocket.py +++ b/homeassistant/components/lcn/websocket.py @@ -5,8 +5,8 @@ from typing import Any, Final import lcn_frontend as lcn_panel +import probatio from pypck.device import DeviceConnection -import voluptuous as vol from homeassistant.components import panel_custom, websocket_api from homeassistant.components.frontend import async_panel_exists @@ -118,7 +118,7 @@ async def get_entry( @websocket_api.require_admin @websocket_api.websocket_command( - {vol.Required("type"): "lcn/devices", vol.Required("entry_id"): cv.string} + {probatio.Required("type"): "lcn/devices", probatio.Required("entry_id"): cv.string} ) @websocket_api.async_response @get_config_entry @@ -135,9 +135,9 @@ async def websocket_get_device_configs( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "lcn/entities", - vol.Required("entry_id"): cv.string, - vol.Optional(CONF_ADDRESS): ADDRESS_SCHEMA, + probatio.Required("type"): "lcn/entities", + probatio.Required("entry_id"): cv.string, + probatio.Optional(CONF_ADDRESS): ADDRESS_SCHEMA, } ) @websocket_api.async_response @@ -169,7 +169,10 @@ async def websocket_get_entity_configs( @websocket_api.require_admin @websocket_api.websocket_command( - {vol.Required("type"): "lcn/devices/scan", vol.Required("entry_id"): cv.string} + { + probatio.Required("type"): "lcn/devices/scan", + probatio.Required("entry_id"): cv.string, + } ) @websocket_api.async_response @get_config_entry @@ -198,9 +201,9 @@ async def websocket_scan_devices( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "lcn/devices/add", - vol.Required("entry_id"): cv.string, - vol.Required(CONF_ADDRESS): ADDRESS_SCHEMA, + probatio.Required("type"): "lcn/devices/add", + probatio.Required("entry_id"): cv.string, + probatio.Required(CONF_ADDRESS): ADDRESS_SCHEMA, } ) @websocket_api.async_response @@ -244,9 +247,9 @@ async def websocket_add_device( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "lcn/devices/delete", - vol.Required("entry_id"): cv.string, - vol.Required(CONF_ADDRESS): ADDRESS_SCHEMA, + probatio.Required("type"): "lcn/devices/delete", + probatio.Required("entry_id"): cv.string, + probatio.Required(CONF_ADDRESS): ADDRESS_SCHEMA, } ) @websocket_api.async_response @@ -295,12 +298,12 @@ async def websocket_delete_device( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "lcn/entities/add", - vol.Required("entry_id"): cv.string, - vol.Required(CONF_ADDRESS): ADDRESS_SCHEMA, - vol.Required(CONF_NAME): cv.string, - vol.Required(CONF_DOMAIN): cv.string, - vol.Required(CONF_DOMAIN_DATA): vol.Any( + probatio.Required("type"): "lcn/entities/add", + probatio.Required("entry_id"): cv.string, + probatio.Required(CONF_ADDRESS): ADDRESS_SCHEMA, + probatio.Required(CONF_NAME): cv.string, + probatio.Required(CONF_DOMAIN): cv.string, + probatio.Required(CONF_DOMAIN_DATA): probatio.Any( DOMAIN_DATA_BINARY_SENSOR, DOMAIN_DATA_SENSOR, DOMAIN_DATA_SWITCH, @@ -362,11 +365,11 @@ async def websocket_add_entity( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "lcn/entities/delete", - vol.Required("entry_id"): cv.string, - vol.Required(CONF_ADDRESS): ADDRESS_SCHEMA, - vol.Required(CONF_DOMAIN): cv.string, - vol.Required(CONF_DOMAIN_DATA): vol.Any( + probatio.Required("type"): "lcn/entities/delete", + probatio.Required("entry_id"): cv.string, + probatio.Required(CONF_ADDRESS): ADDRESS_SCHEMA, + probatio.Required(CONF_DOMAIN): cv.string, + probatio.Required(CONF_DOMAIN_DATA): probatio.Any( DOMAIN_DATA_BINARY_SENSOR, DOMAIN_DATA_SENSOR, DOMAIN_DATA_SWITCH, diff --git a/homeassistant/components/ld2410_ble/config_flow.py b/homeassistant/components/ld2410_ble/config_flow.py index ebdd7a32206b6..0e5cfa35c23f6 100644 --- a/homeassistant/components/ld2410_ble/config_flow.py +++ b/homeassistant/components/ld2410_ble/config_flow.py @@ -5,7 +5,7 @@ from bluetooth_data_tools import human_readable_name from ld2410_ble import BLEAK_EXCEPTIONS, LD2410BLE -import voluptuous as vol +import probatio from homeassistant.components import bluetooth from homeassistant.components.bluetooth import ( @@ -97,9 +97,9 @@ async def async_step_user( if not self._discovered_devices: return self.async_abort(reason="no_devices_found") - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_ADDRESS): vol.In( + probatio.Required(CONF_ADDRESS): probatio.In( { service_info.address: ( f"{service_info.name} ({service_info.address})" diff --git a/homeassistant/components/leaone/config_flow.py b/homeassistant/components/leaone/config_flow.py index 441a04dfee854..b0fad10d4d2c3 100644 --- a/homeassistant/components/leaone/config_flow.py +++ b/homeassistant/components/leaone/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from leaone_ble import LeaoneBluetoothDeviceData as DeviceData -import voluptuous as vol +import probatio from homeassistant.components.bluetooth import async_discovered_service_info from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -50,7 +50,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_ADDRESS): vol.In(self._discovered_devices)} + data_schema=probatio.Schema( + {probatio.Required(CONF_ADDRESS): probatio.In(self._discovered_devices)} ), ) diff --git a/homeassistant/components/led_ble/config_flow.py b/homeassistant/components/led_ble/config_flow.py index a19d5dee89aee..66842da7d9957 100644 --- a/homeassistant/components/led_ble/config_flow.py +++ b/homeassistant/components/led_ble/config_flow.py @@ -5,7 +5,7 @@ from bluetooth_data_tools import human_readable_name from led_ble import BLEAK_EXCEPTIONS, LEDBLE, CharacteristicMissingError -import voluptuous as vol +import probatio from homeassistant.components.bluetooth import ( BluetoothServiceInfoBleak, @@ -102,9 +102,9 @@ async def async_step_user( if not self._discovered_devices: return self.async_abort(reason="no_devices_found") - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_ADDRESS): vol.In( + probatio.Required(CONF_ADDRESS): probatio.In( { service_info.address: ( f"{service_info.name} ({service_info.address})" diff --git a/homeassistant/components/led_infrared/config_flow.py b/homeassistant/components/led_infrared/config_flow.py index fcedbdd106c6e..49c3c327626a8 100644 --- a/homeassistant/components/led_infrared/config_flow.py +++ b/homeassistant/components/led_infrared/config_flow.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING, Any, override -import voluptuous as vol +import probatio from homeassistant.components.infrared import ( DOMAIN as INFRARED_DOMAIN, @@ -87,9 +87,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_DEVICE_TYPE): SelectSelector( + probatio.Required(CONF_DEVICE_TYPE): SelectSelector( SelectSelectorConfig( options=[ device_type.value for device_type in LEDIrDeviceType @@ -98,13 +98,13 @@ async def async_step_user( mode=SelectSelectorMode.DROPDOWN, ) ), - vol.Optional(CONF_INFRARED_ENTITY_ID): EntitySelector( + probatio.Optional(CONF_INFRARED_ENTITY_ID): EntitySelector( EntitySelectorConfig( domain=INFRARED_DOMAIN, include_entities=emitter_entity_ids, ) ), - vol.Optional(CONF_INFRARED_RECEIVER_ENTITY_ID): EntitySelector( + probatio.Optional(CONF_INFRARED_RECEIVER_ENTITY_ID): EntitySelector( EntitySelectorConfig( domain=INFRARED_DOMAIN, include_entities=receiver_entity_ids, @@ -159,15 +159,17 @@ async def async_step_reconfigure( return self.async_show_form( step_id="reconfigure", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Optional(CONF_INFRARED_ENTITY_ID): EntitySelector( + probatio.Optional(CONF_INFRARED_ENTITY_ID): EntitySelector( EntitySelectorConfig( domain=INFRARED_DOMAIN, include_entities=emitter_entity_ids, ) ), - vol.Optional(CONF_INFRARED_RECEIVER_ENTITY_ID): EntitySelector( + probatio.Optional( + CONF_INFRARED_RECEIVER_ENTITY_ID + ): EntitySelector( EntitySelectorConfig( domain=INFRARED_DOMAIN, include_entities=receiver_entity_ids, diff --git a/homeassistant/components/lektrico/config_flow.py b/homeassistant/components/lektrico/config_flow.py index 58a2bb2d6db55..001f186ee725c 100644 --- a/homeassistant/components/lektrico/config_flow.py +++ b/homeassistant/components/lektrico/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from lektricowifi import Device, DeviceConnectionError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -18,9 +18,9 @@ from .const import DOMAIN -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, + probatio.Required(CONF_HOST): str, } ) diff --git a/homeassistant/components/letpot/config_flow.py b/homeassistant/components/letpot/config_flow.py index 26285913a9388..a43b9c6d02fd5 100644 --- a/homeassistant/components/letpot/config_flow.py +++ b/homeassistant/components/letpot/config_flow.py @@ -6,7 +6,7 @@ from letpot.client import LetPotClient from letpot.exceptions import LetPotAuthenticationException, LetPotConnectionException -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_ACCESS_TOKEN, CONF_EMAIL, CONF_PASSWORD @@ -27,23 +27,23 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_EMAIL): TextSelector( + probatio.Required(CONF_EMAIL): TextSelector( TextSelectorConfig( type=TextSelectorType.EMAIL, ), ), - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, ), ), } ) -STEP_REAUTH_SCHEMA = vol.Schema( +STEP_REAUTH_SCHEMA = probatio.Schema( { - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD), ), } diff --git a/homeassistant/components/lg_infrared/config_flow.py b/homeassistant/components/lg_infrared/config_flow.py index 9ae95fe60954f..5a39e065001eb 100644 --- a/homeassistant/components/lg_infrared/config_flow.py +++ b/homeassistant/components/lg_infrared/config_flow.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING, Any, override -import voluptuous as vol +import probatio from homeassistant.components.climate import HVACMode from homeassistant.components.infrared import ( @@ -47,10 +47,10 @@ @callback def _infrared_entity_schema( hass: HomeAssistant, *, emitter_required: bool -) -> vol.Schema: +) -> probatio.Schema: """Return the emitter/receiver selection schema shared by every device type.""" - emitter_marker = vol.Required if emitter_required else vol.Optional - return vol.Schema( + emitter_marker = probatio.Required if emitter_required else probatio.Optional + return probatio.Schema( { emitter_marker(CONF_INFRARED_ENTITY_ID): EntitySelector( EntitySelectorConfig( @@ -58,7 +58,7 @@ def _infrared_entity_schema( include_entities=async_get_emitters(hass), ) ), - vol.Optional(CONF_INFRARED_RECEIVER_ENTITY_ID): EntitySelector( + probatio.Optional(CONF_INFRARED_RECEIVER_ENTITY_ID): EntitySelector( EntitySelectorConfig( domain=INFRARED_DOMAIN, include_entities=async_get_receivers(hass), @@ -155,7 +155,9 @@ async def async_step_ac( self.hass, emitter_required=True ).extend( { - vol.Required(CONF_HVAC_MODES, default=_DEFAULT_HVAC_MODES): vol.All( + probatio.Required( + CONF_HVAC_MODES, default=_DEFAULT_HVAC_MODES + ): probatio.All( SelectSelector( SelectSelectorConfig( options=[mode.value for mode in _HVAC_MODE_OPTIONS], @@ -164,7 +166,7 @@ async def async_step_ac( multiple=True, ) ), - vol.Length(min=1, msg="no_hvac_modes"), + probatio.Length(min=1, msg="no_hvac_modes"), ) } ), diff --git a/homeassistant/components/lg_netcast/config_flow.py b/homeassistant/components/lg_netcast/config_flow.py index da7488b5615cf..5dd4a20268641 100644 --- a/homeassistant/components/lg_netcast/config_flow.py +++ b/homeassistant/components/lg_netcast/config_flow.py @@ -4,8 +4,8 @@ from datetime import datetime, timedelta from typing import TYPE_CHECKING, Any, override +import probatio from pylgnetcast import AccessTokenError, LgNetCastClient, SessionIdError -import voluptuous as vol from homeassistant import config_entries from homeassistant.config_entries import ConfigFlowResult @@ -62,7 +62,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_HOST): str}), + data_schema=probatio.Schema({probatio.Required(CONF_HOST): str}), errors=errors, ) @@ -129,9 +129,11 @@ async def async_step_authorize( return self.async_show_form( step_id="authorize", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional(CONF_ACCESS_TOKEN): vol.All(str, vol.Length(max=6)), + probatio.Optional(CONF_ACCESS_TOKEN): probatio.All( + str, probatio.Length(max=6) + ), } ), errors=errors, diff --git a/homeassistant/components/lg_netcast/device_trigger.py b/homeassistant/components/lg_netcast/device_trigger.py index a24568caedc7a..15896bd14eeea 100644 --- a/homeassistant/components/lg_netcast/device_trigger.py +++ b/homeassistant/components/lg_netcast/device_trigger.py @@ -2,7 +2,7 @@ from typing import Any -import voluptuous as vol +import probatio from homeassistant.components.device_automation import ( DEVICE_TRIGGER_BASE_SCHEMA, @@ -27,7 +27,7 @@ TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): vol.In(TRIGGER_TYPES), + probatio.Required(CONF_TYPE): probatio.In(TRIGGER_TYPES), } ) diff --git a/homeassistant/components/lg_netcast/triggers/turn_on.py b/homeassistant/components/lg_netcast/triggers/turn_on.py index 118ed89797e58..c203152faa13b 100644 --- a/homeassistant/components/lg_netcast/triggers/turn_on.py +++ b/homeassistant/components/lg_netcast/triggers/turn_on.py @@ -1,6 +1,6 @@ """LG Netcast TV device turn on trigger.""" -import voluptuous as vol +import probatio from homeassistant.const import ( ATTR_DEVICE_ID, @@ -24,12 +24,14 @@ PLATFORM_TYPE = f"{DOMAIN}.{__name__.rsplit('.', maxsplit=1)[-1]}" -TRIGGER_SCHEMA = vol.All( +TRIGGER_SCHEMA = probatio.All( cv.TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_PLATFORM): PLATFORM_TYPE, - vol.Optional(ATTR_DEVICE_ID): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(ATTR_ENTITY_ID): cv.entity_ids, + probatio.Required(CONF_PLATFORM): PLATFORM_TYPE, + probatio.Optional(ATTR_DEVICE_ID): probatio.All( + cv.ensure_list, [cv.string] + ), + probatio.Optional(ATTR_ENTITY_ID): cv.entity_ids, }, ), cv.has_at_least_one_key(ATTR_ENTITY_ID, ATTR_DEVICE_ID), diff --git a/homeassistant/components/lg_soundbar/config_flow.py b/homeassistant/components/lg_soundbar/config_flow.py index 1cf9aee230042..d4b0a4b1bec24 100644 --- a/homeassistant/components/lg_soundbar/config_flow.py +++ b/homeassistant/components/lg_soundbar/config_flow.py @@ -4,8 +4,8 @@ from queue import Empty, Full, Queue from typing import override +import probatio import temescal -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PORT @@ -13,7 +13,7 @@ from .const import DEFAULT_PORT, DOMAIN DATA_SCHEMA = { - vol.Required(CONF_HOST): str, + probatio.Required(CONF_HOST): str, } _LOGGER = logging.getLogger(__name__) @@ -107,6 +107,6 @@ def _show_form(self, errors=None): """Show the form to the user.""" return self.async_show_form( step_id="user", - data_schema=vol.Schema(DATA_SCHEMA), + data_schema=probatio.Schema(DATA_SCHEMA), errors=errors or {}, ) diff --git a/homeassistant/components/lg_thinq/config_flow.py b/homeassistant/components/lg_thinq/config_flow.py index e410afa1e1c77..2f2cd89802487 100644 --- a/homeassistant/components/lg_thinq/config_flow.py +++ b/homeassistant/components/lg_thinq/config_flow.py @@ -4,9 +4,9 @@ from typing import Any, override import uuid +import probatio from thinqconnect import ThinQApi, ThinQAPIErrorCodes, ThinQAPIException from thinqconnect.country import Country -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_ACCESS_TOKEN, CONF_COUNTRY @@ -95,10 +95,10 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_ACCESS_TOKEN): cv.string, - vol.Required( + probatio.Required(CONF_ACCESS_TOKEN): cv.string, + probatio.Required( CONF_COUNTRY, default=self._get_default_country_code() ): CountrySelector( CountrySelectorConfig(countries=SUPPORTED_COUNTRIES) diff --git a/homeassistant/components/lg_thinq/repairs.py b/homeassistant/components/lg_thinq/repairs.py index c41c2dc051eb8..a9987cd7979f0 100644 --- a/homeassistant/components/lg_thinq/repairs.py +++ b/homeassistant/components/lg_thinq/repairs.py @@ -1,6 +1,6 @@ """Repairs for LG ThinQ integration.""" -import voluptuous as vol +import probatio from homeassistant.components.repairs import ( ConfirmRepairFlow, @@ -40,7 +40,7 @@ async def async_step_confirm( return self.async_show_form( step_id="confirm", - data_schema=vol.Schema({}), + data_schema=probatio.Schema({}), description_placeholders=self._placeholders, ) diff --git a/homeassistant/components/lg_tv_rs232/config_flow.py b/homeassistant/components/lg_tv_rs232/config_flow.py index b5280074be712..5bf35f7ada713 100644 --- a/homeassistant/components/lg_tv_rs232/config_flow.py +++ b/homeassistant/components/lg_tv_rs232/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from lg_rs232_tv import DEFAULT_SET_ID, LGTV, TVNotRespondingError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_DEVICE @@ -16,10 +16,10 @@ from .const import CONF_SET_ID, DOMAIN, LOGGER -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_DEVICE): SerialPortSelector(), - vol.Required(CONF_SET_ID, default=DEFAULT_SET_ID): NumberSelector( + probatio.Required(CONF_DEVICE): SerialPortSelector(), + probatio.Required(CONF_SET_ID, default=DEFAULT_SET_ID): NumberSelector( NumberSelectorConfig(min=1, max=99, mode=NumberSelectorMode.BOX) ), } diff --git a/homeassistant/components/libre_hardware_monitor/config_flow.py b/homeassistant/components/libre_hardware_monitor/config_flow.py index e59762d1b1e60..b480dcce18071 100644 --- a/homeassistant/components/libre_hardware_monitor/config_flow.py +++ b/homeassistant/components/libre_hardware_monitor/config_flow.py @@ -11,7 +11,7 @@ LibreHardwareMonitorUnauthorizedError, ) from librehardwaremonitor_api.model import LibreHardwareMonitorData -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -25,17 +25,17 @@ _LOGGER = logging.getLogger(__name__) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST, default=DEFAULT_HOST): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Required(CONF_HOST, default=DEFAULT_HOST): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, } ) -REAUTH_SCHEMA = vol.Schema( +REAUTH_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/librenms/config_flow.py b/homeassistant/components/librenms/config_flow.py index 2cc54a32bfe23..3b8e9a94116d3 100644 --- a/homeassistant/components/librenms/config_flow.py +++ b/homeassistant/components/librenms/config_flow.py @@ -7,7 +7,7 @@ from aiolibrenms import Librenms from aiolibrenms.const import CONNECT_ERRORS from aiolibrenms.exceptions import LibrenmsUnauthenticatedError -import voluptuous as vol +import probatio from yarl import URL from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -37,15 +37,15 @@ class InvalidUrl(HomeAssistantError): _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_URL): TextSelector( + probatio.Required(CONF_URL): TextSelector( config=TextSelectorConfig(type=TextSelectorType.URL) ), - vol.Required(CONF_API_KEY): TextSelector( + probatio.Required(CONF_API_KEY): TextSelector( config=TextSelectorConfig(type=TextSelectorType.PASSWORD) ), - vol.Required(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): bool, + probatio.Required(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): bool, } ) @@ -164,9 +164,9 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_API_KEY): TextSelector( + probatio.Required(CONF_API_KEY): TextSelector( config=TextSelectorConfig(type=TextSelectorType.PASSWORD) ) } @@ -232,12 +232,12 @@ async def async_step_reconfigure( return self.async_show_form( step_id="reconfigure", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_URL, default=url): TextSelector( + probatio.Required(CONF_URL, default=url): TextSelector( config=TextSelectorConfig(type=TextSelectorType.URL) ), - vol.Required(CONF_VERIFY_SSL, default=verify_ssl): bool, + probatio.Required(CONF_VERIFY_SSL, default=verify_ssl): bool, } ), errors=errors, diff --git a/homeassistant/components/lichess/config_flow.py b/homeassistant/components/lichess/config_flow.py index 3334081886615..bd544c17b04ae 100644 --- a/homeassistant/components/lichess/config_flow.py +++ b/homeassistant/components/lichess/config_flow.py @@ -5,7 +5,7 @@ from aiolichess import AioLichess from aiolichess.exceptions import AioLichessError, AuthError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_TOKEN @@ -46,7 +46,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_API_TOKEN): str}), + data_schema=probatio.Schema({probatio.Required(CONF_API_TOKEN): str}), description_placeholders={"token_url": TOKEN_URL}, errors=errors, ) diff --git a/homeassistant/components/lidarr/config_flow.py b/homeassistant/components/lidarr/config_flow.py index 85fea780dd32a..f0243c0ddead8 100644 --- a/homeassistant/components/lidarr/config_flow.py +++ b/homeassistant/components/lidarr/config_flow.py @@ -6,7 +6,7 @@ from aiohttp import ClientConnectorError from aiopyarr import exceptions from aiopyarr.lidarr_client import LidarrClient -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY, CONF_URL, CONF_VERIFY_SSL @@ -73,11 +73,13 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_URL, default=user_input.get(CONF_URL, "")): str, - vol.Optional(CONF_API_KEY): str, - vol.Optional( + probatio.Required( + CONF_URL, default=user_input.get(CONF_URL, "") + ): str, + probatio.Optional(CONF_API_KEY): str, + probatio.Optional( CONF_VERIFY_SSL, default=user_input.get(CONF_VERIFY_SSL, False), ): bool, diff --git a/homeassistant/components/liebherr/config_flow.py b/homeassistant/components/liebherr/config_flow.py index 069fd537027d4..130855e5a3f05 100644 --- a/homeassistant/components/liebherr/config_flow.py +++ b/homeassistant/components/liebherr/config_flow.py @@ -4,12 +4,12 @@ import logging from typing import Any, override +import probatio from pyliebherrhomeapi import Device, LiebherrClient from pyliebherrhomeapi.exceptions import ( LiebherrAuthenticationError, LiebherrConnectionError, ) -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY @@ -19,9 +19,9 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_KEY): str, + probatio.Required(CONF_API_KEY): str, } ) diff --git a/homeassistant/components/lifx/__init__.py b/homeassistant/components/lifx/__init__.py index 050d8079204c7..983f8142e2688 100644 --- a/homeassistant/components/lifx/__init__.py +++ b/homeassistant/components/lifx/__init__.py @@ -8,7 +8,7 @@ from aiolifx.aiolifx import Light from aiolifx.connection import LIFXConnection -import voluptuous as vol +import probatio from homeassistant.components.light import DOMAIN as LIGHT_DOMAIN from homeassistant.const import ( @@ -34,23 +34,25 @@ CONF_BROADCAST = "broadcast" -INTERFACE_SCHEMA = vol.Schema( +INTERFACE_SCHEMA = probatio.Schema( { - vol.Optional(CONF_SERVER): cv.string, - vol.Optional(CONF_PORT): cv.port, - vol.Optional(CONF_BROADCAST): cv.string, + probatio.Optional(CONF_SERVER): cv.string, + probatio.Optional(CONF_PORT): cv.port, + probatio.Optional(CONF_BROADCAST): cv.string, } ) -CONFIG_SCHEMA = vol.All( +CONFIG_SCHEMA = probatio.All( cv.deprecated(DOMAIN), - vol.Schema( + probatio.Schema( { DOMAIN: { - LIGHT_DOMAIN: vol.Schema(vol.All(cv.ensure_list, [INTERFACE_SCHEMA])) + LIGHT_DOMAIN: probatio.Schema( + probatio.All(cv.ensure_list, [INTERFACE_SCHEMA]) + ) } }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ), ) diff --git a/homeassistant/components/lifx/config_flow.py b/homeassistant/components/lifx/config_flow.py index 8c04593b5f721..cc28041a57c95 100644 --- a/homeassistant/components/lifx/config_flow.py +++ b/homeassistant/components/lifx/config_flow.py @@ -5,7 +5,7 @@ from aiolifx.aiolifx import Light from aiolifx.connection import LIFXConnection -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_DEVICE, CONF_HOST @@ -170,7 +170,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Optional(CONF_HOST, default=""): str}), + data_schema=probatio.Schema( + {probatio.Optional(CONF_HOST, default=""): str} + ), errors=errors, ) @@ -211,7 +213,9 @@ async def async_step_pick_device( return self.async_abort(reason="no_devices_found") return self.async_show_form( step_id="pick_device", - data_schema=vol.Schema({vol.Required(CONF_DEVICE): vol.In(devices_name)}), + data_schema=probatio.Schema( + {probatio.Required(CONF_DEVICE): probatio.In(devices_name)} + ), ) @callback diff --git a/homeassistant/components/lifx/light.py b/homeassistant/components/lifx/light.py index e9eb5c6ea02b1..23251e58a4710 100644 --- a/homeassistant/components/lifx/light.py +++ b/homeassistant/components/lifx/light.py @@ -5,7 +5,7 @@ from typing import Any, override import aiolifx_effects as aiolifx_effects_module -import voluptuous as vol +import probatio from homeassistant.components.light import ( ATTR_BRIGHTNESS, @@ -57,8 +57,8 @@ LIFX_SET_STATE_SCHEMA: VolDictType = { **LIGHT_TURN_ON_SCHEMA, - ATTR_INFRARED: vol.All(vol.Coerce(int), vol.Clamp(min=0, max=255)), - ATTR_ZONES: vol.All(cv.ensure_list, [cv.positive_int]), + ATTR_INFRARED: probatio.All(probatio.Coerce(int), probatio.Clamp(min=0, max=255)), + ATTR_ZONES: probatio.All(cv.ensure_list, [cv.positive_int]), ATTR_POWER: cv.boolean, } @@ -66,8 +66,10 @@ SERVICE_LIFX_SET_HEV_CYCLE_STATE = "set_hev_cycle_state" LIFX_SET_HEV_CYCLE_STATE_SCHEMA: VolDictType = { - vol.Required(ATTR_POWER): cv.boolean, - ATTR_DURATION: vol.All(vol.Coerce(float), vol.Clamp(min=0, max=86400)), + probatio.Required(ATTR_POWER): cv.boolean, + ATTR_DURATION: probatio.All( + probatio.Coerce(float), probatio.Clamp(min=0, max=86400) + ), } HSBK_HUE = 0 diff --git a/homeassistant/components/lifx/manager.py b/homeassistant/components/lifx/manager.py index f920c8bfe0a0d..c621fefe2e795 100644 --- a/homeassistant/components/lifx/manager.py +++ b/homeassistant/components/lifx/manager.py @@ -8,7 +8,7 @@ import aiolifx_effects from aiolifx_themes.painter import ThemePainter from aiolifx_themes.themes import Theme, ThemeLibrary -import voluptuous as vol +import probatio from homeassistant.components.light import ( ATTR_BRIGHTNESS, @@ -106,49 +106,62 @@ ] LIFX_EFFECT_SCHEMA = { - vol.Optional(ATTR_POWER_ON, default=True): cv.boolean, + probatio.Optional(ATTR_POWER_ON, default=True): cv.boolean, } LIFX_EFFECT_PULSE_SCHEMA = cv.make_entity_service_schema( { **LIFX_EFFECT_SCHEMA, - vol.Exclusive(ATTR_BRIGHTNESS, ATTR_BRIGHTNESS): VALID_BRIGHTNESS, - vol.Exclusive(ATTR_BRIGHTNESS_PCT, ATTR_BRIGHTNESS): VALID_BRIGHTNESS_PCT, - vol.Exclusive(ATTR_COLOR_NAME, COLOR_GROUP): cv.string, - vol.Exclusive(ATTR_RGB_COLOR, COLOR_GROUP): vol.All( - vol.Coerce(tuple), vol.ExactSequence((cv.byte, cv.byte, cv.byte)) + probatio.Exclusive(ATTR_BRIGHTNESS, ATTR_BRIGHTNESS): VALID_BRIGHTNESS, + probatio.Exclusive(ATTR_BRIGHTNESS_PCT, ATTR_BRIGHTNESS): VALID_BRIGHTNESS_PCT, + probatio.Exclusive(ATTR_COLOR_NAME, COLOR_GROUP): cv.string, + probatio.Exclusive(ATTR_RGB_COLOR, COLOR_GROUP): probatio.All( + probatio.Coerce(tuple), probatio.ExactSequence((cv.byte, cv.byte, cv.byte)) ), - vol.Exclusive(ATTR_XY_COLOR, COLOR_GROUP): vol.All( - vol.Coerce(tuple), vol.ExactSequence((cv.small_float, cv.small_float)) + probatio.Exclusive(ATTR_XY_COLOR, COLOR_GROUP): probatio.All( + probatio.Coerce(tuple), + probatio.ExactSequence((cv.small_float, cv.small_float)), ), - vol.Exclusive(ATTR_HS_COLOR, COLOR_GROUP): vol.All( - vol.Coerce(tuple), - vol.ExactSequence( + probatio.Exclusive(ATTR_HS_COLOR, COLOR_GROUP): probatio.All( + probatio.Coerce(tuple), + probatio.ExactSequence( ( - vol.All(vol.Coerce(float), vol.Range(min=0, max=360)), - vol.All(vol.Coerce(float), vol.Range(min=0, max=100)), + probatio.All( + probatio.Coerce(float), probatio.Range(min=0, max=360) + ), + probatio.All( + probatio.Coerce(float), probatio.Range(min=0, max=100) + ), ) ), ), - vol.Exclusive(ATTR_COLOR_TEMP_KELVIN, COLOR_GROUP): vol.All( - vol.Coerce(int), vol.Range(min=1500, max=9000) + probatio.Exclusive(ATTR_COLOR_TEMP_KELVIN, COLOR_GROUP): probatio.All( + probatio.Coerce(int), probatio.Range(min=1500, max=9000) ), - ATTR_PERIOD: vol.All(vol.Coerce(float), vol.Range(min=0.05)), - ATTR_CYCLES: vol.All(vol.Coerce(float), vol.Range(min=1)), - ATTR_MODE: vol.In(PULSE_MODES), + ATTR_PERIOD: probatio.All(probatio.Coerce(float), probatio.Range(min=0.05)), + ATTR_CYCLES: probatio.All(probatio.Coerce(float), probatio.Range(min=1)), + ATTR_MODE: probatio.In(PULSE_MODES), } ) LIFX_EFFECT_COLORLOOP_SCHEMA = cv.make_entity_service_schema( { **LIFX_EFFECT_SCHEMA, - vol.Exclusive(ATTR_BRIGHTNESS, ATTR_BRIGHTNESS): VALID_BRIGHTNESS, - vol.Exclusive(ATTR_BRIGHTNESS_PCT, ATTR_BRIGHTNESS): VALID_BRIGHTNESS_PCT, - ATTR_SATURATION_MAX: vol.All(vol.Coerce(int), vol.Clamp(min=0, max=100)), - ATTR_SATURATION_MIN: vol.All(vol.Coerce(int), vol.Clamp(min=0, max=100)), - ATTR_PERIOD: vol.All(vol.Coerce(float), vol.Clamp(min=0.05)), - ATTR_CHANGE: vol.All(vol.Coerce(float), vol.Clamp(min=0, max=360)), - ATTR_SPREAD: vol.All(vol.Coerce(float), vol.Clamp(min=0, max=360)), + probatio.Exclusive(ATTR_BRIGHTNESS, ATTR_BRIGHTNESS): VALID_BRIGHTNESS, + probatio.Exclusive(ATTR_BRIGHTNESS_PCT, ATTR_BRIGHTNESS): VALID_BRIGHTNESS_PCT, + ATTR_SATURATION_MAX: probatio.All( + probatio.Coerce(int), probatio.Clamp(min=0, max=100) + ), + ATTR_SATURATION_MIN: probatio.All( + probatio.Coerce(int), probatio.Clamp(min=0, max=100) + ), + ATTR_PERIOD: probatio.All(probatio.Coerce(float), probatio.Clamp(min=0.05)), + ATTR_CHANGE: probatio.All( + probatio.Coerce(float), probatio.Clamp(min=0, max=360) + ), + ATTR_SPREAD: probatio.All( + probatio.Coerce(float), probatio.Clamp(min=0, max=360) + ), ATTR_TRANSITION: cv.positive_float, } ) @@ -158,18 +171,18 @@ LIFX_EFFECT_FLAME_SCHEMA = cv.make_entity_service_schema( { **LIFX_EFFECT_SCHEMA, - ATTR_SPEED: vol.All(vol.Coerce(int), vol.Clamp(min=1, max=25)), + ATTR_SPEED: probatio.All(probatio.Coerce(int), probatio.Clamp(min=1, max=25)), } ) -HSBK_SCHEMA = vol.All( - vol.Coerce(tuple), - vol.ExactSequence( +HSBK_SCHEMA = probatio.All( + probatio.Coerce(tuple), + probatio.ExactSequence( ( - vol.All(vol.Coerce(float), vol.Range(min=0, max=360)), - vol.All(vol.Coerce(float), vol.Range(min=0, max=100)), - vol.All(vol.Coerce(float), vol.Clamp(min=0, max=100)), - vol.All(vol.Coerce(int), vol.Clamp(min=1500, max=9000)), + probatio.All(probatio.Coerce(float), probatio.Range(min=0, max=360)), + probatio.All(probatio.Coerce(float), probatio.Range(min=0, max=100)), + probatio.All(probatio.Coerce(float), probatio.Clamp(min=0, max=100)), + probatio.All(probatio.Coerce(int), probatio.Clamp(min=1500, max=9000)), ) ), ) @@ -177,9 +190,9 @@ LIFX_EFFECT_MORPH_SCHEMA = cv.make_entity_service_schema( { **LIFX_EFFECT_SCHEMA, - ATTR_SPEED: vol.All(vol.Coerce(int), vol.Clamp(min=1, max=25)), - vol.Exclusive(ATTR_THEME, COLOR_GROUP): vol.In(ThemeLibrary().themes), - vol.Exclusive(ATTR_PALETTE, COLOR_GROUP): vol.All( + ATTR_SPEED: probatio.All(probatio.Coerce(int), probatio.Clamp(min=1, max=25)), + probatio.Exclusive(ATTR_THEME, COLOR_GROUP): probatio.In(ThemeLibrary().themes), + probatio.Exclusive(ATTR_PALETTE, COLOR_GROUP): probatio.All( cv.ensure_list, [HSBK_SCHEMA] ), } @@ -188,29 +201,39 @@ LIFX_EFFECT_MOVE_SCHEMA = cv.make_entity_service_schema( { **LIFX_EFFECT_SCHEMA, - ATTR_SPEED: vol.All(vol.Coerce(float), vol.Clamp(min=0.1, max=60)), - ATTR_DIRECTION: vol.In(EFFECT_MOVE_DIRECTIONS), - vol.Optional(ATTR_THEME): vol.In(ThemeLibrary().themes), + ATTR_SPEED: probatio.All( + probatio.Coerce(float), probatio.Clamp(min=0.1, max=60) + ), + ATTR_DIRECTION: probatio.In(EFFECT_MOVE_DIRECTIONS), + probatio.Optional(ATTR_THEME): probatio.In(ThemeLibrary().themes), } ) LIFX_EFFECT_SKY_SCHEMA = cv.make_entity_service_schema( { **LIFX_EFFECT_SCHEMA, - ATTR_SPEED: vol.All(vol.Coerce(int), vol.Clamp(min=1, max=86400)), - ATTR_SKY_TYPE: vol.In(EFFECT_SKY_SKY_TYPES), - ATTR_CLOUD_SATURATION_MIN: vol.All(vol.Coerce(int), vol.Clamp(min=0, max=255)), - ATTR_CLOUD_SATURATION_MAX: vol.All(vol.Coerce(int), vol.Clamp(min=0, max=255)), - ATTR_PALETTE: vol.All(cv.ensure_list, [HSBK_SCHEMA]), + ATTR_SPEED: probatio.All( + probatio.Coerce(int), probatio.Clamp(min=1, max=86400) + ), + ATTR_SKY_TYPE: probatio.In(EFFECT_SKY_SKY_TYPES), + ATTR_CLOUD_SATURATION_MIN: probatio.All( + probatio.Coerce(int), probatio.Clamp(min=0, max=255) + ), + ATTR_CLOUD_SATURATION_MAX: probatio.All( + probatio.Coerce(int), probatio.Clamp(min=0, max=255) + ), + ATTR_PALETTE: probatio.All(cv.ensure_list, [HSBK_SCHEMA]), } ) LIFX_PAINT_THEME_SCHEMA = cv.make_entity_service_schema( { **LIFX_EFFECT_SCHEMA, - ATTR_TRANSITION: vol.All(vol.Coerce(int), vol.Clamp(min=1, max=3600)), - vol.Exclusive(ATTR_THEME, COLOR_GROUP): vol.In(ThemeLibrary().themes), - vol.Exclusive(ATTR_PALETTE, COLOR_GROUP): vol.All( + ATTR_TRANSITION: probatio.All( + probatio.Coerce(int), probatio.Clamp(min=1, max=3600) + ), + probatio.Exclusive(ATTR_THEME, COLOR_GROUP): probatio.In(ThemeLibrary().themes), + probatio.Exclusive(ATTR_PALETTE, COLOR_GROUP): probatio.All( cv.ensure_list, [HSBK_SCHEMA] ), } diff --git a/homeassistant/components/lifx_cloud/scene.py b/homeassistant/components/lifx_cloud/scene.py index 76a9aa14fd54f..968d51759c3d4 100644 --- a/homeassistant/components/lifx_cloud/scene.py +++ b/homeassistant/components/lifx_cloud/scene.py @@ -7,7 +7,7 @@ import aiohttp from aiohttp.hdrs import AUTHORIZATION -import voluptuous as vol +import probatio from homeassistant.components.scene import Scene from homeassistant.const import CONF_PLATFORM, CONF_TIMEOUT, CONF_TOKEN @@ -21,11 +21,11 @@ DEFAULT_TIMEOUT = 10 -PLATFORM_SCHEMA = vol.Schema( +PLATFORM_SCHEMA = probatio.Schema( { - vol.Required(CONF_PLATFORM): "lifx_cloud", - vol.Required(CONF_TOKEN): cv.string, - vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, + probatio.Required(CONF_PLATFORM): "lifx_cloud", + probatio.Required(CONF_TOKEN): cv.string, + probatio.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, } ) diff --git a/homeassistant/components/light/__init__.py b/homeassistant/components/light/__init__.py index 63af9ca9e1e28..8b89a71783aae 100644 --- a/homeassistant/components/light/__init__.py +++ b/homeassistant/components/light/__init__.py @@ -7,8 +7,8 @@ import os from typing import TYPE_CHECKING, Any, Self, cast, final, override +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( @@ -84,7 +84,7 @@ def valid_supported_color_modes( or (ColorMode.ONOFF in color_modes and len(color_modes) > 1) or (ColorMode.WHITE in color_modes and not color_supported(color_modes)) ): - raise vol.Error(f"Invalid supported_color_modes {sorted(color_modes)}") + raise probatio.Error(f"Invalid supported_color_modes {sorted(color_modes)}") return color_modes @@ -173,44 +173,52 @@ def get_supported_color_modes(hass: HomeAssistant, entity_id: str) -> set[str] | LIGHT_PROFILES_FILE = "light_profiles.csv" # Service call validation schemas -VALID_TRANSITION = vol.All(vol.Coerce(float), vol.Clamp(min=0, max=6553)) -VALID_BRIGHTNESS = vol.All(vol.Coerce(int), vol.Clamp(min=0, max=255)) -VALID_BRIGHTNESS_PCT = vol.All(vol.Coerce(float), vol.Range(min=0, max=100)) -VALID_BRIGHTNESS_STEP = vol.All(vol.Coerce(int), vol.Clamp(min=-255, max=255)) -VALID_BRIGHTNESS_STEP_PCT = vol.All(vol.Coerce(float), vol.Clamp(min=-100, max=100)) -VALID_FLASH = vol.In([FLASH_SHORT, FLASH_LONG]) +VALID_TRANSITION = probatio.All(probatio.Coerce(float), probatio.Clamp(min=0, max=6553)) +VALID_BRIGHTNESS = probatio.All(probatio.Coerce(int), probatio.Clamp(min=0, max=255)) +VALID_BRIGHTNESS_PCT = probatio.All( + probatio.Coerce(float), probatio.Range(min=0, max=100) +) +VALID_BRIGHTNESS_STEP = probatio.All( + probatio.Coerce(int), probatio.Clamp(min=-255, max=255) +) +VALID_BRIGHTNESS_STEP_PCT = probatio.All( + probatio.Coerce(float), probatio.Clamp(min=-100, max=100) +) +VALID_FLASH = probatio.In([FLASH_SHORT, FLASH_LONG]) LIGHT_TURN_ON_SCHEMA: VolDictType = { - vol.Exclusive(ATTR_PROFILE, COLOR_GROUP): cv.string, + probatio.Exclusive(ATTR_PROFILE, COLOR_GROUP): cv.string, ATTR_TRANSITION: VALID_TRANSITION, - vol.Exclusive(ATTR_BRIGHTNESS, ATTR_BRIGHTNESS): VALID_BRIGHTNESS, - vol.Exclusive(ATTR_BRIGHTNESS_PCT, ATTR_BRIGHTNESS): VALID_BRIGHTNESS_PCT, - vol.Exclusive(ATTR_BRIGHTNESS_STEP, ATTR_BRIGHTNESS): VALID_BRIGHTNESS_STEP, - vol.Exclusive(ATTR_BRIGHTNESS_STEP_PCT, ATTR_BRIGHTNESS): VALID_BRIGHTNESS_STEP_PCT, - vol.Exclusive(ATTR_COLOR_NAME, COLOR_GROUP): cv.string, - vol.Exclusive(ATTR_COLOR_TEMP_KELVIN, COLOR_GROUP): cv.positive_int, - vol.Exclusive(ATTR_HS_COLOR, COLOR_GROUP): vol.All( - vol.Coerce(tuple), - vol.ExactSequence( + probatio.Exclusive(ATTR_BRIGHTNESS, ATTR_BRIGHTNESS): VALID_BRIGHTNESS, + probatio.Exclusive(ATTR_BRIGHTNESS_PCT, ATTR_BRIGHTNESS): VALID_BRIGHTNESS_PCT, + probatio.Exclusive(ATTR_BRIGHTNESS_STEP, ATTR_BRIGHTNESS): VALID_BRIGHTNESS_STEP, + probatio.Exclusive( + ATTR_BRIGHTNESS_STEP_PCT, ATTR_BRIGHTNESS + ): VALID_BRIGHTNESS_STEP_PCT, + probatio.Exclusive(ATTR_COLOR_NAME, COLOR_GROUP): cv.string, + probatio.Exclusive(ATTR_COLOR_TEMP_KELVIN, COLOR_GROUP): cv.positive_int, + probatio.Exclusive(ATTR_HS_COLOR, COLOR_GROUP): probatio.All( + probatio.Coerce(tuple), + probatio.ExactSequence( ( - vol.All(vol.Coerce(float), vol.Range(min=0, max=360)), - vol.All(vol.Coerce(float), vol.Range(min=0, max=100)), + probatio.All(probatio.Coerce(float), probatio.Range(min=0, max=360)), + probatio.All(probatio.Coerce(float), probatio.Range(min=0, max=100)), ) ), ), - vol.Exclusive(ATTR_RGB_COLOR, COLOR_GROUP): vol.All( - vol.Coerce(tuple), vol.ExactSequence((cv.byte,) * 3) + probatio.Exclusive(ATTR_RGB_COLOR, COLOR_GROUP): probatio.All( + probatio.Coerce(tuple), probatio.ExactSequence((cv.byte,) * 3) ), - vol.Exclusive(ATTR_RGBW_COLOR, COLOR_GROUP): vol.All( - vol.Coerce(tuple), vol.ExactSequence((cv.byte,) * 4) + probatio.Exclusive(ATTR_RGBW_COLOR, COLOR_GROUP): probatio.All( + probatio.Coerce(tuple), probatio.ExactSequence((cv.byte,) * 4) ), - vol.Exclusive(ATTR_RGBWW_COLOR, COLOR_GROUP): vol.All( - vol.Coerce(tuple), vol.ExactSequence((cv.byte,) * 5) + probatio.Exclusive(ATTR_RGBWW_COLOR, COLOR_GROUP): probatio.All( + probatio.Coerce(tuple), probatio.ExactSequence((cv.byte,) * 5) ), - vol.Exclusive(ATTR_XY_COLOR, COLOR_GROUP): vol.All( - vol.Coerce(tuple), vol.ExactSequence((cv.small_float, cv.small_float)) + probatio.Exclusive(ATTR_XY_COLOR, COLOR_GROUP): probatio.All( + probatio.Coerce(tuple), probatio.ExactSequence((cv.small_float, cv.small_float)) ), - vol.Exclusive(ATTR_WHITE, COLOR_GROUP): vol.Any(True, VALID_BRIGHTNESS), + probatio.Exclusive(ATTR_WHITE, COLOR_GROUP): probatio.Any(True, VALID_BRIGHTNESS), ATTR_FLASH: VALID_FLASH, ATTR_EFFECT: cv.string, } @@ -538,19 +546,25 @@ async def async_handle_toggle_service( component.async_register_entity_service( SERVICE_TURN_ON, - vol.All(cv.make_entity_service_schema(LIGHT_TURN_ON_SCHEMA), preprocess_data), + probatio.All( + cv.make_entity_service_schema(LIGHT_TURN_ON_SCHEMA), preprocess_data + ), async_handle_light_on_service, ) component.async_register_entity_service( SERVICE_TURN_OFF, - vol.All(cv.make_entity_service_schema(LIGHT_TURN_OFF_SCHEMA), preprocess_data), + probatio.All( + cv.make_entity_service_schema(LIGHT_TURN_OFF_SCHEMA), preprocess_data + ), async_handle_light_off_service, ) component.async_register_entity_service( SERVICE_TOGGLE, - vol.All(cv.make_entity_service_schema(LIGHT_TURN_ON_SCHEMA), preprocess_data), + probatio.All( + cv.make_entity_service_schema(LIGHT_TURN_ON_SCHEMA), preprocess_data + ), async_handle_toggle_service, ) @@ -571,10 +585,10 @@ def _coerce_none(value: str) -> None: """Coerce an empty string as None.""" if not isinstance(value, str): - raise vol.Invalid("Expected a string") + raise probatio.Invalid("Expected a string") if value: - raise vol.Invalid("Not an empty string") + raise probatio.Invalid("Not an empty string") @dataclasses.dataclass @@ -592,23 +606,23 @@ class Profile: transition: int | None = None hs_color: tuple[float, float] | None = dataclasses.field(init=False) - SCHEMA = vol.Schema( - vol.Any( - vol.ExactSequence( + SCHEMA = probatio.Schema( + probatio.Any( + probatio.ExactSequence( ( str, - vol.Any(cv.small_float, _coerce_none), - vol.Any(cv.small_float, _coerce_none), - vol.Any(cv.byte, _coerce_none), + probatio.Any(cv.small_float, _coerce_none), + probatio.Any(cv.small_float, _coerce_none), + probatio.Any(cv.byte, _coerce_none), ) ), - vol.ExactSequence( + probatio.ExactSequence( ( str, - vol.Any(cv.small_float, _coerce_none), - vol.Any(cv.small_float, _coerce_none), - vol.Any(cv.byte, _coerce_none), - vol.Any(VALID_TRANSITION, _coerce_none), + probatio.Any(cv.small_float, _coerce_none), + probatio.Any(cv.small_float, _coerce_none), + probatio.Any(cv.byte, _coerce_none), + probatio.Any(VALID_TRANSITION, _coerce_none), ) ), ) @@ -664,7 +678,7 @@ def _load_profile_data(self) -> dict[str, Profile]: profile = Profile.from_csv_row(rec) profiles[profile.name] = profile - except vol.MultipleInvalid as ex: + except probatio.MultipleInvalid as ex: _LOGGER.error( "Error parsing light profile row '%s' from %s: %s", rec, @@ -1027,7 +1041,7 @@ def __validate_supported_color_modes( """Validate the supported color modes.""" try: valid_supported_color_modes(supported_color_modes) - except vol.Error as err: + except probatio.Error as err: raise HomeAssistantError( f"{self.entity_id} ({type(self)}) sets invalid supported color modes " f"{supported_color_modes}" diff --git a/homeassistant/components/light/device_action.py b/homeassistant/components/light/device_action.py index d71cbac2c4f31..642e187a03695 100644 --- a/homeassistant/components/light/device_action.py +++ b/homeassistant/components/light/device_action.py @@ -1,6 +1,6 @@ """Provides device actions for lights.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import ( async_get_entity_registry_entry_or_raise, @@ -41,9 +41,9 @@ _ACTION_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(ATTR_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_DOMAIN): DOMAIN, - vol.Required(CONF_TYPE): vol.In( + probatio.Required(ATTR_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_DOMAIN): DOMAIN, + probatio.Required(CONF_TYPE): probatio.In( [ *toggle_entity.DEVICE_ACTION_TYPES, TYPE_BRIGHTNESS_INCREASE, @@ -51,8 +51,8 @@ TYPE_FLASH, ] ), - vol.Optional(ATTR_BRIGHTNESS_PCT): VALID_BRIGHTNESS_PCT, - vol.Optional(ATTR_FLASH): VALID_FLASH, + probatio.Optional(ATTR_BRIGHTNESS_PCT): VALID_BRIGHTNESS_PCT, + probatio.Optional(ATTR_FLASH): VALID_FLASH, } ) @@ -134,7 +134,7 @@ async def async_get_actions( async def async_get_action_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List action capabilities.""" if config[CONF_TYPE] != toggle_entity.CONF_TURN_ON: return {} @@ -150,9 +150,9 @@ async def async_get_action_capabilities( extra_fields: VolDictType = {} if brightness_supported(supported_color_modes): - extra_fields[vol.Optional(ATTR_BRIGHTNESS_PCT)] = VALID_BRIGHTNESS_PCT + extra_fields[probatio.Optional(ATTR_BRIGHTNESS_PCT)] = VALID_BRIGHTNESS_PCT if supported_features & LightEntityFeature.FLASH: - extra_fields[vol.Optional(ATTR_FLASH)] = VALID_FLASH + extra_fields[probatio.Optional(ATTR_FLASH)] = VALID_FLASH - return {"extra_fields": vol.Schema(extra_fields)} if extra_fields else {} + return {"extra_fields": probatio.Schema(extra_fields)} if extra_fields else {} diff --git a/homeassistant/components/light/device_condition.py b/homeassistant/components/light/device_condition.py index 8a54a0bd22ebf..545c978c48133 100644 --- a/homeassistant/components/light/device_condition.py +++ b/homeassistant/components/light/device_condition.py @@ -1,6 +1,6 @@ """Provides device conditions for lights.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import toggle_entity from homeassistant.const import CONF_DOMAIN @@ -13,7 +13,7 @@ # mypy: disallow-any-generics CONDITION_SCHEMA = toggle_entity.CONDITION_SCHEMA.extend( - {vol.Required(CONF_DOMAIN): DOMAIN} + {probatio.Required(CONF_DOMAIN): DOMAIN} ) @@ -34,6 +34,6 @@ async def async_get_conditions( async def async_get_condition_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List condition capabilities.""" return await toggle_entity.async_get_condition_capabilities(hass, config) diff --git a/homeassistant/components/light/device_trigger.py b/homeassistant/components/light/device_trigger.py index 2f0e2edfc70fa..888cbd6344956 100644 --- a/homeassistant/components/light/device_trigger.py +++ b/homeassistant/components/light/device_trigger.py @@ -1,6 +1,6 @@ """Provides device trigger for lights.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import toggle_entity from homeassistant.const import CONF_DOMAIN @@ -10,9 +10,11 @@ from .const import DOMAIN -TRIGGER_SCHEMA = vol.All( +TRIGGER_SCHEMA = probatio.All( toggle_entity.TRIGGER_SCHEMA, - vol.Schema({vol.Required(CONF_DOMAIN): DOMAIN}, extra=vol.ALLOW_EXTRA), + probatio.Schema( + {probatio.Required(CONF_DOMAIN): DOMAIN}, extra=probatio.ALLOW_EXTRA + ), ) @@ -35,6 +37,6 @@ async def async_get_triggers( async def async_get_trigger_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List trigger capabilities.""" return await toggle_entity.async_get_trigger_capabilities(hass, config) diff --git a/homeassistant/components/light/intent.py b/homeassistant/components/light/intent.py index a15c085b29537..04bf97da7dc34 100644 --- a/homeassistant/components/light/intent.py +++ b/homeassistant/components/light/intent.py @@ -2,7 +2,7 @@ import logging -import voluptuous as vol +import probatio from homeassistant.const import SERVICE_TURN_ON from homeassistant.core import HomeAssistant @@ -41,7 +41,9 @@ async def async_setup_intents(hass: HomeAssistant) -> None: " light between 0 and 100, where 0" " is off and 100 is fully lit" ), - value_schema=vol.All(vol.Coerce(int), vol.Range(0, 100)), + value_schema=probatio.All( + probatio.Coerce(int), probatio.Range(0, 100) + ), ), }, description="Sets the brightness percentage or color of a light", diff --git a/homeassistant/components/lightwave/__init__.py b/homeassistant/components/lightwave/__init__.py index 443c28e0d0f37..03a1da0b63392 100644 --- a/homeassistant/components/lightwave/__init__.py +++ b/homeassistant/components/lightwave/__init__.py @@ -3,7 +3,7 @@ import logging from lightwave.lightwave import LWLink -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_HOST, @@ -31,29 +31,33 @@ _LOGGER = logging.getLogger(__name__) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( - vol.All( + DOMAIN: probatio.Schema( + probatio.All( cv.has_at_least_one_key(CONF_LIGHTS, CONF_SWITCHES, CONF_TRV), { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_LIGHTS, default={}): { - cv.string: vol.Schema({vol.Required(CONF_NAME): cv.string}) + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_LIGHTS, default={}): { + cv.string: probatio.Schema( + {probatio.Required(CONF_NAME): cv.string} + ) }, - vol.Optional(CONF_SWITCHES, default={}): { - cv.string: vol.Schema({vol.Required(CONF_NAME): cv.string}) + probatio.Optional(CONF_SWITCHES, default={}): { + cv.string: probatio.Schema( + {probatio.Required(CONF_NAME): cv.string} + ) }, - vol.Optional(CONF_TRV, default={}): { - vol.Optional( + probatio.Optional(CONF_TRV, default={}): { + probatio.Optional( CONF_PROXY_PORT, default=DEFAULT_PROXY_PORT ): cv.port, - vol.Optional(CONF_PROXY_IP): cv.string, - vol.Required(CONF_TRVS, default={}): { - cv.string: vol.Schema( + probatio.Optional(CONF_PROXY_IP): cv.string, + probatio.Required(CONF_TRVS, default={}): { + cv.string: probatio.Schema( { - vol.Required(CONF_NAME): cv.string, - vol.Required(CONF_SERIAL): cv.string, + probatio.Required(CONF_NAME): cv.string, + probatio.Required(CONF_SERIAL): cv.string, } ) }, @@ -62,7 +66,7 @@ ) ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) PLATFORMS = (Platform.CLIMATE, Platform.SENSOR) diff --git a/homeassistant/components/limitlessled/light.py b/homeassistant/components/limitlessled/light.py index bd44820fde92e..55d63a885e244 100644 --- a/homeassistant/components/limitlessled/light.py +++ b/homeassistant/components/limitlessled/light.py @@ -13,7 +13,7 @@ from limitlessled.group.white import WhiteGroup from limitlessled.pipeline import Pipeline from limitlessled.presets import COLORLOOP -import voluptuous as vol +import probatio from homeassistant.components.light import ( ATTR_BRIGHTNESS, @@ -76,25 +76,25 @@ PLATFORM_SCHEMA = LIGHT_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_BRIDGES): vol.All( + probatio.Required(CONF_BRIDGES): probatio.All( cv.ensure_list, [ { - vol.Required(CONF_HOST): cv.string, - vol.Optional( + probatio.Required(CONF_HOST): cv.string, + probatio.Optional( CONF_VERSION, default=DEFAULT_VERSION ): cv.positive_int, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Required(CONF_GROUPS): vol.All( + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Required(CONF_GROUPS): probatio.All( cv.ensure_list, [ { - vol.Required(CONF_NAME): cv.string, - vol.Optional( + probatio.Required(CONF_NAME): cv.string, + probatio.Optional( CONF_TYPE, default=DEFAULT_LED_TYPE - ): vol.In(LED_TYPE), - vol.Required(CONF_NUMBER): cv.positive_int, - vol.Optional( + ): probatio.In(LED_TYPE), + probatio.Required(CONF_NUMBER): cv.positive_int, + probatio.Optional( CONF_FADE, default=DEFAULT_FADE ): cv.boolean, } diff --git a/homeassistant/components/linkplay/config_flow.py b/homeassistant/components/linkplay/config_flow.py index acef5fec0d463..05b5c8a609ea5 100644 --- a/homeassistant/components/linkplay/config_flow.py +++ b/homeassistant/components/linkplay/config_flow.py @@ -8,7 +8,7 @@ from linkplay.discovery import linkplay_factory_httpapi_bridge from linkplay.exceptions import LinkPlayRequestException from linkplay.manufacturers import MANUFACTURER_WIIM -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_MODEL @@ -128,6 +128,6 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_HOST): str}), + data_schema=probatio.Schema({probatio.Required(CONF_HOST): str}), errors=errors, ) diff --git a/homeassistant/components/linkplay/services.py b/homeassistant/components/linkplay/services.py index 9acafdd494e45..a9faac8d0d29c 100644 --- a/homeassistant/components/linkplay/services.py +++ b/homeassistant/components/linkplay/services.py @@ -1,6 +1,6 @@ """Support for LinkPlay media players.""" -import voluptuous as vol +import probatio from homeassistant.components.media_player import DOMAIN as MEDIA_PLAYER_DOMAIN from homeassistant.core import HomeAssistant, callback @@ -13,7 +13,7 @@ SERVICE_PLAY_PRESET_SCHEMA = cv.make_entity_service_schema( { - vol.Required(ATTR_PRESET_NUMBER): cv.positive_int, + probatio.Required(ATTR_PRESET_NUMBER): cv.positive_int, } ) diff --git a/homeassistant/components/linksys_smart/device_tracker.py b/homeassistant/components/linksys_smart/device_tracker.py index 39d276f02c63a..1760409857e79 100644 --- a/homeassistant/components/linksys_smart/device_tracker.py +++ b/homeassistant/components/linksys_smart/device_tracker.py @@ -4,8 +4,8 @@ import logging from typing import override +import probatio import requests -import voluptuous as vol from homeassistant.components.device_tracker import ( DOMAIN as DEVICE_TRACKER_DOMAIN, @@ -22,7 +22,7 @@ _LOGGER = logging.getLogger(__name__) PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_HOST): cv.string} + {probatio.Required(CONF_HOST): cv.string} ) diff --git a/homeassistant/components/linode/__init__.py b/homeassistant/components/linode/__init__.py index d59c849f8f088..c675e83a722b3 100644 --- a/homeassistant/components/linode/__init__.py +++ b/homeassistant/components/linode/__init__.py @@ -4,7 +4,7 @@ import logging import linode -import voluptuous as vol +import probatio from homeassistant.const import CONF_ACCESS_TOKEN, Platform from homeassistant.core import HomeAssistant @@ -31,9 +31,9 @@ MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=60) -CONFIG_SCHEMA = vol.Schema( - {DOMAIN: vol.Schema({vol.Required(CONF_ACCESS_TOKEN): cv.string})}, - extra=vol.ALLOW_EXTRA, +CONFIG_SCHEMA = probatio.Schema( + {DOMAIN: probatio.Schema({probatio.Required(CONF_ACCESS_TOKEN): cv.string})}, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/linode/binary_sensor.py b/homeassistant/components/linode/binary_sensor.py index dcf606e5daa38..2f74412ffda81 100644 --- a/homeassistant/components/linode/binary_sensor.py +++ b/homeassistant/components/linode/binary_sensor.py @@ -2,7 +2,7 @@ import logging -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import ( PLATFORM_SCHEMA as BINARY_SENSOR_PLATFORM_SCHEMA, @@ -31,7 +31,7 @@ DEFAULT_NAME = "Node" PLATFORM_SCHEMA = BINARY_SENSOR_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_NODES): vol.All(cv.ensure_list, [cv.string])} + {probatio.Required(CONF_NODES): probatio.All(cv.ensure_list, [cv.string])} ) diff --git a/homeassistant/components/linode/switch.py b/homeassistant/components/linode/switch.py index 374f6cc19a217..ac6c0a77e851d 100644 --- a/homeassistant/components/linode/switch.py +++ b/homeassistant/components/linode/switch.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.switch import ( PLATFORM_SCHEMA as SWITCH_PLATFORM_SCHEMA, @@ -32,7 +32,7 @@ DEFAULT_NAME = "Node" PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_NODES): vol.All(cv.ensure_list, [cv.string])} + {probatio.Required(CONF_NODES): probatio.All(cv.ensure_list, [cv.string])} ) diff --git a/homeassistant/components/linux_battery/sensor.py b/homeassistant/components/linux_battery/sensor.py index 708be0f8ec5a0..e812a7d1dd12b 100644 --- a/homeassistant/components/linux_battery/sensor.py +++ b/homeassistant/components/linux_battery/sensor.py @@ -5,7 +5,7 @@ from typing import Any, override from batinfo import Batteries -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -55,9 +55,9 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_BATTERY, default=DEFAULT_BATTERY): cv.positive_int, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_SYSTEM, default=DEFAULT_SYSTEM): vol.In(SYSTEMS), + probatio.Optional(CONF_BATTERY, default=DEFAULT_BATTERY): cv.positive_int, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_SYSTEM, default=DEFAULT_SYSTEM): probatio.In(SYSTEMS), } ) diff --git a/homeassistant/components/litejet/config_flow.py b/homeassistant/components/litejet/config_flow.py index 24cd15238cdae..6436690fc458a 100644 --- a/homeassistant/components/litejet/config_flow.py +++ b/homeassistant/components/litejet/config_flow.py @@ -2,9 +2,9 @@ from typing import Any, override +import probatio import pylitejet from serial import SerialException -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, OptionsFlow from homeassistant.const import CONF_PORT @@ -27,9 +27,9 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_DEFAULT_TRANSITION, default=self.config_entry.options.get( CONF_DEFAULT_TRANSITION, 0 @@ -65,7 +65,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_PORT): str}), + data_schema=probatio.Schema({probatio.Required(CONF_PORT): str}), errors=errors, ) diff --git a/homeassistant/components/litejet/trigger.py b/homeassistant/components/litejet/trigger.py index 786855fb65573..42aac42fe5eb2 100644 --- a/homeassistant/components/litejet/trigger.py +++ b/homeassistant/components/litejet/trigger.py @@ -4,7 +4,7 @@ from datetime import datetime from typing import cast -import voluptuous as vol +import probatio from homeassistant.const import CONF_PLATFORM from homeassistant.core import CALLBACK_TYPE, HassJob, HomeAssistant, callback @@ -22,12 +22,12 @@ TRIGGER_SCHEMA = cv.TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_PLATFORM): "litejet", - vol.Required(CONF_NUMBER): cv.positive_int, - vol.Optional(CONF_HELD_MORE_THAN): vol.All( + probatio.Required(CONF_PLATFORM): "litejet", + probatio.Required(CONF_NUMBER): cv.positive_int, + probatio.Optional(CONF_HELD_MORE_THAN): probatio.All( cv.time_period, cv.positive_timedelta ), - vol.Optional(CONF_HELD_LESS_THAN): vol.All( + probatio.Optional(CONF_HELD_LESS_THAN): probatio.All( cv.time_period, cv.positive_timedelta ), } diff --git a/homeassistant/components/litellm/config_flow.py b/homeassistant/components/litellm/config_flow.py index 177bf7e24ed74..529dbffafcc7a 100644 --- a/homeassistant/components/litellm/config_flow.py +++ b/homeassistant/components/litellm/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, cast, override from openai import AsyncOpenAI, AuthenticationError, OpenAIError, PermissionDeniedError -import voluptuous as vol +import probatio from yarl import URL from homeassistant.config_entries import ( @@ -121,10 +121,10 @@ async def async_step_user( ) return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_URL): str, - vol.Optional(CONF_API_KEY): str, + probatio.Required(CONF_URL): str, + probatio.Optional(CONF_API_KEY): str, } ), errors=errors, @@ -222,16 +222,16 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_MODEL, default=self.options.get(CONF_MODEL) ): SelectSelector( SelectSelectorConfig( options=options, mode=SelectSelectorMode.DROPDOWN, sort=True ), ), - vol.Optional( + probatio.Optional( CONF_PROMPT, description={ "suggested_value": self.options.get( @@ -240,7 +240,7 @@ async def async_step_init( ) }, ): TemplateSelector(), - vol.Optional( + probatio.Optional( CONF_LLM_HASS_API, default=self.options.get( CONF_LLM_HASS_API, diff --git a/homeassistant/components/litterrobot/config_flow.py b/homeassistant/components/litterrobot/config_flow.py index 3ddc7f6237b7d..9c69ef98b41b3 100644 --- a/homeassistant/components/litterrobot/config_flow.py +++ b/homeassistant/components/litterrobot/config_flow.py @@ -4,9 +4,9 @@ import logging from typing import Any, override +import probatio from pylitterbot import Account from pylitterbot.exceptions import LitterRobotException, LitterRobotLoginException -import voluptuous as vol from homeassistant.config_entries import ConfigEntry, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -16,10 +16,12 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( - {vol.Required(CONF_USERNAME): str, vol.Required(CONF_PASSWORD): str} +STEP_USER_DATA_SCHEMA = probatio.Schema( + {probatio.Required(CONF_USERNAME): str, probatio.Required(CONF_PASSWORD): str} +) +STEP_REAUTH_RECONFIGURE_SCHEMA = probatio.Schema( + {probatio.Required(CONF_PASSWORD): str} ) -STEP_REAUTH_RECONFIGURE_SCHEMA = vol.Schema({vol.Required(CONF_PASSWORD): str}) class LitterRobotConfigFlow(ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/components/litterrobot/services.py b/homeassistant/components/litterrobot/services.py index 2e39ddadb34c2..6d2fde8fb8b84 100644 --- a/homeassistant/components/litterrobot/services.py +++ b/homeassistant/components/litterrobot/services.py @@ -1,6 +1,6 @@ """Litter-Robot services.""" -import voluptuous as vol +import probatio from homeassistant.components.vacuum import DOMAIN as VACUUM_DOMAIN from homeassistant.core import HomeAssistant, callback @@ -21,8 +21,8 @@ def async_setup_services(hass: HomeAssistant) -> None: SERVICE_SET_SLEEP_MODE, entity_domain=VACUUM_DOMAIN, schema={ - vol.Required("enabled"): cv.boolean, - vol.Optional("start_time"): cv.time, + probatio.Required("enabled"): cv.boolean, + probatio.Optional("start_time"): cv.time, }, func="async_set_sleep_mode", ) diff --git a/homeassistant/components/livisi/config_flow.py b/homeassistant/components/livisi/config_flow.py index d26bf3d5203e8..e9b8c4b782133 100644 --- a/homeassistant/components/livisi/config_flow.py +++ b/homeassistant/components/livisi/config_flow.py @@ -6,7 +6,7 @@ from aiohttp import ClientConnectorError from livisi import errors as livisi_errors from livisi.aiolivisi import AioLivisi -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PASSWORD @@ -21,10 +21,10 @@ class LivisiFlowHandler(ConfigFlow, domain=DOMAIN): def __init__(self) -> None: """Create the configuration file.""" self.aio_livisi: AioLivisi = None - self.data_schema = vol.Schema( + self.data_schema = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/llama_cpp/config_flow.py b/homeassistant/components/llama_cpp/config_flow.py index 8c7e42c29ed59..cea4e54438d7f 100644 --- a/homeassistant/components/llama_cpp/config_flow.py +++ b/homeassistant/components/llama_cpp/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, cast, override import openai -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -53,10 +53,10 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_BASE_URL, default=DEFAULT_BASE_URL): str, - vol.Optional(CONF_API_KEY): str, + probatio.Required(CONF_BASE_URL, default=DEFAULT_BASE_URL): str, + probatio.Optional(CONF_API_KEY): str, } ) @@ -153,9 +153,9 @@ async def async_step_model( return self.async_show_form( step_id="model", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_CHAT_MODEL, ): SelectSelector( SelectSelectorConfig( @@ -267,7 +267,7 @@ async def async_step_init( return self.async_show_form( step_id="init", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( llama_cpp_config_option_schema(self.hass, options, models) ), user_input, @@ -301,7 +301,7 @@ async def async_step_init( return self.async_show_form( step_id="init", data_schema=self.add_suggested_values_to_schema( - vol.Schema(schema), options + probatio.Schema(schema), options ), ) @@ -321,11 +321,11 @@ def llama_cpp_config_option_schema( ] LOGGER.debug("Available LLM APIs: %s", hass_apis) - schema: dict[vol.Required | vol.Optional, Any] = {} + schema: dict[probatio.Required | probatio.Optional, Any] = {} schema.update( { - vol.Optional( + probatio.Optional( CONF_PROMPT, description={ "suggested_value": options.get( @@ -333,14 +333,14 @@ def llama_cpp_config_option_schema( ) }, ): TemplateSelector(), - vol.Optional( + probatio.Optional( CONF_LLM_HASS_API, ): SelectSelector(SelectSelectorConfig(options=hass_apis, multiple=True)), } ) schema.update( { - vol.Optional( + probatio.Optional( CONF_CHAT_MODEL, description={"suggested_value": options.get(CONF_CHAT_MODEL)}, default=options.get(CONF_CHAT_MODEL, recommended_model(models)), @@ -352,7 +352,7 @@ def llama_cpp_config_option_schema( custom_value=True, ), ), - vol.Required( + probatio.Required( CONF_RECOMMENDED, default=options.get(CONF_RECOMMENDED, False) ): bool, } @@ -363,17 +363,17 @@ def llama_cpp_config_option_schema( schema.update( { - vol.Optional( + probatio.Optional( CONF_MAX_TOKENS, description={"suggested_value": options.get(CONF_MAX_TOKENS)}, default=RECOMMENDED_MAX_TOKENS, ): int, - vol.Optional( + probatio.Optional( CONF_TOP_P, description={"suggested_value": options.get(CONF_TOP_P)}, default=RECOMMENDED_TOP_P, ): NumberSelector(NumberSelectorConfig(min=0, max=1, step=0.05)), - vol.Optional( + probatio.Optional( CONF_TEMPERATURE, description={"suggested_value": options.get(CONF_TEMPERATURE)}, default=RECOMMENDED_TEMPERATURE, diff --git a/homeassistant/components/llama_cpp/entity.py b/homeassistant/components/llama_cpp/entity.py index 1f3ea9afcf086..5a9910f93baa4 100644 --- a/homeassistant/components/llama_cpp/entity.py +++ b/homeassistant/components/llama_cpp/entity.py @@ -28,8 +28,7 @@ ) from openai.types.chat.chat_completion_message_function_tool_call_param import Function from openai.types.shared_params import FunctionDefinition, ResponseFormatJSONSchema -from probatio import to_openapi -import voluptuous as vol +import probatio from homeassistant.components import conversation from homeassistant.config_entries import ConfigSubentry @@ -64,10 +63,10 @@ def _format_structured_output( - name: str, structure: vol.Schema, llm_api: llm.APIInstance | None + name: str, structure: probatio.Schema, llm_api: llm.APIInstance | None ) -> ResponseFormatJSONSchema: """Format structured output specification.""" - schema = to_openapi( + schema = probatio.to_openapi( structure, custom_serializer=llm_api.custom_serializer if llm_api else None ) return ResponseFormatJSONSchema( @@ -87,7 +86,9 @@ def _format_tool( """Format tool specification.""" tool_spec = FunctionDefinition( name=tool.name, - parameters=to_openapi(tool.parameters, custom_serializer=custom_serializer), + parameters=probatio.to_openapi( + tool.parameters, custom_serializer=custom_serializer + ), ) if tool.description: tool_spec["description"] = tool.description @@ -304,7 +305,7 @@ async def _async_handle_chat_log( self, chat_log: conversation.ChatLog, structure_name: str | None = None, - structure: vol.Schema | None = None, + structure: probatio.Schema | None = None, ) -> None: """Generate an answer for the chat log.""" options = self.subentry.data diff --git a/homeassistant/components/llamalab_automate/notify.py b/homeassistant/components/llamalab_automate/notify.py index 186a35458c758..f6021afccd153 100644 --- a/homeassistant/components/llamalab_automate/notify.py +++ b/homeassistant/components/llamalab_automate/notify.py @@ -4,8 +4,8 @@ import logging from typing import Any, override +import probatio import requests -import voluptuous as vol from homeassistant.components.notify import ( ATTR_DATA, @@ -26,9 +26,9 @@ PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_API_KEY): cv.string, - vol.Required(CONF_TO): cv.string, - vol.Optional(CONF_DEVICE): cv.string, + probatio.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_TO): cv.string, + probatio.Optional(CONF_DEVICE): cv.string, } ) diff --git a/homeassistant/components/llm/websocket_api.py b/homeassistant/components/llm/websocket_api.py index 889c93df71a49..a1fab0c016bf1 100644 --- a/homeassistant/components/llm/websocket_api.py +++ b/homeassistant/components/llm/websocket_api.py @@ -2,7 +2,7 @@ from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.core import HomeAssistant, callback @@ -16,7 +16,7 @@ def async_setup(hass: HomeAssistant) -> None: @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required("type"): "llm/api/list"}) +@websocket_api.websocket_command({probatio.Required("type"): "llm/api/list"}) @callback def websocket_list_apis( hass: HomeAssistant, diff --git a/homeassistant/components/local_calendar/calendar.py b/homeassistant/components/local_calendar/calendar.py index f6ece70b46485..e8416e7a239f4 100644 --- a/homeassistant/components/local_calendar/calendar.py +++ b/homeassistant/components/local_calendar/calendar.py @@ -12,7 +12,7 @@ from ical.store import EventStore, EventStoreError from ical.timeline import Timeline, materialize_timeline from ical.types import Range, Recur -import voluptuous as vol +import probatio from homeassistant.components.calendar import ( EVENT_END, @@ -226,7 +226,7 @@ def _parse_event(event: dict[str, Any]) -> Event: return Event(**event) except CalendarParseError as err: _LOGGER.debug("Error parsing event input fields: %s (%s)", event, str(err)) - raise vol.Invalid("Error parsing event input fields") from err + raise probatio.Invalid("Error parsing event input fields") from err def _get_status(event: Event) -> CalendarEventStatus | None: diff --git a/homeassistant/components/local_calendar/config_flow.py b/homeassistant/components/local_calendar/config_flow.py index 5003f008effa2..55460a81b862e 100644 --- a/homeassistant/components/local_calendar/config_flow.py +++ b/homeassistant/components/local_calendar/config_flow.py @@ -7,7 +7,7 @@ from ical.calendar_stream import CalendarStream from ical.exceptions import CalendarParseError -import voluptuous as vol +import probatio from homeassistant.components.file_upload import process_uploaded_file from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -29,10 +29,12 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_CALENDAR_NAME): str, - vol.Optional(CONF_IMPORT, default=ATTR_CREATE_EMPTY): selector.SelectSelector( + probatio.Required(CONF_CALENDAR_NAME): str, + probatio.Optional( + CONF_IMPORT, default=ATTR_CREATE_EMPTY + ): selector.SelectSelector( selector.SelectSelectorConfig( options=[ ATTR_CREATE_EMPTY, @@ -44,9 +46,9 @@ } ) -STEP_IMPORT_DATA_SCHEMA = vol.Schema( +STEP_IMPORT_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_ICS_FILE): selector.FileSelector( + probatio.Required(CONF_ICS_FILE): selector.FileSelector( config=selector.FileSelectorConfig(accept=".ics") ), } diff --git a/homeassistant/components/local_file/camera.py b/homeassistant/components/local_file/camera.py index 1a3e90da96c80..831e7f7b275b6 100644 --- a/homeassistant/components/local_file/camera.py +++ b/homeassistant/components/local_file/camera.py @@ -4,7 +4,7 @@ import mimetypes from typing import override -import voluptuous as vol +import probatio from homeassistant.components.camera import Camera from homeassistant.config_entries import ConfigEntry @@ -31,7 +31,7 @@ async def async_setup_entry( platform.async_register_entity_service( SERVICE_UPDATE_FILE_PATH, { - vol.Required(CONF_FILE_PATH): cv.string, + probatio.Required(CONF_FILE_PATH): cv.string, }, "update_file_path", ) diff --git a/homeassistant/components/local_file/config_flow.py b/homeassistant/components/local_file/config_flow.py index 29f22cf630e29..388d61bf63391 100644 --- a/homeassistant/components/local_file/config_flow.py +++ b/homeassistant/components/local_file/config_flow.py @@ -3,7 +3,7 @@ from collections.abc import Mapping from typing import Any, cast, override -import voluptuous as vol +import probatio from homeassistant.const import CONF_FILE_PATH, CONF_NAME from homeassistant.helpers.schema_config_entry_flow import ( @@ -35,16 +35,16 @@ async def validate_options( return user_input -DATA_SCHEMA_OPTIONS = vol.Schema( +DATA_SCHEMA_OPTIONS = probatio.Schema( { - vol.Required(CONF_FILE_PATH): TextSelector(), + probatio.Required(CONF_FILE_PATH): TextSelector(), } ) -DATA_SCHEMA_SETUP = vol.Schema( +DATA_SCHEMA_SETUP = probatio.Schema( { # Approved exemption: user names the local file camera # pylint: disable-next=home-assistant-config-flow-name-field - vol.Optional(CONF_NAME, default=DEFAULT_NAME): TextSelector(), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): TextSelector(), } ).extend(DATA_SCHEMA_OPTIONS.schema) diff --git a/homeassistant/components/local_todo/config_flow.py b/homeassistant/components/local_todo/config_flow.py index 37662500c1153..661849f258fc0 100644 --- a/homeassistant/components/local_todo/config_flow.py +++ b/homeassistant/components/local_todo/config_flow.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.util import slugify @@ -12,9 +12,9 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_TODO_LIST_NAME): str, + probatio.Required(CONF_TODO_LIST_NAME): str, } ) diff --git a/homeassistant/components/locative/__init__.py b/homeassistant/components/locative/__init__.py index 37ba8f6759e04..5b37e9888377b 100644 --- a/homeassistant/components/locative/__init__.py +++ b/homeassistant/components/locative/__init__.py @@ -4,7 +4,7 @@ import logging from aiohttp import web -import voluptuous as vol +import probatio from homeassistant.components import webhook from homeassistant.config_entries import ConfigEntry @@ -41,20 +41,20 @@ def _id(value: str) -> str: def _validate_test_mode(obj: dict) -> dict: """Validate that id is provided outside of test mode.""" if ATTR_ID not in obj and obj[ATTR_TRIGGER] != "test": - raise vol.Invalid("Location id not specified") + raise probatio.Invalid("Location id not specified") return obj -WEBHOOK_SCHEMA = vol.All( - vol.Schema( +WEBHOOK_SCHEMA = probatio.All( + probatio.Schema( { - vol.Required(ATTR_LATITUDE): cv.latitude, - vol.Required(ATTR_LONGITUDE): cv.longitude, - vol.Required(ATTR_DEVICE_ID): cv.string, - vol.Required(ATTR_TRIGGER): cv.string, - vol.Optional(ATTR_ID): vol.All(cv.string, _id), + probatio.Required(ATTR_LATITUDE): cv.latitude, + probatio.Required(ATTR_LONGITUDE): cv.longitude, + probatio.Required(ATTR_DEVICE_ID): cv.string, + probatio.Required(ATTR_TRIGGER): cv.string, + probatio.Optional(ATTR_ID): probatio.All(cv.string, _id), }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ), _validate_test_mode, ) @@ -66,7 +66,7 @@ async def handle_webhook( """Handle incoming webhook from Locative.""" try: data = WEBHOOK_SCHEMA(dict(await request.post())) - except vol.MultipleInvalid as error: + except probatio.MultipleInvalid as error: return web.Response( text=error.error_message, status=HTTPStatus.UNPROCESSABLE_ENTITY ) diff --git a/homeassistant/components/lock/__init__.py b/homeassistant/components/lock/__init__.py index e10325df637b9..dd41d21b3e64d 100644 --- a/homeassistant/components/lock/__init__.py +++ b/homeassistant/components/lock/__init__.py @@ -7,8 +7,8 @@ import re from typing import TYPE_CHECKING, Any, final, override +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( # noqa: F401 @@ -42,7 +42,7 @@ MIN_TIME_BETWEEN_SCANS = timedelta(seconds=10) LOCK_SERVICE_SCHEMA = cv.make_entity_service_schema( - {vol.Optional(ATTR_CODE): cv.string} + {probatio.Optional(ATTR_CODE): cv.string} ) diff --git a/homeassistant/components/lock/device_action.py b/homeassistant/components/lock/device_action.py index f1f45bc7ed453..c970fae2b342e 100644 --- a/homeassistant/components/lock/device_action.py +++ b/homeassistant/components/lock/device_action.py @@ -1,6 +1,6 @@ """Provides device automations for Lock.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import async_validate_entity_schema from homeassistant.const import ( @@ -24,8 +24,8 @@ _ACTION_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): vol.In(ACTION_TYPES), - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In(ACTION_TYPES), + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, } ) diff --git a/homeassistant/components/lock/device_condition.py b/homeassistant/components/lock/device_condition.py index d3b28d9c801c6..c956f7acd0842 100644 --- a/homeassistant/components/lock/device_condition.py +++ b/homeassistant/components/lock/device_condition.py @@ -1,6 +1,6 @@ """Provides device automations for Lock.""" -import voluptuous as vol +import probatio from homeassistant.const import ( ATTR_ENTITY_ID, @@ -35,8 +35,8 @@ CONDITION_SCHEMA = DEVICE_CONDITION_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In(CONDITION_TYPES), + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In(CONDITION_TYPES), } ) diff --git a/homeassistant/components/lock/device_trigger.py b/homeassistant/components/lock/device_trigger.py index 34576a4ee1efe..4eec3d0ce9dc3 100644 --- a/homeassistant/components/lock/device_trigger.py +++ b/homeassistant/components/lock/device_trigger.py @@ -1,6 +1,6 @@ """Provides device automations for Lock.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import DEVICE_TRIGGER_BASE_SCHEMA from homeassistant.components.homeassistant.triggers import state as state_trigger @@ -31,9 +31,9 @@ TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In(TRIGGER_TYPES), - vol.Optional(CONF_FOR): cv.positive_time_period_dict, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In(TRIGGER_TYPES), + probatio.Optional(CONF_FOR): cv.positive_time_period_dict, } ) @@ -67,11 +67,11 @@ async def async_get_triggers( async def async_get_trigger_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List trigger capabilities.""" return { - "extra_fields": vol.Schema( - {vol.Optional(CONF_FOR): cv.positive_time_period_dict} + "extra_fields": probatio.Schema( + {probatio.Optional(CONF_FOR): cv.positive_time_period_dict} ) } diff --git a/homeassistant/components/logbook/__init__.py b/homeassistant/components/logbook/__init__.py index db828d1e83473..30c3d2775e0ea 100644 --- a/homeassistant/components/logbook/__init__.py +++ b/homeassistant/components/logbook/__init__.py @@ -3,7 +3,7 @@ from collections.abc import Callable from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import frontend from homeassistant.components.recorder import DOMAIN as RECORDER_DOMAIN @@ -44,17 +44,17 @@ ) from .models import LazyEventPartialState, LogbookConfig -CONFIG_SCHEMA = vol.Schema( - {DOMAIN: INCLUDE_EXCLUDE_BASE_FILTER_SCHEMA}, extra=vol.ALLOW_EXTRA +CONFIG_SCHEMA = probatio.Schema( + {DOMAIN: INCLUDE_EXCLUDE_BASE_FILTER_SCHEMA}, extra=probatio.ALLOW_EXTRA ) -LOG_MESSAGE_SCHEMA = vol.Schema( +LOG_MESSAGE_SCHEMA = probatio.Schema( { - vol.Required(ATTR_NAME): cv.string, - vol.Required(ATTR_MESSAGE): cv.string, - vol.Optional(ATTR_DOMAIN): cv.slug, - vol.Optional(ATTR_ENTITY_ID): cv.entity_id, + probatio.Required(ATTR_NAME): cv.string, + probatio.Required(ATTR_MESSAGE): cv.string, + probatio.Optional(ATTR_DOMAIN): cv.slug, + probatio.Optional(ATTR_ENTITY_ID): cv.entity_id, } ) diff --git a/homeassistant/components/logbook/rest_api.py b/homeassistant/components/logbook/rest_api.py index 79ecc481702f4..8c64c74e2fc3e 100644 --- a/homeassistant/components/logbook/rest_api.py +++ b/homeassistant/components/logbook/rest_api.py @@ -6,7 +6,7 @@ from typing import Any from aiohttp import web -import voluptuous as vol +import probatio from homeassistant.components.http import KEY_HASS, HomeAssistantView from homeassistant.components.recorder import get_instance @@ -68,7 +68,7 @@ async def get( if entity_ids_str := request.query.get("entity"): try: entity_ids = cv.entity_ids(entity_ids_str) - except vol.Invalid as ex: + except probatio.Invalid as ex: raise InvalidEntityFormatError( f"Invalid entity id(s) encountered: {entity_ids_str}. " "Format should be ." diff --git a/homeassistant/components/logbook/websocket_api.py b/homeassistant/components/logbook/websocket_api.py index 820cbe71956f0..aed0fd7c829a4 100644 --- a/homeassistant/components/logbook/websocket_api.py +++ b/homeassistant/components/logbook/websocket_api.py @@ -7,7 +7,7 @@ import logging from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.components.recorder import get_instance @@ -245,11 +245,11 @@ async def _async_events_consumer( @websocket_api.websocket_command( { - vol.Required("type"): "logbook/event_stream", - vol.Required("start_time"): str, - vol.Optional("end_time"): str, - vol.Optional("entity_ids"): [str], - vol.Optional("device_ids"): [str], + probatio.Required("type"): "logbook/event_stream", + probatio.Required("start_time"): str, + probatio.Optional("end_time"): str, + probatio.Optional("entity_ids"): [str], + probatio.Optional("device_ids"): [str], } ) @websocket_api.async_response @@ -451,12 +451,12 @@ def _ws_formatted_get_events( @websocket_api.websocket_command( { - vol.Required("type"): "logbook/get_events", - vol.Required("start_time"): str, - vol.Optional("end_time"): str, - vol.Optional("entity_ids"): [str], - vol.Optional("device_ids"): [str], - vol.Optional("context_id"): str, + probatio.Required("type"): "logbook/get_events", + probatio.Required("start_time"): str, + probatio.Optional("end_time"): str, + probatio.Optional("entity_ids"): [str], + probatio.Optional("device_ids"): [str], + probatio.Optional("context_id"): str, } ) @websocket_api.async_response diff --git a/homeassistant/components/logger/__init__.py b/homeassistant/components/logger/__init__.py index e63b0051567d8..7ab83f80d5a30 100644 --- a/homeassistant/components/logger/__init__.py +++ b/homeassistant/components/logger/__init__.py @@ -4,7 +4,7 @@ import re from typing import override -import voluptuous as vol +import probatio from homeassistant.const import EVENT_LOGGING_CHANGED # noqa: F401 from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -32,22 +32,28 @@ set_log_levels, ) -_VALID_LOG_LEVEL = vol.All(vol.Upper, vol.In(LOGSEVERITY), LOGSEVERITY.__getitem__) +_VALID_LOG_LEVEL = probatio.All( + probatio.Upper, probatio.In(LOGSEVERITY), LOGSEVERITY.__getitem__ +) -SERVICE_SET_DEFAULT_LEVEL_SCHEMA = vol.Schema({ATTR_LEVEL: _VALID_LOG_LEVEL}) -SERVICE_SET_LEVEL_SCHEMA = vol.Schema({cv.string: _VALID_LOG_LEVEL}) +SERVICE_SET_DEFAULT_LEVEL_SCHEMA = probatio.Schema({ATTR_LEVEL: _VALID_LOG_LEVEL}) +SERVICE_SET_LEVEL_SCHEMA = probatio.Schema({cv.string: _VALID_LOG_LEVEL}) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Optional(LOGGER_DEFAULT): _VALID_LOG_LEVEL, - vol.Optional(LOGGER_LOGS): vol.Schema({cv.string: _VALID_LOG_LEVEL}), - vol.Optional(LOGGER_FILTERS): vol.Schema({cv.string: [cv.is_regex]}), + probatio.Optional(LOGGER_DEFAULT): _VALID_LOG_LEVEL, + probatio.Optional(LOGGER_LOGS): probatio.Schema( + {cv.string: _VALID_LOG_LEVEL} + ), + probatio.Optional(LOGGER_FILTERS): probatio.Schema( + {cv.string: [cv.is_regex]} + ), } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/logger/websocket_api.py b/homeassistant/components/logger/websocket_api.py index d20dc5cd680a1..605c8c8096eae 100644 --- a/homeassistant/components/logger/websocket_api.py +++ b/homeassistant/components/logger/websocket_api.py @@ -2,7 +2,7 @@ from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.components.websocket_api import ActiveConnection @@ -30,7 +30,7 @@ def async_load_websocket_api(hass: HomeAssistant) -> None: @callback -@websocket_api.websocket_command({vol.Required("type"): "logger/log_info"}) +@websocket_api.websocket_command({probatio.Required("type"): "logger/log_info"}) def handle_integration_log_info( hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any] ) -> None: @@ -61,10 +61,10 @@ def handle_integration_log_info( @websocket_api.websocket_command( { - vol.Required("type"): "logger/integration_log_level", - vol.Required("integration"): str, - vol.Required("level"): vol.In(LOGSEVERITY), - vol.Required("persistence"): vol.Coerce(LogPersistance), + probatio.Required("type"): "logger/integration_log_level", + probatio.Required("integration"): str, + probatio.Required("level"): probatio.In(LOGSEVERITY), + probatio.Required("persistence"): probatio.Coerce(LogPersistance), } ) @websocket_api.require_admin @@ -94,10 +94,10 @@ async def handle_integration_log_level( @websocket_api.websocket_command( { - vol.Required("type"): "logger/log_level", - vol.Required("module"): str, - vol.Required("level"): vol.In(LOGSEVERITY), - vol.Required("persistence"): vol.Coerce(LogPersistance), + probatio.Required("type"): "logger/log_level", + probatio.Required("module"): str, + probatio.Required("level"): probatio.In(LOGSEVERITY), + probatio.Required("persistence"): probatio.Coerce(LogPersistance), } ) @websocket_api.require_admin diff --git a/homeassistant/components/lojack/config_flow.py b/homeassistant/components/lojack/config_flow.py index c25a19a36ca57..77a722d7ba163 100644 --- a/homeassistant/components/lojack/config_flow.py +++ b/homeassistant/components/lojack/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from lojack_api import ApiError, AuthenticationError, LoJackClient -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -15,10 +15,10 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) @@ -104,7 +104,7 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema({vol.Required(CONF_PASSWORD): str}), + data_schema=probatio.Schema({probatio.Required(CONF_PASSWORD): str}), description_placeholders={CONF_USERNAME: reauth_entry.data[CONF_USERNAME]}, errors=errors, ) diff --git a/homeassistant/components/london_air/sensor.py b/homeassistant/components/london_air/sensor.py index 13b53e38e07e4..3b8b920aae702 100644 --- a/homeassistant/components/london_air/sensor.py +++ b/homeassistant/components/london_air/sensor.py @@ -5,8 +5,8 @@ import logging from typing import Any, override +import probatio import requests -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -64,8 +64,8 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_LOCATIONS, default=AUTHORITIES): vol.All( - cv.ensure_list, [vol.In(AUTHORITIES)] + probatio.Optional(CONF_LOCATIONS, default=AUTHORITIES): probatio.All( + cv.ensure_list, [probatio.In(AUTHORITIES)] ) } ) diff --git a/homeassistant/components/london_underground/config_flow.py b/homeassistant/components/london_underground/config_flow.py index e3898ebfc6e6e..92a80977d5487 100644 --- a/homeassistant/components/london_underground/config_flow.py +++ b/homeassistant/components/london_underground/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from london_tube_status import TubeData -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -65,9 +65,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_LINE, default=DEFAULT_LINES, ): selector.SelectSelector( @@ -136,9 +136,9 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_LINE, default=self.config_entry.options.get( CONF_LINE, diff --git a/homeassistant/components/london_underground/sensor.py b/homeassistant/components/london_underground/sensor.py index 1d020616bbe7d..74d6e30f8af65 100644 --- a/homeassistant/components/london_underground/sensor.py +++ b/homeassistant/components/london_underground/sensor.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -27,7 +27,11 @@ _LOGGER = logging.getLogger(__name__) PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_LINE): vol.All(cv.ensure_list, [vol.In(list(TUBE_LINES))])} + { + probatio.Required(CONF_LINE): probatio.All( + cv.ensure_list, [probatio.In(list(TUBE_LINES))] + ) + } ) diff --git a/homeassistant/components/lookin/config_flow.py b/homeassistant/components/lookin/config_flow.py index 0691fdb68d0b7..9914819b21315 100644 --- a/homeassistant/components/lookin/config_flow.py +++ b/homeassistant/components/lookin/config_flow.py @@ -5,7 +5,7 @@ import aiohttp from aiolookin import Device, LookInHttpProtocol, NoUsableService -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST @@ -79,7 +79,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_HOST): str}), + data_schema=probatio.Schema({probatio.Required(CONF_HOST): str}), errors=errors, ) diff --git a/homeassistant/components/loqed/config_flow.py b/homeassistant/components/loqed/config_flow.py index 9f0a2add5c019..70a8aa7a0a73c 100644 --- a/homeassistant/components/loqed/config_flow.py +++ b/homeassistant/components/loqed/config_flow.py @@ -6,7 +6,7 @@ import aiohttp from loqedAPI import cloud_loqed, loqed -import voluptuous as vol +import probatio from homeassistant.components import webhook from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -116,9 +116,9 @@ async def async_step_user( self, user_input: dict[str, Any] | None = None ) -> ConfigFlowResult: """Show userform to user.""" - user_data_schema = vol.Schema( + user_data_schema = probatio.Schema( { - vol.Required(CONF_API_TOKEN): str, + probatio.Required(CONF_API_TOKEN): str, } ) @@ -214,9 +214,9 @@ async def async_step_pick_lock( return self.async_show_form( step_id="pick_lock", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required("lock_id"): vol.In(lock_options), + probatio.Required("lock_id"): probatio.In(lock_options), } ), ) diff --git a/homeassistant/components/lovelace/__init__.py b/homeassistant/components/lovelace/__init__.py index 1a02378b16b7e..8b468f29acab8 100644 --- a/homeassistant/components/lovelace/__init__.py +++ b/homeassistant/components/lovelace/__init__.py @@ -8,7 +8,7 @@ from typing import Any from urllib.parse import unquote, urlsplit -import voluptuous as vol +import probatio from homeassistant.components import frontend, onboarding, websocket_api from homeassistant.config import ( @@ -63,46 +63,46 @@ def _validate_url_slug(value: Any) -> str: """Validate value is a valid url slug.""" if value is None: - raise vol.Invalid("Slug should not be None") + raise probatio.Invalid("Slug should not be None") if value != "lovelace" and "-" not in value: - raise vol.Invalid("Url path needs to contain a hyphen (-)") + raise probatio.Invalid("Url path needs to contain a hyphen (-)") str_value = str(value) slg = slugify(str_value, separator="-") if str_value == slg: return str_value - raise vol.Invalid(f"invalid slug {value} (try {slg})") + raise probatio.Invalid(f"invalid slug {value} (try {slg})") CONF_DASHBOARDS = "dashboards" -YAML_DASHBOARD_SCHEMA = vol.Schema( +YAML_DASHBOARD_SCHEMA = probatio.Schema( { **DASHBOARD_BASE_CREATE_FIELDS, - vol.Required(CONF_MODE): MODE_YAML, - vol.Required(CONF_FILENAME): cv.path, + probatio.Required(CONF_MODE): MODE_YAML, + probatio.Required(CONF_FILENAME): cv.path, } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Optional(DOMAIN, default={}): vol.Schema( + probatio.Optional(DOMAIN, default={}): probatio.Schema( { # Deprecated - Remove in 2026.8 - vol.Optional(CONF_MODE, default=MODE_STORAGE): vol.All( - vol.Lower, vol.In([MODE_YAML, MODE_STORAGE]) + probatio.Optional(CONF_MODE, default=MODE_STORAGE): probatio.All( + probatio.Lower, probatio.In([MODE_YAML, MODE_STORAGE]) ), - vol.Optional(CONF_RESOURCE_MODE): vol.All( - vol.Lower, vol.In([MODE_YAML, MODE_STORAGE]) + probatio.Optional(CONF_RESOURCE_MODE): probatio.All( + probatio.Lower, probatio.In([MODE_YAML, MODE_STORAGE]) ), - vol.Optional(CONF_DASHBOARDS): cv.schema_with_slug_keys( + probatio.Optional(CONF_DASHBOARDS): cv.schema_with_slug_keys( YAML_DASHBOARD_SCHEMA, slug_validator=_validate_url_slug, ), - vol.Optional(CONF_RESOURCES): [RESOURCE_SCHEMA], + probatio.Optional(CONF_RESOURCES): [RESOURCE_SCHEMA], } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) @@ -481,7 +481,7 @@ async def _async_migrate_default_config( CONF_URL_PATH: DOMAIN, } ) - except HomeAssistantError, vol.Invalid: + except HomeAssistantError, probatio.Invalid: _LOGGER.exception("Failed to create dashboard entry during migration") return diff --git a/homeassistant/components/lovelace/const.py b/homeassistant/components/lovelace/const.py index b79946b57b47e..9b42415119e57 100644 --- a/homeassistant/components/lovelace/const.py +++ b/homeassistant/components/lovelace/const.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_ICON, @@ -36,24 +36,24 @@ RESOURCE_TYPES = ["js", "css", "module", "html"] RESOURCE_FIELDS = { - CONF_TYPE: vol.In(RESOURCE_TYPES), + CONF_TYPE: probatio.In(RESOURCE_TYPES), CONF_URL: cv.string, } -RESOURCE_SCHEMA = vol.Schema(RESOURCE_FIELDS) +RESOURCE_SCHEMA = probatio.Schema(RESOURCE_FIELDS) RESOURCE_CREATE_FIELDS: VolDictType = { - vol.Required(CONF_RESOURCE_TYPE_WS): vol.In(RESOURCE_TYPES), - vol.Required(CONF_URL): cv.string, + probatio.Required(CONF_RESOURCE_TYPE_WS): probatio.In(RESOURCE_TYPES), + probatio.Required(CONF_URL): cv.string, } RESOURCE_UPDATE_FIELDS: VolDictType = { - vol.Optional(CONF_RESOURCE_TYPE_WS): vol.In(RESOURCE_TYPES), - vol.Optional(CONF_URL): cv.string, + probatio.Optional(CONF_RESOURCE_TYPE_WS): probatio.In(RESOURCE_TYPES), + probatio.Optional(CONF_URL): cv.string, } SERVICE_RELOAD_RESOURCES = "reload_resources" -RESOURCE_RELOAD_SERVICE_SCHEMA = vol.Schema({}) +RESOURCE_RELOAD_SERVICE_SCHEMA = probatio.Schema({}) CONF_RESOURCE_MODE = "resource_mode" CONF_TITLE = "title" @@ -61,29 +61,29 @@ CONF_SHOW_IN_SIDEBAR = "show_in_sidebar" DASHBOARD_BASE_CREATE_FIELDS: VolDictType = { - vol.Optional(CONF_REQUIRE_ADMIN, default=False): cv.boolean, - vol.Optional(CONF_ICON): cv.icon, - vol.Required(CONF_TITLE): cv.string, - vol.Optional(CONF_SHOW_IN_SIDEBAR, default=True): cv.boolean, + probatio.Optional(CONF_REQUIRE_ADMIN, default=False): cv.boolean, + probatio.Optional(CONF_ICON): cv.icon, + probatio.Required(CONF_TITLE): cv.string, + probatio.Optional(CONF_SHOW_IN_SIDEBAR, default=True): cv.boolean, } DASHBOARD_BASE_UPDATE_FIELDS: VolDictType = { - vol.Optional(CONF_REQUIRE_ADMIN): cv.boolean, - vol.Optional(CONF_ICON): vol.Any(cv.icon, None), - vol.Optional(CONF_TITLE): cv.string, - vol.Optional(CONF_SHOW_IN_SIDEBAR): cv.boolean, + probatio.Optional(CONF_REQUIRE_ADMIN): cv.boolean, + probatio.Optional(CONF_ICON): probatio.Any(cv.icon, None), + probatio.Optional(CONF_TITLE): cv.string, + probatio.Optional(CONF_SHOW_IN_SIDEBAR): cv.boolean, } STORAGE_DASHBOARD_CREATE_FIELDS: VolDictType = { **DASHBOARD_BASE_CREATE_FIELDS, - vol.Required(CONF_URL_PATH): cv.string, + probatio.Required(CONF_URL_PATH): cv.string, # For now we write "storage" as all modes. # In future we can adjust this to be other modes. - vol.Optional(CONF_MODE, default=MODE_STORAGE): MODE_STORAGE, + probatio.Optional(CONF_MODE, default=MODE_STORAGE): MODE_STORAGE, # Set to allow adding dashboard without hyphen - vol.Optional(CONF_ALLOW_SINGLE_WORD): bool, + probatio.Optional(CONF_ALLOW_SINGLE_WORD): bool, } STORAGE_DASHBOARD_UPDATE_FIELDS = DASHBOARD_BASE_UPDATE_FIELDS diff --git a/homeassistant/components/lovelace/dashboard.py b/homeassistant/components/lovelace/dashboard.py index 3217fb89854c0..ed04382949247 100644 --- a/homeassistant/components/lovelace/dashboard.py +++ b/homeassistant/components/lovelace/dashboard.py @@ -7,7 +7,7 @@ import time from typing import TYPE_CHECKING, Any, override -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.components.frontend import async_panel_exists @@ -276,8 +276,8 @@ def _config_info(mode: str, config: dict[str, Any]) -> dict[str, Any]: class DashboardsCollection(collection.DictStorageCollection): """Collection of dashboards.""" - CREATE_SCHEMA = vol.Schema(STORAGE_DASHBOARD_CREATE_FIELDS) - UPDATE_SCHEMA = vol.Schema(STORAGE_DASHBOARD_UPDATE_FIELDS) + CREATE_SCHEMA = probatio.Schema(STORAGE_DASHBOARD_CREATE_FIELDS) + UPDATE_SCHEMA = probatio.Schema(STORAGE_DASHBOARD_UPDATE_FIELDS) def __init__(self, hass: HomeAssistant) -> None: """Initialize the dashboards collection.""" @@ -293,7 +293,7 @@ async def _process_create_data(self, data: dict) -> dict: allow_single_word = data.pop(CONF_ALLOW_SINGLE_WORD, False) if not allow_single_word and "-" not in url_path: - raise vol.Invalid("Url path needs to contain a hyphen (-)") + raise probatio.Invalid("Url path needs to contain a hyphen (-)") if async_panel_exists(self.hass, url_path): raise HomeAssistantError( diff --git a/homeassistant/components/lovelace/resources.py b/homeassistant/components/lovelace/resources.py index 2ea38ca3a803c..2d0edd4fff69f 100644 --- a/homeassistant/components/lovelace/resources.py +++ b/homeassistant/components/lovelace/resources.py @@ -4,7 +4,7 @@ from typing import Any, override import uuid -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.const import CONF_ID, CONF_RESOURCES, CONF_TYPE @@ -50,8 +50,8 @@ class ResourceStorageCollection(collection.DictStorageCollection): """Collection to store resources.""" loaded = False - CREATE_SCHEMA = vol.Schema(RESOURCE_CREATE_FIELDS) - UPDATE_SCHEMA = vol.Schema(RESOURCE_UPDATE_FIELDS) + CREATE_SCHEMA = probatio.Schema(RESOURCE_CREATE_FIELDS) + UPDATE_SCHEMA = probatio.Schema(RESOURCE_UPDATE_FIELDS) def __init__(self, hass: HomeAssistant, ll_config: LovelaceConfig) -> None: """Initialize the storage collection.""" @@ -108,8 +108,8 @@ async def _async_load_data(self) -> collection.SerializedStorageCollection | Non resources: list[dict[str, Any]] = conf[CONF_RESOURCES] try: - vol.Schema([RESOURCE_SCHEMA])(resources) - except vol.Invalid as err: + probatio.Schema([RESOURCE_SCHEMA])(resources) + except probatio.Invalid as err: _LOGGER.warning("Resource import failed. Data invalid: %s", err) return None @@ -164,7 +164,7 @@ def async_setup(self, hass: HomeAssistant) -> None: self.api_prefix, self.ws_list_item, websocket_api.BASE_COMMAND_MESSAGE_SCHEMA.extend( - {vol.Required("type"): f"{self.api_prefix}"} + {probatio.Required("type"): f"{self.api_prefix}"} ), ) diff --git a/homeassistant/components/lovelace/websocket.py b/homeassistant/components/lovelace/websocket.py index d1137e173bff1..12b8dd25353b5 100644 --- a/homeassistant/components/lovelace/websocket.py +++ b/homeassistant/components/lovelace/websocket.py @@ -4,7 +4,7 @@ from functools import wraps from typing import TYPE_CHECKING, Any -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.core import HomeAssistant @@ -130,8 +130,8 @@ async def websocket_lovelace_info( @websocket_api.websocket_command( { "type": "lovelace/config", - vol.Optional("force", default=False): bool, - vol.Optional(CONF_URL_PATH): vol.Any(None, cv.string), + probatio.Optional("force", default=False): bool, + probatio.Optional(CONF_URL_PATH): probatio.Any(None, cv.string), } ) @websocket_api.async_response @@ -150,8 +150,8 @@ async def websocket_lovelace_config( @websocket_api.websocket_command( { "type": "lovelace/config/save", - "config": vol.Any(str, dict), - vol.Optional(CONF_URL_PATH): vol.Any(None, cv.string), + "config": probatio.Any(str, dict), + probatio.Optional(CONF_URL_PATH): probatio.Any(None, cv.string), } ) @websocket_api.async_response @@ -170,7 +170,7 @@ async def websocket_lovelace_save_config( @websocket_api.websocket_command( { "type": "lovelace/config/delete", - vol.Optional(CONF_URL_PATH): vol.Any(None, cv.string), + probatio.Optional(CONF_URL_PATH): probatio.Any(None, cv.string), } ) @websocket_api.async_response diff --git a/homeassistant/components/luci/config_flow.py b/homeassistant/components/luci/config_flow.py index c5c8a191ab1f9..251d9629adcda 100644 --- a/homeassistant/components/luci/config_flow.py +++ b/homeassistant/components/luci/config_flow.py @@ -4,8 +4,8 @@ from typing import Any, override from openwrt_luci_rpc import OpenWrtRpc +import probatio from requests.exceptions import ConnectionError as RequestsConnectionError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -18,13 +18,13 @@ from .const import DEFAULT_SSL, DEFAULT_VERIFY_SSL, DOMAIN -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Optional(CONF_SSL, default=DEFAULT_SSL): bool, - vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): bool, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Optional(CONF_SSL, default=DEFAULT_SSL): bool, + probatio.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): bool, } ) @@ -100,10 +100,10 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, diff --git a/homeassistant/components/luci/device_tracker.py b/homeassistant/components/luci/device_tracker.py index 510ba0402f127..db0f124621b1f 100644 --- a/homeassistant/components/luci/device_tracker.py +++ b/homeassistant/components/luci/device_tracker.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.device_tracker import ( PLATFORM_SCHEMA as DEVICE_TRACKER_PLATFORM_SCHEMA, @@ -35,11 +35,11 @@ PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, - vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, + probatio.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, } ) diff --git a/homeassistant/components/luftdaten/config_flow.py b/homeassistant/components/luftdaten/config_flow.py index 27319fc99cf34..fc1ef06ac9e07 100644 --- a/homeassistant/components/luftdaten/config_flow.py +++ b/homeassistant/components/luftdaten/config_flow.py @@ -4,7 +4,7 @@ from luftdaten import Luftdaten from luftdaten.exceptions import LuftdatenConnectionError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_SHOW_ON_MAP @@ -24,10 +24,10 @@ def _show_form(self, errors: dict[str, str] | None = None) -> ConfigFlowResult: """Show the form to the user.""" return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_SENSOR_ID): cv.positive_int, - vol.Optional(CONF_SHOW_ON_MAP, default=False): bool, + probatio.Required(CONF_SENSOR_ID): cv.positive_int, + probatio.Optional(CONF_SHOW_ON_MAP, default=False): bool, } ), errors=errors or {}, diff --git a/homeassistant/components/lunatone/config_flow.py b/homeassistant/components/lunatone/config_flow.py index 88f54701e4efd..5231c0cc15b4c 100644 --- a/homeassistant/components/lunatone/config_flow.py +++ b/homeassistant/components/lunatone/config_flow.py @@ -4,7 +4,7 @@ import aiohttp from lunatone_rest_api_client import Auth, Info -import voluptuous as vol +import probatio from yarl import URL from homeassistant.config_entries import ( @@ -19,8 +19,8 @@ from .const import DOMAIN -DATA_SCHEMA: Final[vol.Schema] = vol.Schema( - {vol.Required(CONF_URL, default="http://"): cv.string}, +DATA_SCHEMA: Final[probatio.Schema] = probatio.Schema( + {probatio.Required(CONF_URL, default="http://"): cv.string}, ) @@ -127,8 +127,8 @@ async def async_step_reconfigure( entry = self._get_reconfigure_entry() return self.async_show_form( step_id="reconfigure", - data_schema=vol.Schema( - {vol.Required(CONF_URL, default=entry.data[CONF_URL]): cv.string}, + data_schema=probatio.Schema( + {probatio.Required(CONF_URL, default=entry.data[CONF_URL]): cv.string}, ), description_placeholders={CONF_NAME: entry.title}, ) diff --git a/homeassistant/components/lupusec/config_flow.py b/homeassistant/components/lupusec/config_flow.py index e10e46714d323..9c158043f4899 100644 --- a/homeassistant/components/lupusec/config_flow.py +++ b/homeassistant/components/lupusec/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override import lupupy -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME @@ -16,11 +16,11 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/lutron/config_flow.py b/homeassistant/components/lutron/config_flow.py index f6725a5d7c84d..6da52295a1b71 100644 --- a/homeassistant/components/lutron/config_flow.py +++ b/homeassistant/components/lutron/config_flow.py @@ -4,8 +4,8 @@ from typing import Any, override from urllib.error import HTTPError +import probatio from pylutron import Lutron -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, OptionsFlow from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME @@ -67,11 +67,11 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_USERNAME, default="lutron"): str, - vol.Required(CONF_PASSWORD, default="integration"): str, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_USERNAME, default="lutron"): str, + probatio.Required(CONF_PASSWORD, default="integration"): str, } ), errors=errors, @@ -97,9 +97,9 @@ async def async_step_init( if user_input is not None: return self.async_create_entry(title="", data=user_input) - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required( + probatio.Required( CONF_DEFAULT_DIMMER_LEVEL, default=self.config_entry.options.get( CONF_DEFAULT_DIMMER_LEVEL, DEFAULT_DIMMER_LEVEL diff --git a/homeassistant/components/lutron_caseta/__init__.py b/homeassistant/components/lutron_caseta/__init__.py index 23f9b809f4931..fef08f16cb312 100644 --- a/homeassistant/components/lutron_caseta/__init__.py +++ b/homeassistant/components/lutron_caseta/__init__.py @@ -6,9 +6,9 @@ import ssl from typing import Any, cast +import probatio from pylutron_caseta import BUTTON_STATUS_MULTITAP, BUTTON_STATUS_PRESSED from pylutron_caseta.smartbridge import Smartbridge -import voluptuous as vol from homeassistant import config_entries from homeassistant.const import ATTR_DEVICE_ID, CONF_HOST, Platform @@ -76,21 +76,21 @@ DATA_BRIDGE_CONFIG = "lutron_caseta_bridges" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.All( + DOMAIN: probatio.All( cv.ensure_list, [ { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_KEYFILE): cv.string, - vol.Required(CONF_CERTFILE): cv.string, - vol.Required(CONF_CA_CERTS): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_KEYFILE): cv.string, + probatio.Required(CONF_CERTFILE): cv.string, + probatio.Required(CONF_CA_CERTS): cv.string, } ], ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) PLATFORMS = [ @@ -340,13 +340,13 @@ def _async_setup_keypads( @callback def _async_build_trigger_schemas( keypad_button_names_to_leap: dict[int, dict[str, int]], -) -> dict[int, vol.Schema]: +) -> dict[int, probatio.Schema]: """Build device trigger schemas.""" return { keypad_id: LUTRON_BUTTON_TRIGGER_SCHEMA.extend( { - vol.Required(CONF_SUBTYPE): vol.In( + probatio.Required(CONF_SUBTYPE): probatio.In( keypad_button_names_to_leap[keypad_id] ), } diff --git a/homeassistant/components/lutron_caseta/config_flow.py b/homeassistant/components/lutron_caseta/config_flow.py index 8c2620f80e0aa..77999e4e5d089 100644 --- a/homeassistant/components/lutron_caseta/config_flow.py +++ b/homeassistant/components/lutron_caseta/config_flow.py @@ -6,9 +6,9 @@ import ssl from typing import Any, override +import probatio from pylutron_caseta.pairing import PAIR_CA, PAIR_CERT, PAIR_KEY, async_pair from pylutron_caseta.smartbridge import Smartbridge -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_NAME @@ -41,7 +41,7 @@ ENTRY_DEFAULT_TITLE = "Caséta bridge" -DATA_SCHEMA_USER = vol.Schema({vol.Required(CONF_HOST): str}) +DATA_SCHEMA_USER = probatio.Schema({probatio.Required(CONF_HOST): str}) TLS_ASSET_TEMPLATE = "lutron_caseta-{}-{}.pem" diff --git a/homeassistant/components/lutron_caseta/device_trigger.py b/homeassistant/components/lutron_caseta/device_trigger.py index 379d2ce094eb3..1b33f4ea8b901 100644 --- a/homeassistant/components/lutron_caseta/device_trigger.py +++ b/homeassistant/components/lutron_caseta/device_trigger.py @@ -3,7 +3,7 @@ import logging from typing import cast -import voluptuous as vol +import probatio from homeassistant.components.device_automation import DEVICE_TRIGGER_BASE_SCHEMA from homeassistant.components.homeassistant.triggers import event as event_trigger @@ -55,7 +55,7 @@ def _reverse_dict(forward_dict: dict) -> dict: LUTRON_BUTTON_TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): vol.In(SUPPORTED_INPUTS_EVENTS_TYPES), + probatio.Required(CONF_TYPE): probatio.In(SUPPORTED_INPUTS_EVENTS_TYPES), } ) @@ -84,7 +84,7 @@ def _reverse_dict(forward_dict: dict) -> dict: } PICO_2_BUTTON_TRIGGER_SCHEMA = LUTRON_BUTTON_TRIGGER_SCHEMA.extend( { - vol.Required(CONF_SUBTYPE): vol.In(PICO_2_BUTTON_BUTTON_TYPES_TO_LIP), + probatio.Required(CONF_SUBTYPE): probatio.In(PICO_2_BUTTON_BUTTON_TYPES_TO_LIP), } ) @@ -103,7 +103,7 @@ def _reverse_dict(forward_dict: dict) -> dict: } PICO_2_BUTTON_RAISE_LOWER_TRIGGER_SCHEMA = LUTRON_BUTTON_TRIGGER_SCHEMA.extend( { - vol.Required(CONF_SUBTYPE): vol.In( + probatio.Required(CONF_SUBTYPE): probatio.In( PICO_2_BUTTON_RAISE_LOWER_BUTTON_TYPES_TO_LIP ), } @@ -122,7 +122,7 @@ def _reverse_dict(forward_dict: dict) -> dict: } PICO_3_BUTTON_TRIGGER_SCHEMA = LUTRON_BUTTON_TRIGGER_SCHEMA.extend( { - vol.Required(CONF_SUBTYPE): vol.In(PICO_3_BUTTON_BUTTON_TYPES_TO_LIP), + probatio.Required(CONF_SUBTYPE): probatio.In(PICO_3_BUTTON_BUTTON_TYPES_TO_LIP), } ) @@ -142,7 +142,7 @@ def _reverse_dict(forward_dict: dict) -> dict: } PICO_3_BUTTON_RAISE_LOWER_TRIGGER_SCHEMA = LUTRON_BUTTON_TRIGGER_SCHEMA.extend( { - vol.Required(CONF_SUBTYPE): vol.In( + probatio.Required(CONF_SUBTYPE): probatio.In( PICO_3_BUTTON_RAISE_LOWER_BUTTON_TYPES_TO_LIP ), } @@ -165,7 +165,7 @@ def _reverse_dict(forward_dict: dict) -> dict: } PICO_4_BUTTON_TRIGGER_SCHEMA = LUTRON_BUTTON_TRIGGER_SCHEMA.extend( { - vol.Required(CONF_SUBTYPE): vol.In(PICO_4_BUTTON_BUTTON_TYPES_TO_LIP), + probatio.Required(CONF_SUBTYPE): probatio.In(PICO_4_BUTTON_BUTTON_TYPES_TO_LIP), } ) @@ -187,7 +187,9 @@ def _reverse_dict(forward_dict: dict) -> dict: } PICO_4_BUTTON_ZONE_TRIGGER_SCHEMA = LUTRON_BUTTON_TRIGGER_SCHEMA.extend( { - vol.Required(CONF_SUBTYPE): vol.In(PICO_4_BUTTON_ZONE_BUTTON_TYPES_TO_LIP), + probatio.Required(CONF_SUBTYPE): probatio.In( + PICO_4_BUTTON_ZONE_BUTTON_TYPES_TO_LIP + ), } ) @@ -206,7 +208,9 @@ def _reverse_dict(forward_dict: dict) -> dict: } PICO_4_BUTTON_SCENE_TRIGGER_SCHEMA = LUTRON_BUTTON_TRIGGER_SCHEMA.extend( { - vol.Required(CONF_SUBTYPE): vol.In(PICO_4_BUTTON_SCENE_BUTTON_TYPES_TO_LIP), + probatio.Required(CONF_SUBTYPE): probatio.In( + PICO_4_BUTTON_SCENE_BUTTON_TYPES_TO_LIP + ), } ) @@ -225,7 +229,9 @@ def _reverse_dict(forward_dict: dict) -> dict: } PICO_4_BUTTON_2_GROUP_TRIGGER_SCHEMA = LUTRON_BUTTON_TRIGGER_SCHEMA.extend( { - vol.Required(CONF_SUBTYPE): vol.In(PICO_4_BUTTON_2_GROUP_BUTTON_TYPES_TO_LIP), + probatio.Required(CONF_SUBTYPE): probatio.In( + PICO_4_BUTTON_2_GROUP_BUTTON_TYPES_TO_LIP + ), } ) @@ -285,7 +291,9 @@ def _reverse_dict(forward_dict: dict) -> dict: } FOUR_GROUP_REMOTE_TRIGGER_SCHEMA = LUTRON_BUTTON_TRIGGER_SCHEMA.extend( { - vol.Required(CONF_SUBTYPE): vol.In(FOUR_GROUP_REMOTE_BUTTON_TYPES_TO_LIP), + probatio.Required(CONF_SUBTYPE): probatio.In( + FOUR_GROUP_REMOTE_BUTTON_TYPES_TO_LIP + ), } ) @@ -300,7 +308,9 @@ def _reverse_dict(forward_dict: dict) -> dict: } PADDLE_SWITCH_PICO_TRIGGER_SCHEMA = LUTRON_BUTTON_TRIGGER_SCHEMA.extend( { - vol.Required(CONF_SUBTYPE): vol.In(PADDLE_SWITCH_PICO_BUTTON_TYPES_TO_LIP), + probatio.Required(CONF_SUBTYPE): probatio.In( + PADDLE_SWITCH_PICO_BUTTON_TYPES_TO_LIP + ), } ) @@ -348,7 +358,7 @@ def _reverse_dict(forward_dict: dict) -> dict: k: _reverse_dict(v) for k, v in DEVICE_TYPE_SUBTYPE_MAP_TO_LEAP.items() } -TRIGGER_SCHEMA = vol.Any( +TRIGGER_SCHEMA = probatio.Any( PICO_2_BUTTON_TRIGGER_SCHEMA, PICO_3_BUTTON_RAISE_LOWER_TRIGGER_SCHEMA, PICO_4_BUTTON_TRIGGER_SCHEMA, diff --git a/homeassistant/components/lutron_caseta/models.py b/homeassistant/components/lutron_caseta/models.py index 722f1c0bf016d..39c98b928e346 100644 --- a/homeassistant/components/lutron_caseta/models.py +++ b/homeassistant/components/lutron_caseta/models.py @@ -3,8 +3,8 @@ from dataclasses import dataclass from typing import Any, Final, TypedDict +import probatio from pylutron_caseta.smartbridge import Smartbridge -import voluptuous as vol from homeassistant.config_entries import ConfigEntry from homeassistant.helpers.device_registry import DeviceInfo @@ -30,7 +30,7 @@ class LutronKeypadData: keypads: dict[int, LutronKeypad] buttons: dict[int, LutronButton] button_names_to_leap: dict[int, dict[str, int]] - trigger_schemas: dict[int, vol.Schema] + trigger_schemas: dict[int, probatio.Schema] class LutronKeypad(TypedDict): diff --git a/homeassistant/components/lw12wifi/light.py b/homeassistant/components/lw12wifi/light.py index 4579e0695eb0a..e5aca5cae6b5c 100644 --- a/homeassistant/components/lw12wifi/light.py +++ b/homeassistant/components/lw12wifi/light.py @@ -4,7 +4,7 @@ from typing import Any, override import lw12 -import voluptuous as vol +import probatio from homeassistant.components.light import ( ATTR_BRIGHTNESS, @@ -31,9 +31,9 @@ PLATFORM_SCHEMA = LIGHT_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/lyngdorf/config_flow.py b/homeassistant/components/lyngdorf/config_flow.py index 16f0d62664f37..7e255bcb44bbf 100644 --- a/homeassistant/components/lyngdorf/config_flow.py +++ b/homeassistant/components/lyngdorf/config_flow.py @@ -11,7 +11,7 @@ fetch_device_serial, lookup_model, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_MODEL @@ -80,9 +80,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST): cv.string, + probatio.Required(CONF_HOST): cv.string, } ), errors=errors, @@ -159,7 +159,7 @@ async def async_step_reconfigure( return self.async_show_form( step_id="reconfigure", data_schema=self.add_suggested_values_to_schema( - vol.Schema({vol.Required(CONF_HOST): cv.string}), + probatio.Schema({probatio.Required(CONF_HOST): cv.string}), reconfigure_entry.data, ), errors=errors, diff --git a/homeassistant/components/lyric/climate.py b/homeassistant/components/lyric/climate.py index 057d2401e2be6..449e56662c846 100644 --- a/homeassistant/components/lyric/climate.py +++ b/homeassistant/components/lyric/climate.py @@ -8,7 +8,7 @@ from aiolyric.objects.device import LyricDevice from aiolyric.objects.location import LyricLocation -import voluptuous as vol +import probatio from homeassistant.components.climate import ( ATTR_TARGET_TEMP_HIGH, @@ -108,7 +108,7 @@ ATTR_TIME_PERIOD = "time_period" SCHEMA_HOLD_TIME: VolDictType = { - vol.Required(ATTR_TIME_PERIOD, default="01:00:00"): vol.All( + probatio.Required(ATTR_TIME_PERIOD, default="01:00:00"): probatio.All( cv.time_period, cv.positive_timedelta, lambda td: strftime("%H:%M:%S", localtime(time() + td.total_seconds())), diff --git a/homeassistant/components/madvr/config_flow.py b/homeassistant/components/madvr/config_flow.py index c908c74c9e83c..6b791e87bd503 100644 --- a/homeassistant/components/madvr/config_flow.py +++ b/homeassistant/components/madvr/config_flow.py @@ -4,8 +4,8 @@ import logging from typing import Any, override +import probatio from pymadvr.madvr import Madvr -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_RECONFIGURE, @@ -20,10 +20,10 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, } ) diff --git a/homeassistant/components/mailgun/__init__.py b/homeassistant/components/mailgun/__init__.py index 3489c3303be49..4a7e412fd1f42 100644 --- a/homeassistant/components/mailgun/__init__.py +++ b/homeassistant/components/mailgun/__init__.py @@ -6,7 +6,7 @@ import logging from aiohttp import web -import voluptuous as vol +import probatio from homeassistant.components import webhook from homeassistant.config_entries import ConfigEntry @@ -25,17 +25,17 @@ MESSAGE_RECEIVED = f"{DOMAIN}_message_received" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Optional(DOMAIN): vol.Schema( + probatio.Optional(DOMAIN): probatio.Schema( { - vol.Required(CONF_API_KEY): cv.string, - vol.Required(CONF_DOMAIN): cv.string, - vol.Optional(CONF_SANDBOX, default=DEFAULT_SANDBOX): cv.boolean, + probatio.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_DOMAIN): cv.string, + probatio.Optional(CONF_SANDBOX, default=DEFAULT_SANDBOX): cv.boolean, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/mailgun/notify.py b/homeassistant/components/mailgun/notify.py index e4faa8bf1d45d..2cf5b36ed47db 100644 --- a/homeassistant/components/mailgun/notify.py +++ b/homeassistant/components/mailgun/notify.py @@ -3,13 +3,13 @@ import logging from typing import Any, override +import probatio from pymailgunner import ( Client, MailgunCredentialsError, MailgunDomainError, MailgunError, ) -import voluptuous as vol from homeassistant.components.notify import ( ATTR_DATA, @@ -34,7 +34,10 @@ DEFAULT_SANDBOX = False PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_RECIPIENT): vol.Email(), vol.Optional(CONF_SENDER): vol.Email()} + { + probatio.Required(CONF_RECIPIENT): probatio.Email(), + probatio.Optional(CONF_SENDER): probatio.Email(), + } ) diff --git a/homeassistant/components/manual/alarm_control_panel.py b/homeassistant/components/manual/alarm_control_panel.py index f6f196bbce4b5..888b03fe1fe70 100644 --- a/homeassistant/components/manual/alarm_control_panel.py +++ b/homeassistant/components/manual/alarm_control_panel.py @@ -3,7 +3,7 @@ import datetime from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.alarm_control_panel import ( PLATFORM_SCHEMA as ALARM_CONTROL_PANEL_PLATFORM_SCHEMA, @@ -110,66 +110,66 @@ def _state_validator( return config -def _state_schema(state: str) -> vol.Schema: +def _state_schema(state: str) -> probatio.Schema: """Validate the state.""" schema = {} if state in SUPPORTED_PRETRIGGER_STATES: - schema[vol.Optional(CONF_DELAY_TIME)] = vol.All( + schema[probatio.Optional(CONF_DELAY_TIME)] = probatio.All( cv.time_period, cv.positive_timedelta ) - schema[vol.Optional(CONF_TRIGGER_TIME)] = vol.All( + schema[probatio.Optional(CONF_TRIGGER_TIME)] = probatio.All( cv.time_period, cv.positive_timedelta ) if state in SUPPORTED_ARMING_STATES: - schema[vol.Optional(CONF_ARMING_TIME)] = vol.All( + schema[probatio.Optional(CONF_ARMING_TIME)] = probatio.All( cv.time_period, cv.positive_timedelta ) - return vol.Schema(schema) + return probatio.Schema(schema) -PLATFORM_SCHEMA = vol.Schema( - vol.All( +PLATFORM_SCHEMA = probatio.Schema( + probatio.All( ALARM_CONTROL_PANEL_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_NAME, default=DEFAULT_ALARM_NAME): cv.string, - vol.Optional(CONF_UNIQUE_ID): cv.string, - vol.Exclusive(CONF_CODE, "code validation"): cv.string, - vol.Exclusive(CONF_CODE_TEMPLATE, "code validation"): cv.template, - vol.Optional(CONF_CODE_ARM_REQUIRED, default=True): cv.boolean, - vol.Optional(CONF_DELAY_TIME, default=DEFAULT_DELAY_TIME): vol.All( - cv.time_period, cv.positive_timedelta - ), - vol.Optional(CONF_ARMING_TIME, default=DEFAULT_ARMING_TIME): vol.All( - cv.time_period, cv.positive_timedelta - ), - vol.Optional(CONF_TRIGGER_TIME, default=DEFAULT_TRIGGER_TIME): vol.All( - cv.time_period, cv.positive_timedelta - ), - vol.Optional( + probatio.Optional(CONF_NAME, default=DEFAULT_ALARM_NAME): cv.string, + probatio.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Exclusive(CONF_CODE, "code validation"): cv.string, + probatio.Exclusive(CONF_CODE_TEMPLATE, "code validation"): cv.template, + probatio.Optional(CONF_CODE_ARM_REQUIRED, default=True): cv.boolean, + probatio.Optional( + CONF_DELAY_TIME, default=DEFAULT_DELAY_TIME + ): probatio.All(cv.time_period, cv.positive_timedelta), + probatio.Optional( + CONF_ARMING_TIME, default=DEFAULT_ARMING_TIME + ): probatio.All(cv.time_period, cv.positive_timedelta), + probatio.Optional( + CONF_TRIGGER_TIME, default=DEFAULT_TRIGGER_TIME + ): probatio.All(cv.time_period, cv.positive_timedelta), + probatio.Optional( CONF_DISARM_AFTER_TRIGGER, default=DEFAULT_DISARM_AFTER_TRIGGER ): cv.boolean, - vol.Optional( + probatio.Optional( CONF_ARMING_STATES, default=SUPPORTED_ARMING_STATES - ): vol.All(cv.ensure_list, [vol.In(SUPPORTED_ARMING_STATES)]), - vol.Optional(CONF_ALARM_ARMED_AWAY, default={}): _state_schema( + ): probatio.All(cv.ensure_list, [probatio.In(SUPPORTED_ARMING_STATES)]), + probatio.Optional(CONF_ALARM_ARMED_AWAY, default={}): _state_schema( AlarmControlPanelState.ARMED_AWAY ), - vol.Optional(CONF_ALARM_ARMED_HOME, default={}): _state_schema( + probatio.Optional(CONF_ALARM_ARMED_HOME, default={}): _state_schema( AlarmControlPanelState.ARMED_HOME ), - vol.Optional(CONF_ALARM_ARMED_NIGHT, default={}): _state_schema( + probatio.Optional(CONF_ALARM_ARMED_NIGHT, default={}): _state_schema( AlarmControlPanelState.ARMED_NIGHT ), - vol.Optional(CONF_ALARM_ARMED_VACATION, default={}): _state_schema( + probatio.Optional(CONF_ALARM_ARMED_VACATION, default={}): _state_schema( AlarmControlPanelState.ARMED_VACATION ), - vol.Optional(CONF_ALARM_ARMED_CUSTOM_BYPASS, default={}): _state_schema( - AlarmControlPanelState.ARMED_CUSTOM_BYPASS - ), - vol.Optional(CONF_ALARM_DISARMED, default={}): _state_schema( + probatio.Optional( + CONF_ALARM_ARMED_CUSTOM_BYPASS, default={} + ): _state_schema(AlarmControlPanelState.ARMED_CUSTOM_BYPASS), + probatio.Optional(CONF_ALARM_DISARMED, default={}): _state_schema( AlarmControlPanelState.DISARMED ), - vol.Optional(CONF_ALARM_TRIGGERED, default={}): _state_schema( + probatio.Optional(CONF_ALARM_TRIGGERED, default={}): _state_schema( AlarmControlPanelState.TRIGGERED ), }, diff --git a/homeassistant/components/manual_mqtt/alarm_control_panel.py b/homeassistant/components/manual_mqtt/alarm_control_panel.py index 616b6d21cc38a..8128ada4b5ba4 100644 --- a/homeassistant/components/manual_mqtt/alarm_control_panel.py +++ b/homeassistant/components/manual_mqtt/alarm_control_panel.py @@ -4,7 +4,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components import mqtt from homeassistant.components.alarm_control_panel import ( @@ -110,79 +110,81 @@ def _state_schema(state): """Validate the state.""" schema = {} if state in SUPPORTED_PRETRIGGER_STATES: - schema[vol.Optional(CONF_DELAY_TIME)] = vol.All( + schema[probatio.Optional(CONF_DELAY_TIME)] = probatio.All( cv.time_period, cv.positive_timedelta ) - schema[vol.Optional(CONF_TRIGGER_TIME)] = vol.All( + schema[probatio.Optional(CONF_TRIGGER_TIME)] = probatio.All( cv.time_period, cv.positive_timedelta ) if state in SUPPORTED_PENDING_STATES: - schema[vol.Optional(CONF_PENDING_TIME)] = vol.All( + schema[probatio.Optional(CONF_PENDING_TIME)] = probatio.All( cv.time_period, cv.positive_timedelta ) - return vol.Schema(schema) + return probatio.Schema(schema) -PLATFORM_SCHEMA = vol.Schema( - vol.All( +PLATFORM_SCHEMA = probatio.Schema( + probatio.All( mqtt.config.MQTT_BASE_SCHEMA.extend( { - vol.Required(CONF_PLATFORM): "manual_mqtt", - vol.Optional(CONF_NAME, default=DEFAULT_ALARM_NAME): cv.string, - vol.Exclusive(CONF_CODE, "code validation"): cv.string, - vol.Exclusive(CONF_CODE_TEMPLATE, "code validation"): cv.template, - vol.Optional(CONF_DELAY_TIME, default=DEFAULT_DELAY_TIME): vol.All( - cv.time_period, cv.positive_timedelta - ), - vol.Optional(CONF_PENDING_TIME, default=DEFAULT_PENDING_TIME): vol.All( - cv.time_period, cv.positive_timedelta - ), - vol.Optional(CONF_TRIGGER_TIME, default=DEFAULT_TRIGGER_TIME): vol.All( - cv.time_period, cv.positive_timedelta - ), - vol.Optional( + probatio.Required(CONF_PLATFORM): "manual_mqtt", + probatio.Optional(CONF_NAME, default=DEFAULT_ALARM_NAME): cv.string, + probatio.Exclusive(CONF_CODE, "code validation"): cv.string, + probatio.Exclusive(CONF_CODE_TEMPLATE, "code validation"): cv.template, + probatio.Optional( + CONF_DELAY_TIME, default=DEFAULT_DELAY_TIME + ): probatio.All(cv.time_period, cv.positive_timedelta), + probatio.Optional( + CONF_PENDING_TIME, default=DEFAULT_PENDING_TIME + ): probatio.All(cv.time_period, cv.positive_timedelta), + probatio.Optional( + CONF_TRIGGER_TIME, default=DEFAULT_TRIGGER_TIME + ): probatio.All(cv.time_period, cv.positive_timedelta), + probatio.Optional( CONF_DISARM_AFTER_TRIGGER, default=DEFAULT_DISARM_AFTER_TRIGGER ): cv.boolean, - vol.Optional(CONF_ALARM_ARMED_AWAY, default={}): _state_schema( + probatio.Optional(CONF_ALARM_ARMED_AWAY, default={}): _state_schema( AlarmControlPanelState.ARMED_AWAY ), - vol.Optional(CONF_ALARM_ARMED_HOME, default={}): _state_schema( + probatio.Optional(CONF_ALARM_ARMED_HOME, default={}): _state_schema( AlarmControlPanelState.ARMED_HOME ), - vol.Optional(CONF_ALARM_ARMED_NIGHT, default={}): _state_schema( + probatio.Optional(CONF_ALARM_ARMED_NIGHT, default={}): _state_schema( AlarmControlPanelState.ARMED_NIGHT ), - vol.Optional(CONF_ALARM_ARMED_VACATION, default={}): _state_schema( + probatio.Optional(CONF_ALARM_ARMED_VACATION, default={}): _state_schema( AlarmControlPanelState.ARMED_VACATION ), - vol.Optional(CONF_ALARM_ARMED_CUSTOM_BYPASS, default={}): _state_schema( - AlarmControlPanelState.ARMED_CUSTOM_BYPASS - ), - vol.Optional(CONF_ALARM_DISARMED, default={}): _state_schema( + probatio.Optional( + CONF_ALARM_ARMED_CUSTOM_BYPASS, default={} + ): _state_schema(AlarmControlPanelState.ARMED_CUSTOM_BYPASS), + probatio.Optional(CONF_ALARM_DISARMED, default={}): _state_schema( AlarmControlPanelState.DISARMED ), - vol.Optional(CONF_ALARM_TRIGGERED, default={}): _state_schema( + probatio.Optional(CONF_ALARM_TRIGGERED, default={}): _state_schema( AlarmControlPanelState.TRIGGERED ), - vol.Required(mqtt.CONF_COMMAND_TOPIC): mqtt.valid_publish_topic, - vol.Required(mqtt.CONF_STATE_TOPIC): mqtt.valid_subscribe_topic, - vol.Optional(CONF_CODE_ARM_REQUIRED, default=True): cv.boolean, - vol.Optional( + probatio.Required(mqtt.CONF_COMMAND_TOPIC): mqtt.valid_publish_topic, + probatio.Required(mqtt.CONF_STATE_TOPIC): mqtt.valid_subscribe_topic, + probatio.Optional(CONF_CODE_ARM_REQUIRED, default=True): cv.boolean, + probatio.Optional( CONF_PAYLOAD_ARM_AWAY, default=DEFAULT_ARM_AWAY ): cv.string, - vol.Optional( + probatio.Optional( CONF_PAYLOAD_ARM_HOME, default=DEFAULT_ARM_HOME ): cv.string, - vol.Optional( + probatio.Optional( CONF_PAYLOAD_ARM_NIGHT, default=DEFAULT_ARM_NIGHT ): cv.string, - vol.Optional( + probatio.Optional( CONF_PAYLOAD_ARM_VACATION, default=DEFAULT_ARM_VACATION ): cv.string, - vol.Optional( + probatio.Optional( CONF_PAYLOAD_ARM_CUSTOM_BYPASS, default=DEFAULT_ARM_CUSTOM_BYPASS ): cv.string, - vol.Optional(CONF_PAYLOAD_DISARM, default=DEFAULT_DISARM): cv.string, + probatio.Optional( + CONF_PAYLOAD_DISARM, default=DEFAULT_DISARM + ): cv.string, } ), _state_validator, diff --git a/homeassistant/components/map_tiles/__init__.py b/homeassistant/components/map_tiles/__init__.py index b576174e8789d..54f32ea3435bf 100644 --- a/homeassistant/components/map_tiles/__init__.py +++ b/homeassistant/components/map_tiles/__init__.py @@ -14,7 +14,7 @@ import secrets from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.core import HomeAssistant, callback @@ -68,7 +68,7 @@ def _rotate_token(_now: datetime) -> None: @callback -@websocket_api.websocket_command({vol.Required("type"): "map_tiles/access_token"}) +@websocket_api.websocket_command({probatio.Required("type"): "map_tiles/access_token"}) def ws_access_token( hass: HomeAssistant, connection: websocket_api.ActiveConnection, diff --git a/homeassistant/components/marantz_infrared/config_flow.py b/homeassistant/components/marantz_infrared/config_flow.py index 428b15e5f76a2..1b7e69c979815 100644 --- a/homeassistant/components/marantz_infrared/config_flow.py +++ b/homeassistant/components/marantz_infrared/config_flow.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.infrared import ( DOMAIN as INFRARED_DOMAIN, @@ -52,15 +52,15 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_MODEL): SelectSelector( + probatio.Required(CONF_MODEL): SelectSelector( SelectSelectorConfig( options=model_options, mode=SelectSelectorMode.DROPDOWN, ) ), - vol.Required(CONF_INFRARED_EMITTER_ENTITY_ID): EntitySelector( + probatio.Required(CONF_INFRARED_EMITTER_ENTITY_ID): EntitySelector( EntitySelectorConfig( domain=INFRARED_DOMAIN, include_entities=emitter_entity_ids, diff --git a/homeassistant/components/marytts/tts.py b/homeassistant/components/marytts/tts.py index 401e00a93b312..0404f92423447 100644 --- a/homeassistant/components/marytts/tts.py +++ b/homeassistant/components/marytts/tts.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from speak2mary import MaryTTS -import voluptuous as vol from homeassistant.components.tts import ( CONF_LANG, @@ -33,13 +33,17 @@ PLATFORM_SCHEMA = TTS_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_LANG, default=DEFAULT_LANG): vol.In(SUPPORT_LANGUAGES), - vol.Optional(CONF_VOICE, default=DEFAULT_VOICE): cv.string, - vol.Optional(CONF_CODEC, default=DEFAULT_CODEC): vol.In(SUPPORT_CODEC), - vol.Optional(CONF_EFFECT, default=DEFAULT_EFFECTS): { - vol.All(cv.string, vol.In(SUPPORT_EFFECTS)): cv.string + probatio.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_LANG, default=DEFAULT_LANG): probatio.In( + SUPPORT_LANGUAGES + ), + probatio.Optional(CONF_VOICE, default=DEFAULT_VOICE): cv.string, + probatio.Optional(CONF_CODEC, default=DEFAULT_CODEC): probatio.In( + SUPPORT_CODEC + ), + probatio.Optional(CONF_EFFECT, default=DEFAULT_EFFECTS): { + probatio.All(cv.string, probatio.In(SUPPORT_EFFECTS)): cv.string }, } ) diff --git a/homeassistant/components/mastodon/config_flow.py b/homeassistant/components/mastodon/config_flow.py index 0ff7ba675abda..5ae2043affe55 100644 --- a/homeassistant/components/mastodon/config_flow.py +++ b/homeassistant/components/mastodon/config_flow.py @@ -11,7 +11,7 @@ MastodonNotFoundError, MastodonUnauthorizedError, ) -import voluptuous as vol +import probatio from yarl import URL from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -26,38 +26,38 @@ from .const import CONF_BASE_URL, DOMAIN, LOGGER from .utils import construct_mastodon_username, create_mastodon_client -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required( + probatio.Required( CONF_BASE_URL, ): TextSelector(TextSelectorConfig(type=TextSelectorType.URL)), - vol.Required( + probatio.Required( CONF_CLIENT_ID, ): TextSelector(TextSelectorConfig(type=TextSelectorType.PASSWORD)), - vol.Required( + probatio.Required( CONF_CLIENT_SECRET, ): TextSelector(TextSelectorConfig(type=TextSelectorType.PASSWORD)), - vol.Required( + probatio.Required( CONF_ACCESS_TOKEN, ): TextSelector(TextSelectorConfig(type=TextSelectorType.PASSWORD)), } ) -REAUTH_SCHEMA = vol.Schema( +REAUTH_SCHEMA = probatio.Schema( { - vol.Required( + probatio.Required( CONF_ACCESS_TOKEN, ): TextSelector(TextSelectorConfig(type=TextSelectorType.PASSWORD)), } ) -STEP_RECONFIGURE_SCHEMA = vol.Schema( +STEP_RECONFIGURE_SCHEMA = probatio.Schema( { - vol.Required( + probatio.Required( CONF_CLIENT_ID, ): TextSelector(TextSelectorConfig(type=TextSelectorType.PASSWORD)), - vol.Required( + probatio.Required( CONF_CLIENT_SECRET, ): TextSelector(TextSelectorConfig(type=TextSelectorType.PASSWORD)), - vol.Required( + probatio.Required( CONF_ACCESS_TOKEN, ): TextSelector(TextSelectorConfig(type=TextSelectorType.PASSWORD)), } diff --git a/homeassistant/components/mastodon/services.py b/homeassistant/components/mastodon/services.py index b46b8be84a34c..03665f034709d 100644 --- a/homeassistant/components/mastodon/services.py +++ b/homeassistant/components/mastodon/services.py @@ -17,7 +17,7 @@ ScheduledStatus, Status, ) -import voluptuous as vol +import probatio from homeassistant.components import camera, image from homeassistant.components.media_source import async_resolve_media @@ -88,70 +88,78 @@ class QuoteApprovalPolicy(StrEnum): SERVICE_GET_ACCOUNT = "get_account" -SERVICE_GET_ACCOUNT_SCHEMA = vol.Schema( +SERVICE_GET_ACCOUNT_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): str, - vol.Required(ATTR_ACCOUNT_NAME): str, + probatio.Required(ATTR_CONFIG_ENTRY_ID): str, + probatio.Required(ATTR_ACCOUNT_NAME): str, } ) SERVICE_MUTE_ACCOUNT = "mute_account" -SERVICE_MUTE_ACCOUNT_SCHEMA = vol.Schema( +SERVICE_MUTE_ACCOUNT_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): str, - vol.Required(ATTR_ACCOUNT_NAME): str, - vol.Optional(ATTR_DURATION): vol.All( + probatio.Required(ATTR_CONFIG_ENTRY_ID): str, + probatio.Required(ATTR_ACCOUNT_NAME): str, + probatio.Optional(ATTR_DURATION): probatio.All( cv.time_period, - vol.Range( + probatio.Range( min=timedelta(seconds=1), max=timedelta(seconds=MAX_DURATION_SECONDS) ), ), - vol.Optional(ATTR_HIDE_NOTIFICATIONS, default=True): bool, + probatio.Optional(ATTR_HIDE_NOTIFICATIONS, default=True): bool, } ) SERVICE_UNMUTE_ACCOUNT = "unmute_account" -SERVICE_UNMUTE_ACCOUNT_SCHEMA = vol.Schema( +SERVICE_UNMUTE_ACCOUNT_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): str, - vol.Required(ATTR_ACCOUNT_NAME): str, + probatio.Required(ATTR_CONFIG_ENTRY_ID): str, + probatio.Required(ATTR_ACCOUNT_NAME): str, } ) SERVICE_POST = "post" -SERVICE_POST_SCHEMA = vol.Schema( +SERVICE_POST_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): str, - vol.Required(ATTR_STATUS): str, - vol.Optional(ATTR_VISIBILITY): vol.In([x.lower() for x in StatusVisibility]), - vol.Optional(ATTR_QUOTE_APPROVAL_POLICY): vol.In( + probatio.Required(ATTR_CONFIG_ENTRY_ID): str, + probatio.Required(ATTR_STATUS): str, + probatio.Optional(ATTR_VISIBILITY): probatio.In( + [x.lower() for x in StatusVisibility] + ), + probatio.Optional(ATTR_QUOTE_APPROVAL_POLICY): probatio.In( [x.lower() for x in QuoteApprovalPolicy] ), - vol.Optional(ATTR_IDEMPOTENCY_KEY): str, - vol.Optional(ATTR_CONTENT_WARNING): str, - vol.Optional(ATTR_LANGUAGE): str, - vol.Optional(ATTR_MEDIA): str, - vol.Optional(ATTR_MEDIA_DESCRIPTION): str, - vol.Optional(ATTR_MEDIA_WARNING): bool, - vol.Optional(ATTR_IN_REPLY_TO): str, - vol.Optional(ATTR_QUOTED_STATUS): str, + probatio.Optional(ATTR_IDEMPOTENCY_KEY): str, + probatio.Optional(ATTR_CONTENT_WARNING): str, + probatio.Optional(ATTR_LANGUAGE): str, + probatio.Optional(ATTR_MEDIA): str, + probatio.Optional(ATTR_MEDIA_DESCRIPTION): str, + probatio.Optional(ATTR_MEDIA_WARNING): bool, + probatio.Optional(ATTR_IN_REPLY_TO): str, + probatio.Optional(ATTR_QUOTED_STATUS): str, } ) SERVICE_UPDATE_PROFILE = "update_profile" -SERVICE_UPDATE_PROFILE_SCHEMA = vol.Schema( +SERVICE_UPDATE_PROFILE_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): str, - vol.Optional(ATTR_DISPLAY_NAME): str, - vol.Optional(ATTR_NOTE): str, - vol.Exclusive(ATTR_AVATAR, ATTR_AVATAR): MediaSelector({"accept": ["image/*"]}), - vol.Exclusive(ATTR_DELETE_AVATAR, ATTR_AVATAR): cv.boolean, - vol.Exclusive(ATTR_HEADER, ATTR_HEADER): MediaSelector({"accept": ["image/*"]}), - vol.Exclusive(ATTR_DELETE_HEADER, ATTR_HEADER): cv.boolean, - vol.Optional(ATTR_LOCKED): bool, - vol.Optional(ATTR_BOT): bool, - vol.Optional(ATTR_DISCOVERABLE): bool, - vol.Optional(ATTR_FIELDS): vol.All( - cv.ensure_list, vol.Length(max=4), [dict[str, str]] + probatio.Required(ATTR_CONFIG_ENTRY_ID): str, + probatio.Optional(ATTR_DISPLAY_NAME): str, + probatio.Optional(ATTR_NOTE): str, + probatio.Exclusive(ATTR_AVATAR, ATTR_AVATAR): MediaSelector( + {"accept": ["image/*"]} + ), + probatio.Exclusive(ATTR_DELETE_AVATAR, ATTR_AVATAR): cv.boolean, + probatio.Exclusive(ATTR_HEADER, ATTR_HEADER): MediaSelector( + {"accept": ["image/*"]} + ), + probatio.Exclusive(ATTR_DELETE_HEADER, ATTR_HEADER): cv.boolean, + probatio.Optional(ATTR_LOCKED): bool, + probatio.Optional(ATTR_BOT): bool, + probatio.Optional(ATTR_DISCOVERABLE): bool, + probatio.Optional(ATTR_FIELDS): probatio.All( + cv.ensure_list, probatio.Length(max=4), [dict[str, str]] + ), + probatio.Optional(ATTR_ATTRIBUTION_DOMAINS): probatio.All( + cv.ensure_list, [str] ), - vol.Optional(ATTR_ATTRIBUTION_DOMAINS): vol.All(cv.ensure_list, [str]), } ) diff --git a/homeassistant/components/matrix/__init__.py b/homeassistant/components/matrix/__init__.py index d2fd681002943..33d7dd02567c8 100644 --- a/homeassistant/components/matrix/__init__.py +++ b/homeassistant/components/matrix/__init__.py @@ -24,7 +24,7 @@ WhoamiResponse, ) from PIL import Image -import voluptuous as vol +import probatio from homeassistant.components.notify import ATTR_DATA, ATTR_MESSAGE, ATTR_TARGET from homeassistant.const import ( @@ -91,14 +91,14 @@ class ConfigCommand(TypedDict, total=False): reaction: ReactionCommand # CONF_REACTION -COMMAND_SCHEMA = vol.All( - vol.Schema( +COMMAND_SCHEMA = probatio.All( + probatio.Schema( { - vol.Exclusive(CONF_WORD, "trigger"): cv.string, - vol.Exclusive(CONF_EXPRESSION, "trigger"): cv.is_regex, - vol.Exclusive(CONF_REACTION, "trigger"): cv.string, - vol.Required(CONF_NAME): cv.string, - vol.Optional(CONF_ROOMS): vol.All( + probatio.Exclusive(CONF_WORD, "trigger"): cv.string, + probatio.Exclusive(CONF_EXPRESSION, "trigger"): cv.is_regex, + probatio.Exclusive(CONF_REACTION, "trigger"): cv.string, + probatio.Required(CONF_NAME): cv.string, + probatio.Optional(CONF_ROOMS): probatio.All( cv.ensure_list, [cv.matches_regex(CONF_ROOMS_REGEX)] ), } @@ -106,22 +106,22 @@ class ConfigCommand(TypedDict, total=False): cv.has_at_least_one_key(CONF_WORD, CONF_EXPRESSION, CONF_REACTION), ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_HOMESERVER): cv.url, - vol.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, - vol.Required(CONF_USERNAME): cv.matches_regex(CONF_USERNAME_REGEX), - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_ROOMS, default=[]): vol.All( + probatio.Required(CONF_HOMESERVER): cv.url, + probatio.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, + probatio.Required(CONF_USERNAME): cv.matches_regex(CONF_USERNAME_REGEX), + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_ROOMS, default=[]): probatio.All( cv.ensure_list, [cv.matches_regex(CONF_ROOMS_REGEX)] ), - vol.Optional(CONF_COMMANDS, default=[]): [COMMAND_SCHEMA], + probatio.Optional(CONF_COMMANDS, default=[]): [COMMAND_SCHEMA], } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/matrix/notify.py b/homeassistant/components/matrix/notify.py index dea4a572608d7..51c8738073273 100644 --- a/homeassistant/components/matrix/notify.py +++ b/homeassistant/components/matrix/notify.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.notify import ( ATTR_DATA, @@ -21,7 +21,7 @@ CONF_DEFAULT_ROOM = "default_room" PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_DEFAULT_ROOM): cv.string} + {probatio.Required(CONF_DEFAULT_ROOM): cv.string} ) diff --git a/homeassistant/components/matrix/services.py b/homeassistant/components/matrix/services.py index 2550293747009..e2dadf9b70e5b 100644 --- a/homeassistant/components/matrix/services.py +++ b/homeassistant/components/matrix/services.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING -import voluptuous as vol +import probatio from homeassistant.components.notify import ATTR_DATA, ATTR_MESSAGE, ATTR_TARGET from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -31,27 +31,27 @@ DEFAULT_MESSAGE_FORMAT = FORMAT_TEXT -SERVICE_SCHEMA_SEND_MESSAGE = vol.Schema( +SERVICE_SCHEMA_SEND_MESSAGE = probatio.Schema( { - vol.Required(ATTR_MESSAGE): cv.string, - vol.Optional(ATTR_DATA, default={}): { - vol.Optional(ATTR_FORMAT, default=DEFAULT_MESSAGE_FORMAT): vol.In( + probatio.Required(ATTR_MESSAGE): cv.string, + probatio.Optional(ATTR_DATA, default={}): { + probatio.Optional(ATTR_FORMAT, default=DEFAULT_MESSAGE_FORMAT): probatio.In( MESSAGE_FORMATS ), - vol.Optional(ATTR_IMAGES): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(ATTR_THREAD_ID): cv.string, + probatio.Optional(ATTR_IMAGES): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(ATTR_THREAD_ID): cv.string, }, - vol.Required(ATTR_TARGET): vol.All( + probatio.Required(ATTR_TARGET): probatio.All( cv.ensure_list, [cv.matches_regex(CONF_ROOMS_REGEX)] ), } ) -SERVICE_SCHEMA_REACT = vol.Schema( +SERVICE_SCHEMA_REACT = probatio.Schema( { - vol.Required(ATTR_REACTION): cv.string, - vol.Required(ATTR_ROOM): cv.matches_regex(CONF_ROOMS_REGEX), - vol.Required(ATTR_MESSAGE_ID): cv.string, + probatio.Required(ATTR_REACTION): cv.string, + probatio.Required(ATTR_ROOM): cv.matches_regex(CONF_ROOMS_REGEX), + probatio.Required(ATTR_MESSAGE_ID): cv.string, } ) diff --git a/homeassistant/components/matter/api.py b/homeassistant/components/matter/api.py index 5e3221d6829b8..29006905918de 100644 --- a/homeassistant/components/matter/api.py +++ b/homeassistant/components/matter/api.py @@ -9,7 +9,7 @@ from matter_server.common.errors import MatterError from matter_server.common.helpers.util import dataclass_to_dict from matter_server.common.models import EventType, NetworkTopology -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.components.websocket_api import ERR_NOT_SUPPORTED, ActiveConnection @@ -137,9 +137,9 @@ async def async_handle_failed_command_func( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "matter/commission", - vol.Required("code"): str, - vol.Optional("network_only"): bool, + probatio.Required(TYPE): "matter/commission", + probatio.Required("code"): str, + probatio.Optional("network_only"): bool, } ) @websocket_api.async_response @@ -161,9 +161,9 @@ async def websocket_commission( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "matter/commission_on_network", - vol.Required("pin"): int, - vol.Optional("ip_addr"): str, + probatio.Required(TYPE): "matter/commission_on_network", + probatio.Required("pin"): int, + probatio.Optional("ip_addr"): str, } ) @websocket_api.async_response @@ -185,8 +185,8 @@ async def websocket_commission_on_network( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "matter/set_thread", - vol.Required("thread_operation_dataset"): str, + probatio.Required(TYPE): "matter/set_thread", + probatio.Required("thread_operation_dataset"): str, } ) @websocket_api.async_response @@ -208,9 +208,9 @@ async def websocket_set_thread_dataset( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "matter/set_wifi_credentials", - vol.Required("network_name"): str, - vol.Required("password"): str, + probatio.Required(TYPE): "matter/set_wifi_credentials", + probatio.Required("network_name"): str, + probatio.Required("password"): str, } ) @websocket_api.async_response @@ -231,8 +231,8 @@ async def websocket_set_wifi_credentials( @websocket_api.websocket_command( { - vol.Required(TYPE): "matter/node_diagnostics", - vol.Required(DEVICE_ID): str, + probatio.Required(TYPE): "matter/node_diagnostics", + probatio.Required(DEVICE_ID): str, } ) @websocket_api.async_response @@ -253,8 +253,8 @@ async def websocket_node_diagnostics( @websocket_api.websocket_command( { - vol.Required(TYPE): "matter/ping_node", - vol.Required(DEVICE_ID): str, + probatio.Required(TYPE): "matter/ping_node", + probatio.Required(DEVICE_ID): str, } ) @websocket_api.async_response @@ -276,8 +276,8 @@ async def websocket_ping_node( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "matter/open_commissioning_window", - vol.Required(DEVICE_ID): str, + probatio.Required(TYPE): "matter/open_commissioning_window", + probatio.Required(DEVICE_ID): str, } ) @websocket_api.async_response @@ -299,9 +299,9 @@ async def websocket_open_commissioning_window( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "matter/remove_matter_fabric", - vol.Required(DEVICE_ID): str, - vol.Required("fabric_index"): int, + probatio.Required(TYPE): "matter/remove_matter_fabric", + probatio.Required(DEVICE_ID): str, + probatio.Required("fabric_index"): int, } ) @websocket_api.async_response @@ -325,8 +325,8 @@ async def websocket_remove_matter_fabric( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "matter/interview_node", - vol.Required(DEVICE_ID): str, + probatio.Required(TYPE): "matter/interview_node", + probatio.Required(DEVICE_ID): str, } ) @websocket_api.async_response @@ -384,8 +384,8 @@ def _serialize_topology( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "matter/network_topology", - vol.Optional("refresh", default=False): bool, + probatio.Required(TYPE): "matter/network_topology", + probatio.Optional("refresh", default=False): bool, } ) @websocket_api.async_response @@ -407,7 +407,7 @@ async def websocket_network_topology( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "matter/subscribe_network_topology", + probatio.Required(TYPE): "matter/subscribe_network_topology", } ) @websocket_api.async_response diff --git a/homeassistant/components/matter/config_flow.py b/homeassistant/components/matter/config_flow.py index ee57c07fa752e..79e3d9a0986e7 100644 --- a/homeassistant/components/matter/config_flow.py +++ b/homeassistant/components/matter/config_flow.py @@ -5,7 +5,7 @@ from matter_server.client import MatterClient from matter_server.client.exceptions import CannotConnect, InvalidServerVersion -import voluptuous as vol +import probatio from homeassistant.components.hassio import ( AddonError, @@ -37,13 +37,15 @@ ADDON_SETUP_TIMEOUT_ROUNDS = 40 DEFAULT_URL = "ws://localhost:5580/ws" DEFAULT_TITLE = "Matter" -ON_SUPERVISOR_SCHEMA = vol.Schema({vol.Optional(CONF_USE_ADDON, default=True): bool}) +ON_SUPERVISOR_SCHEMA = probatio.Schema( + {probatio.Optional(CONF_USE_ADDON, default=True): bool} +) -def get_manual_schema(user_input: dict[str, Any]) -> vol.Schema: +def get_manual_schema(user_input: dict[str, Any]) -> probatio.Schema: """Return a schema for the manual step.""" default_url = user_input.get(CONF_URL, DEFAULT_URL) - return vol.Schema({vol.Required(CONF_URL, default=default_url): str}) + return probatio.Schema({probatio.Required(CONF_URL, default=default_url): str}) async def validate_input(hass: HomeAssistant, data: dict[str, Any]) -> None: diff --git a/homeassistant/components/matter/services.py b/homeassistant/components/matter/services.py index 20ca33ebc03d8..8df90e876e0ed 100644 --- a/homeassistant/components/matter/services.py +++ b/homeassistant/components/matter/services.py @@ -1,6 +1,6 @@ """Services for Matter devices.""" -import voluptuous as vol +import probatio from homeassistant.components.lock import DOMAIN as LOCK_DOMAIN from homeassistant.components.water_heater import DOMAIN as WATER_HEATER_DOMAIN @@ -42,10 +42,12 @@ def async_setup_services(hass: HomeAssistant) -> None: entity_domain=WATER_HEATER_DOMAIN, schema={ # duration >=1 - vol.Required(ATTR_DURATION): vol.All(vol.Coerce(int), vol.Range(min=1)), - vol.Optional(ATTR_EMERGENCY_BOOST): cv.boolean, - vol.Optional(ATTR_TEMPORARY_SETPOINT): vol.All( - vol.Coerce(int), vol.Range(min=30, max=65) + probatio.Required(ATTR_DURATION): probatio.All( + probatio.Coerce(int), probatio.Range(min=1) + ), + probatio.Optional(ATTR_EMERGENCY_BOOST): cv.boolean, + probatio.Optional(ATTR_TEMPORARY_SETPOINT): probatio.All( + probatio.Coerce(int), probatio.Range(min=30, max=65) ), }, func="async_set_boost", @@ -58,10 +60,14 @@ def async_setup_services(hass: HomeAssistant) -> None: "set_lock_user", entity_domain=LOCK_DOMAIN, schema={ - vol.Optional(ATTR_USER_INDEX): vol.All(vol.Coerce(int), vol.Range(min=1)), - vol.Optional(ATTR_USER_NAME): vol.Any(str, None), - vol.Optional(ATTR_USER_TYPE): vol.In(USER_TYPE_REVERSE_MAP.keys()), - vol.Optional(ATTR_CREDENTIAL_RULE): vol.In( + probatio.Optional(ATTR_USER_INDEX): probatio.All( + probatio.Coerce(int), probatio.Range(min=1) + ), + probatio.Optional(ATTR_USER_NAME): probatio.Any(str, None), + probatio.Optional(ATTR_USER_TYPE): probatio.In( + USER_TYPE_REVERSE_MAP.keys() + ), + probatio.Optional(ATTR_CREDENTIAL_RULE): probatio.In( CREDENTIAL_RULE_REVERSE_MAP.keys() ), }, @@ -74,9 +80,9 @@ def async_setup_services(hass: HomeAssistant) -> None: "clear_lock_user", entity_domain=LOCK_DOMAIN, schema={ - vol.Required(ATTR_USER_INDEX): vol.All( - vol.Coerce(int), - vol.Any(vol.Range(min=1), CLEAR_ALL_INDEX), + probatio.Required(ATTR_USER_INDEX): probatio.All( + probatio.Coerce(int), + probatio.Any(probatio.Range(min=1), CLEAR_ALL_INDEX), ), }, func="async_clear_lock_user", @@ -110,16 +116,22 @@ def async_setup_services(hass: HomeAssistant) -> None: "set_lock_credential", entity_domain=LOCK_DOMAIN, schema={ - vol.Required(ATTR_CREDENTIAL_TYPE): vol.In(SERVICE_CREDENTIAL_TYPES), - vol.Required(ATTR_CREDENTIAL_DATA): cv.string, - vol.Optional(ATTR_CREDENTIAL_INDEX): vol.All( - vol.Coerce(int), vol.Range(min=0) + probatio.Required(ATTR_CREDENTIAL_TYPE): probatio.In( + SERVICE_CREDENTIAL_TYPES + ), + probatio.Required(ATTR_CREDENTIAL_DATA): cv.string, + probatio.Optional(ATTR_CREDENTIAL_INDEX): probatio.All( + probatio.Coerce(int), probatio.Range(min=0) ), - vol.Optional(ATTR_USER_INDEX): vol.All(vol.Coerce(int), vol.Range(min=1)), - vol.Optional(ATTR_USER_STATUS): vol.In( + probatio.Optional(ATTR_USER_INDEX): probatio.All( + probatio.Coerce(int), probatio.Range(min=1) + ), + probatio.Optional(ATTR_USER_STATUS): probatio.In( ["occupied_enabled", "occupied_disabled"] ), - vol.Optional(ATTR_USER_TYPE): vol.In(USER_TYPE_REVERSE_MAP.keys()), + probatio.Optional(ATTR_USER_TYPE): probatio.In( + USER_TYPE_REVERSE_MAP.keys() + ), }, func="async_set_lock_credential", supports_response=SupportsResponse.ONLY, @@ -131,9 +143,11 @@ def async_setup_services(hass: HomeAssistant) -> None: "clear_lock_credential", entity_domain=LOCK_DOMAIN, schema={ - vol.Required(ATTR_CREDENTIAL_TYPE): vol.In(SERVICE_CREDENTIAL_TYPES), - vol.Required(ATTR_CREDENTIAL_INDEX): vol.All( - vol.Coerce(int), vol.Range(min=0) + probatio.Required(ATTR_CREDENTIAL_TYPE): probatio.In( + SERVICE_CREDENTIAL_TYPES + ), + probatio.Required(ATTR_CREDENTIAL_INDEX): probatio.All( + probatio.Coerce(int), probatio.Range(min=0) ), }, func="async_clear_lock_credential", @@ -145,11 +159,11 @@ def async_setup_services(hass: HomeAssistant) -> None: "get_lock_credential_status", entity_domain=LOCK_DOMAIN, schema={ - vol.Required(ATTR_CREDENTIAL_TYPE): vol.In( + probatio.Required(ATTR_CREDENTIAL_TYPE): probatio.In( CREDENTIAL_TYPE_REVERSE_MAP.keys() ), - vol.Required(ATTR_CREDENTIAL_INDEX): vol.All( - vol.Coerce(int), vol.Range(min=0) + probatio.Required(ATTR_CREDENTIAL_INDEX): probatio.All( + probatio.Coerce(int), probatio.Range(min=0) ), }, func="async_get_lock_credential_status", diff --git a/homeassistant/components/maxcube/__init__.py b/homeassistant/components/maxcube/__init__.py index 4e79a00fed0e1..f70163232c24d 100644 --- a/homeassistant/components/maxcube/__init__.py +++ b/homeassistant/components/maxcube/__init__.py @@ -5,7 +5,7 @@ import time from maxcube.cube import MaxCube -import voluptuous as vol +import probatio from homeassistant.components import persistent_notification from homeassistant.const import CONF_HOST, CONF_PORT, CONF_SCAN_INTERVAL, Platform @@ -27,25 +27,25 @@ CONF_GATEWAYS = "gateways" -CONFIG_GATEWAY = vol.Schema( +CONFIG_GATEWAY = probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_SCAN_INTERVAL, default=300): cv.time_period, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_SCAN_INTERVAL, default=300): cv.time_period, } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_GATEWAYS, default={}): vol.All( + probatio.Required(CONF_GATEWAYS, default={}): probatio.All( cv.ensure_list, [CONFIG_GATEWAY] ) } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/mcp/config_flow.py b/homeassistant/components/mcp/config_flow.py index ca077e27c9e80..b9c14afd0d403 100644 --- a/homeassistant/components/mcp/config_flow.py +++ b/homeassistant/components/mcp/config_flow.py @@ -7,7 +7,7 @@ from typing import Any, cast, override import httpx -import voluptuous as vol +import probatio from yarl import URL from homeassistant.components.application_credentials import AuthorizationServer @@ -30,9 +30,9 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_URL): str, + probatio.Required(CONF_URL): str, } ) @@ -115,7 +115,7 @@ async def validate_input( url = data[CONF_URL] try: cv.url(url) # Cannot be added to schema directly - except vol.Invalid as error: + except probatio.Invalid as error: raise InvalidUrl from error try: async with mcp_client(hass, url, token_manager=token_manager) as ( @@ -200,7 +200,7 @@ async def async_step_hassio( try: # An unparsable URL, such as an unmatched IPv6 bracket, raises ValueError url = cv.url(url) - except vol.Invalid, ValueError: + except probatio.Invalid, ValueError: _LOGGER.debug( "Ignoring discovery from app %s with invalid URL: %s", discovery_info.slug, diff --git a/homeassistant/components/mcp/coordinator.py b/homeassistant/components/mcp/coordinator.py index b11c02639aa97..f3bea5f3d58e4 100644 --- a/homeassistant/components/mcp/coordinator.py +++ b/homeassistant/components/mcp/coordinator.py @@ -13,8 +13,10 @@ from mcp.client.sse import sse_client from mcp.client.streamable_http import streamable_http_client from mcp.types import InitializeResult +import probatio + +# Imported by name because the tests patch it on this module. from probatio import from_openapi -import voluptuous as vol from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_URL @@ -127,7 +129,7 @@ def __init__( self, name: str, description: str | None, - parameters: vol.Schema, + parameters: probatio.Schema, server_url: str, config_entry: ConfigEntry, token_manager: TokenManager | None = None, diff --git a/homeassistant/components/mcp_server/config_flow.py b/homeassistant/components/mcp_server/config_flow.py index 38f0e4685d786..f0e0c3f1117c3 100644 --- a/homeassistant/components/mcp_server/config_flow.py +++ b/homeassistant/components/mcp_server/config_flow.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -46,11 +46,11 @@ def _selected_llm_apis(entry: ConfigEntry, llm_apis: dict[str, str]) -> list[str return [api_id for api_id in api_ids if api_id in llm_apis] -def _llm_api_schema(llm_apis: dict[str, str], default: list[str]) -> vol.Schema: +def _llm_api_schema(llm_apis: dict[str, str], default: list[str]) -> probatio.Schema: """Return the schema for selecting LLM APIs.""" - return vol.Schema( + return probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_LLM_HASS_API, default=default, ): SelectSelector( @@ -71,11 +71,13 @@ def _llm_api_schema(llm_apis: dict[str, str], default: list[str]) -> vol.Schema: def _options_schema( llm_apis: dict[str, str], default: list[str], require_admin: bool -) -> vol.Schema: +) -> probatio.Schema: """Return the schema for the options flow.""" return _llm_api_schema(llm_apis, default).extend( { - vol.Required(CONF_REQUIRE_ADMIN, default=require_admin): BooleanSelector(), + probatio.Required( + CONF_REQUIRE_ADMIN, default=require_admin + ): BooleanSelector(), } ) diff --git a/homeassistant/components/mcp_server/server.py b/homeassistant/components/mcp_server/server.py index 3806efb0242a1..ff6ad96804e61 100644 --- a/homeassistant/components/mcp_server/server.py +++ b/homeassistant/components/mcp_server/server.py @@ -16,9 +16,8 @@ from mcp import types from mcp.server import Server from mcp.server.lowlevel.helper_types import ReadResourceContents -from probatio import to_openapi +import probatio from pydantic import AnyUrl -import voluptuous as vol from homeassistant.core import HomeAssistant from homeassistant.exceptions import HomeAssistantError @@ -44,7 +43,9 @@ def _format_tool( tool: llm.Tool, custom_serializer: Callable[[Any], Any] | None ) -> types.Tool: """Format tool specification.""" - input_schema = to_openapi(tool.parameters, custom_serializer=custom_serializer) + input_schema = probatio.to_openapi( + tool.parameters, custom_serializer=custom_serializer + ) mcp_schema: dict[str, Any] = { "type": "object", "properties": input_schema["properties"], @@ -171,7 +172,7 @@ async def call_tool(name: str, arguments: dict) -> Sequence[types.TextContent]: try: tool_response = await llm_api.async_call_tool(tool_input) - except (HomeAssistantError, vol.Invalid) as e: + except (HomeAssistantError, probatio.Invalid) as e: raise HomeAssistantError(f"Error calling tool: {e}") from e return [ types.TextContent( diff --git a/homeassistant/components/mealie/config_flow.py b/homeassistant/components/mealie/config_flow.py index edb20ca397665..c12cfd3ad3278 100644 --- a/homeassistant/components/mealie/config_flow.py +++ b/homeassistant/components/mealie/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from aiomealie import MealieAuthenticationError, MealieClient, MealieConnectionError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_TOKEN, CONF_HOST, CONF_PORT, CONF_VERIFY_SSL @@ -14,21 +14,21 @@ from .const import DOMAIN, LOGGER, MIN_REQUIRED_MEALIE_VERSION from .utils import create_version -USER_SCHEMA = vol.Schema( +USER_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_API_TOKEN): str, - vol.Optional(CONF_VERIFY_SSL, default=True): bool, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_API_TOKEN): str, + probatio.Optional(CONF_VERIFY_SSL, default=True): bool, } ) -REAUTH_SCHEMA = vol.Schema( +REAUTH_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_TOKEN): str, + probatio.Required(CONF_API_TOKEN): str, } ) -DISCOVERY_SCHEMA = vol.Schema( +DISCOVERY_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_TOKEN): str, + probatio.Required(CONF_API_TOKEN): str, } ) diff --git a/homeassistant/components/mealie/services.py b/homeassistant/components/mealie/services.py index 9e3579935fd34..74f7876bd1dbb 100644 --- a/homeassistant/components/mealie/services.py +++ b/homeassistant/components/mealie/services.py @@ -9,7 +9,7 @@ MealplanEntryType, ) from awesomeversion import AwesomeVersion -import voluptuous as vol +import probatio from homeassistant.components.todo import DOMAIN as TODO_DOMAIN from homeassistant.const import ATTR_CONFIG_ENTRY_ID, ATTR_DATE @@ -41,105 +41,107 @@ from .coordinator import MealieConfigEntry SERVICE_GET_MEALPLAN = "get_mealplan" -SERVICE_GET_MEALPLAN_SCHEMA = vol.Schema( +SERVICE_GET_MEALPLAN_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): str, - vol.Optional(ATTR_START_DATE): cv.date, - vol.Optional(ATTR_END_DATE): cv.date, + probatio.Required(ATTR_CONFIG_ENTRY_ID): str, + probatio.Optional(ATTR_START_DATE): cv.date, + probatio.Optional(ATTR_END_DATE): cv.date, } ) SERVICE_GET_RECIPE = "get_recipe" -SERVICE_GET_RECIPE_SCHEMA = vol.Schema( +SERVICE_GET_RECIPE_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): str, - vol.Required(ATTR_RECIPE_ID): str, + probatio.Required(ATTR_CONFIG_ENTRY_ID): str, + probatio.Required(ATTR_RECIPE_ID): str, } ) SERVICE_GET_RECIPES = "get_recipes" -SERVICE_GET_RECIPES_SCHEMA = vol.Schema( +SERVICE_GET_RECIPES_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): str, - vol.Optional(ATTR_SEARCH_TERMS): str, - vol.Optional(ATTR_RESULT_LIMIT): int, + probatio.Required(ATTR_CONFIG_ENTRY_ID): str, + probatio.Optional(ATTR_SEARCH_TERMS): str, + probatio.Optional(ATTR_RESULT_LIMIT): int, } ) SERVICE_GET_SHOPPING_LIST_ITEMS = "get_shopping_list_items" SERVICE_IMPORT_RECIPE = "import_recipe" -SERVICE_IMPORT_RECIPE_SCHEMA = vol.Schema( +SERVICE_IMPORT_RECIPE_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): str, - vol.Required(ATTR_URL): str, - vol.Optional(ATTR_INCLUDE_TAGS): bool, + probatio.Required(ATTR_CONFIG_ENTRY_ID): str, + probatio.Required(ATTR_URL): str, + probatio.Optional(ATTR_INCLUDE_TAGS): bool, } ) SERVICE_SET_RANDOM_MEALPLAN = "set_random_mealplan" -SERVICE_SET_RANDOM_MEALPLAN_SCHEMA = vol.Schema( +SERVICE_SET_RANDOM_MEALPLAN_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): str, - vol.Required(ATTR_DATE): cv.date, - vol.Required(ATTR_ENTRY_TYPE): vol.In([x.lower() for x in MealplanEntryType]), + probatio.Required(ATTR_CONFIG_ENTRY_ID): str, + probatio.Required(ATTR_DATE): cv.date, + probatio.Required(ATTR_ENTRY_TYPE): probatio.In( + [x.lower() for x in MealplanEntryType] + ), } ) SERVICE_SET_MEALPLAN = "set_mealplan" -SERVICE_SET_MEALPLAN_SCHEMA = vol.Any( - vol.Schema( +SERVICE_SET_MEALPLAN_SCHEMA = probatio.Any( + probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): str, - vol.Required(ATTR_DATE): cv.date, - vol.Required(ATTR_ENTRY_TYPE): vol.In( + probatio.Required(ATTR_CONFIG_ENTRY_ID): str, + probatio.Required(ATTR_DATE): cv.date, + probatio.Required(ATTR_ENTRY_TYPE): probatio.In( [x.lower() for x in MealplanEntryType] ), - vol.Required(ATTR_RECIPE_ID): str, + probatio.Required(ATTR_RECIPE_ID): str, } ), - vol.Schema( + probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): str, - vol.Required(ATTR_DATE): cv.date, - vol.Required(ATTR_ENTRY_TYPE): vol.In( + probatio.Required(ATTR_CONFIG_ENTRY_ID): str, + probatio.Required(ATTR_DATE): cv.date, + probatio.Required(ATTR_ENTRY_TYPE): probatio.In( [x.lower() for x in MealplanEntryType] ), - vol.Required(ATTR_NOTE_TITLE): str, - vol.Optional(ATTR_NOTE_TEXT): str, + probatio.Required(ATTR_NOTE_TITLE): str, + probatio.Optional(ATTR_NOTE_TEXT): str, } ), ) SERVICE_DELETE_MEALPLAN = "delete_mealplan" -SERVICE_DELETE_MEALPLAN_SCHEMA = vol.Schema( +SERVICE_DELETE_MEALPLAN_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): str, - vol.Required(ATTR_MEALPLAN_ID): str, + probatio.Required(ATTR_CONFIG_ENTRY_ID): str, + probatio.Required(ATTR_MEALPLAN_ID): str, } ) SERVICE_UPDATE_MEALPLAN = "update_mealplan" -SERVICE_UPDATE_MEALPLAN_SCHEMA = vol.Any( - vol.Schema( +SERVICE_UPDATE_MEALPLAN_SCHEMA = probatio.Any( + probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): str, - vol.Required(ATTR_MEALPLAN_ID): str, - vol.Required(ATTR_DATE): cv.date, - vol.Required(ATTR_ENTRY_TYPE): vol.In( + probatio.Required(ATTR_CONFIG_ENTRY_ID): str, + probatio.Required(ATTR_MEALPLAN_ID): str, + probatio.Required(ATTR_DATE): cv.date, + probatio.Required(ATTR_ENTRY_TYPE): probatio.In( [x.lower() for x in MealplanEntryType] ), - vol.Required(ATTR_RECIPE_ID): str, + probatio.Required(ATTR_RECIPE_ID): str, } ), - vol.Schema( + probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): str, - vol.Required(ATTR_MEALPLAN_ID): str, - vol.Required(ATTR_DATE): cv.date, - vol.Required(ATTR_ENTRY_TYPE): vol.In( + probatio.Required(ATTR_CONFIG_ENTRY_ID): str, + probatio.Required(ATTR_MEALPLAN_ID): str, + probatio.Required(ATTR_DATE): cv.date, + probatio.Required(ATTR_ENTRY_TYPE): probatio.In( [x.lower() for x in MealplanEntryType] ), - vol.Required(ATTR_NOTE_TITLE): str, - vol.Optional(ATTR_NOTE_TEXT): str, + probatio.Required(ATTR_NOTE_TITLE): str, + probatio.Optional(ATTR_NOTE_TEXT): str, } ), ) diff --git a/homeassistant/components/meater/config_flow.py b/homeassistant/components/meater/config_flow.py index 00a27d01987b4..bef72780d2b6e 100644 --- a/homeassistant/components/meater/config_flow.py +++ b/homeassistant/components/meater/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from meater import AuthenticationError, MeaterApi, ServiceUnavailableError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -15,9 +15,9 @@ _LOGGER = logging.getLogger(__name__) -REAUTH_SCHEMA = vol.Schema({vol.Required(CONF_PASSWORD): str}) -USER_SCHEMA = vol.Schema( - {vol.Required(CONF_USERNAME): str, vol.Required(CONF_PASSWORD): str} +REAUTH_SCHEMA = probatio.Schema({probatio.Required(CONF_PASSWORD): str}) +USER_SCHEMA = probatio.Schema( + {probatio.Required(CONF_USERNAME): str, probatio.Required(CONF_PASSWORD): str} ) diff --git a/homeassistant/components/medcom_ble/config_flow.py b/homeassistant/components/medcom_ble/config_flow.py index d6b97e9080b9b..360d212c0a7fc 100644 --- a/homeassistant/components/medcom_ble/config_flow.py +++ b/homeassistant/components/medcom_ble/config_flow.py @@ -7,7 +7,7 @@ from bluetooth_data_tools import human_readable_name from medcom_ble import MedcomBleDevice, MedcomBleDeviceData from medcom_ble.const import INSPECTOR_SERVICE_UUID -import voluptuous as vol +import probatio from homeassistant.components import bluetooth from homeassistant.components.bluetooth import ( @@ -117,9 +117,9 @@ async def async_step_user( } return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_ADDRESS): vol.In(titles), + probatio.Required(CONF_ADDRESS): probatio.In(titles), }, ), ) diff --git a/homeassistant/components/media_extractor/__init__.py b/homeassistant/components/media_extractor/__init__.py index 79fa9d6fb9a03..580f417ce1919 100644 --- a/homeassistant/components/media_extractor/__init__.py +++ b/homeassistant/components/media_extractor/__init__.py @@ -5,7 +5,7 @@ from pathlib import Path from typing import Any, cast -import voluptuous as vol +import probatio from yt_dlp import YoutubeDL from yt_dlp.utils import DownloadError, ExtractorError @@ -102,10 +102,10 @@ def play_media(call: ServiceCall) -> None: DOMAIN, SERVICE_EXTRACT_MEDIA_URL, extract_media_url, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(ATTR_URL): cv.string, - vol.Optional( + probatio.Required(ATTR_URL): cv.string, + probatio.Optional( ATTR_FORMAT_QUERY, default=default_format_query ): cv.string, } diff --git a/homeassistant/components/media_extractor/config_flow.py b/homeassistant/components/media_extractor/config_flow.py index db001867523c4..c82b3bfe48000 100644 --- a/homeassistant/components/media_extractor/config_flow.py +++ b/homeassistant/components/media_extractor/config_flow.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -22,4 +22,4 @@ async def async_step_user( if user_input is not None: return self.async_create_entry(title="Media extractor", data={}) - return self.async_show_form(step_id="user", data_schema=vol.Schema({})) + return self.async_show_form(step_id="user", data_schema=probatio.Schema({})) diff --git a/homeassistant/components/media_player/__init__.py b/homeassistant/components/media_player/__init__.py index 42be559b05429..f3c1debd3bba6 100644 --- a/homeassistant/components/media_player/__init__.py +++ b/homeassistant/components/media_player/__init__.py @@ -19,8 +19,8 @@ from aiohttp import hdrs, web from aiohttp.hdrs import CACHE_CONTROL, CONTENT_ENCODING, CONTENT_LENGTH, CONTENT_TYPE from aiohttp.typedefs import LooseHeaders +import probatio from propcache.api import cached_property -import voluptuous as vol from yarl import URL from homeassistant.components import websocket_api @@ -161,7 +161,9 @@ class MediaPlayerDeviceClass(StrEnum): PROJECTOR = "projector" -DEVICE_CLASSES_SCHEMA = vol.All(vol.Lower, vol.Coerce(MediaPlayerDeviceClass)) +DEVICE_CLASSES_SCHEMA = probatio.All( + probatio.Lower, probatio.Coerce(MediaPlayerDeviceClass) +) DEVICE_CLASSES = [cls.value for cls in MediaPlayerDeviceClass] @@ -171,7 +173,7 @@ def _promote_media_fields(data: dict[str, Any]) -> dict[str, Any]: """If 'media' key exists, promote its fields to the top level.""" if ATTR_MEDIA in data and isinstance(data[ATTR_MEDIA], dict): if ATTR_MEDIA_CONTENT_TYPE in data or ATTR_MEDIA_CONTENT_ID in data: - raise vol.Invalid( + raise probatio.Invalid( f"Play media cannot contain '{ATTR_MEDIA}' and " f"'{ATTR_MEDIA_CONTENT_ID}' or " f"'{ATTR_MEDIA_CONTENT_TYPE}'" @@ -188,18 +190,18 @@ def _promote_media_fields(data: dict[str, Any]) -> dict[str, Any]: MEDIA_PLAYER_PLAY_MEDIA_SCHEMA = { - vol.Required(ATTR_MEDIA_CONTENT_TYPE): cv.string, - vol.Required(ATTR_MEDIA_CONTENT_ID): cv.string, - vol.Exclusive(ATTR_MEDIA_ENQUEUE, "enqueue_announce"): vol.Any( - cv.boolean, vol.Coerce(MediaPlayerEnqueue) + probatio.Required(ATTR_MEDIA_CONTENT_TYPE): cv.string, + probatio.Required(ATTR_MEDIA_CONTENT_ID): cv.string, + probatio.Exclusive(ATTR_MEDIA_ENQUEUE, "enqueue_announce"): probatio.Any( + cv.boolean, probatio.Coerce(MediaPlayerEnqueue) ), - vol.Exclusive(ATTR_MEDIA_ANNOUNCE, "enqueue_announce"): cv.boolean, - vol.Optional(ATTR_MEDIA_EXTRA, default={}): dict, + probatio.Exclusive(ATTR_MEDIA_ANNOUNCE, "enqueue_announce"): cv.boolean, + probatio.Optional(ATTR_MEDIA_EXTRA, default={}): dict, } MEDIA_PLAYER_BROWSE_MEDIA_SCHEMA = { - vol.Optional(ATTR_MEDIA_CONTENT_TYPE): cv.string, - vol.Optional(ATTR_MEDIA_CONTENT_ID): cv.string, + probatio.Optional(ATTR_MEDIA_CONTENT_TYPE): cv.string, + probatio.Optional(ATTR_MEDIA_CONTENT_ID): cv.string, } @@ -349,9 +351,9 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: ) component.async_register_entity_service( SERVICE_VOLUME_SET, - vol.All( + probatio.All( cv.make_entity_service_schema( - {vol.Required(ATTR_MEDIA_VOLUME_LEVEL): cv.small_float} + {probatio.Required(ATTR_MEDIA_VOLUME_LEVEL): cv.small_float} ), _rename_keys(volume=ATTR_MEDIA_VOLUME_LEVEL), ), @@ -360,9 +362,9 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: ) component.async_register_entity_service( SERVICE_VOLUME_MUTE, - vol.All( + probatio.All( cv.make_entity_service_schema( - {vol.Required(ATTR_MEDIA_VOLUME_MUTED): cv.boolean} + {probatio.Required(ATTR_MEDIA_VOLUME_MUTED): cv.boolean} ), _rename_keys(mute=ATTR_MEDIA_VOLUME_MUTED), ), @@ -371,9 +373,9 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: ) component.async_register_entity_service( SERVICE_MEDIA_SEEK, - vol.All( + probatio.All( cv.make_entity_service_schema( - {vol.Required(ATTR_MEDIA_SEEK_POSITION): cv.positive_float} + {probatio.Required(ATTR_MEDIA_SEEK_POSITION): cv.positive_float} ), _rename_keys(position=ATTR_MEDIA_SEEK_POSITION), ), @@ -382,19 +384,23 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: ) component.async_register_entity_service( SERVICE_JOIN, - {vol.Required(ATTR_GROUP_MEMBERS): vol.All(cv.ensure_list, [cv.entity_id])}, + { + probatio.Required(ATTR_GROUP_MEMBERS): probatio.All( + cv.ensure_list, [cv.entity_id] + ) + }, "async_join_players", [MediaPlayerEntityFeature.GROUPING], ) component.async_register_entity_service( SERVICE_SELECT_SOURCE, - {vol.Required(ATTR_INPUT_SOURCE): cv.string}, + {probatio.Required(ATTR_INPUT_SOURCE): cv.string}, "async_select_source", [MediaPlayerEntityFeature.SELECT_SOURCE], ) component.async_register_entity_service( SERVICE_SELECT_SOUND_MODE, - {vol.Required(ATTR_SOUND_MODE): cv.string}, + {probatio.Required(ATTR_SOUND_MODE): cv.string}, "async_select_sound_mode", [MediaPlayerEntityFeature.SELECT_SOUND_MODE], ) @@ -421,7 +427,7 @@ def _rewrite_enqueue(value: dict[str, Any]) -> dict[str, Any]: component.async_register_entity_service( SERVICE_PLAY_MEDIA, - vol.All( + probatio.All( _promote_media_fields, cv.make_entity_service_schema(MEDIA_PLAYER_PLAY_MEDIA_SCHEMA), _rewrite_enqueue, @@ -437,8 +443,8 @@ def _rewrite_enqueue(value: dict[str, Any]) -> dict[str, Any]: component.async_register_entity_service( SERVICE_BROWSE_MEDIA, { - vol.Optional(ATTR_MEDIA_CONTENT_TYPE): cv.string, - vol.Optional(ATTR_MEDIA_CONTENT_ID): cv.string, + probatio.Optional(ATTR_MEDIA_CONTENT_TYPE): cv.string, + probatio.Optional(ATTR_MEDIA_CONTENT_ID): cv.string, }, "async_browse_media", supports_response=SupportsResponse.ONLY, @@ -446,12 +452,12 @@ def _rewrite_enqueue(value: dict[str, Any]) -> dict[str, Any]: component.async_register_entity_service( SERVICE_SEARCH_MEDIA, { - vol.Optional(ATTR_MEDIA_CONTENT_TYPE): cv.string, - vol.Optional(ATTR_MEDIA_CONTENT_ID): cv.string, - vol.Required(ATTR_MEDIA_SEARCH_QUERY): cv.string, - vol.Optional(ATTR_MEDIA_FILTER_CLASSES): vol.All( + probatio.Optional(ATTR_MEDIA_CONTENT_TYPE): cv.string, + probatio.Optional(ATTR_MEDIA_CONTENT_ID): cv.string, + probatio.Required(ATTR_MEDIA_SEARCH_QUERY): cv.string, + probatio.Optional(ATTR_MEDIA_FILTER_CLASSES): probatio.All( cv.ensure_list, - [vol.In([m.value for m in MediaClass])], + [probatio.In([m.value for m in MediaClass])], lambda x: {MediaClass(item) for item in x}, ), }, @@ -461,7 +467,7 @@ def _rewrite_enqueue(value: dict[str, Any]) -> dict[str, Any]: ) component.async_register_entity_service( SERVICE_SHUFFLE_SET, - {vol.Required(ATTR_MEDIA_SHUFFLE): cv.boolean}, + {probatio.Required(ATTR_MEDIA_SHUFFLE): cv.boolean}, "async_set_shuffle", [MediaPlayerEntityFeature.SHUFFLE_SET], ) @@ -471,7 +477,7 @@ def _rewrite_enqueue(value: dict[str, Any]) -> dict[str, Any]: component.async_register_entity_service( SERVICE_REPEAT_SET, - {vol.Required(ATTR_MEDIA_REPEAT): vol.Coerce(RepeatMode)}, + {probatio.Required(ATTR_MEDIA_REPEAT): probatio.Coerce(RepeatMode)}, "async_set_repeat", [MediaPlayerEntityFeature.REPEAT_SET], ) @@ -1324,14 +1330,14 @@ async def get( @websocket_api.websocket_command( { - vol.Required("type"): "media_player/browse_media", - vol.Required("entity_id"): cv.entity_id, - vol.Inclusive( + probatio.Required("type"): "media_player/browse_media", + probatio.Required("entity_id"): cv.entity_id, + probatio.Inclusive( ATTR_MEDIA_CONTENT_TYPE, "media_ids", "media_content_type and media_content_id must be provided together", ): str, - vol.Inclusive( + probatio.Inclusive( ATTR_MEDIA_CONTENT_ID, "media_ids", "media_content_type and media_content_id must be provided together", @@ -1401,22 +1407,22 @@ async def websocket_browse_media( @websocket_api.websocket_command( { - vol.Required("type"): "media_player/search_media", - vol.Required("entity_id"): cv.entity_id, - vol.Inclusive( + probatio.Required("type"): "media_player/search_media", + probatio.Required("entity_id"): cv.entity_id, + probatio.Inclusive( ATTR_MEDIA_CONTENT_TYPE, "media_ids", "media_content_type and media_content_id must be provided together", ): str, - vol.Inclusive( + probatio.Inclusive( ATTR_MEDIA_CONTENT_ID, "media_ids", "media_content_type and media_content_id must be provided together", ): str, - vol.Required(ATTR_MEDIA_SEARCH_QUERY): str, - vol.Optional(ATTR_MEDIA_FILTER_CLASSES): vol.All( + probatio.Required(ATTR_MEDIA_SEARCH_QUERY): str, + probatio.Optional(ATTR_MEDIA_FILTER_CLASSES): probatio.All( cv.ensure_list, - [vol.In([m.value for m in MediaClass])], + [probatio.In([m.value for m in MediaClass])], lambda x: {MediaClass(item) for item in x}, ), } diff --git a/homeassistant/components/media_player/device_condition.py b/homeassistant/components/media_player/device_condition.py index 239e8994b381d..1f86163b1a539 100644 --- a/homeassistant/components/media_player/device_condition.py +++ b/homeassistant/components/media_player/device_condition.py @@ -1,6 +1,6 @@ """Provides device automations for Media player.""" -import voluptuous as vol +import probatio from homeassistant.const import ( ATTR_ENTITY_ID, @@ -38,8 +38,8 @@ CONDITION_SCHEMA = DEVICE_CONDITION_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In(CONDITION_TYPES), + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In(CONDITION_TYPES), } ) diff --git a/homeassistant/components/media_player/device_trigger.py b/homeassistant/components/media_player/device_trigger.py index 01396db8d3e9e..168b6b22f390a 100644 --- a/homeassistant/components/media_player/device_trigger.py +++ b/homeassistant/components/media_player/device_trigger.py @@ -1,6 +1,6 @@ """Provides device automations for Media player.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import ( DEVICE_TRIGGER_BASE_SCHEMA, @@ -32,18 +32,20 @@ MEDIA_PLAYER_TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In(TRIGGER_TYPES), - vol.Optional(CONF_FOR): cv.positive_time_period_dict, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In(TRIGGER_TYPES), + probatio.Optional(CONF_FOR): cv.positive_time_period_dict, } ) -TRIGGER_SCHEMA = vol.All( - vol.Any( +TRIGGER_SCHEMA = probatio.All( + probatio.Any( MEDIA_PLAYER_TRIGGER_SCHEMA, entity.TRIGGER_SCHEMA, ), - vol.Schema({vol.Required(CONF_DOMAIN): DOMAIN}, extra=vol.ALLOW_EXTRA), + probatio.Schema( + {probatio.Required(CONF_DOMAIN): DOMAIN}, extra=probatio.ALLOW_EXTRA + ), ) @@ -76,13 +78,13 @@ async def async_get_triggers( async def async_get_trigger_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List trigger capabilities.""" if config[CONF_TYPE] not in TRIGGER_TYPES: return await entity.async_get_trigger_capabilities(hass, config) return { - "extra_fields": vol.Schema( - {vol.Optional(CONF_FOR): cv.positive_time_period_dict} + "extra_fields": probatio.Schema( + {probatio.Optional(CONF_FOR): cv.positive_time_period_dict} ) } diff --git a/homeassistant/components/media_player/intent.py b/homeassistant/components/media_player/intent.py index f5b2573183aef..7c5e53a23de96 100644 --- a/homeassistant/components/media_player/intent.py +++ b/homeassistant/components/media_player/intent.py @@ -7,7 +7,7 @@ import time from typing import cast, override -import voluptuous as vol +import probatio from homeassistant.const import ( SERVICE_MEDIA_NEXT_TRACK, @@ -120,9 +120,9 @@ async def async_setup_intents(hass: HomeAssistant) -> None: required_slots={ ATTR_MEDIA_VOLUME_LEVEL: intent.IntentSlotInfo( description="The volume percentage of the media player", - value_schema=vol.All( - vol.Coerce(int), - vol.Range(min=0, max=100), + value_schema=probatio.All( + probatio.Coerce(int), + probatio.Range(min=0, max=100), lambda val: val / 100, ), ), @@ -253,7 +253,7 @@ def __init__(self, is_volume_muted: bool) -> None: optional_slots={ ATTR_MEDIA_VOLUME_MUTED: intent.IntentSlotInfo( description="Whether the media player should be muted or unmuted", - value_schema=vol.Boolean(), + value_schema=probatio.Boolean(), ), }, description=( @@ -282,14 +282,16 @@ class MediaSearchAndPlayHandler(intent.IntentHandler): intent_type = INTENT_MEDIA_SEARCH_AND_PLAY slot_schema = { - vol.Required("search_query"): cv.string, - vol.Optional("media_class"): vol.In([cls.value for cls in MediaClass]), + probatio.Required("search_query"): cv.string, + probatio.Optional("media_class"): probatio.In( + [cls.value for cls in MediaClass] + ), # Optional name/area/floor slots handled by intent matcher - vol.Optional("name"): cv.string, - vol.Optional("area"): cv.string, - vol.Optional("floor"): cv.string, - vol.Optional("preferred_area_id"): cv.string, - vol.Optional("preferred_floor_id"): cv.string, + probatio.Optional("name"): cv.string, + probatio.Optional("area"): cv.string, + probatio.Optional("floor"): cv.string, + probatio.Optional("preferred_area_id"): cv.string, + probatio.Optional("preferred_floor_id"): cv.string, } platforms = {DOMAIN} @@ -409,21 +411,21 @@ class MediaSetVolumeRelativeHandler(intent.IntentHandler): intent_type = INTENT_SET_VOLUME_RELATIVE slot_schema = { - vol.Required("volume_step"): vol.Any( + probatio.Required("volume_step"): probatio.Any( "up", "down", - vol.All( - vol.Coerce(int), - vol.Range(min=-100, max=100), + probatio.All( + probatio.Coerce(int), + probatio.Range(min=-100, max=100), lambda val: val / 100, ), ), # Optional name/area/floor slots handled by intent matcher - vol.Optional("name"): cv.string, - vol.Optional("area"): cv.string, - vol.Optional("floor"): cv.string, - vol.Optional("preferred_area_id"): cv.string, - vol.Optional("preferred_floor_id"): cv.string, + probatio.Optional("name"): cv.string, + probatio.Optional("area"): cv.string, + probatio.Optional("floor"): cv.string, + probatio.Optional("preferred_area_id"): cv.string, + probatio.Optional("preferred_floor_id"): cv.string, } platforms = {DOMAIN} diff --git a/homeassistant/components/media_source/http.py b/homeassistant/components/media_source/http.py index 0acec90fae88b..b866184a300c1 100644 --- a/homeassistant/components/media_source/http.py +++ b/homeassistant/components/media_source/http.py @@ -2,7 +2,7 @@ from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import frontend, websocket_api from homeassistant.components.media_player import ( @@ -34,8 +34,8 @@ def async_setup(hass: HomeAssistant) -> None: @websocket_api.websocket_command( { - vol.Required("type"): "media_source/browse_media", - vol.Optional(ATTR_MEDIA_CONTENT_ID, default=""): str, + probatio.Required("type"): "media_source/browse_media", + probatio.Optional(ATTR_MEDIA_CONTENT_ID, default=""): str, } ) @websocket_api.async_response @@ -55,10 +55,10 @@ async def websocket_browse_media( @websocket_api.websocket_command( { - vol.Required("type"): "media_source/search_media", - vol.Optional(ATTR_MEDIA_CONTENT_ID, default=""): str, - vol.Required(ATTR_MEDIA_SEARCH_QUERY): str, - vol.Optional(ATTR_MEDIA_FILTER_CLASSES): [vol.Coerce(MediaClass)], + probatio.Required("type"): "media_source/search_media", + probatio.Optional(ATTR_MEDIA_CONTENT_ID, default=""): str, + probatio.Required(ATTR_MEDIA_SEARCH_QUERY): str, + probatio.Optional(ATTR_MEDIA_FILTER_CLASSES): [probatio.Coerce(MediaClass)], } ) @websocket_api.async_response @@ -84,9 +84,9 @@ async def websocket_search_media( @websocket_api.websocket_command( { - vol.Required("type"): "media_source/resolve_media", - vol.Required(ATTR_MEDIA_CONTENT_ID): str, - vol.Optional("expires", default=CONTENT_AUTH_EXPIRY_TIME): int, + probatio.Required("type"): "media_source/resolve_media", + probatio.Required(ATTR_MEDIA_CONTENT_ID): str, + probatio.Optional("expires", default=CONTENT_AUTH_EXPIRY_TIME): int, } ) @websocket_api.async_response diff --git a/homeassistant/components/media_source/local_source.py b/homeassistant/components/media_source/local_source.py index 49fb54b225ae4..9f60ea95808b1 100644 --- a/homeassistant/components/media_source/local_source.py +++ b/homeassistant/components/media_source/local_source.py @@ -9,7 +9,7 @@ from aiohttp import web from aiohttp.web_request import FileField -import voluptuous as vol +import probatio from homeassistant.components import http, websocket_api from homeassistant.components.http import require_admin @@ -127,7 +127,7 @@ async def async_upload_media( if not uploaded_file.content_type.startswith(("image/", "video/", "audio/")): LOGGER.error("Content type not allowed") - raise vol.Invalid("Only images and video are allowed") + raise probatio.Invalid("Only images and video are allowed") try: raise_if_invalid_filename(uploaded_file.filename) @@ -414,7 +414,7 @@ class UploadMediaView(http.HomeAssistantView): url = "/api/media_source/local_source/upload" name = "api:media_source:local_source:upload" - schema = vol.Schema( + schema = probatio.Schema( { "media_content_id": str, "file": FileField, @@ -431,7 +431,7 @@ async def post(self, request: web.Request) -> web.Response: try: data = self.schema(dict(await request.post())) - except vol.Invalid as err: + except probatio.Invalid as err: LOGGER.error("Received invalid upload data: %s", err) raise web.HTTPBadRequest from err @@ -469,8 +469,8 @@ async def post(self, request: web.Request) -> web.Response: @websocket_api.websocket_command( { - vol.Required("type"): "media_source/local_source/remove", - vol.Required("media_content_id"): str, + probatio.Required("type"): "media_source/local_source/remove", + probatio.Required("media_content_id"): str, } ) @websocket_api.require_admin diff --git a/homeassistant/components/mediaroom/media_player.py b/homeassistant/components/mediaroom/media_player.py index 5154af015064d..6df9f77e03642 100644 --- a/homeassistant/components/mediaroom/media_player.py +++ b/homeassistant/components/mediaroom/media_player.py @@ -3,6 +3,7 @@ import logging from typing import Any, override +import probatio from pymediaroom import ( COMMANDS, PyMediaroomError, @@ -10,7 +11,6 @@ State, install_mediaroom_protocol, ) -import voluptuous as vol from homeassistant.components.media_player import ( PLATFORM_SCHEMA as MEDIA_PLAYER_PLATFORM_SCHEMA, @@ -46,10 +46,10 @@ PLATFORM_SCHEMA = MEDIA_PLAYER_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_HOST): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_OPTIMISTIC, default=False): cv.boolean, - vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, + probatio.Optional(CONF_HOST): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_OPTIMISTIC, default=False): cv.boolean, + probatio.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, } ) diff --git a/homeassistant/components/melcloud/climate.py b/homeassistant/components/melcloud/climate.py index d592391446ba0..9e9506eba8fc1 100644 --- a/homeassistant/components/melcloud/climate.py +++ b/homeassistant/components/melcloud/climate.py @@ -2,6 +2,7 @@ from typing import Any, cast, override +import probatio from pymelcloud import DEVICE_TYPE_ATA, DEVICE_TYPE_ATW, AtaDevice, AtwDevice import pymelcloud.ata_device as ata import pymelcloud.atw_device as atw @@ -14,7 +15,6 @@ Zone, ) from pymelcloud.device import PROPERTY_POWER -import voluptuous as vol from homeassistant.components.climate import ( ATTR_HVAC_MODE, @@ -105,12 +105,12 @@ async def async_setup_entry( platform = entity_platform.async_get_current_platform() platform.async_register_entity_service( SERVICE_SET_VANE_HORIZONTAL, - {vol.Required(CONF_POSITION): cv.string}, + {probatio.Required(CONF_POSITION): cv.string}, "async_set_vane_horizontal", ) platform.async_register_entity_service( SERVICE_SET_VANE_VERTICAL, - {vol.Required(CONF_POSITION): cv.string}, + {probatio.Required(CONF_POSITION): cv.string}, "async_set_vane_vertical", ) diff --git a/homeassistant/components/melcloud/config_flow.py b/homeassistant/components/melcloud/config_flow.py index d0b576631bcc3..1bc69f4e59ec3 100644 --- a/homeassistant/components/melcloud/config_flow.py +++ b/homeassistant/components/melcloud/config_flow.py @@ -6,8 +6,8 @@ from typing import Any, override from aiohttp import ClientError, ClientResponseError +import probatio import pymelcloud -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_TOKEN, CONF_USERNAME @@ -20,12 +20,12 @@ from .const import DOMAIN -USER_SCHEMA = vol.Schema( +USER_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): TextSelector( + probatio.Required(CONF_USERNAME): TextSelector( TextSelectorConfig(type=TextSelectorType.TEXT, autocomplete="username") ), - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", @@ -193,9 +193,9 @@ async def async_step_reconfigure( return self.async_show_form( step_id="reconfigure", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", diff --git a/homeassistant/components/melcloud_home/config_flow.py b/homeassistant/components/melcloud_home/config_flow.py index 47edc62765192..7071a013472d4 100644 --- a/homeassistant/components/melcloud_home/config_flow.py +++ b/homeassistant/components/melcloud_home/config_flow.py @@ -10,7 +10,7 @@ MelCloudHomeConnectionError, MelCloudHomeTimeoutError, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_EMAIL, CONF_PASSWORD @@ -25,12 +25,12 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_EMAIL): TextSelector( + probatio.Required(CONF_EMAIL): TextSelector( TextSelectorConfig(type=TextSelectorType.EMAIL, autocomplete="username") ), - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password" ) diff --git a/homeassistant/components/melissa/__init__.py b/homeassistant/components/melissa/__init__.py index 9a9268e73d199..f32bc72e327d0 100644 --- a/homeassistant/components/melissa/__init__.py +++ b/homeassistant/components/melissa/__init__.py @@ -1,7 +1,7 @@ """Support for Melissa climate.""" from melissa import AsyncMelissa -import voluptuous as vol +import probatio from homeassistant.const import CONF_PASSWORD, CONF_USERNAME, Platform from homeassistant.core import HomeAssistant @@ -13,16 +13,16 @@ DATA_MELISSA = "MELISSA" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/melnor/config_flow.py b/homeassistant/components/melnor/config_flow.py index b54463a10fc27..aa9d381c9ee18 100644 --- a/homeassistant/components/melnor/config_flow.py +++ b/homeassistant/components/melnor/config_flow.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.bluetooth import async_discovered_service_info from homeassistant.components.bluetooth.models import BluetoothServiceInfoBleak @@ -101,7 +101,9 @@ async def async_step_pick_device( return self.async_show_form( step_id="pick_device", - data_schema=vol.Schema({vol.Required(CONF_ADDRESS): vol.In(addresses)}), + data_schema=probatio.Schema( + {probatio.Required(CONF_ADDRESS): probatio.In(addresses)} + ), ) @override diff --git a/homeassistant/components/meraki/device_tracker.py b/homeassistant/components/meraki/device_tracker.py index 253c3de486a6f..dfb0dda5541cc 100644 --- a/homeassistant/components/meraki/device_tracker.py +++ b/homeassistant/components/meraki/device_tracker.py @@ -4,7 +4,7 @@ import json import logging -import voluptuous as vol +import probatio from homeassistant.components.device_tracker import ( PLATFORM_SCHEMA as DEVICE_TRACKER_PLATFORM_SCHEMA, @@ -26,7 +26,10 @@ PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_VALIDATOR): cv.string, vol.Required(CONF_SECRET): cv.string} + { + probatio.Required(CONF_VALIDATOR): cv.string, + probatio.Required(CONF_SECRET): cv.string, + } ) diff --git a/homeassistant/components/message_bird/notify.py b/homeassistant/components/message_bird/notify.py index 6886c892a31c4..bbe960877d8d5 100644 --- a/homeassistant/components/message_bird/notify.py +++ b/homeassistant/components/message_bird/notify.py @@ -5,7 +5,7 @@ import messagebird from messagebird.client import ErrorException -import voluptuous as vol +import probatio from homeassistant.components.notify import ( ATTR_TARGET, @@ -21,9 +21,9 @@ PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_API_KEY): cv.string, - vol.Optional(CONF_SENDER, default="HA"): vol.All( - cv.string, vol.Match(r"^(\+?[1-9]\d{1,14}|\w{1,11})$") + probatio.Required(CONF_API_KEY): cv.string, + probatio.Optional(CONF_SENDER, default="HA"): probatio.All( + cv.string, probatio.Match(r"^(\+?[1-9]\d{1,14}|\w{1,11})$") ), } ) diff --git a/homeassistant/components/met/config_flow.py b/homeassistant/components/met/config_flow.py index 50c7c302263dd..e82c171360997 100644 --- a/homeassistant/components/met/config_flow.py +++ b/homeassistant/components/met/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -51,19 +51,21 @@ def configured_instances(hass: HomeAssistant) -> set[str]: def _get_data_schema( hass: HomeAssistant, config_entry: ConfigEntry | None = None -) -> vol.Schema: +) -> probatio.Schema: """Get a schema with default values.""" # If tracking home or no config entry is passed in, # default value come from Home location if config_entry is None or config_entry.data.get(CONF_TRACK_HOME, False): - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_NAME, default=HOME_LOCATION_NAME): str, - vol.Required(CONF_LATITUDE, default=hass.config.latitude): cv.latitude, - vol.Required( + probatio.Required(CONF_NAME, default=HOME_LOCATION_NAME): str, + probatio.Required( + CONF_LATITUDE, default=hass.config.latitude + ): cv.latitude, + probatio.Required( CONF_LONGITUDE, default=hass.config.longitude ): cv.longitude, - vol.Required( + probatio.Required( CONF_ELEVATION, default=hass.config.elevation ): NumberSelector( NumberSelectorConfig( @@ -74,16 +76,16 @@ def _get_data_schema( } ) # Not tracking home, default values come from config entry - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_NAME, default=config_entry.data.get(CONF_NAME)): str, - vol.Required( + probatio.Required(CONF_NAME, default=config_entry.data.get(CONF_NAME)): str, + probatio.Required( CONF_LATITUDE, default=config_entry.data.get(CONF_LATITUDE) ): cv.latitude, - vol.Required( + probatio.Required( CONF_LONGITUDE, default=config_entry.data.get(CONF_LONGITUDE) ): cv.longitude, - vol.Required( + probatio.Required( CONF_ELEVATION, default=config_entry.data.get(CONF_ELEVATION) ): NumberSelector( NumberSelectorConfig( diff --git a/homeassistant/components/met_eireann/config_flow.py b/homeassistant/components/met_eireann/config_flow.py index 8587282b68ea2..6151880106b3c 100644 --- a/homeassistant/components/met_eireann/config_flow.py +++ b/homeassistant/components/met_eireann/config_flow.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_ELEVATION, CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME @@ -30,18 +30,18 @@ async def async_step_user( else: return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Required(CONF_NAME, default=HOME_LOCATION_NAME): str, - vol.Required( + probatio.Required(CONF_NAME, default=HOME_LOCATION_NAME): str, + probatio.Required( CONF_LATITUDE, default=self.hass.config.latitude ): cv.latitude, - vol.Required( + probatio.Required( CONF_LONGITUDE, default=self.hass.config.longitude ): cv.longitude, - vol.Required( + probatio.Required( CONF_ELEVATION, default=self.hass.config.elevation ): int, } diff --git a/homeassistant/components/meteo_france/config_flow.py b/homeassistant/components/meteo_france/config_flow.py index 49864eb9bb2f6..68e6468be0a4a 100644 --- a/homeassistant/components/meteo_france/config_flow.py +++ b/homeassistant/components/meteo_france/config_flow.py @@ -5,7 +5,7 @@ from meteofrance_api.client import MeteoFranceClient from meteofrance_api.model import Place -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_IMPORT, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_LATITUDE, CONF_LONGITUDE @@ -38,8 +38,12 @@ def _show_setup_form( return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_CITY, default=user_input.get(CONF_CITY, "")): str} + data_schema=probatio.Schema( + { + probatio.Required( + CONF_CITY, default=user_input.get(CONF_CITY, "") + ): str + } ), errors=errors or {}, ) @@ -91,10 +95,10 @@ async def async_step_cities( return self.async_show_form( step_id="cities", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_CITY): vol.All( - vol.Coerce(str), vol.In(places_for_form) + probatio.Required(CONF_CITY): probatio.All( + probatio.Coerce(str), probatio.In(places_for_form) ) } ), diff --git a/homeassistant/components/meteo_lt/config_flow.py b/homeassistant/components/meteo_lt/config_flow.py index 05f83e831ca2a..19a1dfd3f5782 100644 --- a/homeassistant/components/meteo_lt/config_flow.py +++ b/homeassistant/components/meteo_lt/config_flow.py @@ -5,7 +5,7 @@ import aiohttp from meteo_lt import MeteoLtAPI, Place -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.helpers.aiohttp_client import async_get_clientsession @@ -65,9 +65,9 @@ async def async_step_user( for place in self._places } - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_PLACE_CODE): vol.In(places_options), + probatio.Required(CONF_PLACE_CODE): probatio.In(places_options), } ) diff --git a/homeassistant/components/meteoalarm/binary_sensor.py b/homeassistant/components/meteoalarm/binary_sensor.py index 876b22f06901f..4f99a9ef24e20 100644 --- a/homeassistant/components/meteoalarm/binary_sensor.py +++ b/homeassistant/components/meteoalarm/binary_sensor.py @@ -4,7 +4,7 @@ import logging from meteoalertapi import Meteoalert -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import ( PLATFORM_SCHEMA as BINARY_SENSOR_PLATFORM_SCHEMA, @@ -30,10 +30,10 @@ PLATFORM_SCHEMA = BINARY_SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_COUNTRY): cv.string, - vol.Required(CONF_PROVINCE): cv.string, - vol.Optional(CONF_LANGUAGE, default="en"): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_COUNTRY): cv.string, + probatio.Required(CONF_PROVINCE): cv.string, + probatio.Optional(CONF_LANGUAGE, default="en"): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/meteoclimatic/config_flow.py b/homeassistant/components/meteoclimatic/config_flow.py index 9e3c21e352a11..cac52c2ccdc84 100644 --- a/homeassistant/components/meteoclimatic/config_flow.py +++ b/homeassistant/components/meteoclimatic/config_flow.py @@ -5,7 +5,7 @@ from meteoclimatic import MeteoclimaticClient from meteoclimatic.exceptions import MeteoclimaticError, StationNotFound -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -26,9 +26,9 @@ def _show_setup_form(self, user_input=None, errors=None): return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_STATION_CODE, default=user_input.get(CONF_STATION_CODE, "") ): str } diff --git a/homeassistant/components/metoffice/config_flow.py b/homeassistant/components/metoffice/config_flow.py index 50088f22d971b..0e472dc2440d2 100644 --- a/homeassistant/components/metoffice/config_flow.py +++ b/homeassistant/components/metoffice/config_flow.py @@ -6,8 +6,8 @@ from datapoint.exceptions import APIException from datapoint.Manager import Manager +import probatio from requests import HTTPError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE, CONF_NAME @@ -85,13 +85,13 @@ async def async_step_user( title=user_input[CONF_NAME], data=user_input ) - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_API_KEY): str, - vol.Required( + probatio.Required(CONF_API_KEY): str, + probatio.Required( CONF_LATITUDE, default=self.hass.config.latitude ): cv.latitude, - vol.Required( + probatio.Required( CONF_LONGITUDE, default=self.hass.config.longitude ): cv.longitude, }, @@ -134,9 +134,9 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_API_KEY): str, + probatio.Required(CONF_API_KEY): str, } ), description_placeholders={ diff --git a/homeassistant/components/mfi/sensor.py b/homeassistant/components/mfi/sensor.py index 3364370486399..15e3c4c95c879 100644 --- a/homeassistant/components/mfi/sensor.py +++ b/homeassistant/components/mfi/sensor.py @@ -4,8 +4,8 @@ from typing import override from mficlient.client import FailedToLogin, MFiClient, Port as MFiPort +import probatio import requests -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -47,12 +47,12 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_PORT): cv.port, - vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, - vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_PORT): cv.port, + probatio.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, + probatio.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, } ) diff --git a/homeassistant/components/mfi/switch.py b/homeassistant/components/mfi/switch.py index d8838f218269b..37e0e14d43278 100644 --- a/homeassistant/components/mfi/switch.py +++ b/homeassistant/components/mfi/switch.py @@ -4,8 +4,8 @@ from typing import Any, override from mficlient.client import FailedToLogin, MFiClient, Port as MFiPort +import probatio import requests -import voluptuous as vol from homeassistant.components.switch import ( PLATFORM_SCHEMA as SWITCH_PLATFORM_SCHEMA, @@ -33,12 +33,12 @@ PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_PORT): cv.port, - vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, - vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_PORT): cv.port, + probatio.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, + probatio.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, } ) diff --git a/homeassistant/components/microsoft/tts.py b/homeassistant/components/microsoft/tts.py index 8b09ca37d3fd1..54edc49361a30 100644 --- a/homeassistant/components/microsoft/tts.py +++ b/homeassistant/components/microsoft/tts.py @@ -3,9 +3,9 @@ import logging from typing import Any, override +import probatio from pycsspeechtts import pycsspeechtts from requests.exceptions import HTTPError -import voluptuous as vol from homeassistant.components.tts import ( CONF_LANG, @@ -39,19 +39,21 @@ PLATFORM_SCHEMA = TTS_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_API_KEY): cv.string, - vol.Optional(CONF_LANG, default=DEFAULT_LANG): vol.In(SUPPORTED_LANGUAGES), - vol.Optional(CONF_GENDER, default=DEFAULT_GENDER): vol.In(GENDERS), - vol.Optional(CONF_TYPE, default=DEFAULT_TYPE): cv.string, - vol.Optional(CONF_RATE, default=DEFAULT_RATE): vol.All( - vol.Coerce(int), vol.Range(-100, 100) + probatio.Required(CONF_API_KEY): cv.string, + probatio.Optional(CONF_LANG, default=DEFAULT_LANG): probatio.In( + SUPPORTED_LANGUAGES ), - vol.Optional(CONF_VOLUME, default=DEFAULT_VOLUME): vol.All( - vol.Coerce(int), vol.Range(-100, 100) + probatio.Optional(CONF_GENDER, default=DEFAULT_GENDER): probatio.In(GENDERS), + probatio.Optional(CONF_TYPE, default=DEFAULT_TYPE): cv.string, + probatio.Optional(CONF_RATE, default=DEFAULT_RATE): probatio.All( + probatio.Coerce(int), probatio.Range(-100, 100) ), - vol.Optional(CONF_PITCH, default=DEFAULT_PITCH): cv.string, - vol.Optional(CONF_CONTOUR, default=DEFAULT_CONTOUR): cv.string, - vol.Optional(CONF_REGION, default=DEFAULT_REGION): cv.string, + probatio.Optional(CONF_VOLUME, default=DEFAULT_VOLUME): probatio.All( + probatio.Coerce(int), probatio.Range(-100, 100) + ), + probatio.Optional(CONF_PITCH, default=DEFAULT_PITCH): cv.string, + probatio.Optional(CONF_CONTOUR, default=DEFAULT_CONTOUR): cv.string, + probatio.Optional(CONF_REGION, default=DEFAULT_REGION): cv.string, } ) diff --git a/homeassistant/components/midea/config_flow.py b/homeassistant/components/midea/config_flow.py index 2da1798bb777f..bf2e43ae40165 100644 --- a/homeassistant/components/midea/config_flow.py +++ b/homeassistant/components/midea/config_flow.py @@ -15,7 +15,7 @@ from midealocal.devices import device_selector from midealocal.discover import discover from midealocal.exceptions import MideaCloudError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -241,11 +241,11 @@ def _show_login_credentials_form( error: str | None = None, ) -> ConfigFlowResult: """Show the login form, retaining any previously entered values.""" - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required(CONF_ACCOUNT): str, - vol.Required(CONF_PASSWORD): str, - vol.Required( + probatio.Required(CONF_ACCOUNT): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Required( CONF_SERVER, default=default_server, ): SelectSelector( @@ -292,9 +292,9 @@ async def async_step_auth_method( return self.async_show_form( step_id="auth_method", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( "login_mode", default=LOGIN_MODE_PRESET, ): SelectSelector( @@ -381,8 +381,8 @@ async def async_step_search( # show discovery device input form with auto or ip address in web UI return self.async_show_form( step_id="search", - data_schema=vol.Schema( - {vol.Required(CONF_IP_ADDRESS, default="auto"): str}, + data_schema=probatio.Schema( + {probatio.Required(CONF_IP_ADDRESS, default="auto"): str}, ), errors={"base": error} if error else None, ) @@ -592,12 +592,12 @@ async def async_step_auto( # show available device list in UI return self.async_show_form( step_id="auto", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_DEVICE, default=next(iter(self.available_device.keys())), - ): vol.In(self.available_device), + ): probatio.In(self.available_device), }, ), **self._form_error(error), @@ -804,9 +804,9 @@ async def async_step_reconfigure( ) return self.async_show_form( step_id="reconfigure", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_IP_ADDRESS, default=(user_input or entry.data)[CONF_IP_ADDRESS], ): str @@ -822,43 +822,43 @@ def _show_manually_form( ) -> ConfigFlowResult: """Show the manual step form, retaining any previously entered values.""" protocol = self.found_device.get(CONF_PROTOCOL) - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required( + probatio.Required( CONF_DEVICE_ID, default=self.found_device.get(CONF_DEVICE_ID), ): int, - vol.Required( + probatio.Required( CONF_TYPE, default=(self.found_device.get(CONF_TYPE) or DeviceType.AC), - ): vol.In(self.supports), - vol.Required( + ): probatio.In(self.supports), + probatio.Required( CONF_IP_ADDRESS, default=self.found_device.get(CONF_IP_ADDRESS), ): str, - vol.Required( + probatio.Required( CONF_PORT, default=(self.found_device.get(CONF_PORT) or 6444), ): int, - vol.Required( + probatio.Required( CONF_PROTOCOL, default=(protocol or ProtocolVersion.V3), - ): vol.In( + ): probatio.In( [protocol] if protocol else ProtocolVersion, ), - vol.Required( + probatio.Required( CONF_MODEL, default=(self.found_device.get(CONF_MODEL) or "Unknown"), ): str, - vol.Required( + probatio.Required( CONF_SUBTYPE, default=(self.found_device.get(CONF_SUBTYPE) or 0), ): int, - vol.Optional( + probatio.Optional( CONF_TOKEN, default=(self.found_device.get(CONF_TOKEN) or ""), ): str, - vol.Optional( + probatio.Optional( CONF_KEY, default=(self.found_device.get(CONF_KEY) or ""), ): str, diff --git a/homeassistant/components/miele/services.py b/homeassistant/components/miele/services.py index 40a8a188d4a76..05a3a34b9bafd 100644 --- a/homeassistant/components/miele/services.py +++ b/homeassistant/components/miele/services.py @@ -5,7 +5,7 @@ from typing import cast from aiohttp import ClientResponseError -import voluptuous as vol +import probatio from homeassistant.const import ATTR_DEVICE_ID, ATTR_TEMPERATURE from homeassistant.core import ( @@ -27,30 +27,30 @@ SERVICE_SET_PROGRAM = "set_program" -SERVICE_SET_PROGRAM_SCHEMA = vol.Schema( +SERVICE_SET_PROGRAM_SCHEMA = probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): str, - vol.Required(ATTR_PROGRAM_ID): cv.positive_int, + probatio.Required(ATTR_DEVICE_ID): str, + probatio.Required(ATTR_PROGRAM_ID): cv.positive_int, }, ) SERVICE_SET_PROGRAM_OVEN = "set_program_oven" -SERVICE_SET_PROGRAM_OVEN_SCHEMA = vol.Schema( +SERVICE_SET_PROGRAM_OVEN_SCHEMA = probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): str, - vol.Required(ATTR_PROGRAM_ID): cv.positive_int, - vol.Optional(ATTR_TEMPERATURE): cv.positive_int, - vol.Optional(ATTR_DURATION): vol.All( + probatio.Required(ATTR_DEVICE_ID): str, + probatio.Required(ATTR_PROGRAM_ID): cv.positive_int, + probatio.Optional(ATTR_TEMPERATURE): cv.positive_int, + probatio.Optional(ATTR_DURATION): probatio.All( cv.time_period, - vol.Range(min=timedelta(minutes=1), max=timedelta(hours=12)), + probatio.Range(min=timedelta(minutes=1), max=timedelta(hours=12)), ), }, ) SERVICE_GET_PROGRAMS = "get_programs" -SERVICE_GET_PROGRAMS_SCHEMA = vol.Schema( +SERVICE_GET_PROGRAMS_SCHEMA = probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): str, + probatio.Required(ATTR_DEVICE_ID): str, }, ) diff --git a/homeassistant/components/mikrotik/config_flow.py b/homeassistant/components/mikrotik/config_flow.py index 13eac98cce5b3..64dd8c077e8fa 100644 --- a/homeassistant/components/mikrotik/config_flow.py +++ b/homeassistant/components/mikrotik/config_flow.py @@ -3,7 +3,7 @@ from collections.abc import Mapping from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, OptionsFlow from homeassistant.const import ( @@ -65,13 +65,13 @@ async def async_step_user( ) return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Optional(CONF_PORT, default=DEFAULT_API_PORT): int, - vol.Optional(CONF_VERIFY_SSL, default=False): bool, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Optional(CONF_PORT, default=DEFAULT_API_PORT): int, + probatio.Optional(CONF_VERIFY_SSL, default=False): bool, } ), errors=errors, @@ -105,9 +105,9 @@ async def async_step_reauth_confirm( return self.async_show_form( description_placeholders={CONF_USERNAME: reauth_entry.data[CONF_USERNAME]}, step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, @@ -131,15 +131,15 @@ async def async_step_device_tracker( return self.async_create_entry(title="", data=user_input) options = { - vol.Optional( + probatio.Optional( CONF_FORCE_DHCP, default=self.config_entry.options.get(CONF_FORCE_DHCP, False), ): bool, - vol.Optional( + probatio.Optional( CONF_ARP_PING, default=self.config_entry.options.get(CONF_ARP_PING, False), ): bool, - vol.Optional( + probatio.Optional( CONF_DETECTION_TIME, default=self.config_entry.options.get( CONF_DETECTION_TIME, DEFAULT_DETECTION_TIME @@ -148,5 +148,5 @@ async def async_step_device_tracker( } return self.async_show_form( - step_id="device_tracker", data_schema=vol.Schema(options) + step_id="device_tracker", data_schema=probatio.Schema(options) ) diff --git a/homeassistant/components/mill/config_flow.py b/homeassistant/components/mill/config_flow.py index 45e76fbff4dcf..087eae4e19118 100644 --- a/homeassistant/components/mill/config_flow.py +++ b/homeassistant/components/mill/config_flow.py @@ -4,7 +4,7 @@ from mill import Mill from mill_local import Mill as MillLocal -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_IP_ADDRESS, CONF_PASSWORD, CONF_USERNAME @@ -23,9 +23,9 @@ async def async_step_user( self, user_input: dict[str, Any] | None = None ) -> ConfigFlowResult: """Handle the initial step.""" - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONNECTION_TYPE, default=CLOUD): vol.In( + probatio.Required(CONNECTION_TYPE, default=CLOUD): probatio.In( ( CLOUD, LOCAL, @@ -48,7 +48,7 @@ async def async_step_local( self, user_input: dict[str, str] | None = None ) -> ConfigFlowResult: """Handle the local step.""" - data_schema = vol.Schema({vol.Required(CONF_IP_ADDRESS): str}) + data_schema = probatio.Schema({probatio.Required(CONF_IP_ADDRESS): str}) if user_input is None: return self.async_show_form( step_id="local", @@ -82,8 +82,11 @@ async def async_step_cloud( self, user_input: dict[str, str] | None = None ) -> ConfigFlowResult: """Handle the cloud step.""" - data_schema = vol.Schema( - {vol.Required(CONF_USERNAME): str, vol.Required(CONF_PASSWORD): str} + data_schema = probatio.Schema( + { + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + } ) if user_input is None: return self.async_show_form( diff --git a/homeassistant/components/mill/services.py b/homeassistant/components/mill/services.py index a973fc59416b9..297022a102548 100644 --- a/homeassistant/components/mill/services.py +++ b/homeassistant/components/mill/services.py @@ -1,6 +1,6 @@ """Services for the Mill integration.""" -import voluptuous as vol +import probatio from homeassistant.core import HomeAssistant, ServiceCall, callback from homeassistant.helpers import config_validation as cv, service @@ -15,12 +15,12 @@ ) from .coordinator import MillConfigEntry -SET_ROOM_TEMP_SCHEMA = vol.Schema( +SET_ROOM_TEMP_SCHEMA = probatio.Schema( { - vol.Required(ATTR_ROOM_NAME): cv.string, - vol.Optional(ATTR_AWAY_TEMP): cv.positive_int, - vol.Optional(ATTR_COMFORT_TEMP): cv.positive_int, - vol.Optional(ATTR_SLEEP_TEMP): cv.positive_int, + probatio.Required(ATTR_ROOM_NAME): cv.string, + probatio.Optional(ATTR_AWAY_TEMP): cv.positive_int, + probatio.Optional(ATTR_COMFORT_TEMP): cv.positive_int, + probatio.Optional(ATTR_SLEEP_TEMP): cv.positive_int, } ) diff --git a/homeassistant/components/min_max/config_flow.py b/homeassistant/components/min_max/config_flow.py index 98128b773bf9c..b763546442143 100644 --- a/homeassistant/components/min_max/config_flow.py +++ b/homeassistant/components/min_max/config_flow.py @@ -3,7 +3,7 @@ from collections.abc import Mapping from typing import Any, cast, override -import voluptuous as vol +import probatio from homeassistant.components.input_number import DOMAIN as INPUT_NUMBER_DOMAIN from homeassistant.components.number import DOMAIN as NUMBER_DOMAIN @@ -28,20 +28,20 @@ ] -OPTIONS_SCHEMA = vol.Schema( +OPTIONS_SCHEMA = probatio.Schema( { - vol.Required(CONF_ENTITY_IDS): selector.EntitySelector( + probatio.Required(CONF_ENTITY_IDS): selector.EntitySelector( selector.EntitySelectorConfig( domain=[SENSOR_DOMAIN, NUMBER_DOMAIN, INPUT_NUMBER_DOMAIN], multiple=True, ), ), - vol.Required(CONF_TYPE): selector.SelectSelector( + probatio.Required(CONF_TYPE): selector.SelectSelector( selector.SelectSelectorConfig( options=_STATISTIC_MEASURES, translation_key=CONF_TYPE ), ), - vol.Required(CONF_ROUND_DIGITS, default=2): selector.NumberSelector( + probatio.Required(CONF_ROUND_DIGITS, default=2): selector.NumberSelector( selector.NumberSelectorConfig( min=0, max=6, mode=selector.NumberSelectorMode.BOX ), @@ -49,9 +49,9 @@ } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Required("name"): selector.TextSelector(), + probatio.Required("name"): selector.TextSelector(), } ).extend(OPTIONS_SCHEMA.schema) diff --git a/homeassistant/components/min_max/sensor.py b/homeassistant/components/min_max/sensor.py index 972237a6b6eaf..26b7b3c65ed77 100644 --- a/homeassistant/components/min_max/sensor.py +++ b/homeassistant/components/min_max/sensor.py @@ -5,7 +5,7 @@ import statistics from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -66,13 +66,13 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_TYPE, default=SENSOR_TYPES[ATTR_MAX_VALUE]): vol.All( - cv.string, vol.In(SENSOR_TYPES.values()) - ), - vol.Optional(CONF_NAME): cv.string, - vol.Required(CONF_ENTITY_IDS): cv.entity_ids, - vol.Optional(CONF_ROUND_DIGITS, default=2): vol.Coerce(int), - vol.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Optional( + CONF_TYPE, default=SENSOR_TYPES[ATTR_MAX_VALUE] + ): probatio.All(cv.string, probatio.In(SENSOR_TYPES.values())), + probatio.Optional(CONF_NAME): cv.string, + probatio.Required(CONF_ENTITY_IDS): cv.entity_ids, + probatio.Optional(CONF_ROUND_DIGITS, default=2): probatio.Coerce(int), + probatio.Optional(CONF_UNIQUE_ID): cv.string, } ) diff --git a/homeassistant/components/minecraft_server/config_flow.py b/homeassistant/components/minecraft_server/config_flow.py index fd849195c466c..c966eed987bc4 100644 --- a/homeassistant/components/minecraft_server/config_flow.py +++ b/homeassistant/components/minecraft_server/config_flow.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_ADDRESS, CONF_TYPE @@ -75,12 +75,12 @@ def _show_config_form( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_ADDRESS, default=user_input.get(CONF_ADDRESS, DEFAULT_ADDRESS), - ): vol.All(str, vol.Lower), + ): probatio.All(str, probatio.Lower), } ), errors=errors, diff --git a/homeassistant/components/minio/__init__.py b/homeassistant/components/minio/__init__.py index e35d4e7914254..e69b6aae8c03f 100644 --- a/homeassistant/components/minio/__init__.py +++ b/homeassistant/components/minio/__init__.py @@ -6,7 +6,7 @@ import threading from typing import override -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_HOST, @@ -40,28 +40,28 @@ DEFAULT_LISTEN_SUFFIX = ".*" DEFAULT_LISTEN_EVENTS = "s3:ObjectCreated:*" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_PORT): cv.port, - vol.Required(CONF_ACCESS_KEY): cv.string, - vol.Required(CONF_SECRET_KEY): cv.string, - vol.Required(CONF_SECURE): cv.boolean, - vol.Optional(CONF_LISTEN, default=[]): vol.All( + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_PORT): cv.port, + probatio.Required(CONF_ACCESS_KEY): cv.string, + probatio.Required(CONF_SECRET_KEY): cv.string, + probatio.Required(CONF_SECURE): cv.boolean, + probatio.Optional(CONF_LISTEN, default=[]): probatio.All( cv.ensure_list, [ - vol.Schema( + probatio.Schema( { - vol.Required(CONF_LISTEN_BUCKET): cv.string, - vol.Optional( + probatio.Required(CONF_LISTEN_BUCKET): cv.string, + probatio.Optional( CONF_LISTEN_PREFIX, default=DEFAULT_LISTEN_PREFIX ): cv.string, - vol.Optional( + probatio.Optional( CONF_LISTEN_SUFFIX, default=DEFAULT_LISTEN_SUFFIX ): cv.string, - vol.Optional( + probatio.Optional( CONF_LISTEN_EVENTS, default=DEFAULT_LISTEN_EVENTS ): cv.string, } @@ -71,15 +71,15 @@ } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -BUCKET_KEY_SCHEMA = vol.Schema( - {vol.Required(ATTR_BUCKET): cv.string, vol.Required(ATTR_KEY): cv.string} +BUCKET_KEY_SCHEMA = probatio.Schema( + {probatio.Required(ATTR_BUCKET): cv.string, probatio.Required(ATTR_KEY): cv.string} ) BUCKET_KEY_FILE_SCHEMA = BUCKET_KEY_SCHEMA.extend( - {vol.Required(ATTR_FILE_PATH): cv.string} + {probatio.Required(ATTR_FILE_PATH): cv.string} ) diff --git a/homeassistant/components/mitsubishi_comfort/config_flow.py b/homeassistant/components/mitsubishi_comfort/config_flow.py index 989d5e1c62a8d..2cfee389f553b 100644 --- a/homeassistant/components/mitsubishi_comfort/config_flow.py +++ b/homeassistant/components/mitsubishi_comfort/config_flow.py @@ -5,7 +5,7 @@ from mitsubishi_comfort import MitsubishiCloudAccount from mitsubishi_comfort.exceptions import AuthenticationError, DeviceConnectionError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -18,10 +18,10 @@ _LOGGER = logging.getLogger(__name__) -USER_SCHEMA = vol.Schema( +USER_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/mitsubishi_comfort/repairs.py b/homeassistant/components/mitsubishi_comfort/repairs.py index 905ebf9bf1e24..f7a66856fccfa 100644 --- a/homeassistant/components/mitsubishi_comfort/repairs.py +++ b/homeassistant/components/mitsubishi_comfort/repairs.py @@ -6,7 +6,7 @@ from aiohttp import ClientSession from mitsubishi_comfort import DeviceInfo, probe_candidate_ips -import voluptuous as vol +import probatio from homeassistant.components.dhcp import async_discovered_service_info from homeassistant.components.repairs import ( @@ -187,7 +187,7 @@ async def async_step_addresses( for info in async_discovered_service_info(self.hass) if (formatted := dr.format_mac(info.macaddress)) in macs } - schema = vol.Schema({vol.Optional(mac): str for mac in macs}) + schema = probatio.Schema({probatio.Optional(mac): str for mac in macs}) return self.async_show_form( step_id="addresses", data_schema=self.add_suggested_values_to_schema(schema, user_input), diff --git a/homeassistant/components/mjpeg/config_flow.py b/homeassistant/components/mjpeg/config_flow.py index f99806343a9ca..e2587fadb408c 100644 --- a/homeassistant/components/mjpeg/config_flow.py +++ b/homeassistant/components/mjpeg/config_flow.py @@ -4,10 +4,10 @@ from http import HTTPStatus from typing import Any, override +import probatio import requests from requests.auth import HTTPBasicAuth, HTTPDigestAuth from requests.exceptions import HTTPError, Timeout -import voluptuous as vol from homeassistant.config_entries import ( ConfigEntry, @@ -33,23 +33,23 @@ @callback def async_get_schema( defaults: Mapping[str, Any], show_name: bool = False -) -> vol.Schema: +) -> probatio.Schema: """Return MJPEG IP Camera schema.""" schema = { - vol.Required(CONF_MJPEG_URL, default=defaults.get(CONF_MJPEG_URL)): str, - vol.Optional( + probatio.Required(CONF_MJPEG_URL, default=defaults.get(CONF_MJPEG_URL)): str, + probatio.Optional( CONF_STILL_IMAGE_URL, description={"suggested_value": defaults.get(CONF_STILL_IMAGE_URL)}, ): str, - vol.Optional( + probatio.Optional( CONF_USERNAME, description={"suggested_value": defaults.get(CONF_USERNAME)}, ): str, - vol.Optional( + probatio.Optional( CONF_PASSWORD, default=defaults.get(CONF_PASSWORD, ""), ): str, - vol.Optional( + probatio.Optional( CONF_VERIFY_SSL, default=defaults.get(CONF_VERIFY_SSL, True), ): bool, @@ -59,11 +59,11 @@ def async_get_schema( schema = { # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Required(CONF_NAME, default=defaults.get(CONF_NAME)): str, + probatio.Required(CONF_NAME, default=defaults.get(CONF_NAME)): str, **schema, } - return vol.Schema(schema) + return probatio.Schema(schema) def validate_url( diff --git a/homeassistant/components/moat/config_flow.py b/homeassistant/components/moat/config_flow.py index 0109609760f17..5b8bf3ca5fb22 100644 --- a/homeassistant/components/moat/config_flow.py +++ b/homeassistant/components/moat/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from moat_ble import MoatBluetoothDeviceData as DeviceData -import voluptuous as vol +import probatio from homeassistant.components.bluetooth import ( BluetoothServiceInfoBleak, @@ -88,7 +88,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_ADDRESS): vol.In(self._discovered_devices)} + data_schema=probatio.Schema( + {probatio.Required(CONF_ADDRESS): probatio.In(self._discovered_devices)} ), ) diff --git a/homeassistant/components/mobile_app/const.py b/homeassistant/components/mobile_app/const.py index 6fd82748b8584..5ac11c37ddebf 100644 --- a/homeassistant/components/mobile_app/const.py +++ b/homeassistant/components/mobile_app/const.py @@ -1,6 +1,6 @@ """Constants for mobile_app.""" -import voluptuous as vol +import probatio from homeassistant.helpers import config_validation as cv @@ -102,17 +102,17 @@ ATTR_CAMERA_ENTITY_ID = "camera_entity_id" -SCHEMA_APP_DATA = vol.Schema( +SCHEMA_APP_DATA = probatio.Schema( { - vol.Inclusive(ATTR_PUSH_TOKEN, "push_cloud"): cv.string, - vol.Inclusive(ATTR_PUSH_URL, "push_cloud"): cv.url, + probatio.Inclusive(ATTR_PUSH_TOKEN, "push_cloud"): cv.string, + probatio.Inclusive(ATTR_PUSH_URL, "push_cloud"): cv.url, # Set to True to indicate that this registration # will connect via websocket channel to receive # push notifications. - vol.Optional(ATTR_PUSH_WEBSOCKET_CHANNEL): cv.boolean, - vol.Optional(ATTR_START_LIVE_ACTIVITY_TOKEN): cv.string, + probatio.Optional(ATTR_PUSH_WEBSOCKET_CHANNEL): cv.boolean, + probatio.Optional(ATTR_START_LIVE_ACTIVITY_TOKEN): cv.string, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) SENSOR_TYPES = (ATTR_SENSOR_TYPE_BINARY_SENSOR, ATTR_SENSOR_TYPE_SENSOR) diff --git a/homeassistant/components/mobile_app/device_action.py b/homeassistant/components/mobile_app/device_action.py index e8580d695dc7b..b9b3e01e87bcf 100644 --- a/homeassistant/components/mobile_app/device_action.py +++ b/homeassistant/components/mobile_app/device_action.py @@ -1,6 +1,6 @@ """Provides device actions for Mobile App.""" -import voluptuous as vol +import probatio from homeassistant.components import notify from homeassistant.components.device_automation import InvalidDeviceAutomationConfig @@ -15,10 +15,10 @@ ACTION_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): "notify", - vol.Required(notify.ATTR_MESSAGE): cv.template, - vol.Optional(notify.ATTR_TITLE): cv.template, - vol.Optional(notify.ATTR_DATA): cv.template_complex, + probatio.Required(CONF_TYPE): "notify", + probatio.Required(notify.ATTR_MESSAGE): cv.template, + probatio.Optional(notify.ATTR_TITLE): cv.template, + probatio.Optional(notify.ATTR_DATA): cv.template_complex, } ) @@ -77,16 +77,16 @@ async def async_call_action_from_config( async def async_get_action_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List action capabilities.""" if config[CONF_TYPE] != "notify": return {} return { - "extra_fields": vol.Schema( + "extra_fields": probatio.Schema( { - vol.Required(notify.ATTR_MESSAGE): str, - vol.Optional(notify.ATTR_TITLE): str, + probatio.Required(notify.ATTR_MESSAGE): str, + probatio.Optional(notify.ATTR_TITLE): str, } ) } diff --git a/homeassistant/components/mobile_app/device_tracker.py b/homeassistant/components/mobile_app/device_tracker.py index ce6d1774bfc2a..4e60eee6f15dc 100644 --- a/homeassistant/components/mobile_app/device_tracker.py +++ b/homeassistant/components/mobile_app/device_tracker.py @@ -5,7 +5,7 @@ import logging from typing import Any, Self, override -import voluptuous as vol +import probatio from homeassistant.components.device_tracker import ( ATTR_BATTERY, @@ -49,19 +49,19 @@ ATTR_KEYS = (ATTR_ALTITUDE, ATTR_COURSE, ATTR_SPEED, ATTR_VERTICAL_ACCURACY) -LOCATION_UPDATE_SCHEMA = vol.All( +LOCATION_UPDATE_SCHEMA = probatio.All( cv.key_dependency(ATTR_GPS, ATTR_GPS_ACCURACY), - vol.Schema( + probatio.Schema( { - vol.Optional(ATTR_LOCATION_NAME): cv.string, - vol.Optional(ATTR_GPS): cv.gps, - vol.Optional(ATTR_GPS_ACCURACY): cv.positive_float, - vol.Optional(ATTR_BATTERY): cv.positive_int, - vol.Optional(ATTR_SPEED): cv.positive_int, - vol.Optional(ATTR_ALTITUDE): vol.Coerce(float), - vol.Optional(ATTR_COURSE): cv.positive_int, - vol.Optional(ATTR_VERTICAL_ACCURACY): cv.positive_int, - vol.Optional(ATTR_IN_ZONES): cv.entities_domain(ZONE_DOMAIN), + probatio.Optional(ATTR_LOCATION_NAME): cv.string, + probatio.Optional(ATTR_GPS): cv.gps, + probatio.Optional(ATTR_GPS_ACCURACY): cv.positive_float, + probatio.Optional(ATTR_BATTERY): cv.positive_int, + probatio.Optional(ATTR_SPEED): cv.positive_int, + probatio.Optional(ATTR_ALTITUDE): probatio.Coerce(float), + probatio.Optional(ATTR_COURSE): cv.positive_int, + probatio.Optional(ATTR_VERTICAL_ACCURACY): cv.positive_int, + probatio.Optional(ATTR_IN_ZONES): cv.entities_domain(ZONE_DOMAIN), }, ), ) @@ -85,7 +85,7 @@ def from_dict(cls, restored: dict[str, Any]) -> Self | None: return None try: validated = LOCATION_UPDATE_SCHEMA(data) - except vol.Invalid as err: + except probatio.Invalid as err: _LOGGER.debug("Discarding invalid restored device tracker data: %s", err) return None return cls(validated) diff --git a/homeassistant/components/mobile_app/http_api.py b/homeassistant/components/mobile_app/http_api.py index 8851b1d640dba..c99a0af6ce320 100644 --- a/homeassistant/components/mobile_app/http_api.py +++ b/homeassistant/components/mobile_app/http_api.py @@ -6,7 +6,7 @@ from aiohttp.web import Request, Response from nacl.secret import SecretBox -import voluptuous as vol +import probatio from homeassistant.components import cloud from homeassistant.components.http import KEY_HASS, HomeAssistantView @@ -46,22 +46,22 @@ class RegistrationsView(HomeAssistantView): name = "api:mobile_app:register" @RequestDataValidator( - vol.Schema( + probatio.Schema( { - vol.Optional(ATTR_APP_DATA, default={}): SCHEMA_APP_DATA, - vol.Required(ATTR_APP_ID): cv.string, - vol.Required(ATTR_APP_NAME): cv.string, - vol.Required(ATTR_APP_VERSION): cv.string, - vol.Required(ATTR_DEVICE_NAME): cv.string, - vol.Required(ATTR_MANUFACTURER): cv.string, - vol.Required(ATTR_MODEL): cv.string, - vol.Optional(ATTR_DEVICE_ID): cv.string, # Added in 0.104 - vol.Required(ATTR_OS_NAME): cv.string, - vol.Optional(ATTR_OS_VERSION): cv.string, - vol.Required(ATTR_SUPPORTS_ENCRYPTION, default=False): cv.boolean, + probatio.Optional(ATTR_APP_DATA, default={}): SCHEMA_APP_DATA, + probatio.Required(ATTR_APP_ID): cv.string, + probatio.Required(ATTR_APP_NAME): cv.string, + probatio.Required(ATTR_APP_VERSION): cv.string, + probatio.Required(ATTR_DEVICE_NAME): cv.string, + probatio.Required(ATTR_MANUFACTURER): cv.string, + probatio.Required(ATTR_MODEL): cv.string, + probatio.Optional(ATTR_DEVICE_ID): cv.string, # Added in 0.104 + probatio.Required(ATTR_OS_NAME): cv.string, + probatio.Optional(ATTR_OS_VERSION): cv.string, + probatio.Required(ATTR_SUPPORTS_ENCRYPTION, default=False): cv.boolean, }, # To allow future apps to send more data - extra=vol.REMOVE_EXTRA, + extra=probatio.REMOVE_EXTRA, ) ) async def post(self, request: Request, data: dict) -> Response: diff --git a/homeassistant/components/mobile_app/live_activity/webhook.py b/homeassistant/components/mobile_app/live_activity/webhook.py index bec862f910f90..cf792bb959e0b 100644 --- a/homeassistant/components/mobile_app/live_activity/webhook.py +++ b/homeassistant/components/mobile_app/live_activity/webhook.py @@ -3,7 +3,7 @@ from typing import Any from aiohttp.web import Response -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_WEBHOOK_ID @@ -19,9 +19,9 @@ @WEBHOOK_COMMANDS.register("live_activity_token") @validate_schema( { - vol.Required(ATTR_TAG): cv.string, - vol.Required(ATTR_PUSH_TOKEN): cv.string, - vol.Required(ATTR_LIVE_ACTIVITY_EXPIRES_AT): cv.positive_float, + probatio.Required(ATTR_TAG): cv.string, + probatio.Required(ATTR_PUSH_TOKEN): cv.string, + probatio.Required(ATTR_LIVE_ACTIVITY_EXPIRES_AT): cv.positive_float, } ) async def webhook_update_live_activity_token( @@ -41,7 +41,7 @@ async def webhook_update_live_activity_token( @WEBHOOK_COMMANDS.register("live_activity_dismissed") @validate_schema( { - vol.Required(ATTR_TAG): cv.string, + probatio.Required(ATTR_TAG): cv.string, } ) async def webhook_live_activity_dismissed( diff --git a/homeassistant/components/mobile_app/webhook.py b/homeassistant/components/mobile_app/webhook.py index 04ebb786bfc2f..16b37e5f1bb57 100644 --- a/homeassistant/components/mobile_app/webhook.py +++ b/homeassistant/components/mobile_app/webhook.py @@ -13,8 +13,8 @@ from aiohttp.web import HTTPBadRequest, Request, Response, json_response from nacl.exceptions import CryptoError from nacl.secret import SecretBox -import voluptuous as vol -from voluptuous.humanize import humanize_error +import probatio +from probatio.humanize import humanize_error from homeassistant.components import ( camera, @@ -126,29 +126,31 @@ str, Callable[[HomeAssistant, ConfigEntry, Any], Coroutine[Any, Any, Response]] ] = Registry() -WEBHOOK_PAYLOAD_SCHEMA = vol.Any( - vol.Schema( +WEBHOOK_PAYLOAD_SCHEMA = probatio.Any( + probatio.Schema( { - vol.Required(ATTR_WEBHOOK_TYPE): cv.string, - vol.Optional(ATTR_WEBHOOK_DATA): vol.Any(dict, list), + probatio.Required(ATTR_WEBHOOK_TYPE): cv.string, + probatio.Optional(ATTR_WEBHOOK_DATA): probatio.Any(dict, list), } ), - vol.Schema( + probatio.Schema( { - vol.Required(ATTR_WEBHOOK_TYPE): cv.string, - vol.Required(ATTR_WEBHOOK_ENCRYPTED): True, - vol.Optional(ATTR_WEBHOOK_ENCRYPTED_DATA): cv.string, + probatio.Required(ATTR_WEBHOOK_TYPE): cv.string, + probatio.Required(ATTR_WEBHOOK_ENCRYPTED): True, + probatio.Optional(ATTR_WEBHOOK_ENCRYPTED_DATA): cv.string, } ), ) -SENSOR_SCHEMA_FULL = vol.Schema( +SENSOR_SCHEMA_FULL = probatio.Schema( { - vol.Optional(ATTR_SENSOR_ATTRIBUTES, default={}): dict, - vol.Optional(ATTR_SENSOR_ICON, default="mdi:cellphone"): vol.Any(None, cv.icon), - vol.Required(ATTR_SENSOR_STATE): vol.Any(None, bool, int, float, str), - vol.Required(ATTR_SENSOR_TYPE): vol.In(SENSOR_TYPES), - vol.Required(ATTR_SENSOR_UNIQUE_ID): cv.string, + probatio.Optional(ATTR_SENSOR_ATTRIBUTES, default={}): dict, + probatio.Optional(ATTR_SENSOR_ICON, default="mdi:cellphone"): probatio.Any( + None, cv.icon + ), + probatio.Required(ATTR_SENSOR_STATE): probatio.Any(None, bool, int, float, str), + probatio.Required(ATTR_SENSOR_TYPE): probatio.In(SENSOR_TYPES), + probatio.Required(ATTR_SENSOR_UNIQUE_ID): cv.string, } ) @@ -156,7 +158,7 @@ def validate_schema(schema): """Decorate a webhook function with a schema.""" if isinstance(schema, dict): - schema = vol.Schema(schema) + schema = probatio.Schema(schema) def wrapper(func): """Wrap function so we validate schema.""" @@ -166,7 +168,7 @@ async def validate_and_run(hass, config_entry, data): """Validate input and call handler.""" try: data = schema(data) - except vol.Invalid as ex: + except probatio.Invalid as ex: err = humanize_error(data, ex) _LOGGER.error("Received invalid webhook payload: %s", err) return empty_okay_response() @@ -207,7 +209,7 @@ async def handle_webhook( try: req_data = WEBHOOK_PAYLOAD_SCHEMA(req_data) - except vol.Invalid as ex: + except probatio.Invalid as ex: err = humanize_error(req_data, ex) _LOGGER.error( "Received invalid webhook from %s with payload: %s", device_name, err @@ -269,9 +271,9 @@ async def handle_webhook( @WEBHOOK_COMMANDS.register("call_service") @validate_schema( { - vol.Required(ATTR_DOMAIN): cv.string, - vol.Required(ATTR_SERVICE): cv.string, - vol.Optional(ATTR_SERVICE_DATA, default={}): dict, + probatio.Required(ATTR_DOMAIN): cv.string, + probatio.Required(ATTR_SERVICE): cv.string, + probatio.Optional(ATTR_SERVICE_DATA, default={}): dict, } ) async def webhook_call_service( @@ -286,7 +288,7 @@ async def webhook_call_service( blocking=True, context=registration_context(config_entry.data), ) - except (vol.Invalid, ServiceNotFound, Exception) as ex: + except (probatio.Invalid, ServiceNotFound, Exception) as ex: _LOGGER.error( ( "Error when calling service during mobile_app " @@ -303,8 +305,8 @@ async def webhook_call_service( @WEBHOOK_COMMANDS.register("fire_event") @validate_schema( { - vol.Required(ATTR_EVENT_TYPE): cv.string, - vol.Optional(ATTR_EVENT_DATA, default={}): dict, + probatio.Required(ATTR_EVENT_TYPE): cv.string, + probatio.Optional(ATTR_EVENT_DATA, default={}): dict, } ) async def webhook_fire_event( @@ -324,9 +326,9 @@ async def webhook_fire_event( @WEBHOOK_COMMANDS.register("conversation_process") @validate_schema( { - vol.Required("text"): cv.string, - vol.Optional("language"): cv.string, - vol.Optional("conversation_id"): cv.string, + probatio.Required("text"): cv.string, + probatio.Optional("language"): cv.string, + probatio.Optional("conversation_id"): cv.string, } ) async def webhook_conversation_process( @@ -344,7 +346,7 @@ async def webhook_conversation_process( @WEBHOOK_COMMANDS.register("stream_camera") -@validate_schema({vol.Required(ATTR_CAMERA_ENTITY_ID): cv.string}) +@validate_schema({probatio.Required(ATTR_CAMERA_ENTITY_ID): cv.string}) async def webhook_stream_camera( hass: HomeAssistant, config_entry: ConfigEntry, data: dict[str, str] ) -> Response: @@ -386,8 +388,8 @@ def _cached_template(template_str: str, hass: HomeAssistant) -> template.Templat @validate_schema( { str: { - vol.Required(ATTR_TEMPLATE): cv.string, - vol.Optional(ATTR_TEMPLATE_VARIABLES, default={}): dict, + probatio.Required(ATTR_TEMPLATE): cv.string, + probatio.Optional(ATTR_TEMPLATE_VARIABLES, default={}): dict, } } ) @@ -421,12 +423,12 @@ async def webhook_update_location( @WEBHOOK_COMMANDS.register("update_registration") @validate_schema( { - vol.Optional(ATTR_APP_DATA): SCHEMA_APP_DATA, - vol.Required(ATTR_APP_VERSION): cv.string, - vol.Required(ATTR_DEVICE_NAME): cv.string, - vol.Required(ATTR_MANUFACTURER): cv.string, - vol.Required(ATTR_MODEL): cv.string, - vol.Optional(ATTR_OS_VERSION): cv.string, + probatio.Optional(ATTR_APP_DATA): SCHEMA_APP_DATA, + probatio.Required(ATTR_APP_VERSION): cv.string, + probatio.Required(ATTR_DEVICE_NAME): cv.string, + probatio.Required(ATTR_MANUFACTURER): cv.string, + probatio.Required(ATTR_MODEL): cv.string, + probatio.Optional(ATTR_OS_VERSION): cv.string, } ) async def webhook_update_registration( @@ -489,7 +491,7 @@ def _validate_state_class_sensor(value: dict[str, Any]) -> dict[str, Any]: ATTR_SENSOR_STATE_CLASS in value and value[ATTR_SENSOR_TYPE] != ATTR_SENSOR_TYPE_SENSOR ): - raise vol.Invalid("state_class only allowed for sensors") + raise probatio.Invalid("state_class only allowed for sensors") return value @@ -506,31 +508,31 @@ def _extract_sensor_unique_id(webhook_id: str, unique_id: str) -> str: @WEBHOOK_COMMANDS.register("register_sensor") @validate_schema( - vol.All( + probatio.All( { - vol.Optional(ATTR_SENSOR_ATTRIBUTES, default={}): dict, - vol.Optional(ATTR_SENSOR_DEVICE_CLASS): vol.Any( + probatio.Optional(ATTR_SENSOR_ATTRIBUTES, default={}): dict, + probatio.Optional(ATTR_SENSOR_DEVICE_CLASS): probatio.Any( None, - vol.All(vol.Lower, vol.Coerce(BinarySensorDeviceClass)), - vol.All(vol.Lower, vol.Coerce(SensorDeviceClass)), + probatio.All(probatio.Lower, probatio.Coerce(BinarySensorDeviceClass)), + probatio.All(probatio.Lower, probatio.Coerce(SensorDeviceClass)), ), - vol.Required(ATTR_SENSOR_NAME): cv.string, - vol.Required(ATTR_SENSOR_TYPE): vol.In(SENSOR_TYPES), - vol.Required(ATTR_SENSOR_UNIQUE_ID): cv.string, - vol.Optional(ATTR_SENSOR_UOM): vol.Any(None, cv.string), - vol.Optional(ATTR_SENSOR_STATE, default=None): vol.Any( + probatio.Required(ATTR_SENSOR_NAME): cv.string, + probatio.Required(ATTR_SENSOR_TYPE): probatio.In(SENSOR_TYPES), + probatio.Required(ATTR_SENSOR_UNIQUE_ID): cv.string, + probatio.Optional(ATTR_SENSOR_UOM): probatio.Any(None, cv.string), + probatio.Optional(ATTR_SENSOR_STATE, default=None): probatio.Any( None, bool, int, float, str ), - vol.Optional(ATTR_SENSOR_ENTITY_CATEGORY): vol.Any( - None, vol.Coerce(EntityCategory) + probatio.Optional(ATTR_SENSOR_ENTITY_CATEGORY): probatio.Any( + None, probatio.Coerce(EntityCategory) ), - vol.Optional(ATTR_SENSOR_ICON, default="mdi:cellphone"): vol.Any( + probatio.Optional(ATTR_SENSOR_ICON, default="mdi:cellphone"): probatio.Any( None, cv.icon ), - vol.Optional(ATTR_SENSOR_STATE_CLASS): vol.Any( - None, vol.Coerce(SensorStateClass) + probatio.Optional(ATTR_SENSOR_STATE_CLASS): probatio.Any( + None, probatio.Coerce(SensorStateClass) ), - vol.Optional(ATTR_SENSOR_DISABLED): bool, + probatio.Optional(ATTR_SENSOR_DISABLED): bool, }, _validate_state_class_sensor, ) @@ -608,18 +610,18 @@ async def webhook_register_sensor( @WEBHOOK_COMMANDS.register("update_sensor_states") @validate_schema( - vol.All( + probatio.All( cv.ensure_list, [ # Partial schema, enough to identify schema. # We don't validate everything because otherwise 1 invalid sensor # will invalidate all sensors. - vol.Schema( + probatio.Schema( { - vol.Required(ATTR_SENSOR_TYPE): vol.In(SENSOR_TYPES), - vol.Required(ATTR_SENSOR_UNIQUE_ID): cv.string, + probatio.Required(ATTR_SENSOR_TYPE): probatio.In(SENSOR_TYPES), + probatio.Required(ATTR_SENSOR_UNIQUE_ID): cv.string, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) ], ) @@ -658,7 +660,7 @@ async def webhook_update_sensor_states( try: sensor = SENSOR_SCHEMA_FULL(sensor) - except vol.Invalid as err: + except probatio.Invalid as err: err_msg = humanize_error(sensor, err) _LOGGER.error( "Received invalid sensor payload from %s for %s: %s", @@ -771,7 +773,7 @@ async def webhook_get_config( @WEBHOOK_COMMANDS.register("scan_tag") -@validate_schema({vol.Required("tag_id"): cv.string}) +@validate_schema({probatio.Required("tag_id"): cv.string}) async def webhook_scan_tag( hass: HomeAssistant, config_entry: ConfigEntry, data: dict[str, str] ) -> Response: diff --git a/homeassistant/components/mobile_app/websocket_api.py b/homeassistant/components/mobile_app/websocket_api.py index 18963d91c2687..3bc59892b8754 100644 --- a/homeassistant/components/mobile_app/websocket_api.py +++ b/homeassistant/components/mobile_app/websocket_api.py @@ -4,7 +4,7 @@ from functools import wraps from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.core import HomeAssistant, callback @@ -53,9 +53,9 @@ def with_webhook_access(hass, connection, msg): @_ensure_webhook_access @websocket_api.websocket_command( { - vol.Required("type"): "mobile_app/push_notification_confirm", - vol.Required("webhook_id"): str, - vol.Required("confirm_id"): str, + probatio.Required("type"): "mobile_app/push_notification_confirm", + probatio.Required("webhook_id"): str, + probatio.Required("confirm_id"): str, } ) def handle_push_notification_confirm( @@ -87,9 +87,9 @@ def handle_push_notification_confirm( @websocket_api.websocket_command( { - vol.Required("type"): "mobile_app/push_notification_channel", - vol.Required("webhook_id"): str, - vol.Optional("support_confirm", default=False): bool, + probatio.Required("type"): "mobile_app/push_notification_channel", + probatio.Required("webhook_id"): str, + probatio.Optional("support_confirm", default=False): bool, } ) @_ensure_webhook_access diff --git a/homeassistant/components/mochad/__init__.py b/homeassistant/components/mochad/__init__.py index 9e992b5babd50..13b903c30c525 100644 --- a/homeassistant/components/mochad/__init__.py +++ b/homeassistant/components/mochad/__init__.py @@ -3,8 +3,8 @@ import logging import threading +import probatio from pymochad import controller, exceptions -import voluptuous as vol from homeassistant.const import ( CONF_HOST, @@ -24,16 +24,16 @@ REQ_LOCK = threading.Lock() -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Optional(CONF_HOST, default="localhost"): cv.string, - vol.Optional(CONF_PORT, default=1099): cv.port, + probatio.Optional(CONF_HOST, default="localhost"): cv.string, + probatio.Optional(CONF_PORT, default=1099): cv.port, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/mochad/light.py b/homeassistant/components/mochad/light.py index 030a5107d2238..4e1c9b30c1904 100644 --- a/homeassistant/components/mochad/light.py +++ b/homeassistant/components/mochad/light.py @@ -3,9 +3,9 @@ import logging from typing import Any, override +import probatio from pymochad import controller, device from pymochad.exceptions import MochadException -import voluptuous as vol from homeassistant.components.light import ( ATTR_BRIGHTNESS, @@ -27,14 +27,14 @@ PLATFORM_SCHEMA = LIGHT_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_PLATFORM): DOMAIN, + probatio.Required(CONF_PLATFORM): DOMAIN, CONF_DEVICES: [ { - vol.Optional(CONF_NAME): cv.string, - vol.Required(CONF_ADDRESS): cv.x10_address, - vol.Optional(CONF_COMM_TYPE): cv.string, - vol.Optional(CONF_BRIGHTNESS_LEVELS, default=32): vol.All( - vol.Coerce(int), vol.In([32, 64, 256]) + probatio.Optional(CONF_NAME): cv.string, + probatio.Required(CONF_ADDRESS): cv.x10_address, + probatio.Optional(CONF_COMM_TYPE): cv.string, + probatio.Optional(CONF_BRIGHTNESS_LEVELS, default=32): probatio.All( + probatio.Coerce(int), probatio.In([32, 64, 256]) ), } ], diff --git a/homeassistant/components/mochad/switch.py b/homeassistant/components/mochad/switch.py index 275404171e430..8e4dcf35a65e3 100644 --- a/homeassistant/components/mochad/switch.py +++ b/homeassistant/components/mochad/switch.py @@ -3,9 +3,9 @@ import logging from typing import Any, override +import probatio from pymochad import controller, device from pymochad.exceptions import MochadException -import voluptuous as vol from homeassistant.components.switch import SwitchEntity from homeassistant.const import CONF_ADDRESS, CONF_DEVICES, CONF_NAME, CONF_PLATFORM @@ -20,14 +20,14 @@ _LOGGER = logging.getLogger(__name__) -PLATFORM_SCHEMA = vol.Schema( +PLATFORM_SCHEMA = probatio.Schema( { - vol.Required(CONF_PLATFORM): DOMAIN, + probatio.Required(CONF_PLATFORM): DOMAIN, CONF_DEVICES: [ { - vol.Optional(CONF_NAME): cv.string, - vol.Required(CONF_ADDRESS): cv.x10_address, - vol.Optional(CONF_COMM_TYPE): cv.string, + probatio.Optional(CONF_NAME): cv.string, + probatio.Required(CONF_ADDRESS): cv.x10_address, + probatio.Optional(CONF_COMM_TYPE): cv.string, } ], } diff --git a/homeassistant/components/modbus/schemas.py b/homeassistant/components/modbus/schemas.py index f7d3998296341..8a9c172d0084d 100644 --- a/homeassistant/components/modbus/schemas.py +++ b/homeassistant/components/modbus/schemas.py @@ -1,6 +1,6 @@ -"""Voluptuous schemas for the Modbus integration.""" +"""Probatio schemas for the Modbus integration.""" -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import ( DEVICE_CLASSES_SCHEMA as BINARY_SENSOR_DEVICE_CLASSES_SCHEMA, @@ -162,33 +162,37 @@ struct_validator, ) -BASE_SCHEMA = vol.Schema({vol.Optional(CONF_NAME, default=DEFAULT_HUB): cv.string}) +BASE_SCHEMA = probatio.Schema( + {probatio.Optional(CONF_NAME, default=DEFAULT_HUB): cv.string} +) -BASE_COMPONENT_SCHEMA = vol.Schema( +BASE_COMPONENT_SCHEMA = probatio.Schema( { - vol.Required(CONF_NAME): cv.string, - vol.Required(CONF_ADDRESS): cv.positive_int, - vol.Exclusive(CONF_DEVICE_ADDRESS, "slave_addr"): cv.positive_int, - vol.Exclusive(CONF_SLAVE, "slave_addr"): cv.positive_int, - vol.Optional( + probatio.Required(CONF_NAME): cv.string, + probatio.Required(CONF_ADDRESS): cv.positive_int, + probatio.Exclusive(CONF_DEVICE_ADDRESS, "slave_addr"): cv.positive_int, + probatio.Exclusive(CONF_SLAVE, "slave_addr"): cv.positive_int, + probatio.Optional( CONF_SCAN_INTERVAL, default=DEFAULT_SCAN_INTERVAL ): cv.positive_int, - vol.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Optional(CONF_UNIQUE_ID): cv.string, } ) BASE_STRUCT_SCHEMA = BASE_COMPONENT_SCHEMA.extend( { - vol.Optional(CONF_INPUT_TYPE, default=CALL_TYPE_REGISTER_HOLDING): vol.In( + probatio.Optional( + CONF_INPUT_TYPE, default=CALL_TYPE_REGISTER_HOLDING + ): probatio.In( [ CALL_TYPE_REGISTER_HOLDING, CALL_TYPE_REGISTER_INPUT, ] ), - vol.Optional(CONF_COUNT): cv.positive_int, - vol.Optional(CONF_DATA_TYPE, default=DataType.INT16): vol.In( + probatio.Optional(CONF_COUNT): cv.positive_int, + probatio.Optional(CONF_DATA_TYPE, default=DataType.INT16): probatio.In( [ DataType.INT16, DataType.INT32, @@ -203,15 +207,15 @@ DataType.CUSTOM, ] ), - vol.Optional(CONF_STRUCTURE): cv.string, - vol.Optional(CONF_SCALE): vol.All( - vol.Coerce(float), lambda v: not_zero_value(v, "Scale cannot be zero.") + probatio.Optional(CONF_STRUCTURE): cv.string, + probatio.Optional(CONF_SCALE): probatio.All( + probatio.Coerce(float), lambda v: not_zero_value(v, "Scale cannot be zero.") ), - vol.Optional(CONF_OFFSET): vol.Coerce(float), - vol.Optional(CONF_PRECISION): cv.positive_int, - vol.Optional( + probatio.Optional(CONF_OFFSET): probatio.Coerce(float), + probatio.Optional(CONF_PRECISION): cv.positive_int, + probatio.Optional( CONF_SWAP, - ): vol.In( + ): probatio.In( [ CONF_SWAP_BYTE, CONF_SWAP_WORD, @@ -224,7 +228,9 @@ BASE_SWITCH_SCHEMA = BASE_COMPONENT_SCHEMA.extend( { - vol.Optional(CONF_WRITE_TYPE, default=CALL_TYPE_REGISTER_HOLDING): vol.In( + probatio.Optional( + CONF_WRITE_TYPE, default=CALL_TYPE_REGISTER_HOLDING + ): probatio.In( [ CALL_TYPE_REGISTER_HOLDING, CALL_TYPE_COIL, @@ -232,12 +238,12 @@ CALL_TYPE_X_REGISTER_HOLDINGS, ] ), - vol.Optional(CONF_COMMAND_OFF, default=0x00): cv.positive_int, - vol.Optional(CONF_COMMAND_ON, default=0x01): cv.positive_int, - vol.Optional(CONF_VERIFY): vol.Maybe( + probatio.Optional(CONF_COMMAND_OFF, default=0x00): cv.positive_int, + probatio.Optional(CONF_COMMAND_ON, default=0x01): cv.positive_int, + probatio.Optional(CONF_VERIFY): probatio.Maybe( { - vol.Optional(CONF_ADDRESS): cv.positive_int, - vol.Optional(CONF_INPUT_TYPE): vol.In( + probatio.Optional(CONF_ADDRESS): cv.positive_int, + probatio.Optional(CONF_INPUT_TYPE): probatio.In( [ CALL_TYPE_REGISTER_HOLDING, CALL_TYPE_DISCRETE, @@ -247,108 +253,118 @@ CALL_TYPE_X_REGISTER_HOLDINGS, ] ), - vol.Optional(CONF_STATE_OFF): vol.All( + probatio.Optional(CONF_STATE_OFF): probatio.All( + cv.ensure_list, [cv.positive_int] + ), + probatio.Optional(CONF_STATE_ON): probatio.All( cv.ensure_list, [cv.positive_int] ), - vol.Optional(CONF_STATE_ON): vol.All(cv.ensure_list, [cv.positive_int]), - vol.Optional(CONF_DELAY, default=0): cv.positive_int, + probatio.Optional(CONF_DELAY, default=0): cv.positive_int, } ), } ) -CLIMATE_SCHEMA = vol.All( +CLIMATE_SCHEMA = probatio.All( BASE_STRUCT_SCHEMA.extend( { - vol.Required(CONF_TARGET_TEMP): hvac_fixedsize_reglist_validator, - vol.Optional(CONF_TARGET_TEMP_WRITE_REGISTERS, default=False): cv.boolean, - vol.Optional(CONF_MAX_TEMP, default=35): vol.Coerce(int), - vol.Optional(CONF_MIN_TEMP, default=5): vol.Coerce(int), - vol.Optional(CONF_STEP, default=0.5): vol.Coerce(float), - vol.Optional(CONF_TEMPERATURE_UNIT, default=DEFAULT_TEMP_UNIT): cv.string, - vol.Exclusive(CONF_HVAC_ONOFF_COIL, "hvac_onoff_type"): cv.positive_int, - vol.Exclusive(CONF_HVAC_ONOFF_REGISTER, "hvac_onoff_type"): cv.positive_int, - vol.Optional(CONF_CURRENT_TEMP_SCALE): vol.All( - vol.Coerce(float), + probatio.Required(CONF_TARGET_TEMP): hvac_fixedsize_reglist_validator, + probatio.Optional( + CONF_TARGET_TEMP_WRITE_REGISTERS, default=False + ): cv.boolean, + probatio.Optional(CONF_MAX_TEMP, default=35): probatio.Coerce(int), + probatio.Optional(CONF_MIN_TEMP, default=5): probatio.Coerce(int), + probatio.Optional(CONF_STEP, default=0.5): probatio.Coerce(float), + probatio.Optional( + CONF_TEMPERATURE_UNIT, default=DEFAULT_TEMP_UNIT + ): cv.string, + probatio.Exclusive( + CONF_HVAC_ONOFF_COIL, "hvac_onoff_type" + ): cv.positive_int, + probatio.Exclusive( + CONF_HVAC_ONOFF_REGISTER, "hvac_onoff_type" + ): cv.positive_int, + probatio.Optional(CONF_CURRENT_TEMP_SCALE): probatio.All( + probatio.Coerce(float), lambda v: not_zero_value( v, "Current temperature scale cannot be zero." ), ), - vol.Optional(CONF_TARGET_TEMP_SCALE): vol.All( - vol.Coerce(float), + probatio.Optional(CONF_TARGET_TEMP_SCALE): probatio.All( + probatio.Coerce(float), lambda v: not_zero_value(v, "Target temperature scale cannot be zero."), ), - vol.Optional(CONF_CURRENT_TEMP_OFFSET): vol.Coerce(float), - vol.Optional(CONF_TARGET_TEMP_OFFSET): vol.Coerce(float), - vol.Optional( + probatio.Optional(CONF_CURRENT_TEMP_OFFSET): probatio.Coerce(float), + probatio.Optional(CONF_TARGET_TEMP_OFFSET): probatio.Coerce(float), + probatio.Optional( CONF_HVAC_ON_VALUE, default=DEFAULT_HVAC_ON_VALUE ): cv.positive_int, - vol.Optional( + probatio.Optional( CONF_HVAC_OFF_VALUE, default=DEFAULT_HVAC_OFF_VALUE ): cv.positive_int, - vol.Optional(CONF_WRITE_REGISTERS, default=False): cv.boolean, - vol.Optional(CONF_HVAC_MODE_REGISTER): vol.Maybe( + probatio.Optional(CONF_WRITE_REGISTERS, default=False): cv.boolean, + probatio.Optional(CONF_HVAC_MODE_REGISTER): probatio.Maybe( { CONF_ADDRESS: cv.positive_int, CONF_HVAC_MODE_VALUES: { - vol.Optional(CONF_HVAC_MODE_OFF): vol.Any( + probatio.Optional(CONF_HVAC_MODE_OFF): probatio.Any( cv.positive_int, [cv.positive_int] ), - vol.Optional(CONF_HVAC_MODE_HEAT): vol.Any( + probatio.Optional(CONF_HVAC_MODE_HEAT): probatio.Any( cv.positive_int, [cv.positive_int] ), - vol.Optional(CONF_HVAC_MODE_COOL): vol.Any( + probatio.Optional(CONF_HVAC_MODE_COOL): probatio.Any( cv.positive_int, [cv.positive_int] ), - vol.Optional(CONF_HVAC_MODE_HEAT_COOL): vol.Any( + probatio.Optional(CONF_HVAC_MODE_HEAT_COOL): probatio.Any( cv.positive_int, [cv.positive_int] ), - vol.Optional(CONF_HVAC_MODE_AUTO): vol.Any( + probatio.Optional(CONF_HVAC_MODE_AUTO): probatio.Any( cv.positive_int, [cv.positive_int] ), - vol.Optional(CONF_HVAC_MODE_DRY): vol.Any( + probatio.Optional(CONF_HVAC_MODE_DRY): probatio.Any( cv.positive_int, [cv.positive_int] ), - vol.Optional(CONF_HVAC_MODE_FAN_ONLY): vol.Any( + probatio.Optional(CONF_HVAC_MODE_FAN_ONLY): probatio.Any( cv.positive_int, [cv.positive_int] ), }, - vol.Optional(CONF_WRITE_REGISTERS, default=False): cv.boolean, + probatio.Optional(CONF_WRITE_REGISTERS, default=False): cv.boolean, } ), - vol.Optional(CONF_HVAC_ACTION_REGISTER): vol.Maybe( + probatio.Optional(CONF_HVAC_ACTION_REGISTER): probatio.Maybe( { CONF_ADDRESS: cv.positive_int, CONF_HVAC_ACTION_VALUES: { - vol.Optional(CONF_HVAC_ACTION_COOLING): vol.Any( + probatio.Optional(CONF_HVAC_ACTION_COOLING): probatio.Any( cv.positive_int, [cv.positive_int] ), - vol.Optional(CONF_HVAC_ACTION_DEFROSTING): vol.Any( + probatio.Optional(CONF_HVAC_ACTION_DEFROSTING): probatio.Any( cv.positive_int, [cv.positive_int] ), - vol.Optional(CONF_HVAC_ACTION_DRYING): vol.Any( + probatio.Optional(CONF_HVAC_ACTION_DRYING): probatio.Any( cv.positive_int, [cv.positive_int] ), - vol.Optional(CONF_HVAC_ACTION_FAN): vol.Any( + probatio.Optional(CONF_HVAC_ACTION_FAN): probatio.Any( cv.positive_int, [cv.positive_int] ), - vol.Optional(CONF_HVAC_ACTION_HEATING): vol.Any( + probatio.Optional(CONF_HVAC_ACTION_HEATING): probatio.Any( cv.positive_int, [cv.positive_int] ), - vol.Optional(CONF_HVAC_ACTION_IDLE): vol.Any( + probatio.Optional(CONF_HVAC_ACTION_IDLE): probatio.Any( cv.positive_int, [cv.positive_int] ), - vol.Optional(CONF_HVAC_ACTION_OFF): vol.Any( + probatio.Optional(CONF_HVAC_ACTION_OFF): probatio.Any( cv.positive_int, [cv.positive_int] ), - vol.Optional(CONF_HVAC_ACTION_PREHEATING): vol.Any( + probatio.Optional(CONF_HVAC_ACTION_PREHEATING): probatio.Any( cv.positive_int, [cv.positive_int] ), }, - vol.Optional( + probatio.Optional( CONF_INPUT_TYPE, default=CALL_TYPE_REGISTER_HOLDING - ): vol.In( + ): probatio.In( [ CALL_TYPE_REGISTER_HOLDING, CALL_TYPE_REGISTER_INPUT, @@ -356,36 +372,46 @@ ), } ), - vol.Optional(CONF_FAN_MODE_REGISTER): vol.Maybe( - vol.All( + probatio.Optional(CONF_FAN_MODE_REGISTER): probatio.Maybe( + probatio.All( { - vol.Required(CONF_ADDRESS): register_int_list_validator, + probatio.Required(CONF_ADDRESS): register_int_list_validator, CONF_FAN_MODE_VALUES: { - vol.Optional(CONF_FAN_MODE_ON): cv.positive_int, - vol.Optional(CONF_FAN_MODE_OFF): cv.positive_int, - vol.Optional(CONF_FAN_MODE_AUTO): cv.positive_int, - vol.Optional(CONF_FAN_MODE_LOW): cv.positive_int, - vol.Optional(CONF_FAN_MODE_MEDIUM): cv.positive_int, - vol.Optional(CONF_FAN_MODE_HIGH): cv.positive_int, - vol.Optional(CONF_FAN_MODE_TOP): cv.positive_int, - vol.Optional(CONF_FAN_MODE_MIDDLE): cv.positive_int, - vol.Optional(CONF_FAN_MODE_FOCUS): cv.positive_int, - vol.Optional(CONF_FAN_MODE_DIFFUSE): cv.positive_int, + probatio.Optional(CONF_FAN_MODE_ON): cv.positive_int, + probatio.Optional(CONF_FAN_MODE_OFF): cv.positive_int, + probatio.Optional(CONF_FAN_MODE_AUTO): cv.positive_int, + probatio.Optional(CONF_FAN_MODE_LOW): cv.positive_int, + probatio.Optional(CONF_FAN_MODE_MEDIUM): cv.positive_int, + probatio.Optional(CONF_FAN_MODE_HIGH): cv.positive_int, + probatio.Optional(CONF_FAN_MODE_TOP): cv.positive_int, + probatio.Optional(CONF_FAN_MODE_MIDDLE): cv.positive_int, + probatio.Optional(CONF_FAN_MODE_FOCUS): cv.positive_int, + probatio.Optional(CONF_FAN_MODE_DIFFUSE): cv.positive_int, }, }, duplicate_fan_mode_validator, ), ), - vol.Optional(CONF_SWING_MODE_REGISTER): vol.Maybe( - vol.All( + probatio.Optional(CONF_SWING_MODE_REGISTER): probatio.Maybe( + probatio.All( { - vol.Required(CONF_ADDRESS): register_int_list_validator, + probatio.Required(CONF_ADDRESS): register_int_list_validator, CONF_SWING_MODE_VALUES: { - vol.Optional(CONF_SWING_MODE_SWING_ON): cv.positive_int, - vol.Optional(CONF_SWING_MODE_SWING_OFF): cv.positive_int, - vol.Optional(CONF_SWING_MODE_SWING_HORIZ): cv.positive_int, - vol.Optional(CONF_SWING_MODE_SWING_VERT): cv.positive_int, - vol.Optional(CONF_SWING_MODE_SWING_BOTH): cv.positive_int, + probatio.Optional( + CONF_SWING_MODE_SWING_ON + ): cv.positive_int, + probatio.Optional( + CONF_SWING_MODE_SWING_OFF + ): cv.positive_int, + probatio.Optional( + CONF_SWING_MODE_SWING_HORIZ + ): cv.positive_int, + probatio.Optional( + CONF_SWING_MODE_SWING_VERT + ): cv.positive_int, + probatio.Optional( + CONF_SWING_MODE_SWING_BOTH + ): cv.positive_int, }, }, duplicate_swing_mode_validator, @@ -398,65 +424,65 @@ COVERS_SCHEMA = BASE_COMPONENT_SCHEMA.extend( { - vol.Optional( + probatio.Optional( CONF_INPUT_TYPE, default=CALL_TYPE_REGISTER_HOLDING, - ): vol.In( + ): probatio.In( [ CALL_TYPE_REGISTER_HOLDING, CALL_TYPE_COIL, ] ), - vol.Optional(CONF_DEVICE_CLASS): COVER_DEVICE_CLASSES_SCHEMA, - vol.Optional(CONF_STATE_CLOSED, default=0): cv.positive_int, - vol.Optional(CONF_STATE_CLOSING, default=3): cv.positive_int, - vol.Optional(CONF_STATE_OPEN, default=1): cv.positive_int, - vol.Optional(CONF_STATE_OPENING, default=2): cv.positive_int, - vol.Optional(CONF_STATUS_REGISTER): cv.positive_int, - vol.Optional( + probatio.Optional(CONF_DEVICE_CLASS): COVER_DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_STATE_CLOSED, default=0): cv.positive_int, + probatio.Optional(CONF_STATE_CLOSING, default=3): cv.positive_int, + probatio.Optional(CONF_STATE_OPEN, default=1): cv.positive_int, + probatio.Optional(CONF_STATE_OPENING, default=2): cv.positive_int, + probatio.Optional(CONF_STATUS_REGISTER): cv.positive_int, + probatio.Optional( CONF_STATUS_REGISTER_TYPE, default=CALL_TYPE_REGISTER_HOLDING, - ): vol.In([CALL_TYPE_REGISTER_HOLDING, CALL_TYPE_REGISTER_INPUT]), + ): probatio.In([CALL_TYPE_REGISTER_HOLDING, CALL_TYPE_REGISTER_INPUT]), } ) SWITCH_SCHEMA = BASE_SWITCH_SCHEMA.extend( { - vol.Optional(CONF_DEVICE_CLASS): SWITCH_DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_DEVICE_CLASS): SWITCH_DEVICE_CLASSES_SCHEMA, } ) LIGHT_SCHEMA = BASE_SWITCH_SCHEMA.extend( { - vol.Optional(CONF_BRIGHTNESS_REGISTER): cv.positive_int, - vol.Optional(CONF_COLOR_TEMP_REGISTER): cv.positive_int, - vol.Optional(CONF_MIN_TEMP): cv.positive_int, - vol.Optional(CONF_MAX_TEMP): cv.positive_int, + probatio.Optional(CONF_BRIGHTNESS_REGISTER): cv.positive_int, + probatio.Optional(CONF_COLOR_TEMP_REGISTER): cv.positive_int, + probatio.Optional(CONF_MIN_TEMP): cv.positive_int, + probatio.Optional(CONF_MAX_TEMP): cv.positive_int, } ) FAN_SCHEMA = BASE_SWITCH_SCHEMA.extend({}) -SENSOR_SCHEMA = vol.All( +SENSOR_SCHEMA = probatio.All( BASE_STRUCT_SCHEMA.extend( { - vol.Optional(CONF_DEVICE_CLASS): SENSOR_DEVICE_CLASSES_SCHEMA, - vol.Optional(CONF_STATE_CLASS): SENSOR_STATE_CLASSES_SCHEMA, - vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, - vol.Exclusive(CONF_VIRTUAL_COUNT, "vir_sen_count"): cv.positive_int, - vol.Exclusive(CONF_SLAVE_COUNT, "vir_sen_count"): cv.positive_int, - vol.Optional(CONF_MIN_VALUE): vol.Coerce(float), - vol.Optional(CONF_MAX_VALUE): vol.Coerce(float), - vol.Optional(CONF_NAN_VALUE): nan_validator, - vol.Optional(CONF_ZERO_SUPPRESS): cv.positive_float, + probatio.Optional(CONF_DEVICE_CLASS): SENSOR_DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_STATE_CLASS): SENSOR_STATE_CLASSES_SCHEMA, + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, + probatio.Exclusive(CONF_VIRTUAL_COUNT, "vir_sen_count"): cv.positive_int, + probatio.Exclusive(CONF_SLAVE_COUNT, "vir_sen_count"): cv.positive_int, + probatio.Optional(CONF_MIN_VALUE): probatio.Coerce(float), + probatio.Optional(CONF_MAX_VALUE): probatio.Coerce(float), + probatio.Optional(CONF_NAN_VALUE): nan_validator, + probatio.Optional(CONF_ZERO_SUPPRESS): cv.positive_float, } ), ) BINARY_SENSOR_SCHEMA = BASE_COMPONENT_SCHEMA.extend( { - vol.Optional(CONF_DEVICE_CLASS): BINARY_SENSOR_DEVICE_CLASSES_SCHEMA, - vol.Optional(CONF_INPUT_TYPE, default=CALL_TYPE_COIL): vol.In( + probatio.Optional(CONF_DEVICE_CLASS): BINARY_SENSOR_DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_INPUT_TYPE, default=CALL_TYPE_COIL): probatio.In( [ CALL_TYPE_COIL, CALL_TYPE_DISCRETE, @@ -464,74 +490,74 @@ CALL_TYPE_REGISTER_INPUT, ] ), - vol.Exclusive(CONF_VIRTUAL_COUNT, "vir_bin_count"): cv.positive_int, - vol.Exclusive(CONF_SLAVE_COUNT, "vir_bin_count"): cv.positive_int, + probatio.Exclusive(CONF_VIRTUAL_COUNT, "vir_bin_count"): cv.positive_int, + probatio.Exclusive(CONF_SLAVE_COUNT, "vir_bin_count"): cv.positive_int, } ) -MODBUS_SCHEMA = vol.Schema( +MODBUS_SCHEMA = probatio.Schema( { - vol.Optional(CONF_NAME, default=DEFAULT_HUB): cv.string, - vol.Optional(CONF_TIMEOUT, default=3): cv.socket_timeout, - vol.Optional(CONF_DELAY, default=0): cv.positive_int, - vol.Optional(CONF_MSG_WAIT): cv.positive_int, - vol.Optional(CONF_BINARY_SENSORS): vol.All( + probatio.Optional(CONF_NAME, default=DEFAULT_HUB): cv.string, + probatio.Optional(CONF_TIMEOUT, default=3): cv.socket_timeout, + probatio.Optional(CONF_DELAY, default=0): cv.positive_int, + probatio.Optional(CONF_MSG_WAIT): cv.positive_int, + probatio.Optional(CONF_BINARY_SENSORS): probatio.All( cv.ensure_list, [BINARY_SENSOR_SCHEMA] ), - vol.Optional(CONF_CLIMATES): vol.All( - cv.ensure_list, [vol.All(CLIMATE_SCHEMA, struct_validator)] + probatio.Optional(CONF_CLIMATES): probatio.All( + cv.ensure_list, [probatio.All(CLIMATE_SCHEMA, struct_validator)] ), - vol.Optional(CONF_COVERS): vol.All(cv.ensure_list, [COVERS_SCHEMA]), - vol.Optional(CONF_LIGHTS): vol.All(cv.ensure_list, [LIGHT_SCHEMA]), - vol.Optional(CONF_SENSORS): vol.All( - cv.ensure_list, [vol.All(SENSOR_SCHEMA, struct_validator)] + probatio.Optional(CONF_COVERS): probatio.All(cv.ensure_list, [COVERS_SCHEMA]), + probatio.Optional(CONF_LIGHTS): probatio.All(cv.ensure_list, [LIGHT_SCHEMA]), + probatio.Optional(CONF_SENSORS): probatio.All( + cv.ensure_list, [probatio.All(SENSOR_SCHEMA, struct_validator)] ), - vol.Optional(CONF_SWITCHES): vol.All(cv.ensure_list, [SWITCH_SCHEMA]), - vol.Optional(CONF_FANS): vol.All(cv.ensure_list, [FAN_SCHEMA]), + probatio.Optional(CONF_SWITCHES): probatio.All(cv.ensure_list, [SWITCH_SCHEMA]), + probatio.Optional(CONF_FANS): probatio.All(cv.ensure_list, [FAN_SCHEMA]), }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) SERIAL_SCHEMA = MODBUS_SCHEMA.extend( { - vol.Required(CONF_TYPE): SERIAL, - vol.Required(CONF_BAUDRATE): cv.positive_int, - vol.Required(CONF_BYTESIZE): vol.Any(5, 6, 7, 8), - vol.Required(CONF_METHOD): vol.Any("rtu", "ascii"), - vol.Required(CONF_PORT): cv.string, - vol.Required(CONF_PARITY): vol.Any("E", "O", "N"), - vol.Required(CONF_STOPBITS): vol.Any(1, 2), + probatio.Required(CONF_TYPE): SERIAL, + probatio.Required(CONF_BAUDRATE): cv.positive_int, + probatio.Required(CONF_BYTESIZE): probatio.Any(5, 6, 7, 8), + probatio.Required(CONF_METHOD): probatio.Any("rtu", "ascii"), + probatio.Required(CONF_PORT): cv.string, + probatio.Required(CONF_PARITY): probatio.Any("E", "O", "N"), + probatio.Required(CONF_STOPBITS): probatio.Any(1, 2), } ) ETHERNET_SCHEMA = MODBUS_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_PORT): cv.port, - vol.Required(CONF_TYPE): vol.Any(TCP, UDP, RTUOVERTCP), + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_PORT): cv.port, + probatio.Required(CONF_TYPE): probatio.Any(TCP, UDP, RTUOVERTCP), } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.All( + DOMAIN: probatio.All( cv.ensure_list, [ - vol.Any(SERIAL_SCHEMA, ETHERNET_SCHEMA), + probatio.Any(SERIAL_SCHEMA, ETHERNET_SCHEMA), ], ), }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) # Per-platform schema for a single entity config, used to validate the entity # lists stored in a device subentry. PLATFORM_SCHEMAS: dict[Platform, VolSchemaType] = { Platform.BINARY_SENSOR: BINARY_SENSOR_SCHEMA, - Platform.CLIMATE: vol.All(CLIMATE_SCHEMA, struct_validator), + Platform.CLIMATE: probatio.All(CLIMATE_SCHEMA, struct_validator), Platform.COVER: COVERS_SCHEMA, Platform.FAN: FAN_SCHEMA, Platform.LIGHT: LIGHT_SCHEMA, - Platform.SENSOR: vol.All(SENSOR_SCHEMA, struct_validator), + Platform.SENSOR: probatio.All(SENSOR_SCHEMA, struct_validator), Platform.SWITCH: SWITCH_SCHEMA, } diff --git a/homeassistant/components/modbus/services.py b/homeassistant/components/modbus/services.py index 2abb1963e7f47..b4a709194efa7 100644 --- a/homeassistant/components/modbus/services.py +++ b/homeassistant/components/modbus/services.py @@ -3,7 +3,7 @@ from collections.abc import Callable from typing import Any -import voluptuous as vol +import probatio from homeassistant.const import ATTR_STATE, SERVICE_RELOAD from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -36,16 +36,18 @@ from .modbus import ModbusHub, async_modbus_setup -def _write_service_schema(attr: str, validator: Callable[[Any], Any]) -> vol.Schema: +def _write_service_schema( + attr: str, validator: Callable[[Any], Any] +) -> probatio.Schema: """Return the schema shared by the write actions.""" - return vol.Schema( + return probatio.Schema( { - vol.Optional(ATTR_HUB, default=DEFAULT_HUB): cv.string, - vol.Exclusive(ATTR_SLAVE, "unit"): cv.positive_int, - vol.Exclusive(ATTR_UNIT, "unit"): cv.positive_int, - vol.Required(ATTR_ADDRESS): cv.positive_int, - vol.Required(attr): vol.Any( - cv.positive_int, vol.All(cv.ensure_list, [validator]) + probatio.Optional(ATTR_HUB, default=DEFAULT_HUB): cv.string, + probatio.Exclusive(ATTR_SLAVE, "unit"): cv.positive_int, + probatio.Exclusive(ATTR_UNIT, "unit"): cv.positive_int, + probatio.Required(ATTR_ADDRESS): cv.positive_int, + probatio.Required(attr): probatio.Any( + cv.positive_int, probatio.All(cv.ensure_list, [validator]) ), } ) @@ -149,5 +151,5 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, SERVICE_STOP, _async_stop_hub, - schema=vol.Schema({vol.Required(ATTR_HUB): cv.string}), + schema=probatio.Schema({probatio.Required(ATTR_HUB): cv.string}), ) diff --git a/homeassistant/components/modbus/validators.py b/homeassistant/components/modbus/validators.py index c322e000ad144..868a6a27fbdcd 100644 --- a/homeassistant/components/modbus/validators.py +++ b/homeassistant/components/modbus/validators.py @@ -5,7 +5,7 @@ import struct from typing import Any -import voluptuous as vol +import probatio from homeassistant.components.climate import HVACMode from homeassistant.const import ( @@ -168,10 +168,10 @@ def struct_validator(config: dict[str, Any]) -> dict[str, Any]: f"{name}: `{entry[2]}` missing," f" demanded with `{CONF_DATA_TYPE}: {data_type}`" ) - raise vol.Invalid(error) + raise probatio.Invalid(error) elif entry[1] == ILLEGAL: error = f"{name}: `{entry[2]}` illegal with `{CONF_DATA_TYPE}: {data_type}`" - raise vol.Invalid(error) + raise probatio.Invalid(error) if config[CONF_DATA_TYPE] == DataType.CUSTOM: assert isinstance(structure, str) @@ -179,10 +179,12 @@ def struct_validator(config: dict[str, Any]) -> dict[str, Any]: try: size = struct.calcsize(structure) except struct.error as err: - raise vol.Invalid(f"{name}: error in structure format --> {err!s}") from err + raise probatio.Invalid( + f"{name}: error in structure format --> {err!s}" + ) from err bytecount = count * 2 if bytecount != size: - raise vol.Invalid( + raise probatio.Invalid( f"{name}: Size of structure is {size} bytes" f" but `{CONF_COUNT}: {count}` is {bytecount} bytes" ) @@ -217,7 +219,7 @@ def hvac_fixedsize_reglist_validator(value: Any) -> list: if _rv is True: return list(value) - raise vol.Invalid( + raise probatio.Invalid( "Invalid target temp register. Required type: integer," f" allowed 1 or list of {len(HVACMode)} registers" ) @@ -234,7 +236,7 @@ def nan_validator(value: Any) -> int: try: return int(value, 16) except (TypeError, ValueError) as err: - raise vol.Invalid(f"invalid number {value}") from err + raise probatio.Invalid(f"invalid number {value}") from err def duplicate_fan_mode_validator(config: dict[str, Any]) -> dict: @@ -260,7 +262,7 @@ def duplicate_fan_mode_validator(config: dict[str, Any]) -> dict: def not_zero_value(val: float, errMsg: str) -> float: """Check value is not zero.""" if val == 0: - raise vol.Invalid(errMsg) + raise probatio.Invalid(errMsg) return val @@ -278,7 +280,7 @@ def ensure_and_check_conflicting_scales_and_offsets(config: dict[str, Any]) -> d for generic_key, target_key, current_key, default_value in config_keys: if generic_key in config and (target_key in config or current_key in config): - raise vol.Invalid( + raise probatio.Invalid( f"Cannot use both '{generic_key}' and" " temperature-specific parameters" f" ('{target_key}' or '{current_key}')" @@ -331,7 +333,7 @@ def register_int_list_validator(value: Any) -> Any: if (len(value) == 1) and isinstance(value[0], int) and value[0] >= 0: return value - raise vol.Invalid( + raise probatio.Invalid( f"Invalid {CONF_ADDRESS} register for fan/swing mode." " Required type: positive integer," " allowed 1 or list of 1 register." diff --git a/homeassistant/components/modbus/websocket_api.py b/homeassistant/components/modbus/websocket_api.py index 57d388327ea2d..01acf38b79e4a 100644 --- a/homeassistant/components/modbus/websocket_api.py +++ b/homeassistant/components/modbus/websocket_api.py @@ -2,7 +2,7 @@ from typing import Any, Final -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.core import HomeAssistant, callback @@ -23,7 +23,7 @@ def async_setup(hass: HomeAssistant) -> None: @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required("type"): TYPE_LIST_CONNECTIONS}) +@websocket_api.websocket_command({probatio.Required("type"): TYPE_LIST_CONNECTIONS}) @callback def websocket_list_connections( hass: HomeAssistant, diff --git a/homeassistant/components/modem_callerid/config_flow.py b/homeassistant/components/modem_callerid/config_flow.py index 6efb06e9c67bd..527cb01995867 100644 --- a/homeassistant/components/modem_callerid/config_flow.py +++ b/homeassistant/components/modem_callerid/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from phone_modem import PhoneModem -import voluptuous as vol +import probatio from homeassistant.components import usb from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -12,7 +12,7 @@ from .const import DEFAULT_NAME, DOMAIN, EXCEPTIONS -DATA_SCHEMA = vol.Schema({"name": str, "device": str}) +DATA_SCHEMA = probatio.Schema({"name": str, "device": str}) def _generate_unique_id(port: usb.USBDevice | usb.SerialDevice) -> str: @@ -98,7 +98,9 @@ async def async_step_user( data={CONF_DEVICE: dev_path}, ) user_input = user_input or {} - schema = vol.Schema({vol.Required(CONF_DEVICE): vol.In(list(port_map))}) + schema = probatio.Schema( + {probatio.Required(CONF_DEVICE): probatio.In(list(port_map))} + ) return self.async_show_form(step_id="user", data_schema=schema, errors=errors) async def validate_device_errors( diff --git a/homeassistant/components/modern_forms/config_flow.py b/homeassistant/components/modern_forms/config_flow.py index f2d2042942afd..88d4c9c866499 100644 --- a/homeassistant/components/modern_forms/config_flow.py +++ b/homeassistant/components/modern_forms/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from aiomodernforms import ModernFormsConnectionError, ModernFormsDevice -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_ZEROCONF, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_MAC @@ -12,7 +12,7 @@ from .const import DOMAIN -USER_SCHEMA = vol.Schema({vol.Required(CONF_HOST): str}) +USER_SCHEMA = probatio.Schema({probatio.Required(CONF_HOST): str}) class ModernFormsFlowHandler(ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/components/modern_forms/fan.py b/homeassistant/components/modern_forms/fan.py index e072bcb1bedfc..7677d0b9cd2b5 100644 --- a/homeassistant/components/modern_forms/fan.py +++ b/homeassistant/components/modern_forms/fan.py @@ -3,7 +3,7 @@ from typing import Any, override from aiomodernforms.const import FAN_POWER_OFF, FAN_POWER_ON -import voluptuous as vol +import probatio from homeassistant.components.fan import FanEntity, FanEntityFeature from homeassistant.core import HomeAssistant @@ -48,8 +48,8 @@ async def async_setup_entry( platform.async_register_entity_service( SERVICE_SET_FAN_SLEEP_TIMER, { - vol.Required(ATTR_SLEEP_TIME): vol.All( - vol.Coerce(int), vol.Range(min=1, max=1440) + probatio.Required(ATTR_SLEEP_TIME): probatio.All( + probatio.Coerce(int), probatio.Range(min=1, max=1440) ), }, "async_set_fan_sleep_timer", diff --git a/homeassistant/components/modern_forms/light.py b/homeassistant/components/modern_forms/light.py index bcfc40d61322a..981c367eccccf 100644 --- a/homeassistant/components/modern_forms/light.py +++ b/homeassistant/components/modern_forms/light.py @@ -4,7 +4,7 @@ from aiomodernforms.const import LIGHT_POWER_OFF, LIGHT_POWER_ON from aiomodernforms.models import Light -import voluptuous as vol +import probatio from homeassistant.components.light import ( ATTR_BRIGHTNESS, @@ -56,8 +56,8 @@ async def async_setup_entry( platform.async_register_entity_service( SERVICE_SET_LIGHT_SLEEP_TIMER, { - vol.Required(ATTR_SLEEP_TIME): vol.All( - vol.Coerce(int), vol.Range(min=1, max=1440) + probatio.Required(ATTR_SLEEP_TIME): probatio.All( + probatio.Coerce(int), probatio.Range(min=1, max=1440) ), }, "async_set_light_sleep_timer", diff --git a/homeassistant/components/moehlenhoff_alpha2/config_flow.py b/homeassistant/components/moehlenhoff_alpha2/config_flow.py index ba3ba413bc877..fc62cae1a67f3 100644 --- a/homeassistant/components/moehlenhoff_alpha2/config_flow.py +++ b/homeassistant/components/moehlenhoff_alpha2/config_flow.py @@ -5,7 +5,7 @@ import aiohttp from moehlenhoff_alpha2 import Alpha2Base -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST @@ -14,7 +14,7 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema({vol.Required(CONF_HOST): str}) +DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_HOST): str}) async def validate_input(data: dict[str, Any]) -> dict[str, str]: diff --git a/homeassistant/components/mold_indicator/config_flow.py b/homeassistant/components/mold_indicator/config_flow.py index 0487342ab27dc..5fc6dec52be14 100644 --- a/homeassistant/components/mold_indicator/config_flow.py +++ b/homeassistant/components/mold_indicator/config_flow.py @@ -3,7 +3,7 @@ from collections.abc import Mapping from typing import Any, cast, override -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.components.sensor import SensorDeviceClass @@ -47,32 +47,32 @@ async def validate_input( return user_input -DATA_SCHEMA_OPTIONS = vol.Schema( +DATA_SCHEMA_OPTIONS = probatio.Schema( { - vol.Required(CONF_INDOOR_TEMP): EntitySelector( + probatio.Required(CONF_INDOOR_TEMP): EntitySelector( EntitySelectorConfig( domain=Platform.SENSOR, device_class=SensorDeviceClass.TEMPERATURE ) ), - vol.Required(CONF_INDOOR_HUMIDITY): EntitySelector( + probatio.Required(CONF_INDOOR_HUMIDITY): EntitySelector( EntitySelectorConfig( domain=Platform.SENSOR, device_class=SensorDeviceClass.HUMIDITY ) ), - vol.Required(CONF_OUTDOOR_TEMP): EntitySelector( + probatio.Required(CONF_OUTDOOR_TEMP): EntitySelector( EntitySelectorConfig( domain=Platform.SENSOR, device_class=SensorDeviceClass.TEMPERATURE ) ), - vol.Required(CONF_CALIBRATION_FACTOR): NumberSelector( + probatio.Required(CONF_CALIBRATION_FACTOR): NumberSelector( NumberSelectorConfig(step=0.1, mode=NumberSelectorMode.BOX) ), } ) -DATA_SCHEMA_CONFIG = vol.Schema( +DATA_SCHEMA_CONFIG = probatio.Schema( { - vol.Required(CONF_NAME, default=DEFAULT_NAME): TextSelector(), + probatio.Required(CONF_NAME, default=DEFAULT_NAME): TextSelector(), } ).extend(DATA_SCHEMA_OPTIONS.schema) @@ -117,10 +117,10 @@ async def async_setup_preview(hass: HomeAssistant) -> None: @websocket_api.websocket_command( { - vol.Required("type"): "mold_indicator/start_preview", - vol.Required("flow_id"): str, - vol.Required("flow_type"): vol.Any("config_flow", "options_flow"), - vol.Required("user_input"): dict, + probatio.Required("type"): "mold_indicator/start_preview", + probatio.Required("flow_id"): str, + probatio.Required("flow_type"): probatio.Any("config_flow", "options_flow"), + probatio.Required("user_input"): dict, } ) @callback diff --git a/homeassistant/components/mold_indicator/sensor.py b/homeassistant/components/mold_indicator/sensor.py index ed383a44927d2..59f02f9012843 100644 --- a/homeassistant/components/mold_indicator/sensor.py +++ b/homeassistant/components/mold_indicator/sensor.py @@ -5,7 +5,7 @@ import math from typing import TYPE_CHECKING, Any, override -import voluptuous as vol +import probatio from homeassistant import util from homeassistant.components.sensor import ( @@ -63,12 +63,12 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_INDOOR_TEMP): cv.entity_id, - vol.Required(CONF_OUTDOOR_TEMP): cv.entity_id, - vol.Required(CONF_INDOOR_HUMIDITY): cv.entity_id, - vol.Optional(CONF_CALIBRATION_FACTOR): vol.Coerce(float), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Required(CONF_INDOOR_TEMP): cv.entity_id, + probatio.Required(CONF_OUTDOOR_TEMP): cv.entity_id, + probatio.Required(CONF_INDOOR_HUMIDITY): cv.entity_id, + probatio.Optional(CONF_CALIBRATION_FACTOR): probatio.Coerce(float), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_UNIQUE_ID): cv.string, } ) diff --git a/homeassistant/components/monarch_money/config_flow.py b/homeassistant/components/monarch_money/config_flow.py index df2d01d96b704..8236571540a81 100644 --- a/homeassistant/components/monarch_money/config_flow.py +++ b/homeassistant/components/monarch_money/config_flow.py @@ -5,9 +5,9 @@ from monarchmoney import LoginFailedException, RequireMFAException from monarchmoney.monarchmoney import SESSION_FILE +import probatio from typedmonarchmoney import TypedMonarchMoney from typedmonarchmoney.models import MonarchSubscription -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_EMAIL, CONF_ID, CONF_PASSWORD, CONF_TOKEN @@ -24,14 +24,14 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_EMAIL): TextSelector( + probatio.Required(CONF_EMAIL): TextSelector( TextSelectorConfig( type=TextSelectorType.EMAIL, ), ), - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, ), @@ -39,9 +39,9 @@ } ) -STEP_MFA_DATA_SCHEMA = vol.Schema( +STEP_MFA_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_MFA_CODE): str, + probatio.Required(CONF_MFA_CODE): str, } ) diff --git a/homeassistant/components/monoprice/config_flow.py b/homeassistant/components/monoprice/config_flow.py index 81749cca18c5f..a20620ab0394b 100644 --- a/homeassistant/components/monoprice/config_flow.py +++ b/homeassistant/components/monoprice/config_flow.py @@ -3,9 +3,9 @@ import logging from typing import Any, override +import probatio from pymonoprice import get_monoprice from serialx import SerialException -import voluptuous as vol from homeassistant.config_entries import ( ConfigEntry, @@ -41,10 +41,10 @@ CONF_SOURCE_6, ] -OPTIONS_FOR_DATA: VolDictType = {vol.Optional(source): str for source in SOURCES} +OPTIONS_FOR_DATA: VolDictType = {probatio.Optional(source): str for source in SOURCES} -DATA_SCHEMA = vol.Schema( - {vol.Required(CONF_PORT): SerialPortSelector(), **OPTIONS_FOR_DATA} +DATA_SCHEMA = probatio.Schema( + {probatio.Required(CONF_PORT): SerialPortSelector(), **OPTIONS_FOR_DATA} ) @@ -117,11 +117,11 @@ def async_get_options_flow( @callback def _key_for_source(index, source, previous_sources): if str(index) in previous_sources: - key = vol.Optional( + key = probatio.Optional( source, description={"suggested_value": previous_sources[str(index)]} ) else: - key = vol.Optional(source) + key = probatio.Optional(source) return key @@ -156,7 +156,7 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema(options), + data_schema=probatio.Schema(options), ) diff --git a/homeassistant/components/monzo/services.py b/homeassistant/components/monzo/services.py index 0c5ee510c78a6..1cdbb725f6c57 100644 --- a/homeassistant/components/monzo/services.py +++ b/homeassistant/components/monzo/services.py @@ -6,7 +6,7 @@ from aiohttp import ClientError from monzopy import AuthorisationExpiredError, InvalidMonzoAPIResponseError -import voluptuous as vol +import probatio from homeassistant.core import HomeAssistant, ServiceCall, callback from homeassistant.exceptions import ( @@ -40,7 +40,7 @@ def _amount_to_minor_units(value: Any) -> int: amount = Decimal(str(value)) minor_units = amount * 100 except (DecimalException, ValueError) as err: - raise vol.Invalid("Amount must be a number") from err + raise probatio.Invalid("Amount must be a number") from err if ( not amount.is_finite() @@ -48,7 +48,9 @@ def _amount_to_minor_units(value: Any) -> int: or minor_units <= 0 or minor_units != minor_units.to_integral_value() ): - raise vol.Invalid("Amount must be positive with no more than 2 decimal places") + raise probatio.Invalid( + "Amount must be positive with no more than 2 decimal places" + ) return int(minor_units) @@ -64,9 +66,9 @@ def _transfer_rejection_reason(error: InvalidMonzoAPIResponseError) -> str | Non return message -TRANSFER_SCHEMA = vol.Schema( +TRANSFER_SCHEMA = probatio.Schema( { - vol.Required(ATTR_ACCOUNT): selector.DeviceSelector( + probatio.Required(ATTR_ACCOUNT): selector.DeviceSelector( { "filter": { "integration": DOMAIN, @@ -74,7 +76,7 @@ def _transfer_rejection_reason(error: InvalidMonzoAPIResponseError) -> str | Non } } ), - vol.Required(ATTR_POT): selector.DeviceSelector( + probatio.Required(ATTR_POT): selector.DeviceSelector( { "filter": { "integration": DOMAIN, @@ -82,7 +84,7 @@ def _transfer_rejection_reason(error: InvalidMonzoAPIResponseError) -> str | Non } } ), - vol.Required(ATTR_AMOUNT): _amount_to_minor_units, + probatio.Required(ATTR_AMOUNT): _amount_to_minor_units, } ) diff --git a/homeassistant/components/moon/condition.py b/homeassistant/components/moon/condition.py index 4a8fef2b3ee13..a86c7a6ec2fdb 100644 --- a/homeassistant/components/moon/condition.py +++ b/homeassistant/components/moon/condition.py @@ -2,7 +2,7 @@ from typing import Unpack, cast, override -import voluptuous as vol +import probatio from homeassistant.const import CONF_OPTIONS from homeassistant.core import HomeAssistant @@ -16,11 +16,13 @@ from .const import CONF_PHASE from .helpers import MOON_PHASES, is_waxing, moon_phase -_STATE_CONDITION_SCHEMA = vol.Schema({vol.Required(CONF_OPTIONS, default=dict): {}}) -_IS_PHASE_CONDITION_SCHEMA = vol.Schema( +_STATE_CONDITION_SCHEMA = probatio.Schema( + {probatio.Required(CONF_OPTIONS, default=dict): {}} +) +_IS_PHASE_CONDITION_SCHEMA = probatio.Schema( { - vol.Required(CONF_OPTIONS, default=dict): { - vol.Required(CONF_PHASE): vol.In(MOON_PHASES), + probatio.Required(CONF_OPTIONS, default=dict): { + probatio.Required(CONF_PHASE): probatio.In(MOON_PHASES), } } ) diff --git a/homeassistant/components/moon/trigger.py b/homeassistant/components/moon/trigger.py index 174436020f9ab..d714463430a92 100644 --- a/homeassistant/components/moon/trigger.py +++ b/homeassistant/components/moon/trigger.py @@ -3,7 +3,7 @@ from datetime import datetime from typing import cast, override -import voluptuous as vol +import probatio from homeassistant.const import CONF_OPTIONS from homeassistant.core import CALLBACK_TYPE, HomeAssistant, callback @@ -21,10 +21,10 @@ PHASE_ANY = "any" -_PHASE_CHANGED_TRIGGER_SCHEMA = vol.Schema( +_PHASE_CHANGED_TRIGGER_SCHEMA = probatio.Schema( { - vol.Required(CONF_OPTIONS, default=dict): { - vol.Optional(CONF_PHASE, default=PHASE_ANY): vol.In( + probatio.Required(CONF_OPTIONS, default=dict): { + probatio.Optional(CONF_PHASE, default=PHASE_ANY): probatio.In( [PHASE_ANY, *MOON_PHASES] ), } diff --git a/homeassistant/components/mopeka/config_flow.py b/homeassistant/components/mopeka/config_flow.py index f4c0cac52c416..c2dc40bee04e6 100644 --- a/homeassistant/components/mopeka/config_flow.py +++ b/homeassistant/components/mopeka/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from mopeka_iot_ble import MopekaIOTBluetoothDeviceData as DeviceData -import voluptuous as vol +import probatio from homeassistant import config_entries from homeassistant.components.bluetooth import ( @@ -28,13 +28,13 @@ def format_medium_type(medium_type: Enum) -> str: } -def async_generate_schema(medium_type: str | None = None) -> vol.Schema: +def async_generate_schema(medium_type: str | None = None) -> probatio.Schema: """Return the base schema with formatted medium types.""" - return vol.Schema( + return probatio.Schema( { - vol.Required( + probatio.Required( CONF_MEDIUM_TYPE, default=medium_type or DEFAULT_MEDIUM_TYPE - ): vol.In(MEDIUM_TYPES_BY_NAME) + ): probatio.In(MEDIUM_TYPES_BY_NAME) } ) @@ -128,9 +128,11 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_ADDRESS): vol.In(self._discovered_devices), + probatio.Required(CONF_ADDRESS): probatio.In( + self._discovered_devices + ), **async_generate_schema().schema, } ), diff --git a/homeassistant/components/motion_blinds/config_flow.py b/homeassistant/components/motion_blinds/config_flow.py index 7165a006b7eac..069798d456d40 100644 --- a/homeassistant/components/motion_blinds/config_flow.py +++ b/homeassistant/components/motion_blinds/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from motionblinds import MotionDiscovery, MotionGateway -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigFlow, @@ -29,9 +29,9 @@ _LOGGER = logging.getLogger(__name__) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Optional(CONF_HOST): str, + probatio.Optional(CONF_HOST): str, } ) @@ -47,9 +47,9 @@ async def async_step_init( if user_input is not None: return self.async_create_entry(title="", data=user_input) - settings_schema = vol.Schema( + settings_schema = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_WAIT_FOR_PUSH, default=self.config_entry.options.get( CONF_WAIT_FOR_PUSH, DEFAULT_WAIT_FOR_PUSH @@ -72,7 +72,7 @@ def __init__(self) -> None: """Initialize the Motionblinds flow.""" self._host: str | None = None self._ips: list[str] = [] - self._config_settings: vol.Schema | None = None + self._config_settings: probatio.Schema | None = None @staticmethod @callback @@ -150,7 +150,9 @@ async def async_step_select( self._host = user_input["select_ip"] return await self.async_step_connect() - select_schema = vol.Schema({vol.Required("select_ip"): vol.In(self._ips)}) + select_schema = probatio.Schema( + {probatio.Required("select_ip"): probatio.In(self._ips)} + ) return self.async_show_form(step_id="select", data_schema=select_schema) @@ -196,9 +198,11 @@ async def async_step_connect( }, ) - self._config_settings = vol.Schema( + self._config_settings = probatio.Schema( { - vol.Required(CONF_API_KEY): vol.All(str, vol.Length(min=16, max=16)), + probatio.Required(CONF_API_KEY): probatio.All( + str, probatio.Length(min=16, max=16) + ), } ) diff --git a/homeassistant/components/motion_blinds/cover.py b/homeassistant/components/motion_blinds/cover.py index 5e1e7f9b9f536..77a382ed18146 100644 --- a/homeassistant/components/motion_blinds/cover.py +++ b/homeassistant/components/motion_blinds/cover.py @@ -4,7 +4,7 @@ from typing import Any, override from motionblinds import BlindType -import voluptuous as vol +import probatio from homeassistant.components.cover import ( ATTR_POSITION, @@ -72,9 +72,15 @@ SET_ABSOLUTE_POSITION_SCHEMA: VolDictType = { - vol.Required(ATTR_ABSOLUTE_POSITION): vol.All(cv.positive_int, vol.Range(max=100)), - vol.Optional(ATTR_TILT_POSITION): vol.All(cv.positive_int, vol.Range(max=100)), - vol.Optional(ATTR_WIDTH): vol.All(cv.positive_int, vol.Range(max=100)), + probatio.Required(ATTR_ABSOLUTE_POSITION): probatio.All( + cv.positive_int, probatio.Range(max=100) + ), + probatio.Optional(ATTR_TILT_POSITION): probatio.All( + cv.positive_int, probatio.Range(max=100) + ), + probatio.Optional(ATTR_WIDTH): probatio.All( + cv.positive_int, probatio.Range(max=100) + ), } diff --git a/homeassistant/components/motionblinds_ble/config_flow.py b/homeassistant/components/motionblinds_ble/config_flow.py index cbc045d63cd73..0f003399a3b0e 100644 --- a/homeassistant/components/motionblinds_ble/config_flow.py +++ b/homeassistant/components/motionblinds_ble/config_flow.py @@ -6,7 +6,7 @@ from bleak.backends.device import BLEDevice from motionblindsble.const import DISPLAY_NAME, SETTING_DISCONNECT_TIME, MotionBlindType -import voluptuous as vol +import probatio from homeassistant.components import bluetooth from homeassistant.components.bluetooth import BluetoothServiceInfoBleak @@ -36,7 +36,7 @@ _LOGGER = logging.getLogger(__name__) -CONFIG_SCHEMA = vol.Schema({vol.Required(CONF_MAC_CODE): str}) +CONFIG_SCHEMA = probatio.Schema({probatio.Required(CONF_MAC_CODE): str}) class FlowHandler(ConfigFlow, domain=DOMAIN): @@ -121,9 +121,9 @@ async def async_step_confirm( return self.async_show_form( step_id="confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_BLIND_TYPE): SelectSelector( + probatio.Required(CONF_BLIND_TYPE): SelectSelector( SelectSelectorConfig( options=[ blind_type.name.lower() @@ -200,9 +200,9 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( OPTION_PERMANENT_CONNECTION, default=( self.config_entry.options.get( @@ -210,14 +210,14 @@ async def async_step_init( ) ), ): bool, - vol.Optional( + probatio.Optional( OPTION_DISCONNECT_TIME, default=( self.config_entry.options.get( OPTION_DISCONNECT_TIME, SETTING_DISCONNECT_TIME ) ), - ): vol.All(vol.Coerce(int), vol.Range(min=0)), + ): probatio.All(probatio.Coerce(int), probatio.Range(min=0)), } ), ) diff --git a/homeassistant/components/motioneye/camera.py b/homeassistant/components/motioneye/camera.py index 34b543bce7cac..7771e822c7a3d 100644 --- a/homeassistant/components/motioneye/camera.py +++ b/homeassistant/components/motioneye/camera.py @@ -21,7 +21,7 @@ KEY_TEXT_OVERLAY_RIGHT, KEY_TEXT_OVERLAY_TIMESTAMP, ) -import voluptuous as vol +import probatio from homeassistant.components.mjpeg import ( CONF_MJPEG_URL, @@ -58,7 +58,7 @@ PLATFORMS = [Platform.CAMERA] -SCHEMA_TEXT_OVERLAY = vol.In( +SCHEMA_TEXT_OVERLAY = probatio.In( [ KEY_TEXT_OVERLAY_DISABLED, KEY_TEXT_OVERLAY_TIMESTAMP, @@ -66,14 +66,14 @@ KEY_TEXT_OVERLAY_CAMERA_NAME, ] ) -SCHEMA_SERVICE_SET_TEXT = vol.Schema( - vol.All( +SCHEMA_SERVICE_SET_TEXT = probatio.Schema( + probatio.All( cv.make_entity_service_schema( { - vol.Optional(KEY_TEXT_OVERLAY_LEFT): SCHEMA_TEXT_OVERLAY, - vol.Optional(KEY_TEXT_OVERLAY_CUSTOM_TEXT_LEFT): cv.string, - vol.Optional(KEY_TEXT_OVERLAY_RIGHT): SCHEMA_TEXT_OVERLAY, - vol.Optional(KEY_TEXT_OVERLAY_CUSTOM_TEXT_RIGHT): cv.string, + probatio.Optional(KEY_TEXT_OVERLAY_LEFT): SCHEMA_TEXT_OVERLAY, + probatio.Optional(KEY_TEXT_OVERLAY_CUSTOM_TEXT_LEFT): cv.string, + probatio.Optional(KEY_TEXT_OVERLAY_RIGHT): SCHEMA_TEXT_OVERLAY, + probatio.Optional(KEY_TEXT_OVERLAY_CUSTOM_TEXT_RIGHT): cv.string, }, ), cv.has_at_least_one_key( @@ -123,7 +123,7 @@ def camera_add(camera: dict[str, Any]) -> None: ) platform.async_register_entity_service( SERVICE_ACTION, - {vol.Required(CONF_ACTION): cv.string}, + {probatio.Required(CONF_ACTION): cv.string}, "async_request_action", ) platform.async_register_entity_service( diff --git a/homeassistant/components/motioneye/config_flow.py b/homeassistant/components/motioneye/config_flow.py index b80df4b75365f..b44b170b63479 100644 --- a/homeassistant/components/motioneye/config_flow.py +++ b/homeassistant/components/motioneye/config_flow.py @@ -8,7 +8,7 @@ MotionEyeClientInvalidAuthError, MotionEyeClientRequestError, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -61,27 +61,27 @@ def _get_form( if not self._hassio_discovery: # Only ask for URL when not discovered url_schema[ - vol.Required(CONF_URL, default=user_input.get(CONF_URL, "")) + probatio.Required(CONF_URL, default=user_input.get(CONF_URL, "")) ] = str return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { **url_schema, - vol.Optional( + probatio.Optional( CONF_ADMIN_USERNAME, default=user_input.get(CONF_ADMIN_USERNAME, ""), ): str, - vol.Optional( + probatio.Optional( CONF_ADMIN_PASSWORD, default=user_input.get(CONF_ADMIN_PASSWORD, ""), ): str, - vol.Optional( + probatio.Optional( CONF_SURVEILLANCE_USERNAME, default=user_input.get(CONF_SURVEILLANCE_USERNAME, ""), ): str, - vol.Optional( + probatio.Optional( CONF_SURVEILLANCE_PASSWORD, default=user_input.get(CONF_SURVEILLANCE_PASSWORD, ""), ): str, @@ -103,7 +103,7 @@ def _get_form( # Cannot use cv.url validation in the schema itself, so # apply extra validation here. cv.url(user_input[CONF_URL]) - except vol.Invalid: + except probatio.Invalid: return _get_form(user_input, {"base": "invalid_url"}) client = create_motioneye_client( @@ -211,26 +211,26 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_WEBHOOK_SET, default=self.config_entry.options.get( CONF_WEBHOOK_SET, DEFAULT_WEBHOOK_SET, ), ): bool, - vol.Required( + probatio.Required( CONF_WEBHOOK_SET_OVERWRITE, default=self.config_entry.options.get( CONF_WEBHOOK_SET_OVERWRITE, DEFAULT_WEBHOOK_SET_OVERWRITE, ), ): bool, - vol.Required(CONF_MORE_OPTIONS): section( - vol.Schema( + probatio.Required(CONF_MORE_OPTIONS): section( + probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_STREAM_URL_TEMPLATE, description=description, ): str, diff --git a/homeassistant/components/motionmount/config_flow.py b/homeassistant/components/motionmount/config_flow.py index 1060f68c302fe..71cc43a1589bc 100644 --- a/homeassistant/components/motionmount/config_flow.py +++ b/homeassistant/components/motionmount/config_flow.py @@ -7,7 +7,7 @@ from typing import Any, override import motionmount -import voluptuous as vol +import probatio from homeassistant.config_entries import ( DEFAULT_DISCOVERY_UNIQUE_ID, @@ -200,9 +200,11 @@ async def async_step_auth( return self.async_show_form( step_id="auth", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PIN): vol.All(int, vol.Range(min=1, max=9999)), + probatio.Required(CONF_PIN): probatio.All( + int, probatio.Range(min=1, max=9999) + ), } ), errors=errors, @@ -279,10 +281,10 @@ def _show_setup_form( """Show the setup form to the user.""" return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=23): int, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=23): int, } ), errors=errors or {}, diff --git a/homeassistant/components/mpd/config_flow.py b/homeassistant/components/mpd/config_flow.py index 863b90ce6ccfb..1270068cca1fc 100644 --- a/homeassistant/components/mpd/config_flow.py +++ b/homeassistant/components/mpd/config_flow.py @@ -7,18 +7,18 @@ import mpd from mpd.asyncio import MPDClient -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_PORT from .const import DOMAIN, LOGGER -SCHEMA = vol.Schema( +SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Optional(CONF_PASSWORD): str, - vol.Optional(CONF_PORT, default=6600): int, + probatio.Required(CONF_HOST): str, + probatio.Optional(CONF_PASSWORD): str, + probatio.Optional(CONF_PORT, default=6600): int, } ) diff --git a/homeassistant/components/mpd/media_player.py b/homeassistant/components/mpd/media_player.py index e12d760d6d79d..7c72f2446139b 100644 --- a/homeassistant/components/mpd/media_player.py +++ b/homeassistant/components/mpd/media_player.py @@ -11,7 +11,7 @@ import mpd from mpd.asyncio import MPDClient -import voluptuous as vol +import probatio from homeassistant.components import media_source from homeassistant.components.media_player import ( @@ -57,10 +57,10 @@ PLATFORM_SCHEMA = MEDIA_PLAYER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_PASSWORD): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, } ) diff --git a/homeassistant/components/mqtt/__init__.py b/homeassistant/components/mqtt/__init__.py index 7d5cea73e0307..dcdb200d932a1 100644 --- a/homeassistant/components/mqtt/__init__.py +++ b/homeassistant/components/mqtt/__init__.py @@ -6,7 +6,7 @@ import logging from typing import Any, cast -import voluptuous as vol +import probatio from homeassistant import config as conf_util from homeassistant.components import websocket_api @@ -229,26 +229,26 @@ # ... # - name: "" # ... -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.All( + DOMAIN: probatio.All( cv.ensure_list, cv.remove_falsy, [CONFIG_SCHEMA_BASE], ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) # Publish action call validation schema -MQTT_PUBLISH_SCHEMA = vol.Schema( +MQTT_PUBLISH_SCHEMA = probatio.Schema( { - vol.Required(ATTR_TOPIC): valid_publish_topic, - vol.Required(ATTR_PAYLOAD, default=None): vol.Any(cv.string, None), - vol.Optional(ATTR_EVALUATE_PAYLOAD): cv.boolean, - vol.Optional(ATTR_QOS, default=DEFAULT_QOS): valid_qos_schema, - vol.Optional(ATTR_RETAIN, default=DEFAULT_RETAIN): cv.boolean, - vol.Optional(ATTR_MESSAGE_EXPIRY_INTERVAL): cv.positive_time_period_dict, + probatio.Required(ATTR_TOPIC): valid_publish_topic, + probatio.Required(ATTR_PAYLOAD, default=None): probatio.Any(cv.string, None), + probatio.Optional(ATTR_EVALUATE_PAYLOAD): cv.boolean, + probatio.Optional(ATTR_QOS, default=DEFAULT_QOS): valid_qos_schema, + probatio.Optional(ATTR_RETAIN, default=DEFAULT_RETAIN): cv.boolean, + probatio.Optional(ATTR_MESSAGE_EXPIRY_INTERVAL): cv.positive_time_period_dict, }, required=True, ) @@ -287,7 +287,7 @@ async def async_check_config_schema( for config in config_items: try: schema(config) - except vol.Invalid as exc: + except probatio.Invalid as exc: integration = await async_get_integration(hass, DOMAIN) message = conf_util.format_schema_error( hass, exc, domain, config, integration.documentation @@ -399,10 +399,10 @@ async def finish_dump(_: datetime) -> None: DOMAIN, SERVICE_DUMP, async_dump_service, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required("topic"): valid_subscribe_topic, - vol.Optional("duration", default=5): int, + probatio.Required("topic"): valid_subscribe_topic, + probatio.Optional("duration", default=5): int, } ), ) @@ -609,7 +609,10 @@ async def _setup_client() -> tuple[MqttData, dict[str, Any]]: @websocket_api.websocket_command( - {vol.Required("type"): "mqtt/device/debug_info", vol.Required("device_id"): str} + { + probatio.Required("type"): "mqtt/device/debug_info", + probatio.Required("device_id"): str, + } ) @callback def websocket_mqtt_info( @@ -624,9 +627,9 @@ def websocket_mqtt_info( @websocket_api.websocket_command( { - vol.Required("type"): "mqtt/subscribe", - vol.Required("topic"): valid_subscribe_topic, - vol.Optional("qos"): valid_qos_schema, + probatio.Required("type"): "mqtt/subscribe", + probatio.Required("topic"): valid_subscribe_topic, + probatio.Optional("qos"): valid_qos_schema, } ) @websocket_api.async_response diff --git a/homeassistant/components/mqtt/alarm_control_panel.py b/homeassistant/components/mqtt/alarm_control_panel.py index 24f8475473f8e..4d3dbb1f5d657 100644 --- a/homeassistant/components/mqtt/alarm_control_panel.py +++ b/homeassistant/components/mqtt/alarm_control_panel.py @@ -3,7 +3,7 @@ import logging from typing import override -import voluptuous as vol +import probatio from homeassistant.components import alarm_control_panel as alarm from homeassistant.components.alarm_control_panel import ( @@ -69,43 +69,47 @@ PLATFORM_SCHEMA_MODERN = MQTT_BASE_SCHEMA.extend( { - vol.Optional( + probatio.Optional( CONF_SUPPORTED_FEATURES, default=list(ALARM_CONTROL_PANEL_SUPPORTED_FEATURES), - ): [vol.In(ALARM_CONTROL_PANEL_SUPPORTED_FEATURES)], - vol.Optional(CONF_CODE): cv.string, - vol.Optional(CONF_CODE_ARM_REQUIRED, default=True): cv.boolean, - vol.Optional(CONF_CODE_DISARM_REQUIRED, default=True): cv.boolean, - vol.Optional(CONF_CODE_TRIGGER_REQUIRED, default=True): cv.boolean, - vol.Optional( + ): [probatio.In(ALARM_CONTROL_PANEL_SUPPORTED_FEATURES)], + probatio.Optional(CONF_CODE): cv.string, + probatio.Optional(CONF_CODE_ARM_REQUIRED, default=True): cv.boolean, + probatio.Optional(CONF_CODE_DISARM_REQUIRED, default=True): cv.boolean, + probatio.Optional(CONF_CODE_TRIGGER_REQUIRED, default=True): cv.boolean, + probatio.Optional( CONF_COMMAND_TEMPLATE, default=DEFAULT_ALARM_CONTROL_PANEL_COMMAND_TEMPLATE ): cv.template, - vol.Required(CONF_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Optional( + probatio.Required(CONF_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Optional( CONF_PAYLOAD_ARM_AWAY, default=DEFAULT_PAYLOAD_ARM_AWAY ): cv.string, - vol.Optional( + probatio.Optional( CONF_PAYLOAD_ARM_HOME, default=DEFAULT_PAYLOAD_ARM_HOME ): cv.string, - vol.Optional( + probatio.Optional( CONF_PAYLOAD_ARM_NIGHT, default=DEFAULT_PAYLOAD_ARM_NIGHT ): cv.string, - vol.Optional( + probatio.Optional( CONF_PAYLOAD_ARM_VACATION, default=DEFAULT_PAYLOAD_ARM_VACATION ): cv.string, - vol.Optional( + probatio.Optional( CONF_PAYLOAD_ARM_CUSTOM_BYPASS, default=DEFAULT_PAYLOAD_ARM_CUSTOM_BYPASS ): cv.string, - vol.Optional(CONF_PAYLOAD_DISARM, default=DEFAULT_PAYLOAD_DISARM): cv.string, - vol.Optional(CONF_PAYLOAD_TRIGGER, default=DEFAULT_PAYLOAD_TRIGGER): cv.string, - vol.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, - vol.Required(CONF_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, + probatio.Optional( + CONF_PAYLOAD_DISARM, default=DEFAULT_PAYLOAD_DISARM + ): cv.string, + probatio.Optional( + CONF_PAYLOAD_TRIGGER, default=DEFAULT_PAYLOAD_TRIGGER + ): cv.string, + probatio.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, + probatio.Required(CONF_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_VALUE_TEMPLATE): cv.template, } ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) -DISCOVERY_SCHEMA = PLATFORM_SCHEMA_MODERN.extend({}, extra=vol.REMOVE_EXTRA) +DISCOVERY_SCHEMA = PLATFORM_SCHEMA_MODERN.extend({}, extra=probatio.REMOVE_EXTRA) async def async_setup_entry( @@ -134,7 +138,7 @@ class MqttAlarm(MqttEntity, alarm.AlarmControlPanelEntity): @staticmethod @override - def config_schema() -> vol.Schema: + def config_schema() -> probatio.Schema: """Return the config schema.""" return DISCOVERY_SCHEMA diff --git a/homeassistant/components/mqtt/binary_sensor.py b/homeassistant/components/mqtt/binary_sensor.py index f40d2d5fc04a4..9de17c29beff2 100644 --- a/homeassistant/components/mqtt/binary_sensor.py +++ b/homeassistant/components/mqtt/binary_sensor.py @@ -4,7 +4,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components import binary_sensor from homeassistant.components.binary_sensor import ( @@ -50,17 +50,17 @@ PLATFORM_SCHEMA_MODERN = MQTT_RO_SCHEMA.extend( { - vol.Optional(CONF_DEVICE_CLASS): vol.Any(DEVICE_CLASSES_SCHEMA, None), - vol.Optional(CONF_EXPIRE_AFTER): cv.positive_int, - vol.Optional(CONF_FORCE_UPDATE, default=DEFAULT_FORCE_UPDATE): cv.boolean, - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Optional(CONF_OFF_DELAY): cv.positive_int, - vol.Optional(CONF_PAYLOAD_OFF, default=DEFAULT_PAYLOAD_OFF): cv.string, - vol.Optional(CONF_PAYLOAD_ON, default=DEFAULT_PAYLOAD_ON): cv.string, + probatio.Optional(CONF_DEVICE_CLASS): probatio.Any(DEVICE_CLASSES_SCHEMA, None), + probatio.Optional(CONF_EXPIRE_AFTER): cv.positive_int, + probatio.Optional(CONF_FORCE_UPDATE, default=DEFAULT_FORCE_UPDATE): cv.boolean, + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Optional(CONF_OFF_DELAY): cv.positive_int, + probatio.Optional(CONF_PAYLOAD_OFF, default=DEFAULT_PAYLOAD_OFF): cv.string, + probatio.Optional(CONF_PAYLOAD_ON, default=DEFAULT_PAYLOAD_ON): cv.string, } ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) -DISCOVERY_SCHEMA = PLATFORM_SCHEMA_MODERN.extend({}, extra=vol.REMOVE_EXTRA) +DISCOVERY_SCHEMA = PLATFORM_SCHEMA_MODERN.extend({}, extra=probatio.REMOVE_EXTRA) async def async_setup_entry( @@ -137,7 +137,7 @@ async def async_will_remove_from_hass(self) -> None: @staticmethod @override - def config_schema() -> vol.Schema: + def config_schema() -> probatio.Schema: """Return the config schema.""" return DISCOVERY_SCHEMA diff --git a/homeassistant/components/mqtt/button.py b/homeassistant/components/mqtt/button.py index 685585f0def09..6bb5727bd5e15 100644 --- a/homeassistant/components/mqtt/button.py +++ b/homeassistant/components/mqtt/button.py @@ -2,7 +2,7 @@ from typing import override -import voluptuous as vol +import probatio from homeassistant.components import button from homeassistant.components.button import DEVICE_CLASSES_SCHEMA, ButtonEntity @@ -32,16 +32,16 @@ PLATFORM_SCHEMA_MODERN = MQTT_BASE_SCHEMA.extend( { - vol.Optional(CONF_COMMAND_TEMPLATE): cv.template, - vol.Required(CONF_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_DEVICE_CLASS): vol.Any(DEVICE_CLASSES_SCHEMA, None), - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Optional(CONF_PAYLOAD_PRESS, default=DEFAULT_PAYLOAD_PRESS): cv.string, - vol.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, + probatio.Optional(CONF_COMMAND_TEMPLATE): cv.template, + probatio.Required(CONF_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_DEVICE_CLASS): probatio.Any(DEVICE_CLASSES_SCHEMA, None), + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Optional(CONF_PAYLOAD_PRESS, default=DEFAULT_PAYLOAD_PRESS): cv.string, + probatio.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, } ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) -DISCOVERY_SCHEMA = PLATFORM_SCHEMA_MODERN.extend({}, extra=vol.REMOVE_EXTRA) +DISCOVERY_SCHEMA = PLATFORM_SCHEMA_MODERN.extend({}, extra=probatio.REMOVE_EXTRA) async def async_setup_entry( @@ -69,7 +69,7 @@ class MqttButton(MqttEntity, ButtonEntity): @staticmethod @override - def config_schema() -> vol.Schema: + def config_schema() -> probatio.Schema: """Return the config schema.""" return DISCOVERY_SCHEMA diff --git a/homeassistant/components/mqtt/camera.py b/homeassistant/components/mqtt/camera.py index 3ad9f1e744c94..3e36188920e84 100644 --- a/homeassistant/components/mqtt/camera.py +++ b/homeassistant/components/mqtt/camera.py @@ -4,7 +4,7 @@ import logging from typing import TYPE_CHECKING, override -import voluptuous as vol +import probatio from homeassistant.components import camera from homeassistant.components.camera import Camera, CameraEntityStateAttribute @@ -42,17 +42,17 @@ PLATFORM_SCHEMA_BASE = MQTT_BASE_SCHEMA.extend( { - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Required(CONF_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_IMAGE_ENCODING): "b64", + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Required(CONF_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_IMAGE_ENCODING): "b64", } ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) -PLATFORM_SCHEMA_MODERN = vol.All( +PLATFORM_SCHEMA_MODERN = probatio.All( PLATFORM_SCHEMA_BASE.schema, ) -DISCOVERY_SCHEMA = PLATFORM_SCHEMA_BASE.extend({}, extra=vol.REMOVE_EXTRA) +DISCOVERY_SCHEMA = PLATFORM_SCHEMA_BASE.extend({}, extra=probatio.REMOVE_EXTRA) async def async_setup_entry( @@ -93,7 +93,7 @@ def __init__( @staticmethod @override - def config_schema() -> vol.Schema: + def config_schema() -> probatio.Schema: """Return the config schema.""" return DISCOVERY_SCHEMA diff --git a/homeassistant/components/mqtt/climate.py b/homeassistant/components/mqtt/climate.py index c0872ae89cddc..e22c96118d30d 100644 --- a/homeassistant/components/mqtt/climate.py +++ b/homeassistant/components/mqtt/climate.py @@ -6,7 +6,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components import climate from homeassistant.components.climate import ( @@ -215,16 +215,16 @@ def valid_preset_mode_configuration(config: ConfigType) -> ConfigType: """Validate that the preset mode reset payload is not one of the preset modes.""" if PRESET_NONE in config[CONF_PRESET_MODES_LIST]: - raise vol.Invalid("preset_modes must not include preset mode 'none'") + raise probatio.Invalid("preset_modes must not include preset mode 'none'") return config def valid_humidity_range_configuration(config: ConfigType) -> ConfigType: """Validate a target_humidity range configuration, throws otherwise.""" if config[CONF_HUMIDITY_MIN] >= config[CONF_HUMIDITY_MAX]: - raise vol.Invalid("target_humidity_max must be > target_humidity_min") + raise probatio.Invalid("target_humidity_max must be > target_humidity_min") if config[CONF_HUMIDITY_MAX] > 100: - raise vol.Invalid("max_humidity must be <= 100") + raise probatio.Invalid("max_humidity must be <= 100") return config @@ -239,7 +239,7 @@ def valid_humidity_state_configuration(config: ConfigType) -> ConfigType: CONF_HUMIDITY_STATE_TOPIC in config and CONF_HUMIDITY_COMMAND_TOPIC not in config ): - raise vol.Invalid( + raise probatio.Invalid( f"{CONF_HUMIDITY_STATE_TOPIC} cannot be used without" f" {CONF_HUMIDITY_COMMAND_TOPIC}" ) @@ -249,31 +249,31 @@ def valid_humidity_state_configuration(config: ConfigType) -> ConfigType: _PLATFORM_SCHEMA_BASE = MQTT_BASE_SCHEMA.extend( { - vol.Optional(CONF_CURRENT_HUMIDITY_TEMPLATE): cv.template, - vol.Optional(CONF_CURRENT_HUMIDITY_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_CURRENT_TEMP_TEMPLATE): cv.template, - vol.Optional(CONF_CURRENT_TEMP_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_FAN_MODE_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_FAN_MODE_COMMAND_TOPIC): valid_publish_topic, - vol.Optional( + probatio.Optional(CONF_CURRENT_HUMIDITY_TEMPLATE): cv.template, + probatio.Optional(CONF_CURRENT_HUMIDITY_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_CURRENT_TEMP_TEMPLATE): cv.template, + probatio.Optional(CONF_CURRENT_TEMP_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_FAN_MODE_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_FAN_MODE_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional( CONF_FAN_MODE_LIST, default=[FAN_AUTO, FAN_LOW, FAN_MEDIUM, FAN_HIGH], ): cv.ensure_list, - vol.Optional(CONF_FAN_MODE_STATE_TEMPLATE): cv.template, - vol.Optional(CONF_FAN_MODE_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_HUMIDITY_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_HUMIDITY_COMMAND_TOPIC): valid_publish_topic, - vol.Optional( + probatio.Optional(CONF_FAN_MODE_STATE_TEMPLATE): cv.template, + probatio.Optional(CONF_FAN_MODE_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_HUMIDITY_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_HUMIDITY_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional( CONF_HUMIDITY_MIN, default=DEFAULT_MIN_HUMIDITY ): cv.positive_float, - vol.Optional( + probatio.Optional( CONF_HUMIDITY_MAX, default=DEFAULT_MAX_HUMIDITY ): cv.positive_float, - vol.Optional(CONF_HUMIDITY_STATE_TEMPLATE): cv.template, - vol.Optional(CONF_HUMIDITY_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_MODE_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_MODE_COMMAND_TOPIC): valid_publish_topic, - vol.Optional( + probatio.Optional(CONF_HUMIDITY_STATE_TEMPLATE): cv.template, + probatio.Optional(CONF_HUMIDITY_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_MODE_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_MODE_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional( CONF_MODE_LIST, default=[ HVACMode.AUTO, @@ -284,77 +284,81 @@ def valid_humidity_state_configuration(config: ConfigType) -> ConfigType: HVACMode.FAN_ONLY, ], ): cv.ensure_list, - vol.Optional(CONF_MODE_STATE_TEMPLATE): cv.template, - vol.Optional(CONF_MODE_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Optional(CONF_OPTIMISTIC, default=DEFAULT_OPTIMISTIC): cv.boolean, - vol.Optional(CONF_PAYLOAD_ON, default="ON"): cv.string, - vol.Optional(CONF_PAYLOAD_OFF, default="OFF"): cv.string, - vol.Optional(CONF_POWER_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_POWER_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_PRECISION): vol.All( - vol.Coerce(float), - vol.In([PRECISION_TENTHS, PRECISION_HALVES, PRECISION_WHOLE]), + probatio.Optional(CONF_MODE_STATE_TEMPLATE): cv.template, + probatio.Optional(CONF_MODE_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Optional(CONF_OPTIMISTIC, default=DEFAULT_OPTIMISTIC): cv.boolean, + probatio.Optional(CONF_PAYLOAD_ON, default="ON"): cv.string, + probatio.Optional(CONF_PAYLOAD_OFF, default="OFF"): cv.string, + probatio.Optional(CONF_POWER_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_POWER_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_PRECISION): probatio.All( + probatio.Coerce(float), + probatio.In([PRECISION_TENTHS, PRECISION_HALVES, PRECISION_WHOLE]), ), - vol.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, - vol.Optional(CONF_ACTION_TEMPLATE): cv.template, - vol.Optional(CONF_ACTION_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, + probatio.Optional(CONF_ACTION_TEMPLATE): cv.template, + probatio.Optional(CONF_ACTION_TOPIC): valid_subscribe_topic, # CONF_PRESET_MODE_COMMAND_TOPIC and CONF_PRESET_MODES_LIST # must be used together - vol.Inclusive( + probatio.Inclusive( CONF_PRESET_MODE_COMMAND_TOPIC, "preset_modes" ): valid_publish_topic, - vol.Inclusive( + probatio.Inclusive( CONF_PRESET_MODES_LIST, "preset_modes", default=[] ): cv.ensure_list, - vol.Optional(CONF_PRESET_MODE_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_PRESET_MODE_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_PRESET_MODE_VALUE_TEMPLATE): cv.template, - vol.Optional(CONF_SWING_HORIZONTAL_MODE_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_SWING_HORIZONTAL_MODE_COMMAND_TOPIC): valid_publish_topic, - vol.Optional( + probatio.Optional(CONF_PRESET_MODE_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_PRESET_MODE_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_PRESET_MODE_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_SWING_HORIZONTAL_MODE_COMMAND_TEMPLATE): cv.template, + probatio.Optional( + CONF_SWING_HORIZONTAL_MODE_COMMAND_TOPIC + ): valid_publish_topic, + probatio.Optional( CONF_SWING_HORIZONTAL_MODE_LIST, default=[SWING_ON, SWING_OFF] ): cv.ensure_list, - vol.Optional(CONF_SWING_HORIZONTAL_MODE_STATE_TEMPLATE): cv.template, - vol.Optional(CONF_SWING_HORIZONTAL_MODE_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_SWING_MODE_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_SWING_MODE_COMMAND_TOPIC): valid_publish_topic, - vol.Optional( + probatio.Optional(CONF_SWING_HORIZONTAL_MODE_STATE_TEMPLATE): cv.template, + probatio.Optional( + CONF_SWING_HORIZONTAL_MODE_STATE_TOPIC + ): valid_subscribe_topic, + probatio.Optional(CONF_SWING_MODE_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_SWING_MODE_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional( CONF_SWING_MODE_LIST, default=[SWING_ON, SWING_OFF] ): cv.ensure_list, - vol.Optional(CONF_SWING_MODE_STATE_TEMPLATE): cv.template, - vol.Optional(CONF_SWING_MODE_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_TEMP_INITIAL): vol.All(vol.Coerce(float)), - vol.Optional(CONF_TEMP_MIN): vol.Coerce(float), - vol.Optional(CONF_TEMP_MAX): vol.Coerce(float), - vol.Optional(CONF_TEMP_STEP, default=1.0): vol.Coerce(float), - vol.Optional(CONF_TEMP_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_TEMP_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_TEMP_HIGH_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_TEMP_HIGH_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_TEMP_HIGH_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_TEMP_HIGH_STATE_TEMPLATE): cv.template, - vol.Optional(CONF_TEMP_LOW_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_TEMP_LOW_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_TEMP_LOW_STATE_TEMPLATE): cv.template, - vol.Optional(CONF_TEMP_LOW_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_TEMP_STATE_TEMPLATE): cv.template, - vol.Optional(CONF_TEMP_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_TEMPERATURE_UNIT): cv.temperature_unit, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_SWING_MODE_STATE_TEMPLATE): cv.template, + probatio.Optional(CONF_SWING_MODE_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_TEMP_INITIAL): probatio.All(probatio.Coerce(float)), + probatio.Optional(CONF_TEMP_MIN): probatio.Coerce(float), + probatio.Optional(CONF_TEMP_MAX): probatio.Coerce(float), + probatio.Optional(CONF_TEMP_STEP, default=1.0): probatio.Coerce(float), + probatio.Optional(CONF_TEMP_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_TEMP_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_TEMP_HIGH_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_TEMP_HIGH_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_TEMP_HIGH_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_TEMP_HIGH_STATE_TEMPLATE): cv.template, + probatio.Optional(CONF_TEMP_LOW_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_TEMP_LOW_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_TEMP_LOW_STATE_TEMPLATE): cv.template, + probatio.Optional(CONF_TEMP_LOW_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_TEMP_STATE_TEMPLATE): cv.template, + probatio.Optional(CONF_TEMP_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_TEMPERATURE_UNIT): cv.temperature_unit, + probatio.Optional(CONF_VALUE_TEMPLATE): cv.template, } ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) -PLATFORM_SCHEMA_MODERN = vol.All( +PLATFORM_SCHEMA_MODERN = probatio.All( _PLATFORM_SCHEMA_BASE, valid_preset_mode_configuration, valid_humidity_range_configuration, valid_humidity_state_configuration, ) -_DISCOVERY_SCHEMA_BASE = _PLATFORM_SCHEMA_BASE.extend({}, extra=vol.REMOVE_EXTRA) +_DISCOVERY_SCHEMA_BASE = _PLATFORM_SCHEMA_BASE.extend({}, extra=probatio.REMOVE_EXTRA) -DISCOVERY_SCHEMA = vol.All( +DISCOVERY_SCHEMA = probatio.All( _DISCOVERY_SCHEMA_BASE, valid_preset_mode_configuration, valid_humidity_range_configuration, diff --git a/homeassistant/components/mqtt/config.py b/homeassistant/components/mqtt/config.py index 32346971138ba..1cfbca7b7b867 100644 --- a/homeassistant/components/mqtt/config.py +++ b/homeassistant/components/mqtt/config.py @@ -1,6 +1,6 @@ """Support for MQTT message handling.""" -import voluptuous as vol +import probatio from homeassistant.const import CONF_OPTIMISTIC, CONF_VALUE_TEMPLATE from homeassistant.helpers import config_validation as cv @@ -20,27 +20,27 @@ from .util import valid_publish_topic, valid_qos_schema, valid_subscribe_topic SCHEMA_BASE = { - vol.Optional(CONF_QOS, default=DEFAULT_QOS): valid_qos_schema, - vol.Optional(CONF_ENCODING, default=DEFAULT_ENCODING): cv.string, - vol.Optional(CONF_GROUP): vol.All(cv.ensure_list, [cv.string]), + probatio.Optional(CONF_QOS, default=DEFAULT_QOS): valid_qos_schema, + probatio.Optional(CONF_ENCODING, default=DEFAULT_ENCODING): cv.string, + probatio.Optional(CONF_GROUP): probatio.All(cv.ensure_list, [cv.string]), } -MQTT_BASE_SCHEMA = vol.Schema(SCHEMA_BASE) +MQTT_BASE_SCHEMA = probatio.Schema(SCHEMA_BASE) # Sensor type platforms subscribe to MQTT events MQTT_RO_SCHEMA = MQTT_BASE_SCHEMA.extend( { - vol.Required(CONF_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, + probatio.Required(CONF_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_VALUE_TEMPLATE): cv.template, } ) # Switch type platforms publish to MQTT and may subscribe MQTT_RW_SCHEMA = MQTT_BASE_SCHEMA.extend( { - vol.Required(CONF_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_OPTIMISTIC, default=DEFAULT_OPTIMISTIC): cv.boolean, - vol.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, - vol.Optional(CONF_STATE_TOPIC): valid_subscribe_topic, + probatio.Required(CONF_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_OPTIMISTIC, default=DEFAULT_OPTIMISTIC): cv.boolean, + probatio.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, + probatio.Optional(CONF_STATE_TOPIC): valid_subscribe_topic, } ) diff --git a/homeassistant/components/mqtt/config_flow.py b/homeassistant/components/mqtt/config_flow.py index 80f086364566c..776f6b79aca9a 100644 --- a/homeassistant/components/mqtt/config_flow.py +++ b/homeassistant/components/mqtt/config_flow.py @@ -21,7 +21,7 @@ load_pem_private_key, ) from cryptography.x509 import load_der_x509_certificate, load_pem_x509_certificate -import voluptuous as vol +import probatio import yaml from homeassistant.components.climate import ( @@ -544,17 +544,17 @@ CERT_UPLOAD_SELECTOR = FileSelector( FileSelectorConfig(accept=".pem,.crt,.cer,.der,application/x-x509-user-cert") ) -KEEPALIVE_SELECTOR = vol.All( +KEEPALIVE_SELECTOR = probatio.All( NumberSelector( NumberSelectorConfig( mode=NumberSelectorMode.BOX, min=15, step="any", unit_of_measurement="sec" ) ), - vol.Coerce(int), + probatio.Coerce(int), ) -PORT_SELECTOR = vol.All( +PORT_SELECTOR = probatio.All( NumberSelector(NumberSelectorConfig(mode=NumberSelectorMode.BOX, min=1, max=65535)), - vol.Coerce(int), + probatio.Coerce(int), ) PROTOCOL_SELECTOR = SelectSelector( SelectSelectorConfig( @@ -586,14 +586,14 @@ sort=True, ) ) -SUBENTRY_AVAILABILITY_SCHEMA = vol.Schema( +SUBENTRY_AVAILABILITY_SCHEMA = probatio.Schema( { - vol.Optional(CONF_AVAILABILITY_TOPIC): TEXT_SELECTOR, - vol.Optional(CONF_AVAILABILITY_TEMPLATE): TEMPLATE_SELECTOR, - vol.Optional( + probatio.Optional(CONF_AVAILABILITY_TOPIC): TEXT_SELECTOR, + probatio.Optional(CONF_AVAILABILITY_TEMPLATE): TEMPLATE_SELECTOR, + probatio.Optional( CONF_PAYLOAD_AVAILABLE, default=DEFAULT_PAYLOAD_AVAILABLE ): TEXT_SELECTOR, - vol.Optional( + probatio.Optional( CONF_PAYLOAD_NOT_AVAILABLE, default=DEFAULT_PAYLOAD_NOT_AVAILABLE ): TEXT_SELECTOR, } @@ -642,13 +642,13 @@ COVER_DEVICE_CLASS_SELECTOR = DeviceClassSelector( DeviceClassSelectorConfig(domain=Platform.COVER) ) -FAN_SPEED_RANGE_MIN_SELECTOR = vol.All( +FAN_SPEED_RANGE_MIN_SELECTOR = probatio.All( NumberSelector(NumberSelectorConfig(mode=NumberSelectorMode.BOX, min=1)), - vol.Coerce(int), + probatio.Coerce(int), ) -FAN_SPEED_RANGE_MAX_SELECTOR = vol.All( +FAN_SPEED_RANGE_MAX_SELECTOR = probatio.All( NumberSelector(NumberSelectorConfig(mode=NumberSelectorMode.BOX, min=2)), - vol.Coerce(int), + probatio.Coerce(int), ) FLASH_TIME_SELECTOR = NumberSelector( NumberSelectorConfig( @@ -656,11 +656,11 @@ min=1, ) ) -HUMIDITY_SELECTOR = vol.All( +HUMIDITY_SELECTOR = probatio.All( NumberSelector( NumberSelectorConfig(mode=NumberSelectorMode.BOX, min=0, max=100, step=1) ), - vol.Coerce(int), + probatio.Coerce(int), ) IMAGE_CONTENT_TYPE_SELECTOR = SelectSelector( SelectSelectorConfig( @@ -868,7 +868,7 @@ def default_precision(config: dict[str, Any]) -> str: def no_empty_list(value: list[Any]) -> list[Any]: """Validate a selector returns at least one item.""" if not value: - raise vol.Invalid("empty_list_not_allowed") + raise probatio.Invalid("empty_list_not_allowed") return value @@ -984,7 +984,7 @@ def validate_field( return try: user_input[field] = validator(user_input[field]) - except ValueError, vol.Error, vol.Invalid: + except ValueError, probatio.Error, probatio.Invalid: errors[field] = error @@ -1223,8 +1223,8 @@ class PlatformField: required: bool validator: Callable[[Any], Any] | None = None error: str | None = None - default: Any | Callable[[dict[str, Any]], Any] | vol.Undefined | None = ( - vol.UNDEFINED + default: Any | Callable[[dict[str, Any]], Any] | probatio.Undefined | None = ( + probatio.UNDEFINED ) is_schema_default: bool = False include_in_config: bool = False @@ -3818,7 +3818,7 @@ def data_schema_from_fields( component_data: dict[str, Any] | None = None, user_input: dict[str, Any] | None = None, device_data: MqttDeviceData | None = None, -) -> vol.Schema: +) -> probatio.Schema: """Generate custom data schema from platform fields or device data.""" def get_default(field_details: PlatformField) -> Any: @@ -3861,13 +3861,13 @@ def get_default(field_details: PlatformField) -> Any: # Getting the default value may update the subentry data, # even when and option is filtered out data_schema_element = { - vol.Required(field_name, default=defaults[field_name]) + probatio.Required(field_name, default=defaults[field_name]) if field_details.required - else vol.Optional( + else probatio.Optional( field_name, default=defaults[field_name] if field_details.default is not None - else vol.UNDEFINED, + else probatio.UNDEFINED, ): field_details.selector(component_data_with_user_input or {}) if callable(field_details.selector) and field_details.custom_filtering else field_details.selector @@ -3894,7 +3894,8 @@ def get_default(field_details: PlatformField) -> Any: # Collapse if no values are changed and no required fields need to be set collapsed = ( not any( - (default := data_schema_fields[str(option)].default) is vol.UNDEFINED + (default := data_schema_fields[str(option)].default) + is probatio.UNDEFINED or ( str(option) in component_data_with_user_input and component_data_with_user_input[str(option)] != default @@ -3909,8 +3910,9 @@ def get_default(field_details: PlatformField) -> Any: if component_data_with_user_input is not None else True ) - data_schema[vol.Optional(schema_section)] = section( - vol.Schema(data_schema_element), SectionConfig({"collapsed": collapsed}) + data_schema[probatio.Optional(schema_section)] = section( + probatio.Schema(data_schema_element), + SectionConfig({"collapsed": collapsed}), ) # Reset all fields from the component_data not in the schema @@ -3925,7 +3927,7 @@ def get_default(field_details: PlatformField) -> Any: and not data_schema_fields[field].include_in_config ): del component_data[field] - return vol.Schema(data_schema) + return probatio.Schema(data_schema) @callback @@ -3952,7 +3954,7 @@ def validate_user_input( merged_user_input[field] = ( validator(value) if validator is not None else value ) - except ValueError, vol.Error, vol.Invalid: + except ValueError, probatio.Error, probatio.Invalid: data_schema_field = data_schema_fields[field] errors[data_schema_field.section or field] = ( data_schema_field.error or "invalid_input" @@ -3983,7 +3985,7 @@ def subentry_schema_default_data_from_fields( if _check_conditions(field, component_data) and ( field.is_schema_default - or (field.default is not vol.UNDEFINED and key not in component_data) + or (field.default is not probatio.UNDEFINED and key not in component_data) ) } @@ -4009,37 +4011,39 @@ def update_password_from_user_input( user_input[CONF_PASSWORD] = password -REAUTH_SCHEMA = vol.Schema( +REAUTH_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): TEXT_SELECTOR, - vol.Required(CONF_PASSWORD): PASSWORD_SELECTOR, + probatio.Required(CONF_USERNAME): TEXT_SELECTOR, + probatio.Required(CONF_PASSWORD): PASSWORD_SELECTOR, } ) -OTHER_SETTINGS_SCHEMA = vol.Schema( +OTHER_SETTINGS_SCHEMA = probatio.Schema( { - vol.Optional(CONF_CLIENT_ID): TEXT_SELECTOR, - vol.Optional(CONF_KEEPALIVE): KEEPALIVE_SELECTOR, - vol.Required(SET_CLIENT_CERT): BOOLEAN_SELECTOR, - vol.Optional(CONF_CLIENT_CERT): CERT_UPLOAD_SELECTOR, - vol.Optional(CONF_CLIENT_KEY): CERT_KEY_UPLOAD_SELECTOR, - vol.Optional(CONF_CLIENT_KEY_PASSWORD): PASSWORD_SELECTOR, - vol.Required(SET_CA_CERT): BROKER_VERIFICATION_SELECTOR, - vol.Optional(CONF_CERTIFICATE): CA_CERT_UPLOAD_SELECTOR, - vol.Optional(CONF_TLS_INSECURE): BOOLEAN_SELECTOR, - vol.Required(CONF_TRANSPORT, default=DEFAULT_TRANSPORT): TRANSPORT_SELECTOR, - vol.Optional(CONF_WS_PATH): TEXT_SELECTOR, - vol.Optional(CONF_WS_HEADERS): WS_HEADERS_SELECTOR, + probatio.Optional(CONF_CLIENT_ID): TEXT_SELECTOR, + probatio.Optional(CONF_KEEPALIVE): KEEPALIVE_SELECTOR, + probatio.Required(SET_CLIENT_CERT): BOOLEAN_SELECTOR, + probatio.Optional(CONF_CLIENT_CERT): CERT_UPLOAD_SELECTOR, + probatio.Optional(CONF_CLIENT_KEY): CERT_KEY_UPLOAD_SELECTOR, + probatio.Optional(CONF_CLIENT_KEY_PASSWORD): PASSWORD_SELECTOR, + probatio.Required(SET_CA_CERT): BROKER_VERIFICATION_SELECTOR, + probatio.Optional(CONF_CERTIFICATE): CA_CERT_UPLOAD_SELECTOR, + probatio.Optional(CONF_TLS_INSECURE): BOOLEAN_SELECTOR, + probatio.Required( + CONF_TRANSPORT, default=DEFAULT_TRANSPORT + ): TRANSPORT_SELECTOR, + probatio.Optional(CONF_WS_PATH): TEXT_SELECTOR, + probatio.Optional(CONF_WS_HEADERS): WS_HEADERS_SELECTOR, } ) -CONFIG_DATAFLOW_SCHEMA = vol.Schema( +CONFIG_DATAFLOW_SCHEMA = probatio.Schema( { - vol.Required(CONF_BROKER): TEXT_SELECTOR, - vol.Required(CONF_PORT, default=DEFAULT_PORT): PORT_SELECTOR, - vol.Required(CONF_PROTOCOL, default=DEFAULT_PROTOCOL): PROTOCOL_SELECTOR, - vol.Optional(CONF_USERNAME): TEXT_SELECTOR, - vol.Optional(CONF_PASSWORD): PASSWORD_SELECTOR, - vol.Required(OTHER_SETTINGS): section( + probatio.Required(CONF_BROKER): TEXT_SELECTOR, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): PORT_SELECTOR, + probatio.Required(CONF_PROTOCOL, default=DEFAULT_PROTOCOL): PROTOCOL_SELECTOR, + probatio.Optional(CONF_USERNAME): TEXT_SELECTOR, + probatio.Optional(CONF_PASSWORD): PASSWORD_SELECTOR, + probatio.Required(OTHER_SETTINGS): section( OTHER_SETTINGS_SCHEMA, SectionConfig({"collapsed": True}) ), } @@ -4484,7 +4488,7 @@ def _validate( try: option_values = schema(values) options_config[field] = option_values - except vol.Invalid: + except probatio.Invalid: errors["base"] = error_code bad_input = True @@ -4534,62 +4538,62 @@ def _validate( discovery_qos = options_config.get(CONF_DISCOVERY_QOS, DEFAULT_QOS) # build form - fields: OrderedDict[vol.Marker, Any] = OrderedDict() - fields[vol.Optional(CONF_DISCOVERY, default=discovery)] = BOOLEAN_SELECTOR - fields[vol.Optional(CONF_DISCOVERY_PREFIX, default=discovery_prefix)] = ( + fields: OrderedDict[probatio.Marker, Any] = OrderedDict() + fields[probatio.Optional(CONF_DISCOVERY, default=discovery)] = BOOLEAN_SELECTOR + fields[probatio.Optional(CONF_DISCOVERY_PREFIX, default=discovery_prefix)] = ( PUBLISH_TOPIC_SELECTOR ) - fields[vol.Optional("discovery_qos", default=discovery_qos)] = QOS_SELECTOR + fields[probatio.Optional("discovery_qos", default=discovery_qos)] = QOS_SELECTOR # Birth message is disabled if CONF_BIRTH_MESSAGE = {} fields[ - vol.Optional( + probatio.Optional( "birth_enable", default=CONF_BIRTH_MESSAGE not in options_config or options_config[CONF_BIRTH_MESSAGE] != {}, ) ] = BOOLEAN_SELECTOR fields[ - vol.Optional( + probatio.Optional( "birth_topic", description={"suggested_value": birth[ATTR_TOPIC]} ) ] = PUBLISH_TOPIC_SELECTOR fields[ - vol.Optional( + probatio.Optional( "birth_payload", description={"suggested_value": birth[CONF_PAYLOAD]} ) ] = TEXT_SELECTOR - fields[vol.Optional("birth_qos", default=birth[ATTR_QOS])] = QOS_SELECTOR - fields[vol.Optional("birth_retain", default=birth[ATTR_RETAIN])] = ( + fields[probatio.Optional("birth_qos", default=birth[ATTR_QOS])] = QOS_SELECTOR + fields[probatio.Optional("birth_retain", default=birth[ATTR_RETAIN])] = ( BOOLEAN_SELECTOR ) # Will message is disabled if CONF_WILL_MESSAGE = {} fields[ - vol.Optional( + probatio.Optional( "will_enable", default=CONF_WILL_MESSAGE not in options_config or options_config[CONF_WILL_MESSAGE] != {}, ) ] = BOOLEAN_SELECTOR fields[ - vol.Optional( + probatio.Optional( "will_topic", description={"suggested_value": will[ATTR_TOPIC]} ) ] = PUBLISH_TOPIC_SELECTOR fields[ - vol.Optional( + probatio.Optional( "will_payload", description={"suggested_value": will[CONF_PAYLOAD]} ) ] = TEXT_SELECTOR - fields[vol.Optional("will_qos", default=will[ATTR_QOS])] = QOS_SELECTOR - fields[vol.Optional("will_retain", default=will[ATTR_RETAIN])] = ( + fields[probatio.Optional("will_qos", default=will[ATTR_QOS])] = QOS_SELECTOR + fields[probatio.Optional("will_retain", default=will[ATTR_RETAIN])] = ( BOOLEAN_SELECTOR ) return self.async_show_form( step_id="options", - data_schema=vol.Schema(fields), + data_schema=probatio.Schema(fields), errors=errors, last_step=True, ) @@ -4642,7 +4646,7 @@ def generate_names(self) -> tuple[str, str]: @callback def get_suggested_values_from_component( - self, data_schema: vol.Schema + self, data_schema: probatio.Schema ) -> dict[str, Any]: """Get suggestions from component data based on the data schema.""" if TYPE_CHECKING: @@ -4657,7 +4661,7 @@ def get_suggested_values_from_component( @callback def get_suggested_values_from_device_data( - self, data_schema: vol.Schema + self, data_schema: probatio.Schema ) -> dict[str, Any]: """Get suggestions from device data based on the data schema.""" device_data = deepcopy(self._subentry_data["device"]) @@ -4779,9 +4783,9 @@ def _show_update_or_delete_form(self, step_id: str) -> SubentryFlowResult: ) for key, component_data in self._subentry_data["components"].items() ] - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required("component"): SelectSelector( + probatio.Required("component"): SelectSelector( SelectSelectorConfig( options=entities, mode=SelectSelectorMode.LIST, @@ -5119,9 +5123,9 @@ async def async_step_export_yaml( mqtt_yaml_config.append({platform: component_config}) yaml_config = yaml.dump(mqtt_yaml_config_base) - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Optional("yaml"): TEMPLATE_SELECTOR_READ_ONLY, + probatio.Optional("yaml"): TEMPLATE_SELECTOR_READ_ONLY, } ) data_schema = self.add_suggested_values_to_schema( @@ -5169,10 +5173,10 @@ async def async_step_export_discovery( component_config.pop(field) discovery_payload["cmps"][component_id] = component_config - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Optional("discovery_topic"): TEXT_SELECTOR_READ_ONLY, - vol.Optional("discovery_payload"): TEMPLATE_SELECTOR_READ_ONLY, + probatio.Optional("discovery_topic"): TEXT_SELECTOR_READ_ONLY, + probatio.Optional("discovery_payload"): TEMPLATE_SELECTOR_READ_ONLY, } ) data_schema = self.add_suggested_values_to_schema( @@ -5400,9 +5404,9 @@ async def _async_process_file_upload( entry_config_update[CONF_WS_HEADERS] = json_loads( user_input[OTHER_SETTINGS].get(CONF_WS_HEADERS, "{}") ) - schema = vol.Schema({str: str}) + schema = probatio.Schema({str: str}) schema(entry_config_update[CONF_WS_HEADERS]) - except (*JSON_DECODE_EXCEPTIONS, vol.MultipleInvalid): + except (*JSON_DECODE_EXCEPTIONS, probatio.MultipleInvalid): errors["base"] = "bad_ws_headers" return False diff --git a/homeassistant/components/mqtt/config_integration.py b/homeassistant/components/mqtt/config_integration.py index 6fff361c60b26..5bea75150bf20 100644 --- a/homeassistant/components/mqtt/config_integration.py +++ b/homeassistant/components/mqtt/config_integration.py @@ -1,41 +1,41 @@ """Support for MQTT platform config setup.""" -import voluptuous as vol +import probatio from homeassistant.const import Platform from homeassistant.helpers import config_validation as cv -CONFIG_SCHEMA_BASE = vol.Schema( +CONFIG_SCHEMA_BASE = probatio.Schema( { - Platform.ALARM_CONTROL_PANEL.value: vol.All(cv.ensure_list, [dict]), - Platform.BINARY_SENSOR.value: vol.All(cv.ensure_list, [dict]), - Platform.BUTTON.value: vol.All(cv.ensure_list, [dict]), - Platform.CAMERA.value: vol.All(cv.ensure_list, [dict]), - Platform.CLIMATE.value: vol.All(cv.ensure_list, [dict]), - Platform.COVER.value: vol.All(cv.ensure_list, [dict]), - Platform.DATE.value: vol.All(cv.ensure_list, [dict]), - Platform.DATETIME.value: vol.All(cv.ensure_list, [dict]), - Platform.DEVICE_TRACKER.value: vol.All(cv.ensure_list, [dict]), - Platform.EVENT.value: vol.All(cv.ensure_list, [dict]), - Platform.FAN.value: vol.All(cv.ensure_list, [dict]), - Platform.HUMIDIFIER.value: vol.All(cv.ensure_list, [dict]), - Platform.IMAGE.value: vol.All(cv.ensure_list, [dict]), - Platform.INFRARED.value: vol.All(cv.ensure_list, [dict]), - Platform.LAWN_MOWER.value: vol.All(cv.ensure_list, [dict]), - Platform.LIGHT.value: vol.All(cv.ensure_list, [dict]), - Platform.LOCK.value: vol.All(cv.ensure_list, [dict]), - Platform.NOTIFY.value: vol.All(cv.ensure_list, [dict]), - Platform.NUMBER.value: vol.All(cv.ensure_list, [dict]), - Platform.SCENE.value: vol.All(cv.ensure_list, [dict]), - Platform.SELECT.value: vol.All(cv.ensure_list, [dict]), - Platform.SENSOR.value: vol.All(cv.ensure_list, [dict]), - Platform.SIREN.value: vol.All(cv.ensure_list, [dict]), - Platform.SWITCH.value: vol.All(cv.ensure_list, [dict]), - Platform.TEXT.value: vol.All(cv.ensure_list, [dict]), - Platform.TIME.value: vol.All(cv.ensure_list, [dict]), - Platform.UPDATE.value: vol.All(cv.ensure_list, [dict]), - Platform.VACUUM.value: vol.All(cv.ensure_list, [dict]), - Platform.VALVE.value: vol.All(cv.ensure_list, [dict]), - Platform.WATER_HEATER.value: vol.All(cv.ensure_list, [dict]), + Platform.ALARM_CONTROL_PANEL.value: probatio.All(cv.ensure_list, [dict]), + Platform.BINARY_SENSOR.value: probatio.All(cv.ensure_list, [dict]), + Platform.BUTTON.value: probatio.All(cv.ensure_list, [dict]), + Platform.CAMERA.value: probatio.All(cv.ensure_list, [dict]), + Platform.CLIMATE.value: probatio.All(cv.ensure_list, [dict]), + Platform.COVER.value: probatio.All(cv.ensure_list, [dict]), + Platform.DATE.value: probatio.All(cv.ensure_list, [dict]), + Platform.DATETIME.value: probatio.All(cv.ensure_list, [dict]), + Platform.DEVICE_TRACKER.value: probatio.All(cv.ensure_list, [dict]), + Platform.EVENT.value: probatio.All(cv.ensure_list, [dict]), + Platform.FAN.value: probatio.All(cv.ensure_list, [dict]), + Platform.HUMIDIFIER.value: probatio.All(cv.ensure_list, [dict]), + Platform.IMAGE.value: probatio.All(cv.ensure_list, [dict]), + Platform.INFRARED.value: probatio.All(cv.ensure_list, [dict]), + Platform.LAWN_MOWER.value: probatio.All(cv.ensure_list, [dict]), + Platform.LIGHT.value: probatio.All(cv.ensure_list, [dict]), + Platform.LOCK.value: probatio.All(cv.ensure_list, [dict]), + Platform.NOTIFY.value: probatio.All(cv.ensure_list, [dict]), + Platform.NUMBER.value: probatio.All(cv.ensure_list, [dict]), + Platform.SCENE.value: probatio.All(cv.ensure_list, [dict]), + Platform.SELECT.value: probatio.All(cv.ensure_list, [dict]), + Platform.SENSOR.value: probatio.All(cv.ensure_list, [dict]), + Platform.SIREN.value: probatio.All(cv.ensure_list, [dict]), + Platform.SWITCH.value: probatio.All(cv.ensure_list, [dict]), + Platform.TEXT.value: probatio.All(cv.ensure_list, [dict]), + Platform.TIME.value: probatio.All(cv.ensure_list, [dict]), + Platform.UPDATE.value: probatio.All(cv.ensure_list, [dict]), + Platform.VACUUM.value: probatio.All(cv.ensure_list, [dict]), + Platform.VALVE.value: probatio.All(cv.ensure_list, [dict]), + Platform.WATER_HEATER.value: probatio.All(cv.ensure_list, [dict]), } ) diff --git a/homeassistant/components/mqtt/cover.py b/homeassistant/components/mqtt/cover.py index 26e0cd66143d2..7e8849a448306 100644 --- a/homeassistant/components/mqtt/cover.py +++ b/homeassistant/components/mqtt/cover.py @@ -4,7 +4,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components import cover from homeassistant.components.cover import ( @@ -115,7 +115,7 @@ def validate_options(config: ConfigType) -> ConfigType: If set position topic is set then get position topic is set as well. """ if CONF_SET_POSITION_TOPIC in config and CONF_GET_POSITION_TOPIC not in config: - raise vol.Invalid( + raise probatio.Invalid( f"'{CONF_SET_POSITION_TOPIC}' must be set together with" f" '{CONF_GET_POSITION_TOPIC}'." ) @@ -123,30 +123,30 @@ def validate_options(config: ConfigType) -> ConfigType: # if templates are set make sure the topic for the template is also set if CONF_VALUE_TEMPLATE in config and CONF_STATE_TOPIC not in config: - raise vol.Invalid( + raise probatio.Invalid( f"'{CONF_VALUE_TEMPLATE}' must be set together with '{CONF_STATE_TOPIC}'." ) if CONF_GET_POSITION_TEMPLATE in config and CONF_GET_POSITION_TOPIC not in config: - raise vol.Invalid( + raise probatio.Invalid( f"'{CONF_GET_POSITION_TEMPLATE}' must be set together with" f" '{CONF_GET_POSITION_TOPIC}'." ) if CONF_SET_POSITION_TEMPLATE in config and CONF_SET_POSITION_TOPIC not in config: - raise vol.Invalid( + raise probatio.Invalid( f"'{CONF_SET_POSITION_TEMPLATE}' must be set together with" f" '{CONF_SET_POSITION_TOPIC}'." ) if CONF_TILT_COMMAND_TEMPLATE in config and CONF_TILT_COMMAND_TOPIC not in config: - raise vol.Invalid( + raise probatio.Invalid( f"'{CONF_TILT_COMMAND_TEMPLATE}' must be set together with" f" '{CONF_TILT_COMMAND_TOPIC}'." ) if CONF_TILT_STATUS_TEMPLATE in config and CONF_TILT_STATUS_TOPIC not in config: - raise vol.Invalid( + raise probatio.Invalid( f"'{CONF_TILT_STATUS_TEMPLATE}' must be set together with" f" '{CONF_TILT_STATUS_TOPIC}'." ) @@ -156,59 +156,61 @@ def validate_options(config: ConfigType) -> ConfigType: _PLATFORM_SCHEMA_BASE = MQTT_BASE_SCHEMA.extend( { - vol.Optional(CONF_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_DEVICE_CLASS): vol.Any(DEVICE_CLASSES_SCHEMA, None), - vol.Optional(CONF_GET_POSITION_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Optional(CONF_OPTIMISTIC, default=DEFAULT_OPTIMISTIC): cv.boolean, - vol.Optional(CONF_PAYLOAD_CLOSE, default=DEFAULT_PAYLOAD_CLOSE): vol.Any( - cv.string, None - ), - vol.Optional(CONF_PAYLOAD_OPEN, default=DEFAULT_PAYLOAD_OPEN): vol.Any( - cv.string, None - ), - vol.Optional(CONF_PAYLOAD_STOP, default=DEFAULT_PAYLOAD_STOP): vol.Any( - cv.string, None - ), - vol.Optional(CONF_POSITION_CLOSED, default=DEFAULT_POSITION_CLOSED): int, - vol.Optional(CONF_POSITION_OPEN, default=DEFAULT_POSITION_OPEN): int, - vol.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, - vol.Optional(CONF_SET_POSITION_TEMPLATE): cv.template, - vol.Optional(CONF_SET_POSITION_TOPIC): valid_publish_topic, - vol.Optional(CONF_STATE_CLOSED, default=STATE_CLOSED): cv.string, - vol.Optional(CONF_STATE_CLOSING, default=STATE_CLOSING): cv.string, - vol.Optional(CONF_STATE_OPEN, default=STATE_OPEN): cv.string, - vol.Optional(CONF_STATE_OPENING, default=STATE_OPENING): cv.string, - vol.Optional(CONF_STATE_STOPPED, default=DEFAULT_STATE_STOPPED): cv.string, - vol.Optional(CONF_STATE_TOPIC): valid_subscribe_topic, - vol.Optional( + probatio.Optional(CONF_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_DEVICE_CLASS): probatio.Any(DEVICE_CLASSES_SCHEMA, None), + probatio.Optional(CONF_GET_POSITION_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Optional(CONF_OPTIMISTIC, default=DEFAULT_OPTIMISTIC): cv.boolean, + probatio.Optional( + CONF_PAYLOAD_CLOSE, default=DEFAULT_PAYLOAD_CLOSE + ): probatio.Any(cv.string, None), + probatio.Optional( + CONF_PAYLOAD_OPEN, default=DEFAULT_PAYLOAD_OPEN + ): probatio.Any(cv.string, None), + probatio.Optional( + CONF_PAYLOAD_STOP, default=DEFAULT_PAYLOAD_STOP + ): probatio.Any(cv.string, None), + probatio.Optional(CONF_POSITION_CLOSED, default=DEFAULT_POSITION_CLOSED): int, + probatio.Optional(CONF_POSITION_OPEN, default=DEFAULT_POSITION_OPEN): int, + probatio.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, + probatio.Optional(CONF_SET_POSITION_TEMPLATE): cv.template, + probatio.Optional(CONF_SET_POSITION_TOPIC): valid_publish_topic, + probatio.Optional(CONF_STATE_CLOSED, default=STATE_CLOSED): cv.string, + probatio.Optional(CONF_STATE_CLOSING, default=STATE_CLOSING): cv.string, + probatio.Optional(CONF_STATE_OPEN, default=STATE_OPEN): cv.string, + probatio.Optional(CONF_STATE_OPENING, default=STATE_OPENING): cv.string, + probatio.Optional(CONF_STATE_STOPPED, default=DEFAULT_STATE_STOPPED): cv.string, + probatio.Optional(CONF_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional( CONF_TILT_CLOSED_POSITION, default=DEFAULT_TILT_CLOSED_POSITION ): int, - vol.Optional(CONF_TILT_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_TILT_MAX, default=DEFAULT_TILT_MAX): int, - vol.Optional(CONF_TILT_MIN, default=DEFAULT_TILT_MIN): int, - vol.Optional(CONF_TILT_OPEN_POSITION, default=DEFAULT_TILT_OPEN_POSITION): int, - vol.Optional( + probatio.Optional(CONF_TILT_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_TILT_MAX, default=DEFAULT_TILT_MAX): int, + probatio.Optional(CONF_TILT_MIN, default=DEFAULT_TILT_MIN): int, + probatio.Optional( + CONF_TILT_OPEN_POSITION, default=DEFAULT_TILT_OPEN_POSITION + ): int, + probatio.Optional( CONF_TILT_STATE_OPTIMISTIC, default=DEFAULT_TILT_OPTIMISTIC ): cv.boolean, - vol.Optional(CONF_TILT_STATUS_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_TILT_STATUS_TEMPLATE): cv.template, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, - vol.Optional(CONF_GET_POSITION_TEMPLATE): cv.template, - vol.Optional(CONF_TILT_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_PAYLOAD_STOP_TILT, default=DEFAULT_PAYLOAD_STOP): vol.Any( - cv.string, None - ), + probatio.Optional(CONF_TILT_STATUS_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_TILT_STATUS_TEMPLATE): cv.template, + probatio.Optional(CONF_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_GET_POSITION_TEMPLATE): cv.template, + probatio.Optional(CONF_TILT_COMMAND_TEMPLATE): cv.template, + probatio.Optional( + CONF_PAYLOAD_STOP_TILT, default=DEFAULT_PAYLOAD_STOP + ): probatio.Any(cv.string, None), } ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) -PLATFORM_SCHEMA_MODERN = vol.All( +PLATFORM_SCHEMA_MODERN = probatio.All( _PLATFORM_SCHEMA_BASE, validate_options, ) -DISCOVERY_SCHEMA = vol.All( - _PLATFORM_SCHEMA_BASE.extend({}, extra=vol.REMOVE_EXTRA), +DISCOVERY_SCHEMA = probatio.All( + _PLATFORM_SCHEMA_BASE.extend({}, extra=probatio.REMOVE_EXTRA), validate_options, ) diff --git a/homeassistant/components/mqtt/date.py b/homeassistant/components/mqtt/date.py index 290f067e0187b..76d221212a245 100644 --- a/homeassistant/components/mqtt/date.py +++ b/homeassistant/components/mqtt/date.py @@ -6,7 +6,7 @@ from typing import Any, override from dateutil.parser import ParserError, parse -import voluptuous as vol +import probatio from homeassistant.components import date from homeassistant.components.date import DateEntity @@ -46,14 +46,14 @@ PLATFORM_SCHEMA_MODERN = MQTT_RW_SCHEMA.extend( { - vol.Optional(CONF_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Optional(CONF_VALUE_TEMPLATE): cv.template, }, ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) -DISCOVERY_SCHEMA = PLATFORM_SCHEMA_MODERN.extend({}, extra=vol.REMOVE_EXTRA) +DISCOVERY_SCHEMA = PLATFORM_SCHEMA_MODERN.extend({}, extra=probatio.REMOVE_EXTRA) async def async_setup_entry( diff --git a/homeassistant/components/mqtt/datetime.py b/homeassistant/components/mqtt/datetime.py index e794f7f910aad..9ca67b8138fda 100644 --- a/homeassistant/components/mqtt/datetime.py +++ b/homeassistant/components/mqtt/datetime.py @@ -8,7 +8,7 @@ from dateutil.parser import ParserError, parse from dateutil.tz import UTC -import voluptuous as vol +import probatio from homeassistant.components import datetime from homeassistant.components.datetime import DateTimeEntity @@ -50,15 +50,15 @@ PLATFORM_SCHEMA_MODERN = MQTT_RW_SCHEMA.extend( { - vol.Optional(CONF_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Optional(CONF_TIMEZONE): str, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Optional(CONF_TIMEZONE): str, + probatio.Optional(CONF_VALUE_TEMPLATE): cv.template, }, ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) -DISCOVERY_SCHEMA = PLATFORM_SCHEMA_MODERN.extend({}, extra=vol.REMOVE_EXTRA) +DISCOVERY_SCHEMA = PLATFORM_SCHEMA_MODERN.extend({}, extra=probatio.REMOVE_EXTRA) async def async_setup_entry( diff --git a/homeassistant/components/mqtt/device_automation.py b/homeassistant/components/mqtt/device_automation.py index 54ac398d0270c..c0a148741ab7d 100644 --- a/homeassistant/components/mqtt/device_automation.py +++ b/homeassistant/components/mqtt/device_automation.py @@ -2,7 +2,7 @@ import functools -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant @@ -14,12 +14,12 @@ AUTOMATION_TYPE_TRIGGER = "trigger" AUTOMATION_TYPES = [AUTOMATION_TYPE_TRIGGER] -AUTOMATION_TYPES_SCHEMA = vol.In(AUTOMATION_TYPES) +AUTOMATION_TYPES_SCHEMA = probatio.In(AUTOMATION_TYPES) CONF_AUTOMATION_TYPE = "automation_type" DISCOVERY_SCHEMA = MQTT_BASE_SCHEMA.extend( - {vol.Required(CONF_AUTOMATION_TYPE): AUTOMATION_TYPES_SCHEMA}, - extra=vol.ALLOW_EXTRA, + {probatio.Required(CONF_AUTOMATION_TYPE): AUTOMATION_TYPES_SCHEMA}, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/mqtt/device_tracker.py b/homeassistant/components/mqtt/device_tracker.py index 8cf181e7699d4..33411b6587f23 100644 --- a/homeassistant/components/mqtt/device_tracker.py +++ b/homeassistant/components/mqtt/device_tracker.py @@ -4,7 +4,7 @@ import logging from typing import TYPE_CHECKING, Any, override -import voluptuous as vol +import probatio from homeassistant.components import device_tracker from homeassistant.components.device_tracker import ( @@ -54,7 +54,7 @@ def valid_config(config: ConfigType) -> ConfigType: """Check if there is a state topic or json_attributes_topic.""" if CONF_STATE_TOPIC not in config and CONF_JSON_ATTRS_TOPIC not in config: - raise vol.Invalid( + raise probatio.Invalid( f"Invalid device tracker config, missing" f" {CONF_STATE_TOPIC} or" f" {CONF_JSON_ATTRS_TOPIC}, got: {config}" @@ -64,22 +64,22 @@ def valid_config(config: ConfigType) -> ConfigType: PLATFORM_SCHEMA_MODERN_BASE = MQTT_BASE_SCHEMA.extend( { - vol.Optional(CONF_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Optional(CONF_PAYLOAD_HOME, default=STATE_HOME): cv.string, - vol.Optional(CONF_PAYLOAD_NOT_HOME, default=STATE_NOT_HOME): cv.string, - vol.Optional(CONF_PAYLOAD_RESET, default=DEFAULT_PAYLOAD_RESET): cv.string, - vol.Optional(CONF_SOURCE_TYPE, default=DEFAULT_SOURCE_TYPE): vol.Coerce( - SourceType - ), + probatio.Optional(CONF_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Optional(CONF_PAYLOAD_HOME, default=STATE_HOME): cv.string, + probatio.Optional(CONF_PAYLOAD_NOT_HOME, default=STATE_NOT_HOME): cv.string, + probatio.Optional(CONF_PAYLOAD_RESET, default=DEFAULT_PAYLOAD_RESET): cv.string, + probatio.Optional( + CONF_SOURCE_TYPE, default=DEFAULT_SOURCE_TYPE + ): probatio.Coerce(SourceType), }, ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) -PLATFORM_SCHEMA_MODERN = vol.All(PLATFORM_SCHEMA_MODERN_BASE, valid_config) +PLATFORM_SCHEMA_MODERN = probatio.All(PLATFORM_SCHEMA_MODERN_BASE, valid_config) -DISCOVERY_SCHEMA = vol.All( - PLATFORM_SCHEMA_MODERN_BASE.extend({}, extra=vol.REMOVE_EXTRA), valid_config +DISCOVERY_SCHEMA = probatio.All( + PLATFORM_SCHEMA_MODERN_BASE.extend({}, extra=probatio.REMOVE_EXTRA), valid_config ) diff --git a/homeassistant/components/mqtt/device_trigger.py b/homeassistant/components/mqtt/device_trigger.py index a903943e2d1a2..4ed272f86539a 100644 --- a/homeassistant/components/mqtt/device_trigger.py +++ b/homeassistant/components/mqtt/device_trigger.py @@ -5,7 +5,7 @@ import logging from typing import TYPE_CHECKING, Any, override -import voluptuous as vol +import probatio from homeassistant.components.device_automation import DEVICE_TRIGGER_BASE_SCHEMA from homeassistant.config_entries import ConfigEntry @@ -54,29 +54,31 @@ TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_PLATFORM): DEVICE, - vol.Required(CONF_DOMAIN): DOMAIN, - vol.Required(CONF_DEVICE_ID): str, + probatio.Required(CONF_PLATFORM): DEVICE, + probatio.Required(CONF_DOMAIN): DOMAIN, + probatio.Required(CONF_DEVICE_ID): str, # The use of CONF_DISCOVERY_ID was deprecated in HA Core 2024.2. # By default, a MQTT device trigger now will be referenced by # device_id, type and subtype instead. - vol.Optional(CONF_DISCOVERY_ID): str, - vol.Required(CONF_TYPE): cv.string, - vol.Required(CONF_SUBTYPE): cv.string, + probatio.Optional(CONF_DISCOVERY_ID): str, + probatio.Required(CONF_TYPE): cv.string, + probatio.Required(CONF_SUBTYPE): cv.string, }, ) TRIGGER_DISCOVERY_SCHEMA = MQTT_BASE_SCHEMA.extend( { - vol.Required(CONF_AUTOMATION_TYPE): str, - vol.Required(CONF_DEVICE): MQTT_ENTITY_DEVICE_INFO_SCHEMA, - vol.Optional(CONF_PAYLOAD, default=None): vol.Any(None, cv.string), - vol.Required(CONF_SUBTYPE): cv.string, - vol.Required(CONF_TOPIC): cv.string, - vol.Required(CONF_TYPE): cv.string, - vol.Optional(CONF_VALUE_TEMPLATE, default=None): vol.Any(None, cv.string), + probatio.Required(CONF_AUTOMATION_TYPE): str, + probatio.Required(CONF_DEVICE): MQTT_ENTITY_DEVICE_INFO_SCHEMA, + probatio.Optional(CONF_PAYLOAD, default=None): probatio.Any(None, cv.string), + probatio.Required(CONF_SUBTYPE): cv.string, + probatio.Required(CONF_TOPIC): cv.string, + probatio.Required(CONF_TYPE): cv.string, + probatio.Optional(CONF_VALUE_TEMPLATE, default=None): probatio.Any( + None, cv.string + ), }, - extra=vol.REMOVE_EXTRA, + extra=probatio.REMOVE_EXTRA, ) LOG_NAME = "Device trigger" diff --git a/homeassistant/components/mqtt/discovery.py b/homeassistant/components/mqtt/discovery.py index f6464790f0bf4..d7a6bb3367690 100644 --- a/homeassistant/components/mqtt/discovery.py +++ b/homeassistant/components/mqtt/discovery.py @@ -10,7 +10,7 @@ import time from typing import TYPE_CHECKING, Any -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_MQTT, @@ -80,8 +80,8 @@ CONF_MIGRATE_DISCOVERY = "migrate_discovery" -MIGRATE_DISCOVERY_SCHEMA = vol.Schema( - {vol.Optional(CONF_MIGRATE_DISCOVERY): True}, +MIGRATE_DISCOVERY_SCHEMA = probatio.Schema( + {probatio.Optional(CONF_MIGRATE_DISCOVERY): True}, ) @@ -110,7 +110,7 @@ def _async_process_discovery_migration(payload: MQTTDiscoveryPayload) -> bool: if CONF_MIGRATE_DISCOVERY in payload: try: MIGRATE_DISCOVERY_SCHEMA(payload) - except vol.Invalid as exc: + except probatio.Invalid as exc: _LOGGER.warning(exc) return False payload.migrate_discovery = True @@ -303,7 +303,7 @@ def _parse_device_payload( _replace_all_abbreviations(device_payload) try: DEVICE_DISCOVERY_SCHEMA(device_payload) - except vol.Invalid as exc: + except probatio.Invalid as exc: _LOGGER.warning( "Invalid MQTT device discovery payload for %s, %s: '%s'", object_id, diff --git a/homeassistant/components/mqtt/entity.py b/homeassistant/components/mqtt/entity.py index 95fc8ece1e2bc..8eecdd091b6bd 100644 --- a/homeassistant/components/mqtt/entity.py +++ b/homeassistant/components/mqtt/entity.py @@ -6,7 +6,7 @@ import logging from typing import TYPE_CHECKING, Any, Protocol, cast, final, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( @@ -160,7 +160,7 @@ @callback def async_handle_schema_error( - discovery_payload: MQTTDiscoveryPayload, err: vol.Invalid + discovery_payload: MQTTDiscoveryPayload, err: probatio.Invalid ) -> None: """Help handling schema errors on MQTT discovery messages.""" discovery_topic: str = discovery_payload.discovery_data[ATTR_DISCOVERY_TOPIC] @@ -212,7 +212,7 @@ def async_setup_non_entity_entry_helper( hass: HomeAssistant, domain: str, async_setup: _SetupNonEntityHelperCallbackProtocol, - discovery_schema: vol.Schema, + discovery_schema: probatio.Schema, ) -> None: """Set up automation or tag creation dynamically through MQTT discovery.""" mqtt_data = hass.data[DATA_MQTT] @@ -228,7 +228,7 @@ async def _async_setup_non_entity_entry_from_discovery( try: config: ConfigType = discovery_schema(discovery_payload) await async_setup(config, discovery_data=discovery_payload.discovery_data) - except vol.Invalid as err: + except probatio.Invalid as err: _handle_discovery_failure(hass, discovery_payload) async_handle_schema_error(discovery_payload, err) except Exception: @@ -342,7 +342,7 @@ def _async_setup_entity_entry_from_discovery( ) ] ) - except vol.Invalid as err: + except probatio.Invalid as err: _handle_discovery_failure(hass, discovery_payload) async_handle_schema_error(discovery_payload, err) except Exception: @@ -404,7 +404,7 @@ def _async_setup_entities() -> None: if TYPE_CHECKING: assert entity_class is not None subentry_entities.append(entity_class(hass, config, entry, None)) - except vol.Invalid as exc: + except probatio.Invalid as exc: _LOGGER.error( "Schema violation occurred when trying to set up " "entity from subentry %s %s %s: %s", @@ -430,7 +430,7 @@ def _async_setup_entities() -> None: continue entities.append(entity_class(hass, config, entry, None)) - except vol.Invalid as exc: + except probatio.Invalid as exc: error = str(exc) config_file = getattr(yaml_config, "__config_file__", "?") line = getattr(yaml_config, "__line__", "?") @@ -1586,7 +1586,7 @@ async def discovery_update(self, discovery_payload: MQTTDiscoveryPayload) -> Non """Handle updated discovery message.""" try: config: DiscoveryInfoType = self.config_schema()(discovery_payload) - except vol.Invalid as err: + except probatio.Invalid as err: async_handle_schema_error(discovery_payload, err) return self._config = config diff --git a/homeassistant/components/mqtt/event.py b/homeassistant/components/mqtt/event.py index 49e52912ddae6..519a5c168137a 100644 --- a/homeassistant/components/mqtt/event.py +++ b/homeassistant/components/mqtt/event.py @@ -4,7 +4,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components import event from homeassistant.components.event import ( @@ -51,22 +51,22 @@ DEFAULT_NAME = "MQTT Event" DEFAULT_FORCE_UPDATE = False -DEVICE_CLASS_SCHEMA = vol.All(vol.Lower, vol.Coerce(EventDeviceClass)) +DEVICE_CLASS_SCHEMA = probatio.All(probatio.Lower, probatio.Coerce(EventDeviceClass)) _PLATFORM_SCHEMA_BASE = MQTT_RO_SCHEMA.extend( { - vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASS_SCHEMA, - vol.Optional(CONF_NAME): vol.Any(None, cv.string), - vol.Required(CONF_EVENT_TYPES): vol.All(cv.ensure_list, [cv.string]), + probatio.Optional(CONF_DEVICE_CLASS): DEVICE_CLASS_SCHEMA, + probatio.Optional(CONF_NAME): probatio.Any(None, cv.string), + probatio.Required(CONF_EVENT_TYPES): probatio.All(cv.ensure_list, [cv.string]), } ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) -PLATFORM_SCHEMA_MODERN = vol.All( +PLATFORM_SCHEMA_MODERN = probatio.All( _PLATFORM_SCHEMA_BASE, ) -DISCOVERY_SCHEMA = vol.All( - _PLATFORM_SCHEMA_BASE.extend({}, extra=vol.REMOVE_EXTRA), +DISCOVERY_SCHEMA = probatio.All( + _PLATFORM_SCHEMA_BASE.extend({}, extra=probatio.REMOVE_EXTRA), ) diff --git a/homeassistant/components/mqtt/fan.py b/homeassistant/components/mqtt/fan.py index 365c76a0f62eb..2c4d2a7b5d186 100644 --- a/homeassistant/components/mqtt/fan.py +++ b/homeassistant/components/mqtt/fan.py @@ -5,7 +5,7 @@ import math from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components import fan from homeassistant.components.fan import ( @@ -108,78 +108,80 @@ def valid_speed_range_configuration(config: ConfigType) -> ConfigType: """Validate that the fan speed_range configuration is valid, throws if it isn't.""" if config[CONF_SPEED_RANGE_MIN] == 0: - raise vol.Invalid("speed_range_min must be > 0") + raise probatio.Invalid("speed_range_min must be > 0") if config[CONF_SPEED_RANGE_MIN] >= config[CONF_SPEED_RANGE_MAX]: - raise vol.Invalid("speed_range_max must be > speed_range_min") + raise probatio.Invalid("speed_range_max must be > speed_range_min") return config def valid_preset_mode_configuration(config: ConfigType) -> ConfigType: """Validate that the preset mode reset payload is not one of the preset modes.""" if config[CONF_PAYLOAD_RESET_PRESET_MODE] in config[CONF_PRESET_MODES_LIST]: - raise vol.Invalid("preset_modes must not contain payload_reset_preset_mode") + raise probatio.Invalid( + "preset_modes must not contain payload_reset_preset_mode" + ) return config _PLATFORM_SCHEMA_BASE = MQTT_RW_SCHEMA.extend( { - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Optional(CONF_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_DIRECTION_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_DIRECTION_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_DIRECTION_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_DIRECTION_VALUE_TEMPLATE): cv.template, - vol.Optional(CONF_OSCILLATION_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_OSCILLATION_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_OSCILLATION_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_OSCILLATION_VALUE_TEMPLATE): cv.template, - vol.Optional(CONF_PERCENTAGE_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_PERCENTAGE_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_PERCENTAGE_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_PERCENTAGE_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Optional(CONF_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_DIRECTION_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_DIRECTION_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_DIRECTION_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_DIRECTION_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_OSCILLATION_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_OSCILLATION_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_OSCILLATION_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_OSCILLATION_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_PERCENTAGE_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_PERCENTAGE_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_PERCENTAGE_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_PERCENTAGE_VALUE_TEMPLATE): cv.template, # CONF_PRESET_MODE_COMMAND_TOPIC and CONF_PRESET_MODES_LIST # must be used together - vol.Inclusive( + probatio.Inclusive( CONF_PRESET_MODE_COMMAND_TOPIC, "preset_modes" ): valid_publish_topic, - vol.Inclusive( + probatio.Inclusive( CONF_PRESET_MODES_LIST, "preset_modes", default=[] ): cv.ensure_list, - vol.Optional(CONF_PRESET_MODE_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_PRESET_MODE_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_PRESET_MODE_VALUE_TEMPLATE): cv.template, - vol.Optional( + probatio.Optional(CONF_PRESET_MODE_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_PRESET_MODE_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_PRESET_MODE_VALUE_TEMPLATE): cv.template, + probatio.Optional( CONF_SPEED_RANGE_MIN, default=DEFAULT_SPEED_RANGE_MIN ): cv.positive_int, - vol.Optional( + probatio.Optional( CONF_SPEED_RANGE_MAX, default=DEFAULT_SPEED_RANGE_MAX ): cv.positive_int, - vol.Optional( + probatio.Optional( CONF_PAYLOAD_RESET_PERCENTAGE, default=DEFAULT_PAYLOAD_RESET ): cv.string, - vol.Optional( + probatio.Optional( CONF_PAYLOAD_RESET_PRESET_MODE, default=DEFAULT_PAYLOAD_RESET ): cv.string, - vol.Optional(CONF_PAYLOAD_OFF, default=DEFAULT_PAYLOAD_OFF): cv.string, - vol.Optional(CONF_PAYLOAD_ON, default=DEFAULT_PAYLOAD_ON): cv.string, - vol.Optional( + probatio.Optional(CONF_PAYLOAD_OFF, default=DEFAULT_PAYLOAD_OFF): cv.string, + probatio.Optional(CONF_PAYLOAD_ON, default=DEFAULT_PAYLOAD_ON): cv.string, + probatio.Optional( CONF_PAYLOAD_OSCILLATION_OFF, default=DEFAULT_PAYLOAD_OSCILLATE_OFF ): cv.string, - vol.Optional( + probatio.Optional( CONF_PAYLOAD_OSCILLATION_ON, default=DEFAULT_PAYLOAD_OSCILLATE_ON ): cv.string, - vol.Optional(CONF_STATE_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_STATE_VALUE_TEMPLATE): cv.template, } ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) -PLATFORM_SCHEMA_MODERN = vol.All( +PLATFORM_SCHEMA_MODERN = probatio.All( _PLATFORM_SCHEMA_BASE, valid_speed_range_configuration, valid_preset_mode_configuration, ) -DISCOVERY_SCHEMA = vol.All( - _PLATFORM_SCHEMA_BASE.extend({}, extra=vol.REMOVE_EXTRA), +DISCOVERY_SCHEMA = probatio.All( + _PLATFORM_SCHEMA_BASE.extend({}, extra=probatio.REMOVE_EXTRA), valid_speed_range_configuration, valid_preset_mode_configuration, ) diff --git a/homeassistant/components/mqtt/humidifier.py b/homeassistant/components/mqtt/humidifier.py index f98345914a2c5..d795e3f77f45f 100644 --- a/homeassistant/components/mqtt/humidifier.py +++ b/homeassistant/components/mqtt/humidifier.py @@ -4,7 +4,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components import humidifier from homeassistant.components.humidifier import ( @@ -97,7 +97,7 @@ def valid_mode_configuration(config: ConfigType) -> ConfigType: """Validate that the mode reset payload is not one of the available modes.""" if config[CONF_PAYLOAD_RESET_MODE] in config[CONF_AVAILABLE_MODES_LIST]: - raise vol.Invalid("modes must not contain payload_reset_mode") + raise probatio.Invalid("modes must not contain payload_reset_mode") return config @@ -108,62 +108,66 @@ def valid_humidity_range_configuration(config: ConfigType) -> ConfigType: throws if it isn't. """ if config[CONF_TARGET_HUMIDITY_MIN] >= config[CONF_TARGET_HUMIDITY_MAX]: - raise vol.Invalid("target_humidity_max must be > target_humidity_min") + raise probatio.Invalid("target_humidity_max must be > target_humidity_min") if config[CONF_TARGET_HUMIDITY_MAX] > 100: - raise vol.Invalid("max_humidity must be <= 100") + raise probatio.Invalid("max_humidity must be <= 100") return config _PLATFORM_SCHEMA_BASE = MQTT_RW_SCHEMA.extend( { - vol.Optional(CONF_ACTION_TEMPLATE): cv.template, - vol.Optional(CONF_ACTION_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_ACTION_TEMPLATE): cv.template, + probatio.Optional(CONF_ACTION_TOPIC): valid_subscribe_topic, # CONF_AVAIALABLE_MODES_LIST and CONF_MODE_COMMAND_TOPIC must be used together - vol.Inclusive( + probatio.Inclusive( CONF_AVAILABLE_MODES_LIST, "available_modes", default=[] ): cv.ensure_list, - vol.Inclusive(CONF_MODE_COMMAND_TOPIC, "available_modes"): valid_publish_topic, - vol.Optional(CONF_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_CURRENT_HUMIDITY_TEMPLATE): cv.template, - vol.Optional(CONF_CURRENT_HUMIDITY_TOPIC): valid_subscribe_topic, - vol.Optional( + probatio.Inclusive( + CONF_MODE_COMMAND_TOPIC, "available_modes" + ): valid_publish_topic, + probatio.Optional(CONF_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_CURRENT_HUMIDITY_TEMPLATE): cv.template, + probatio.Optional(CONF_CURRENT_HUMIDITY_TOPIC): valid_subscribe_topic, + probatio.Optional( CONF_DEVICE_CLASS, default=HumidifierDeviceClass.HUMIDIFIER - ): vol.In( + ): probatio.In( [HumidifierDeviceClass.HUMIDIFIER, HumidifierDeviceClass.DEHUMIDIFIER, None] ), - vol.Optional(CONF_MODE_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_MODE_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_MODE_STATE_TEMPLATE): cv.template, - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Optional(CONF_PAYLOAD_OFF, default=DEFAULT_PAYLOAD_OFF): cv.string, - vol.Optional(CONF_PAYLOAD_ON, default=DEFAULT_PAYLOAD_ON): cv.string, - vol.Optional(CONF_STATE_VALUE_TEMPLATE): cv.template, - vol.Required(CONF_TARGET_HUMIDITY_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_TARGET_HUMIDITY_COMMAND_TEMPLATE): cv.template, - vol.Optional( + probatio.Optional(CONF_MODE_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_MODE_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_MODE_STATE_TEMPLATE): cv.template, + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Optional(CONF_PAYLOAD_OFF, default=DEFAULT_PAYLOAD_OFF): cv.string, + probatio.Optional(CONF_PAYLOAD_ON, default=DEFAULT_PAYLOAD_ON): cv.string, + probatio.Optional(CONF_STATE_VALUE_TEMPLATE): cv.template, + probatio.Required(CONF_TARGET_HUMIDITY_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_TARGET_HUMIDITY_COMMAND_TEMPLATE): cv.template, + probatio.Optional( CONF_TARGET_HUMIDITY_MAX, default=DEFAULT_MAX_HUMIDITY ): cv.positive_float, - vol.Optional( + probatio.Optional( CONF_TARGET_HUMIDITY_MIN, default=DEFAULT_MIN_HUMIDITY ): cv.positive_float, - vol.Optional(CONF_TARGET_HUMIDITY_STATE_TEMPLATE): cv.template, - vol.Optional(CONF_TARGET_HUMIDITY_STATE_TOPIC): valid_subscribe_topic, - vol.Optional( + probatio.Optional(CONF_TARGET_HUMIDITY_STATE_TEMPLATE): cv.template, + probatio.Optional(CONF_TARGET_HUMIDITY_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional( CONF_PAYLOAD_RESET_HUMIDITY, default=DEFAULT_PAYLOAD_RESET ): cv.string, - vol.Optional(CONF_PAYLOAD_RESET_MODE, default=DEFAULT_PAYLOAD_RESET): cv.string, + probatio.Optional( + CONF_PAYLOAD_RESET_MODE, default=DEFAULT_PAYLOAD_RESET + ): cv.string, } ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) -PLATFORM_SCHEMA_MODERN = vol.All( +PLATFORM_SCHEMA_MODERN = probatio.All( _PLATFORM_SCHEMA_BASE, valid_humidity_range_configuration, valid_mode_configuration, ) -DISCOVERY_SCHEMA = vol.All( - _PLATFORM_SCHEMA_BASE.extend({}, extra=vol.REMOVE_EXTRA), +DISCOVERY_SCHEMA = probatio.All( + _PLATFORM_SCHEMA_BASE.extend({}, extra=probatio.REMOVE_EXTRA), valid_humidity_range_configuration, valid_mode_configuration, ) diff --git a/homeassistant/components/mqtt/image.py b/homeassistant/components/mqtt/image.py index 82c0388965c07..f3e5315f62d97 100644 --- a/homeassistant/components/mqtt/image.py +++ b/homeassistant/components/mqtt/image.py @@ -7,7 +7,7 @@ from typing import TYPE_CHECKING, Any, override import httpx -import voluptuous as vol +import probatio from homeassistant.components import image from homeassistant.components.image import DEFAULT_CONTENT_TYPE, ImageEntity @@ -52,9 +52,9 @@ def validate_topic_required(config: ConfigType) -> ConfigType: """Ensure at least one subscribe topic is configured.""" if CONF_IMAGE_TOPIC not in config and CONF_URL_TOPIC not in config: - raise vol.Invalid("Expected one of [`image_topic`, `url_topic`], got none") + raise probatio.Invalid("Expected one of [`image_topic`, `url_topic`], got none") if CONF_CONTENT_TYPE in config and CONF_URL_TOPIC in config: - raise vol.Invalid( + raise probatio.Invalid( "Option `content_type` can not be used together with `url_topic`" ) return config @@ -62,19 +62,22 @@ def validate_topic_required(config: ConfigType) -> ConfigType: PLATFORM_SCHEMA_BASE = MQTT_BASE_SCHEMA.extend( { - vol.Optional(CONF_CONTENT_TYPE): cv.string, - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Exclusive(CONF_URL_TOPIC, "image_topic"): valid_subscribe_topic, - vol.Exclusive(CONF_IMAGE_TOPIC, "image_topic"): valid_subscribe_topic, - vol.Optional(CONF_IMAGE_ENCODING): vol.In({"b64", "raw"}), - vol.Optional(CONF_URL_TEMPLATE): cv.template, + probatio.Optional(CONF_CONTENT_TYPE): cv.string, + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Exclusive(CONF_URL_TOPIC, "image_topic"): valid_subscribe_topic, + probatio.Exclusive(CONF_IMAGE_TOPIC, "image_topic"): valid_subscribe_topic, + probatio.Optional(CONF_IMAGE_ENCODING): probatio.In({"b64", "raw"}), + probatio.Optional(CONF_URL_TEMPLATE): cv.template, } ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) -PLATFORM_SCHEMA_MODERN = vol.All(PLATFORM_SCHEMA_BASE.schema, validate_topic_required) +PLATFORM_SCHEMA_MODERN = probatio.All( + PLATFORM_SCHEMA_BASE.schema, validate_topic_required +) -DISCOVERY_SCHEMA = vol.All( - PLATFORM_SCHEMA_BASE.extend({}, extra=vol.REMOVE_EXTRA), validate_topic_required +DISCOVERY_SCHEMA = probatio.All( + PLATFORM_SCHEMA_BASE.extend({}, extra=probatio.REMOVE_EXTRA), + validate_topic_required, ) @@ -172,7 +175,7 @@ def _image_from_url_request_received(self, msg: ReceiveMessage) -> None: except MqttValueTemplateException as exc: _LOGGER.warning(exc) return - except vol.Invalid: + except probatio.Invalid: _LOGGER.error( "Invalid image URL '%s' received at topic %s", msg.payload, diff --git a/homeassistant/components/mqtt/infrared.py b/homeassistant/components/mqtt/infrared.py index f686f63b10c93..b912bfa8b7a00 100644 --- a/homeassistant/components/mqtt/infrared.py +++ b/homeassistant/components/mqtt/infrared.py @@ -5,7 +5,7 @@ from typing import Any, override import orjson -import voluptuous as vol +import probatio from homeassistant.components import infrared from homeassistant.components.infrared import ( @@ -53,12 +53,12 @@ MQTT_INFRARED_ATTRIBUTES_BLOCKED: frozenset[str] = frozenset() -SIGNAL_SCHEMA = vol.Schema( +SIGNAL_SCHEMA = probatio.Schema( { - vol.Required("timings"): vol.All([int], vol.Length(min=1)), - vol.Optional("modulation"): vol.Any(int, None), + probatio.Required("timings"): probatio.All([int], probatio.Length(min=1)), + probatio.Optional("modulation"): probatio.Any(int, None), }, - extra=vol.REMOVE_EXTRA, + extra=probatio.REMOVE_EXTRA, ) @@ -80,41 +80,41 @@ def validate_mqtt_infrared_discovery(config_value: dict[str, Any]) -> ConfigType return config -INFRARED_BASE_SCHEMA = vol.Schema( - {vol.Required(CONF_SCHEMA): vol.Any("emitter", "receiver")}, - extra=vol.ALLOW_EXTRA, +INFRARED_BASE_SCHEMA = probatio.Schema( + {probatio.Required(CONF_SCHEMA): probatio.Any("emitter", "receiver")}, + extra=probatio.ALLOW_EXTRA, ) EMITTER_SCHEMA = MQTT_BASE_SCHEMA.extend( { - vol.Required(CONF_SCHEMA): "emitter", - vol.Required(CONF_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, - vol.Optional(CONF_NAME): vol.Any(cv.string, None), + probatio.Required(CONF_SCHEMA): "emitter", + probatio.Required(CONF_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), } ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) RECEIVER_SCHEMA = MQTT_BASE_SCHEMA.extend( { - vol.Required(CONF_SCHEMA): "receiver", - vol.Required(CONF_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, - vol.Optional(CONF_NAME): vol.Any(cv.string, None), + probatio.Required(CONF_SCHEMA): "receiver", + probatio.Required(CONF_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), } ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) DISCOVERY_SCHEMA_MAPPING: dict[str, VolSchemaType] = { - "emitter": EMITTER_SCHEMA.extend({}, extra=vol.REMOVE_EXTRA), - "receiver": RECEIVER_SCHEMA.extend({}, extra=vol.REMOVE_EXTRA), + "emitter": EMITTER_SCHEMA.extend({}, extra=probatio.REMOVE_EXTRA), + "receiver": RECEIVER_SCHEMA.extend({}, extra=probatio.REMOVE_EXTRA), } -PLATFORM_SCHEMA_MODERN = vol.All( +PLATFORM_SCHEMA_MODERN = probatio.All( INFRARED_BASE_SCHEMA, validate_mqtt_infrared_config, ) -DISCOVERY_SCHEMA = vol.All( +DISCOVERY_SCHEMA = probatio.All( INFRARED_BASE_SCHEMA, validate_mqtt_infrared_discovery, ) @@ -230,7 +230,7 @@ def _handle_state_message_received(self, msg: ReceiveMessage) -> None: return try: payload_dict = SIGNAL_SCHEMA(json_loads_object(payload)) - except (*JSON_DECODE_EXCEPTIONS, vol.Invalid, TypeError, ValueError): + except (*JSON_DECODE_EXCEPTIONS, probatio.Invalid, TypeError, ValueError): _LOGGER.warning( "Invalid message received for %s on topic %s, with template %s. " "Message is not a valid signal JSON message. Got %s", diff --git a/homeassistant/components/mqtt/lawn_mower.py b/homeassistant/components/mqtt/lawn_mower.py index 5ec5857bab07b..141028c37e308 100644 --- a/homeassistant/components/mqtt/lawn_mower.py +++ b/homeassistant/components/mqtt/lawn_mower.py @@ -5,7 +5,7 @@ import logging from typing import override -import voluptuous as vol +import probatio from homeassistant.components import lawn_mower from homeassistant.components.lawn_mower import ( @@ -62,23 +62,25 @@ PLATFORM_SCHEMA_MODERN = MQTT_BASE_SCHEMA.extend( { - vol.Optional(CONF_ACTIVITY_VALUE_TEMPLATE): cv.template, - vol.Optional(CONF_ACTIVITY_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_DOCK_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_DOCK_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Optional(CONF_OPTIMISTIC, default=DEFAULT_OPTIMISTIC): cv.boolean, - vol.Optional(CONF_PAUSE_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_PAUSE_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, - vol.Optional(CONF_START_MOWING_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_START_MOWING_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_STOP_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_STOP_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_ACTIVITY_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_ACTIVITY_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_DOCK_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_DOCK_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Optional(CONF_OPTIMISTIC, default=DEFAULT_OPTIMISTIC): cv.boolean, + probatio.Optional(CONF_PAUSE_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_PAUSE_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, + probatio.Optional(CONF_START_MOWING_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_START_MOWING_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_STOP_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_STOP_COMMAND_TOPIC): valid_publish_topic, }, ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) -DISCOVERY_SCHEMA = vol.All(PLATFORM_SCHEMA_MODERN.extend({}, extra=vol.REMOVE_EXTRA)) +DISCOVERY_SCHEMA = probatio.All( + PLATFORM_SCHEMA_MODERN.extend({}, extra=probatio.REMOVE_EXTRA) +) async def async_setup_entry( diff --git a/homeassistant/components/mqtt/light/__init__.py b/homeassistant/components/mqtt/light/__init__.py index 6f235dd87e617..39b3e08359dc5 100644 --- a/homeassistant/components/mqtt/light/__init__.py +++ b/homeassistant/components/mqtt/light/__init__.py @@ -2,7 +2,7 @@ from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import light from homeassistant.config_entries import ConfigEntry @@ -53,13 +53,13 @@ def validate_mqtt_light_modern(config_value: dict[str, Any]) -> ConfigType: return config -DISCOVERY_SCHEMA = vol.All( - MQTT_LIGHT_SCHEMA_SCHEMA.extend({}, extra=vol.ALLOW_EXTRA), +DISCOVERY_SCHEMA = probatio.All( + MQTT_LIGHT_SCHEMA_SCHEMA.extend({}, extra=probatio.ALLOW_EXTRA), validate_mqtt_light_discovery, ) -PLATFORM_SCHEMA_MODERN = vol.All( - MQTT_LIGHT_SCHEMA_SCHEMA.extend({}, extra=vol.ALLOW_EXTRA), +PLATFORM_SCHEMA_MODERN = probatio.All( + MQTT_LIGHT_SCHEMA_SCHEMA.extend({}, extra=probatio.ALLOW_EXTRA), validate_mqtt_light_modern, ) diff --git a/homeassistant/components/mqtt/light/schema.py b/homeassistant/components/mqtt/light/schema.py index baec7dd40e538..7432742cf11e8 100644 --- a/homeassistant/components/mqtt/light/schema.py +++ b/homeassistant/components/mqtt/light/schema.py @@ -1,13 +1,13 @@ """Shared schema code.""" -import voluptuous as vol +import probatio from ..const import CONF_SCHEMA -MQTT_LIGHT_SCHEMA_SCHEMA = vol.Schema( +MQTT_LIGHT_SCHEMA_SCHEMA = probatio.Schema( { - vol.Optional(CONF_SCHEMA, default="basic"): vol.All( - vol.Lower, vol.Any("basic", "json", "template") + probatio.Optional(CONF_SCHEMA, default="basic"): probatio.All( + probatio.Lower, probatio.Any("basic", "json", "template") ) } ) diff --git a/homeassistant/components/mqtt/light/schema_basic.py b/homeassistant/components/mqtt/light/schema_basic.py index 40d18499443ea..cec5b0222b90a 100644 --- a/homeassistant/components/mqtt/light/schema_basic.py +++ b/homeassistant/components/mqtt/light/schema_basic.py @@ -4,7 +4,7 @@ import logging from typing import Any, cast, override -import voluptuous as vol +import probatio from homeassistant.components.light import ( ATTR_BRIGHTNESS, @@ -160,68 +160,70 @@ PLATFORM_SCHEMA_MODERN_BASIC = ( MQTT_RW_SCHEMA.extend( { - vol.Optional(CONF_BRIGHTNESS_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_BRIGHTNESS_COMMAND_TOPIC): valid_publish_topic, - vol.Optional( + probatio.Optional(CONF_BRIGHTNESS_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_BRIGHTNESS_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional( CONF_BRIGHTNESS_SCALE, default=DEFAULT_BRIGHTNESS_SCALE - ): vol.All(vol.Coerce(int), vol.Range(min=1)), - vol.Optional(CONF_BRIGHTNESS_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_BRIGHTNESS_VALUE_TEMPLATE): cv.template, - vol.Optional(CONF_COLOR_MODE_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_COLOR_MODE_VALUE_TEMPLATE): cv.template, - vol.Optional(CONF_COLOR_TEMP_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_COLOR_TEMP_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_COLOR_TEMP_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_COLOR_TEMP_VALUE_TEMPLATE): cv.template, - vol.Optional(CONF_COLOR_TEMP_KELVIN, default=False): cv.boolean, - vol.Optional(CONF_EFFECT_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_EFFECT_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_EFFECT_LIST): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(CONF_EFFECT_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_EFFECT_VALUE_TEMPLATE): cv.template, - vol.Optional(CONF_HS_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_HS_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_HS_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_HS_VALUE_TEMPLATE): cv.template, - vol.Optional(CONF_MAX_MIREDS): cv.positive_int, - vol.Optional(CONF_MIN_MIREDS): cv.positive_int, - vol.Optional(CONF_MAX_KELVIN): cv.positive_int, - vol.Optional(CONF_MIN_KELVIN): cv.positive_int, - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Optional(CONF_ON_COMMAND_TYPE, default=DEFAULT_ON_COMMAND_TYPE): vol.In( - VALUES_ON_COMMAND_TYPE + ): probatio.All(probatio.Coerce(int), probatio.Range(min=1)), + probatio.Optional(CONF_BRIGHTNESS_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_BRIGHTNESS_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_COLOR_MODE_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_COLOR_MODE_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_COLOR_TEMP_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_COLOR_TEMP_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_COLOR_TEMP_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_COLOR_TEMP_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_COLOR_TEMP_KELVIN, default=False): cv.boolean, + probatio.Optional(CONF_EFFECT_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_EFFECT_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_EFFECT_LIST): probatio.All( + cv.ensure_list, [cv.string] ), - vol.Optional(CONF_PAYLOAD_OFF, default=DEFAULT_PAYLOAD_OFF): cv.string, - vol.Optional(CONF_PAYLOAD_ON, default=DEFAULT_PAYLOAD_ON): cv.string, - vol.Optional(CONF_RGB_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_RGB_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_RGB_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_RGB_VALUE_TEMPLATE): cv.template, - vol.Optional(CONF_RGBW_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_RGBW_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_RGBW_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_RGBW_VALUE_TEMPLATE): cv.template, - vol.Optional(CONF_RGBWW_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_RGBWW_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_RGBWW_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_RGBWW_VALUE_TEMPLATE): cv.template, - vol.Optional(CONF_STATE_VALUE_TEMPLATE): cv.template, - vol.Optional(CONF_WHITE_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_WHITE_SCALE, default=DEFAULT_WHITE_SCALE): vol.All( - vol.Coerce(int), vol.Range(min=1) - ), - vol.Optional(CONF_XY_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_XY_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_XY_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_XY_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_EFFECT_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_EFFECT_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_HS_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_HS_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_HS_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_HS_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_MAX_MIREDS): cv.positive_int, + probatio.Optional(CONF_MIN_MIREDS): cv.positive_int, + probatio.Optional(CONF_MAX_KELVIN): cv.positive_int, + probatio.Optional(CONF_MIN_KELVIN): cv.positive_int, + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Optional( + CONF_ON_COMMAND_TYPE, default=DEFAULT_ON_COMMAND_TYPE + ): probatio.In(VALUES_ON_COMMAND_TYPE), + probatio.Optional(CONF_PAYLOAD_OFF, default=DEFAULT_PAYLOAD_OFF): cv.string, + probatio.Optional(CONF_PAYLOAD_ON, default=DEFAULT_PAYLOAD_ON): cv.string, + probatio.Optional(CONF_RGB_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_RGB_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_RGB_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_RGB_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_RGBW_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_RGBW_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_RGBW_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_RGBW_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_RGBWW_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_RGBWW_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_RGBWW_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_RGBWW_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_STATE_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_WHITE_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional( + CONF_WHITE_SCALE, default=DEFAULT_WHITE_SCALE + ): probatio.All(probatio.Coerce(int), probatio.Range(min=1)), + probatio.Optional(CONF_XY_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_XY_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_XY_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_XY_VALUE_TEMPLATE): cv.template, }, ) .extend(MQTT_ENTITY_COMMON_SCHEMA.schema) .extend(MQTT_LIGHT_SCHEMA_SCHEMA.schema) ) -DISCOVERY_SCHEMA_BASIC = vol.All( - PLATFORM_SCHEMA_MODERN_BASIC.extend({}, extra=vol.REMOVE_EXTRA), +DISCOVERY_SCHEMA_BASIC = probatio.All( + PLATFORM_SCHEMA_MODERN_BASIC.extend({}, extra=probatio.REMOVE_EXTRA), ) diff --git a/homeassistant/components/mqtt/light/schema_json.py b/homeassistant/components/mqtt/light/schema_json.py index 4b608be5d30cd..66cfec2b28160 100644 --- a/homeassistant/components/mqtt/light/schema_json.py +++ b/homeassistant/components/mqtt/light/schema_json.py @@ -4,7 +4,7 @@ import logging from typing import TYPE_CHECKING, Any, cast, override -import voluptuous as vol +import probatio from homeassistant.components.light import ( ATTR_BRIGHTNESS, @@ -92,48 +92,50 @@ PLATFORM_SCHEMA_MODERN_JSON = ( MQTT_RW_SCHEMA.extend( { - vol.Optional(CONF_BRIGHTNESS, default=DEFAULT_BRIGHTNESS): cv.boolean, - vol.Optional( + probatio.Optional(CONF_BRIGHTNESS, default=DEFAULT_BRIGHTNESS): cv.boolean, + probatio.Optional( CONF_BRIGHTNESS_SCALE, default=DEFAULT_BRIGHTNESS_SCALE - ): vol.All(vol.Coerce(int), vol.Range(min=1)), - vol.Optional(CONF_COLOR_TEMP_KELVIN, default=False): cv.boolean, - vol.Optional(CONF_EFFECT, default=DEFAULT_EFFECT): cv.boolean, - vol.Optional(CONF_EFFECT_LIST): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(CONF_FLASH, default=DEFAULT_FLASH): cv.boolean, - vol.Optional( + ): probatio.All(probatio.Coerce(int), probatio.Range(min=1)), + probatio.Optional(CONF_COLOR_TEMP_KELVIN, default=False): cv.boolean, + probatio.Optional(CONF_EFFECT, default=DEFAULT_EFFECT): cv.boolean, + probatio.Optional(CONF_EFFECT_LIST): probatio.All( + cv.ensure_list, [cv.string] + ), + probatio.Optional(CONF_FLASH, default=DEFAULT_FLASH): cv.boolean, + probatio.Optional( CONF_FLASH_TIME_LONG, default=DEFAULT_FLASH_TIME_LONG ): cv.positive_int, - vol.Optional( + probatio.Optional( CONF_FLASH_TIME_SHORT, default=DEFAULT_FLASH_TIME_SHORT ): cv.positive_int, - vol.Optional(CONF_MAX_MIREDS): cv.positive_int, - vol.Optional(CONF_MIN_MIREDS): cv.positive_int, - vol.Optional(CONF_MAX_KELVIN): cv.positive_int, - vol.Optional(CONF_MIN_KELVIN): cv.positive_int, - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Optional(CONF_QOS, default=DEFAULT_QOS): vol.All( - vol.Coerce(int), vol.In([0, 1, 2]) + probatio.Optional(CONF_MAX_MIREDS): cv.positive_int, + probatio.Optional(CONF_MIN_MIREDS): cv.positive_int, + probatio.Optional(CONF_MAX_KELVIN): cv.positive_int, + probatio.Optional(CONF_MIN_KELVIN): cv.positive_int, + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Optional(CONF_QOS, default=DEFAULT_QOS): probatio.All( + probatio.Coerce(int), probatio.In([0, 1, 2]) ), - vol.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, - vol.Optional(CONF_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_SUPPORTED_COLOR_MODES): vol.All( + probatio.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, + probatio.Optional(CONF_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_SUPPORTED_COLOR_MODES): probatio.All( cv.ensure_list, - [vol.In(VALID_COLOR_MODES)], - vol.Unique(), + [probatio.In(VALID_COLOR_MODES)], + probatio.Unique(), valid_supported_color_modes, ), - vol.Optional(CONF_TRANSITION, default=DEFAULT_TRANSITION): cv.boolean, - vol.Optional(CONF_WHITE_SCALE, default=DEFAULT_WHITE_SCALE): vol.All( - vol.Coerce(int), vol.Range(min=1) - ), + probatio.Optional(CONF_TRANSITION, default=DEFAULT_TRANSITION): cv.boolean, + probatio.Optional( + CONF_WHITE_SCALE, default=DEFAULT_WHITE_SCALE + ): probatio.All(probatio.Coerce(int), probatio.Range(min=1)), }, ) .extend(MQTT_ENTITY_COMMON_SCHEMA.schema) .extend(MQTT_LIGHT_SCHEMA_SCHEMA.schema) ) -DISCOVERY_SCHEMA_JSON = vol.All( - PLATFORM_SCHEMA_MODERN_JSON.extend({}, extra=vol.REMOVE_EXTRA), +DISCOVERY_SCHEMA_JSON = probatio.All( + PLATFORM_SCHEMA_MODERN_JSON.extend({}, extra=probatio.REMOVE_EXTRA), ) diff --git a/homeassistant/components/mqtt/light/schema_template.py b/homeassistant/components/mqtt/light/schema_template.py index 80766f89499b4..3936c73ce9ea4 100644 --- a/homeassistant/components/mqtt/light/schema_template.py +++ b/homeassistant/components/mqtt/light/schema_template.py @@ -4,7 +4,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.light import ( ATTR_BRIGHTNESS, @@ -89,30 +89,32 @@ PLATFORM_SCHEMA_MODERN_TEMPLATE = ( MQTT_RW_SCHEMA.extend( { - vol.Optional(CONF_BLUE_TEMPLATE): cv.template, - vol.Optional(CONF_BRIGHTNESS_TEMPLATE): cv.template, - vol.Optional(CONF_COLOR_TEMP_KELVIN, default=False): cv.boolean, - vol.Optional(CONF_COLOR_TEMP_TEMPLATE): cv.template, - vol.Required(CONF_COMMAND_OFF_TEMPLATE): cv.template, - vol.Required(CONF_COMMAND_ON_TEMPLATE): cv.template, - vol.Optional(CONF_EFFECT_LIST): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(CONF_EFFECT_TEMPLATE): cv.template, - vol.Optional(CONF_GREEN_TEMPLATE): cv.template, - vol.Optional(CONF_MAX_KELVIN): cv.positive_int, - vol.Optional(CONF_MIN_KELVIN): cv.positive_int, - vol.Optional(CONF_MAX_MIREDS): cv.positive_int, - vol.Optional(CONF_MIN_MIREDS): cv.positive_int, - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Optional(CONF_RED_TEMPLATE): cv.template, - vol.Optional(CONF_STATE_TEMPLATE): cv.template, + probatio.Optional(CONF_BLUE_TEMPLATE): cv.template, + probatio.Optional(CONF_BRIGHTNESS_TEMPLATE): cv.template, + probatio.Optional(CONF_COLOR_TEMP_KELVIN, default=False): cv.boolean, + probatio.Optional(CONF_COLOR_TEMP_TEMPLATE): cv.template, + probatio.Required(CONF_COMMAND_OFF_TEMPLATE): cv.template, + probatio.Required(CONF_COMMAND_ON_TEMPLATE): cv.template, + probatio.Optional(CONF_EFFECT_LIST): probatio.All( + cv.ensure_list, [cv.string] + ), + probatio.Optional(CONF_EFFECT_TEMPLATE): cv.template, + probatio.Optional(CONF_GREEN_TEMPLATE): cv.template, + probatio.Optional(CONF_MAX_KELVIN): cv.positive_int, + probatio.Optional(CONF_MIN_KELVIN): cv.positive_int, + probatio.Optional(CONF_MAX_MIREDS): cv.positive_int, + probatio.Optional(CONF_MIN_MIREDS): cv.positive_int, + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Optional(CONF_RED_TEMPLATE): cv.template, + probatio.Optional(CONF_STATE_TEMPLATE): cv.template, } ) .extend(MQTT_ENTITY_COMMON_SCHEMA.schema) .extend(MQTT_LIGHT_SCHEMA_SCHEMA.schema) ) -DISCOVERY_SCHEMA_TEMPLATE = vol.All( - PLATFORM_SCHEMA_MODERN_TEMPLATE.extend({}, extra=vol.REMOVE_EXTRA), +DISCOVERY_SCHEMA_TEMPLATE = probatio.All( + PLATFORM_SCHEMA_MODERN_TEMPLATE.extend({}, extra=probatio.REMOVE_EXTRA), ) diff --git a/homeassistant/components/mqtt/lock.py b/homeassistant/components/mqtt/lock.py index a936363fac766..5814b4f526647 100644 --- a/homeassistant/components/mqtt/lock.py +++ b/homeassistant/components/mqtt/lock.py @@ -5,7 +5,7 @@ import re from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components import lock from homeassistant.components.lock import ( @@ -79,25 +79,31 @@ PLATFORM_SCHEMA_MODERN = MQTT_RW_SCHEMA.extend( { - vol.Optional(CONF_CODE_FORMAT): cv.is_regex, - vol.Optional(CONF_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Optional(CONF_PAYLOAD_LOCK, default=DEFAULT_PAYLOAD_LOCK): cv.string, - vol.Optional(CONF_PAYLOAD_UNLOCK, default=DEFAULT_PAYLOAD_UNLOCK): cv.string, - vol.Optional(CONF_PAYLOAD_OPEN): cv.string, - vol.Optional(CONF_PAYLOAD_RESET, default=DEFAULT_PAYLOAD_RESET): cv.string, - vol.Optional(CONF_STATE_JAMMED, default=DEFAULT_STATE_JAMMED): cv.string, - vol.Optional(CONF_STATE_LOCKED, default=DEFAULT_STATE_LOCKED): cv.string, - vol.Optional(CONF_STATE_LOCKING, default=DEFAULT_STATE_LOCKING): cv.string, - vol.Optional(CONF_STATE_OPEN, default=DEFAULT_STATE_OPEN): cv.string, - vol.Optional(CONF_STATE_OPENING, default=DEFAULT_STATE_OPENING): cv.string, - vol.Optional(CONF_STATE_UNLOCKED, default=DEFAULT_STATE_UNLOCKED): cv.string, - vol.Optional(CONF_STATE_UNLOCKING, default=DEFAULT_STATE_UNLOCKING): cv.string, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_CODE_FORMAT): cv.is_regex, + probatio.Optional(CONF_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Optional(CONF_PAYLOAD_LOCK, default=DEFAULT_PAYLOAD_LOCK): cv.string, + probatio.Optional( + CONF_PAYLOAD_UNLOCK, default=DEFAULT_PAYLOAD_UNLOCK + ): cv.string, + probatio.Optional(CONF_PAYLOAD_OPEN): cv.string, + probatio.Optional(CONF_PAYLOAD_RESET, default=DEFAULT_PAYLOAD_RESET): cv.string, + probatio.Optional(CONF_STATE_JAMMED, default=DEFAULT_STATE_JAMMED): cv.string, + probatio.Optional(CONF_STATE_LOCKED, default=DEFAULT_STATE_LOCKED): cv.string, + probatio.Optional(CONF_STATE_LOCKING, default=DEFAULT_STATE_LOCKING): cv.string, + probatio.Optional(CONF_STATE_OPEN, default=DEFAULT_STATE_OPEN): cv.string, + probatio.Optional(CONF_STATE_OPENING, default=DEFAULT_STATE_OPENING): cv.string, + probatio.Optional( + CONF_STATE_UNLOCKED, default=DEFAULT_STATE_UNLOCKED + ): cv.string, + probatio.Optional( + CONF_STATE_UNLOCKING, default=DEFAULT_STATE_UNLOCKING + ): cv.string, + probatio.Optional(CONF_VALUE_TEMPLATE): cv.template, } ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) -DISCOVERY_SCHEMA = PLATFORM_SCHEMA_MODERN.extend({}, extra=vol.REMOVE_EXTRA) +DISCOVERY_SCHEMA = PLATFORM_SCHEMA_MODERN.extend({}, extra=probatio.REMOVE_EXTRA) STATE_CONFIG_KEYS = [ CONF_STATE_JAMMED, @@ -144,7 +150,7 @@ class MqttLock(MqttEntity, LockEntity): @staticmethod @override - def config_schema() -> vol.Schema: + def config_schema() -> probatio.Schema: """Return the config schema.""" return DISCOVERY_SCHEMA diff --git a/homeassistant/components/mqtt/notify.py b/homeassistant/components/mqtt/notify.py index b5c6f52cbdff5..1a51c26069528 100644 --- a/homeassistant/components/mqtt/notify.py +++ b/homeassistant/components/mqtt/notify.py @@ -2,7 +2,7 @@ from typing import override -import voluptuous as vol +import probatio from homeassistant.components import notify from homeassistant.components.notify import NotifyEntity @@ -26,14 +26,14 @@ PLATFORM_SCHEMA_MODERN = MQTT_BASE_SCHEMA.extend( { - vol.Optional(CONF_COMMAND_TEMPLATE): cv.template, - vol.Required(CONF_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, + probatio.Optional(CONF_COMMAND_TEMPLATE): cv.template, + probatio.Required(CONF_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, } ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) -DISCOVERY_SCHEMA = PLATFORM_SCHEMA_MODERN.extend({}, extra=vol.REMOVE_EXTRA) +DISCOVERY_SCHEMA = PLATFORM_SCHEMA_MODERN.extend({}, extra=probatio.REMOVE_EXTRA) async def async_setup_entry( @@ -61,7 +61,7 @@ class MqttNotify(MqttEntity, NotifyEntity): @staticmethod @override - def config_schema() -> vol.Schema: + def config_schema() -> probatio.Schema: """Return the config schema.""" return DISCOVERY_SCHEMA diff --git a/homeassistant/components/mqtt/number.py b/homeassistant/components/mqtt/number.py index 159e684c41f24..9edcb999da48b 100644 --- a/homeassistant/components/mqtt/number.py +++ b/homeassistant/components/mqtt/number.py @@ -4,7 +4,7 @@ import logging from typing import override -import voluptuous as vol +import probatio from homeassistant.components import number from homeassistant.components.number import ( @@ -77,37 +77,39 @@ def validate_config(config: ConfigType) -> ConfigType: config[CONF_UNIT_OF_MEASUREMENT] = AMBIGUOUS_UNITS[unit_of_measurement] if config[CONF_MIN] > config[CONF_MAX]: - raise vol.Invalid(f"{CONF_MAX} must be >= {CONF_MIN}") + raise probatio.Invalid(f"{CONF_MAX} must be >= {CONF_MIN}") return config _PLATFORM_SCHEMA_BASE = MQTT_RW_SCHEMA.extend( { - vol.Optional(CONF_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_DEVICE_CLASS): vol.Any( - vol.All(vol.Lower, vol.Coerce(NumberDeviceClass)), None + probatio.Optional(CONF_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_DEVICE_CLASS): probatio.Any( + probatio.All(probatio.Lower, probatio.Coerce(NumberDeviceClass)), None ), - vol.Optional(CONF_MAX, default=DEFAULT_MAX_VALUE): vol.Coerce(float), - vol.Optional(CONF_MIN, default=DEFAULT_MIN_VALUE): vol.Coerce(float), - vol.Optional(CONF_MODE, default=NumberMode.AUTO): vol.Coerce(NumberMode), - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Optional(CONF_PAYLOAD_RESET, default=DEFAULT_PAYLOAD_RESET): cv.string, - vol.Optional(CONF_STEP, default=DEFAULT_STEP): vol.All( - vol.Coerce(float), vol.Range(min=1e-3) + probatio.Optional(CONF_MAX, default=DEFAULT_MAX_VALUE): probatio.Coerce(float), + probatio.Optional(CONF_MIN, default=DEFAULT_MIN_VALUE): probatio.Coerce(float), + probatio.Optional(CONF_MODE, default=NumberMode.AUTO): probatio.Coerce( + NumberMode ), - vol.Optional(CONF_UNIT_OF_MEASUREMENT): vol.Any(cv.string, None), - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Optional(CONF_PAYLOAD_RESET, default=DEFAULT_PAYLOAD_RESET): cv.string, + probatio.Optional(CONF_STEP, default=DEFAULT_STEP): probatio.All( + probatio.Coerce(float), probatio.Range(min=1e-3) + ), + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): probatio.Any(cv.string, None), + probatio.Optional(CONF_VALUE_TEMPLATE): cv.template, }, ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) -PLATFORM_SCHEMA_MODERN = vol.All( +PLATFORM_SCHEMA_MODERN = probatio.All( _PLATFORM_SCHEMA_BASE, validate_config, ) -DISCOVERY_SCHEMA = vol.All( - _PLATFORM_SCHEMA_BASE.extend({}, extra=vol.REMOVE_EXTRA), +DISCOVERY_SCHEMA = probatio.All( + _PLATFORM_SCHEMA_BASE.extend({}, extra=probatio.REMOVE_EXTRA), validate_config, ) diff --git a/homeassistant/components/mqtt/repairs.py b/homeassistant/components/mqtt/repairs.py index 07439681f2c18..357b4cb565bc3 100644 --- a/homeassistant/components/mqtt/repairs.py +++ b/homeassistant/components/mqtt/repairs.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING -import voluptuous as vol +import probatio from homeassistant.components.repairs import RepairsFlow, RepairsFlowResult from homeassistant.core import HomeAssistant @@ -48,7 +48,7 @@ async def async_step_confirm( return self.async_show_form( step_id="confirm", - data_schema=vol.Schema({}), + data_schema=probatio.Schema({}), description_placeholders={"name": self.name}, ) diff --git a/homeassistant/components/mqtt/scene.py b/homeassistant/components/mqtt/scene.py index 2921d726f5466..b7b53ca38bf05 100644 --- a/homeassistant/components/mqtt/scene.py +++ b/homeassistant/components/mqtt/scene.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components import scene from homeassistant.components.scene import Scene @@ -28,14 +28,14 @@ PLATFORM_SCHEMA_MODERN = MQTT_BASE_SCHEMA.extend( { - vol.Required(CONF_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Optional(CONF_PAYLOAD_ON): cv.string, - vol.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, + probatio.Required(CONF_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Optional(CONF_PAYLOAD_ON): cv.string, + probatio.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, } ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) -DISCOVERY_SCHEMA = PLATFORM_SCHEMA_MODERN.extend({}, extra=vol.REMOVE_EXTRA) +DISCOVERY_SCHEMA = PLATFORM_SCHEMA_MODERN.extend({}, extra=probatio.REMOVE_EXTRA) async def async_setup_entry( @@ -66,7 +66,7 @@ class MqttScene( @staticmethod @override - def config_schema() -> vol.Schema: + def config_schema() -> probatio.Schema: """Return the config schema.""" return DISCOVERY_SCHEMA diff --git a/homeassistant/components/mqtt/schemas.py b/homeassistant/components/mqtt/schemas.py index b1284f6f1c5b0..9fe49b5a7f525 100644 --- a/homeassistant/components/mqtt/schemas.py +++ b/homeassistant/components/mqtt/schemas.py @@ -2,7 +2,7 @@ from typing import Any -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_DEVICE, @@ -76,37 +76,39 @@ ] -_MQTT_AVAILABILITY_SINGLE_SCHEMA = vol.Schema( +_MQTT_AVAILABILITY_SINGLE_SCHEMA = probatio.Schema( { - vol.Exclusive(CONF_AVAILABILITY_TOPIC, "availability"): valid_subscribe_topic, - vol.Optional(CONF_AVAILABILITY_TEMPLATE): cv.template, - vol.Optional( + probatio.Exclusive( + CONF_AVAILABILITY_TOPIC, "availability" + ): valid_subscribe_topic, + probatio.Optional(CONF_AVAILABILITY_TEMPLATE): cv.template, + probatio.Optional( CONF_PAYLOAD_AVAILABLE, default=DEFAULT_PAYLOAD_AVAILABLE ): cv.string, - vol.Optional( + probatio.Optional( CONF_PAYLOAD_NOT_AVAILABLE, default=DEFAULT_PAYLOAD_NOT_AVAILABLE ): cv.string, } ) -_MQTT_AVAILABILITY_LIST_SCHEMA = vol.Schema( +_MQTT_AVAILABILITY_LIST_SCHEMA = probatio.Schema( { - vol.Optional(CONF_AVAILABILITY_MODE, default=AVAILABILITY_LATEST): vol.All( - cv.string, vol.In(AVAILABILITY_MODES) - ), - vol.Exclusive(CONF_AVAILABILITY, "availability"): vol.All( + probatio.Optional( + CONF_AVAILABILITY_MODE, default=AVAILABILITY_LATEST + ): probatio.All(cv.string, probatio.In(AVAILABILITY_MODES)), + probatio.Exclusive(CONF_AVAILABILITY, "availability"): probatio.All( cv.ensure_list, [ { - vol.Required(CONF_TOPIC): valid_subscribe_topic, - vol.Optional( + probatio.Required(CONF_TOPIC): valid_subscribe_topic, + probatio.Optional( CONF_PAYLOAD_AVAILABLE, default=DEFAULT_PAYLOAD_AVAILABLE ): cv.string, - vol.Optional( + probatio.Optional( CONF_PAYLOAD_NOT_AVAILABLE, default=DEFAULT_PAYLOAD_NOT_AVAILABLE, ): cv.string, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_VALUE_TEMPLATE): cv.template, } ], ), @@ -122,44 +124,44 @@ def validate_device_has_at_least_one_identifier(value: ConfigType) -> ConfigType """Validate that a device info entry has at least one identifying value.""" if value.get(CONF_IDENTIFIERS) or value.get(CONF_CONNECTIONS): return value - raise vol.Invalid( + raise probatio.Invalid( "Device must have at least one identifying value in " "'identifiers' and/or 'connections'" ) -MQTT_ENTITY_DEVICE_INFO_SCHEMA = vol.All( +MQTT_ENTITY_DEVICE_INFO_SCHEMA = probatio.All( cv.deprecated(CONF_DEPRECATED_VIA_HUB, CONF_VIA_DEVICE), - vol.Schema( + probatio.Schema( { - vol.Optional(CONF_IDENTIFIERS, default=list): vol.All( + probatio.Optional(CONF_IDENTIFIERS, default=list): probatio.All( cv.ensure_list, [cv.string] ), - vol.Optional(CONF_CONNECTIONS, default=list): vol.All( - cv.ensure_list, [vol.All(vol.Length(2), [cv.string])] + probatio.Optional(CONF_CONNECTIONS, default=list): probatio.All( + cv.ensure_list, [probatio.All(probatio.Length(2), [cv.string])] ), - vol.Optional(CONF_MANUFACTURER): cv.string, - vol.Optional(CONF_MODEL): cv.string, - vol.Optional(CONF_MODEL_ID): cv.string, - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_HW_VERSION): cv.string, - vol.Optional(CONF_SERIAL_NUMBER): cv.string, - vol.Optional(CONF_SW_VERSION): cv.string, - vol.Optional(CONF_VIA_DEVICE): cv.string, - vol.Optional(CONF_SUGGESTED_AREA): cv.string, - vol.Optional(CONF_CONFIGURATION_URL): cv.configuration_url, + probatio.Optional(CONF_MANUFACTURER): cv.string, + probatio.Optional(CONF_MODEL): cv.string, + probatio.Optional(CONF_MODEL_ID): cv.string, + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_HW_VERSION): cv.string, + probatio.Optional(CONF_SERIAL_NUMBER): cv.string, + probatio.Optional(CONF_SW_VERSION): cv.string, + probatio.Optional(CONF_VIA_DEVICE): cv.string, + probatio.Optional(CONF_SUGGESTED_AREA): cv.string, + probatio.Optional(CONF_CONFIGURATION_URL): cv.configuration_url, } ), validate_device_has_at_least_one_identifier, ) -MQTT_ORIGIN_INFO_SCHEMA = vol.All( - vol.Schema( +MQTT_ORIGIN_INFO_SCHEMA = probatio.All( + probatio.Schema( { - vol.Required(CONF_NAME): cv.string, - vol.Optional(CONF_SW_VERSION): cv.string, - vol.Optional(CONF_SUPPORT_URL): cv.configuration_url, + probatio.Required(CONF_NAME): cv.string, + probatio.Optional(CONF_SW_VERSION): cv.string, + probatio.Optional(CONF_SUPPORT_URL): cv.configuration_url, } ), ) @@ -174,23 +176,23 @@ def valid_message_expiry_interval(value: Any) -> int: MQTT_ENTITY_COMMON_SCHEMA = _MQTT_AVAILABILITY_SCHEMA.extend( { - vol.Optional(CONF_DEVICE): MQTT_ENTITY_DEVICE_INFO_SCHEMA, - vol.Optional(CONF_ENTITY_PICTURE): cv.url, - vol.Optional(CONF_ORIGIN): MQTT_ORIGIN_INFO_SCHEMA, - vol.Optional(CONF_ENABLED_BY_DEFAULT, default=True): cv.boolean, - vol.Optional(CONF_ENTITY_CATEGORY): ENTITY_CATEGORIES_SCHEMA, - vol.Optional(CONF_ICON): cv.icon, - vol.Optional(CONF_JSON_ATTRS_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_JSON_ATTRS_TEMPLATE): cv.template, - vol.Optional(CONF_DEFAULT_ENTITY_ID): cv.string, - vol.Optional(CONF_MESSAGE_EXPIRY_INTERVAL): valid_message_expiry_interval, - vol.Optional(CONF_UNIQUE_ID): cv.string, - vol.Optional(CONF_VISIBLE_BY_DEFAULT, default=True): cv.boolean, + probatio.Optional(CONF_DEVICE): MQTT_ENTITY_DEVICE_INFO_SCHEMA, + probatio.Optional(CONF_ENTITY_PICTURE): cv.url, + probatio.Optional(CONF_ORIGIN): MQTT_ORIGIN_INFO_SCHEMA, + probatio.Optional(CONF_ENABLED_BY_DEFAULT, default=True): cv.boolean, + probatio.Optional(CONF_ENTITY_CATEGORY): ENTITY_CATEGORIES_SCHEMA, + probatio.Optional(CONF_ICON): cv.icon, + probatio.Optional(CONF_JSON_ATTRS_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_JSON_ATTRS_TEMPLATE): cv.template, + probatio.Optional(CONF_DEFAULT_ENTITY_ID): cv.string, + probatio.Optional(CONF_MESSAGE_EXPIRY_INTERVAL): valid_message_expiry_interval, + probatio.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Optional(CONF_VISIBLE_BY_DEFAULT, default=True): cv.boolean, } ) -_UNIQUE_ID_SCHEMA = vol.Schema( - {vol.Required(CONF_UNIQUE_ID): cv.string}, +_UNIQUE_ID_SCHEMA = probatio.Schema( + {probatio.Required(CONF_UNIQUE_ID): cv.string}, ).extend({}, extra=True) @@ -202,22 +204,24 @@ def check_unique_id(config: dict[str, Any]) -> dict[str, Any]: return config -_COMPONENT_CONFIG_SCHEMA = vol.All( - vol.Schema( - {vol.Required(CONF_PLATFORM): vol.In(SUPPORTED_COMPONENTS)}, +_COMPONENT_CONFIG_SCHEMA = probatio.All( + probatio.Schema( + {probatio.Required(CONF_PLATFORM): probatio.In(SUPPORTED_COMPONENTS)}, ).extend({}, extra=True), check_unique_id, ) DEVICE_DISCOVERY_SCHEMA = _MQTT_AVAILABILITY_SCHEMA.extend( { - vol.Required(CONF_DEVICE): MQTT_ENTITY_DEVICE_INFO_SCHEMA, - vol.Required(CONF_COMPONENTS): vol.Schema({str: _COMPONENT_CONFIG_SCHEMA}), - vol.Required(CONF_ORIGIN): MQTT_ORIGIN_INFO_SCHEMA, - vol.Optional(CONF_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_MESSAGE_EXPIRY_INTERVAL): valid_message_expiry_interval, - vol.Optional(CONF_QOS): valid_qos_schema, - vol.Optional(CONF_ENCODING): cv.string, + probatio.Required(CONF_DEVICE): MQTT_ENTITY_DEVICE_INFO_SCHEMA, + probatio.Required(CONF_COMPONENTS): probatio.Schema( + {str: _COMPONENT_CONFIG_SCHEMA} + ), + probatio.Required(CONF_ORIGIN): MQTT_ORIGIN_INFO_SCHEMA, + probatio.Optional(CONF_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_MESSAGE_EXPIRY_INTERVAL): valid_message_expiry_interval, + probatio.Optional(CONF_QOS): valid_qos_schema, + probatio.Optional(CONF_ENCODING): cv.string, } ) diff --git a/homeassistant/components/mqtt/select.py b/homeassistant/components/mqtt/select.py index aef1ea39b2ba8..b5b528ced533b 100644 --- a/homeassistant/components/mqtt/select.py +++ b/homeassistant/components/mqtt/select.py @@ -4,7 +4,7 @@ import logging from typing import override -import voluptuous as vol +import probatio from homeassistant.components import select from homeassistant.components.select import ( @@ -52,14 +52,16 @@ PLATFORM_SCHEMA_MODERN = MQTT_RW_SCHEMA.extend( { - vol.Optional(CONF_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Required(CONF_OPTIONS): cv.ensure_list, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Required(CONF_OPTIONS): cv.ensure_list, + probatio.Optional(CONF_VALUE_TEMPLATE): cv.template, }, ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) -DISCOVERY_SCHEMA = vol.All(PLATFORM_SCHEMA_MODERN.extend({}, extra=vol.REMOVE_EXTRA)) +DISCOVERY_SCHEMA = probatio.All( + PLATFORM_SCHEMA_MODERN.extend({}, extra=probatio.REMOVE_EXTRA) +) async def async_setup_entry( diff --git a/homeassistant/components/mqtt/sensor.py b/homeassistant/components/mqtt/sensor.py index fd1f4ce3f4852..b4236a24728d6 100644 --- a/homeassistant/components/mqtt/sensor.py +++ b/homeassistant/components/mqtt/sensor.py @@ -5,7 +5,7 @@ import logging from typing import override -import voluptuous as vol +import probatio from homeassistant.components import sensor from homeassistant.components.sensor import ( @@ -76,15 +76,15 @@ _PLATFORM_SCHEMA_BASE = MQTT_RO_SCHEMA.extend( { - vol.Optional(CONF_DEVICE_CLASS): vol.Any(DEVICE_CLASSES_SCHEMA, None), - vol.Optional(CONF_EXPIRE_AFTER): cv.positive_int, - vol.Optional(CONF_FORCE_UPDATE, default=DEFAULT_FORCE_UPDATE): cv.boolean, - vol.Optional(CONF_LAST_RESET_VALUE_TEMPLATE): cv.template, - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Optional(CONF_OPTIONS): cv.ensure_list, - vol.Optional(CONF_SUGGESTED_DISPLAY_PRECISION): cv.positive_int, - vol.Optional(CONF_STATE_CLASS): vol.Any(STATE_CLASSES_SCHEMA, None), - vol.Optional(CONF_UNIT_OF_MEASUREMENT): vol.Any(cv.string, None), + probatio.Optional(CONF_DEVICE_CLASS): probatio.Any(DEVICE_CLASSES_SCHEMA, None), + probatio.Optional(CONF_EXPIRE_AFTER): cv.positive_int, + probatio.Optional(CONF_FORCE_UPDATE, default=DEFAULT_FORCE_UPDATE): cv.boolean, + probatio.Optional(CONF_LAST_RESET_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Optional(CONF_OPTIONS): cv.ensure_list, + probatio.Optional(CONF_SUGGESTED_DISPLAY_PRECISION): cv.positive_int, + probatio.Optional(CONF_STATE_CLASS): probatio.Any(STATE_CLASSES_SCHEMA, None), + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): probatio.Any(cv.string, None), } ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) @@ -95,7 +95,7 @@ def validate_sensor_state_and_device_class_config(config: ConfigType) -> ConfigT CONF_LAST_RESET_VALUE_TEMPLATE in config and (state_class := config.get(CONF_STATE_CLASS)) != SensorStateClass.TOTAL ): - raise vol.Invalid( + raise probatio.Invalid( f"The option `{CONF_LAST_RESET_VALUE_TEMPLATE}` cannot be used " f"together with state class `{state_class}`" ) @@ -110,15 +110,15 @@ def validate_sensor_state_and_device_class_config(config: ConfigType) -> ConfigT # to limit the possible sensor values if (options := config.get(CONF_OPTIONS)) is not None: if not options: - raise vol.Invalid("An empty options list is not allowed") + raise probatio.Invalid("An empty options list is not allowed") if config.get(CONF_STATE_CLASS) or config.get(CONF_UNIT_OF_MEASUREMENT): - raise vol.Invalid( + raise probatio.Invalid( f"Specifying `{CONF_OPTIONS}` is not allowed together with " f"the `{CONF_STATE_CLASS}` or `{CONF_UNIT_OF_MEASUREMENT}` option" ) if (device_class := config.get(CONF_DEVICE_CLASS)) != SensorDeviceClass.ENUM: - raise vol.Invalid( + raise probatio.Invalid( f"The option `{CONF_OPTIONS}` must be used " f"together with device class `{SensorDeviceClass.ENUM}`, " f"got `{CONF_DEVICE_CLASS}` '{device_class}'" @@ -130,7 +130,7 @@ def validate_sensor_state_and_device_class_config(config: ConfigType) -> ConfigT and (unit_of_measurement := config.get(CONF_UNIT_OF_MEASUREMENT)) not in STATE_CLASS_UNITS[state_class] ): - raise vol.Invalid( + raise probatio.Invalid( f"The unit of measurement '{unit_of_measurement}' is not valid " f"together with state class '{state_class}'" ) @@ -149,7 +149,7 @@ def validate_sensor_state_and_device_class_config(config: ConfigType) -> ConfigT device_class in DEVICE_CLASS_UNITS and unit_of_measurement not in DEVICE_CLASS_UNITS[device_class] ): - raise vol.Invalid( + raise probatio.Invalid( f"The unit of measurement `{unit_of_measurement}` is not valid " f"together with device class `{device_class}`", ) @@ -157,13 +157,13 @@ def validate_sensor_state_and_device_class_config(config: ConfigType) -> ConfigT return config -PLATFORM_SCHEMA_MODERN = vol.All( +PLATFORM_SCHEMA_MODERN = probatio.All( _PLATFORM_SCHEMA_BASE, validate_sensor_state_and_device_class_config, ) -DISCOVERY_SCHEMA = vol.All( - _PLATFORM_SCHEMA_BASE.extend({}, extra=vol.REMOVE_EXTRA), +DISCOVERY_SCHEMA = probatio.All( + _PLATFORM_SCHEMA_BASE.extend({}, extra=probatio.REMOVE_EXTRA), validate_sensor_state_and_device_class_config, ) diff --git a/homeassistant/components/mqtt/siren.py b/homeassistant/components/mqtt/siren.py index b27b1a78708fd..00dbedfeb665a 100644 --- a/homeassistant/components/mqtt/siren.py +++ b/homeassistant/components/mqtt/siren.py @@ -4,7 +4,7 @@ import logging from typing import Any, cast, override -import voluptuous as vol +import probatio from homeassistant.components import siren from homeassistant.components.siren import ( @@ -71,21 +71,23 @@ PLATFORM_SCHEMA_MODERN = MQTT_RW_SCHEMA.extend( { - vol.Optional(CONF_AVAILABLE_TONES): cv.ensure_list, - vol.Optional(CONF_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_COMMAND_OFF_TEMPLATE): cv.template, - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Optional(CONF_PAYLOAD_OFF, default=DEFAULT_PAYLOAD_OFF): cv.string, - vol.Optional(CONF_PAYLOAD_ON, default=DEFAULT_PAYLOAD_ON): cv.string, - vol.Optional(CONF_STATE_OFF): cv.string, - vol.Optional(CONF_STATE_ON): cv.string, - vol.Optional(CONF_STATE_VALUE_TEMPLATE): cv.template, - vol.Optional(CONF_SUPPORT_DURATION, default=True): cv.boolean, - vol.Optional(CONF_SUPPORT_VOLUME_SET, default=True): cv.boolean, + probatio.Optional(CONF_AVAILABLE_TONES): cv.ensure_list, + probatio.Optional(CONF_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_COMMAND_OFF_TEMPLATE): cv.template, + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Optional(CONF_PAYLOAD_OFF, default=DEFAULT_PAYLOAD_OFF): cv.string, + probatio.Optional(CONF_PAYLOAD_ON, default=DEFAULT_PAYLOAD_ON): cv.string, + probatio.Optional(CONF_STATE_OFF): cv.string, + probatio.Optional(CONF_STATE_ON): cv.string, + probatio.Optional(CONF_STATE_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_SUPPORT_DURATION, default=True): cv.boolean, + probatio.Optional(CONF_SUPPORT_VOLUME_SET, default=True): cv.boolean, }, ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) -DISCOVERY_SCHEMA = vol.All(PLATFORM_SCHEMA_MODERN.extend({}, extra=vol.REMOVE_EXTRA)) +DISCOVERY_SCHEMA = probatio.All( + PLATFORM_SCHEMA_MODERN.extend({}, extra=probatio.REMOVE_EXTRA) +) MQTT_SIREN_ATTRIBUTES_BLOCKED = frozenset( { @@ -243,8 +245,8 @@ def _state_message_received(self, msg: ReceiveMessage) -> None: # process attributes try: params: SirenTurnOnServiceParameters - params = vol.All(TURN_ON_SCHEMA)(json_payload) - except vol.MultipleInvalid as invalid_siren_parameters: + params = probatio.All(TURN_ON_SCHEMA)(json_payload) + except probatio.MultipleInvalid as invalid_siren_parameters: _LOGGER.warning( "Unable to update siren state attributes from payload '%s': %s", json_payload, diff --git a/homeassistant/components/mqtt/switch.py b/homeassistant/components/mqtt/switch.py index c96708d6fec31..b4ac6cc2f16ee 100644 --- a/homeassistant/components/mqtt/switch.py +++ b/homeassistant/components/mqtt/switch.py @@ -3,7 +3,7 @@ from collections.abc import Callable from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components import switch from homeassistant.components.switch import DEVICE_CLASSES_SCHEMA, SwitchEntity @@ -51,18 +51,18 @@ PLATFORM_SCHEMA_MODERN = MQTT_RW_SCHEMA.extend( { - vol.Optional(CONF_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Optional(CONF_PAYLOAD_OFF, default=DEFAULT_PAYLOAD_OFF): cv.string, - vol.Optional(CONF_PAYLOAD_ON, default=DEFAULT_PAYLOAD_ON): cv.string, - vol.Optional(CONF_STATE_OFF): cv.string, - vol.Optional(CONF_STATE_ON): cv.string, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, - vol.Optional(CONF_DEVICE_CLASS): vol.Any(DEVICE_CLASSES_SCHEMA, None), + probatio.Optional(CONF_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Optional(CONF_PAYLOAD_OFF, default=DEFAULT_PAYLOAD_OFF): cv.string, + probatio.Optional(CONF_PAYLOAD_ON, default=DEFAULT_PAYLOAD_ON): cv.string, + probatio.Optional(CONF_STATE_OFF): cv.string, + probatio.Optional(CONF_STATE_ON): cv.string, + probatio.Optional(CONF_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_DEVICE_CLASS): probatio.Any(DEVICE_CLASSES_SCHEMA, None), } ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) -DISCOVERY_SCHEMA = PLATFORM_SCHEMA_MODERN.extend({}, extra=vol.REMOVE_EXTRA) +DISCOVERY_SCHEMA = PLATFORM_SCHEMA_MODERN.extend({}, extra=probatio.REMOVE_EXTRA) async def async_setup_entry( @@ -95,7 +95,7 @@ class MqttSwitch(MqttEntity, SwitchEntity, RestoreEntity): @staticmethod @override - def config_schema() -> vol.Schema: + def config_schema() -> probatio.Schema: """Return the config schema.""" return DISCOVERY_SCHEMA diff --git a/homeassistant/components/mqtt/tag.py b/homeassistant/components/mqtt/tag.py index 4844e5843a8a0..aabef575e12a8 100644 --- a/homeassistant/components/mqtt/tag.py +++ b/homeassistant/components/mqtt/tag.py @@ -5,7 +5,7 @@ import logging from typing import override -import voluptuous as vol +import probatio from homeassistant.components import tag from homeassistant.config_entries import ConfigEntry @@ -44,11 +44,11 @@ DISCOVERY_SCHEMA = MQTT_BASE_SCHEMA.extend( { - vol.Optional(CONF_DEVICE): MQTT_ENTITY_DEVICE_INFO_SCHEMA, - vol.Required(CONF_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_DEVICE): MQTT_ENTITY_DEVICE_INFO_SCHEMA, + probatio.Required(CONF_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_VALUE_TEMPLATE): cv.template, }, - extra=vol.REMOVE_EXTRA, + extra=probatio.REMOVE_EXTRA, ) @@ -132,7 +132,7 @@ async def async_update(self, discovery_data: MQTTDiscoveryPayload) -> None: # Update tag scanner try: config: DiscoveryInfoType = DISCOVERY_SCHEMA(discovery_data) - except vol.Invalid as err: + except probatio.Invalid as err: async_handle_schema_error(discovery_data, err) return self._config = config diff --git a/homeassistant/components/mqtt/text.py b/homeassistant/components/mqtt/text.py index 5ec31989f3e55..9cd40fd53aa9e 100644 --- a/homeassistant/components/mqtt/text.py +++ b/homeassistant/components/mqtt/text.py @@ -5,7 +5,7 @@ import re from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components import text from homeassistant.components.text import TextEntity, TextEntityCapabilityAttribute @@ -62,34 +62,36 @@ def valid_text_size_configuration(config: ConfigType) -> ConfigType: """Validate that the text length configuration is valid, throws if it isn't.""" if config[CONF_MIN] > config[CONF_MAX]: - raise vol.Invalid("text length min must be <= max") + raise probatio.Invalid("text length min must be <= max") if config[CONF_MAX] > MAX_LENGTH_STATE_STATE: - raise vol.Invalid(f"max text length must be <= {MAX_LENGTH_STATE_STATE}") + raise probatio.Invalid(f"max text length must be <= {MAX_LENGTH_STATE_STATE}") return config _PLATFORM_SCHEMA_BASE = MQTT_RW_SCHEMA.extend( { - vol.Optional(CONF_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Optional(CONF_MAX, default=MAX_LENGTH_STATE_STATE): cv.positive_int, - vol.Optional(CONF_MIN, default=0): cv.positive_int, - vol.Optional(CONF_MODE, default=text.TextMode.TEXT): vol.In( + probatio.Optional(CONF_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Optional(CONF_MAX, default=MAX_LENGTH_STATE_STATE): cv.positive_int, + probatio.Optional(CONF_MIN, default=0): cv.positive_int, + probatio.Optional(CONF_MODE, default=text.TextMode.TEXT): probatio.In( [text.TextMode.TEXT, text.TextMode.PASSWORD] ), - vol.Optional(CONF_PATTERN): cv.is_regex, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_PATTERN): cv.is_regex, + probatio.Optional(CONF_VALUE_TEMPLATE): cv.template, }, ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) -DISCOVERY_SCHEMA = vol.All( - _PLATFORM_SCHEMA_BASE.extend({}, extra=vol.REMOVE_EXTRA), +DISCOVERY_SCHEMA = probatio.All( + _PLATFORM_SCHEMA_BASE.extend({}, extra=probatio.REMOVE_EXTRA), valid_text_size_configuration, ) -PLATFORM_SCHEMA_MODERN = vol.All(_PLATFORM_SCHEMA_BASE, valid_text_size_configuration) +PLATFORM_SCHEMA_MODERN = probatio.All( + _PLATFORM_SCHEMA_BASE, valid_text_size_configuration +) async def async_setup_entry( diff --git a/homeassistant/components/mqtt/time.py b/homeassistant/components/mqtt/time.py index 3143edc5d4993..00bceac10e521 100644 --- a/homeassistant/components/mqtt/time.py +++ b/homeassistant/components/mqtt/time.py @@ -6,7 +6,7 @@ from typing import Any, override from dateutil.parser import ParserError, parse -import voluptuous as vol +import probatio from homeassistant.components import time from homeassistant.components.time import TimeEntity @@ -46,14 +46,14 @@ PLATFORM_SCHEMA_MODERN = MQTT_RW_SCHEMA.extend( { - vol.Optional(CONF_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Optional(CONF_VALUE_TEMPLATE): cv.template, }, ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) -DISCOVERY_SCHEMA = PLATFORM_SCHEMA_MODERN.extend({}, extra=vol.REMOVE_EXTRA) +DISCOVERY_SCHEMA = PLATFORM_SCHEMA_MODERN.extend({}, extra=probatio.REMOVE_EXTRA) async def async_setup_entry( diff --git a/homeassistant/components/mqtt/trigger.py b/homeassistant/components/mqtt/trigger.py index 714f3ef51b9bc..41b98a107b948 100644 --- a/homeassistant/components/mqtt/trigger.py +++ b/homeassistant/components/mqtt/trigger.py @@ -5,7 +5,7 @@ import logging from typing import Any -import voluptuous as vol +import probatio from homeassistant.const import CONF_PAYLOAD, CONF_PLATFORM, CONF_VALUE_TEMPLATE from homeassistant.core import ( @@ -42,13 +42,13 @@ TRIGGER_SCHEMA = cv.TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_PLATFORM): DOMAIN, - vol.Required(CONF_TOPIC): valid_subscribe_topic_template, - vol.Optional(CONF_PAYLOAD): cv.template, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, - vol.Optional(CONF_ENCODING, default=DEFAULT_ENCODING): cv.string, - vol.Optional(CONF_QOS, default=DEFAULT_QOS): vol.All( - vol.Coerce(int), vol.In([0, 1, 2]) + probatio.Required(CONF_PLATFORM): DOMAIN, + probatio.Required(CONF_TOPIC): valid_subscribe_topic_template, + probatio.Optional(CONF_PAYLOAD): cv.template, + probatio.Optional(CONF_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_ENCODING, default=DEFAULT_ENCODING): cv.string, + probatio.Optional(CONF_QOS, default=DEFAULT_QOS): probatio.All( + probatio.Coerce(int), probatio.In([0, 1, 2]) ), } ) diff --git a/homeassistant/components/mqtt/update.py b/homeassistant/components/mqtt/update.py index b4a89b143aa94..cbe4a1fb02d55 100644 --- a/homeassistant/components/mqtt/update.py +++ b/homeassistant/components/mqtt/update.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components import update from homeassistant.components.update import ( @@ -45,34 +45,38 @@ PLATFORM_SCHEMA_MODERN = MQTT_RO_SCHEMA.extend( { - vol.Optional(CONF_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_DEVICE_CLASS): vol.Any(DEVICE_CLASSES_SCHEMA, None), - vol.Optional(CONF_DISPLAY_PRECISION, default=0): cv.positive_int, - vol.Optional(CONF_LATEST_VERSION_TEMPLATE): cv.template, - vol.Optional(CONF_LATEST_VERSION_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Optional(CONF_PAYLOAD_INSTALL): cv.string, - vol.Optional(CONF_RELEASE_SUMMARY): cv.string, - vol.Optional(CONF_RELEASE_URL): cv.string, - vol.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, - vol.Optional(CONF_TITLE): cv.string, + probatio.Optional(CONF_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_DEVICE_CLASS): probatio.Any(DEVICE_CLASSES_SCHEMA, None), + probatio.Optional(CONF_DISPLAY_PRECISION, default=0): cv.positive_int, + probatio.Optional(CONF_LATEST_VERSION_TEMPLATE): cv.template, + probatio.Optional(CONF_LATEST_VERSION_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Optional(CONF_PAYLOAD_INSTALL): cv.string, + probatio.Optional(CONF_RELEASE_SUMMARY): cv.string, + probatio.Optional(CONF_RELEASE_URL): cv.string, + probatio.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, + probatio.Optional(CONF_TITLE): cv.string, }, ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) -DISCOVERY_SCHEMA = vol.All(PLATFORM_SCHEMA_MODERN.extend({}, extra=vol.REMOVE_EXTRA)) +DISCOVERY_SCHEMA = probatio.All( + PLATFORM_SCHEMA_MODERN.extend({}, extra=probatio.REMOVE_EXTRA) +) -MQTT_JSON_UPDATE_SCHEMA = vol.Schema( +MQTT_JSON_UPDATE_SCHEMA = probatio.Schema( { - vol.Optional("installed_version"): cv.string, - vol.Optional("latest_version"): cv.string, - vol.Optional("title"): cv.string, - vol.Optional("release_summary"): cv.string, - vol.Optional("release_url"): cv.url, - vol.Optional("entity_picture"): cv.url, - vol.Optional("in_progress"): cv.boolean, - vol.Optional("update_percentage"): vol.Any(vol.Range(min=0, max=100), None), + probatio.Optional("installed_version"): cv.string, + probatio.Optional("latest_version"): cv.string, + probatio.Optional("title"): cv.string, + probatio.Optional("release_summary"): cv.string, + probatio.Optional("release_url"): cv.url, + probatio.Optional("entity_picture"): cv.url, + probatio.Optional("in_progress"): cv.boolean, + probatio.Optional("update_percentage"): probatio.Any( + probatio.Range(min=0, max=100), None + ), } ) @@ -175,7 +179,7 @@ def _handle_state_message_received(self, msg: ReceiveMessage) -> None: msg.topic, ) json_payload = {"installed_version": str(payload)} - except vol.MultipleInvalid as exc: + except probatio.MultipleInvalid as exc: _LOGGER.warning( ( "Schema violation after processing payload '%s'" diff --git a/homeassistant/components/mqtt/util.py b/homeassistant/components/mqtt/util.py index f4f4fe4caf205..d7fc1c7b60bdc 100644 --- a/homeassistant/components/mqtt/util.py +++ b/homeassistant/components/mqtt/util.py @@ -9,7 +9,7 @@ import tempfile from typing import Any -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigEntry, ConfigEntryState from homeassistant.const import MAX_LENGTH_STATE_STATE, STATE_UNKNOWN, Platform @@ -43,7 +43,7 @@ TEMP_DIR_NAME = f"home-assistant-{DOMAIN}" -_VALID_QOS_SCHEMA = vol.All(vol.Coerce(int), vol.In([0, 1, 2])) +_VALID_QOS_SCHEMA = probatio.All(probatio.Coerce(int), probatio.In([0, 1, 2])) _LOGGER = logging.getLogger(__name__) @@ -252,23 +252,29 @@ def valid_topic(topic: Any) -> str: try: raw_validated_topic = validated_topic.encode("utf-8") except UnicodeError as err: - raise vol.Invalid("MQTT topic name/filter must be valid UTF-8 string.") from err + raise probatio.Invalid( + "MQTT topic name/filter must be valid UTF-8 string." + ) from err if not raw_validated_topic: - raise vol.Invalid("MQTT topic name/filter must not be empty.") + raise probatio.Invalid("MQTT topic name/filter must not be empty.") if len(raw_validated_topic) > 65535: - raise vol.Invalid( + raise probatio.Invalid( "MQTT topic name/filter must not be longer than 65535 encoded bytes." ) for char in validated_topic: if char == "\0": - raise vol.Invalid("MQTT topic name/filter must not contain null character.") + raise probatio.Invalid( + "MQTT topic name/filter must not contain null character." + ) if char <= "\u001f" or "\u007f" <= char <= "\u009f": - raise vol.Invalid( + raise probatio.Invalid( "MQTT topic name/filter must not contain control characters." ) if "\ufdd0" <= char <= "\ufdef" or (ord(char) & 0xFFFF) in (0xFFFE, 0xFFFF): - raise vol.Invalid("MQTT topic name/filter must not contain non-characters.") + raise probatio.Invalid( + "MQTT topic name/filter must not contain non-characters." + ) return validated_topic @@ -282,7 +288,7 @@ def valid_subscribe_topic(topic: Any) -> str: if (i > 0 and validated_topic[i - 1] != "/") or ( i < len(validated_topic) - 1 and validated_topic[i + 1] != "/" ): - raise vol.Invalid( + raise probatio.Invalid( "Single-level wildcard must occupy an entire level of the filter" ) @@ -290,11 +296,11 @@ def valid_subscribe_topic(topic: Any) -> str: if index != -1: if index != len(validated_topic) - 1: # If there are multiple wildcards, this will also trigger - raise vol.Invalid( + raise probatio.Invalid( "Multi-level wildcard must be the last character in the topic filter." ) if len(validated_topic) > 1 and validated_topic[index - 1] != "/": - raise vol.Invalid( + raise probatio.Invalid( "Multi-level wildcard must be after a topic level separator." ) @@ -316,7 +322,7 @@ def valid_publish_topic(topic: Any) -> str: """Validate that we can publish using this MQTT topic.""" validated_topic = valid_topic(topic) if "+" in validated_topic or "#" in validated_topic: - raise vol.Invalid("Wildcards cannot be used in topic names") + raise probatio.Invalid("Wildcards cannot be used in topic names") return validated_topic @@ -326,12 +332,12 @@ def valid_qos_schema(qos: Any) -> int: return validated_qos -_MQTT_WILL_BIRTH_SCHEMA = vol.Schema( +_MQTT_WILL_BIRTH_SCHEMA = probatio.Schema( { - vol.Required(ATTR_TOPIC): valid_publish_topic, - vol.Required(ATTR_PAYLOAD): cv.string, - vol.Optional(ATTR_QOS, default=DEFAULT_QOS): valid_qos_schema, - vol.Optional(ATTR_RETAIN, default=DEFAULT_RETAIN): cv.boolean, + probatio.Required(ATTR_TOPIC): valid_publish_topic, + probatio.Required(ATTR_PAYLOAD): cv.string, + probatio.Optional(ATTR_QOS, default=DEFAULT_QOS): valid_qos_schema, + probatio.Optional(ATTR_RETAIN, default=DEFAULT_RETAIN): cv.boolean, }, required=True, ) diff --git a/homeassistant/components/mqtt/vacuum.py b/homeassistant/components/mqtt/vacuum.py index 1be1fa8d611eb..bc1c95fe10fe7 100644 --- a/homeassistant/components/mqtt/vacuum.py +++ b/homeassistant/components/mqtt/vacuum.py @@ -3,7 +3,7 @@ import logging from typing import Any, cast, override -import voluptuous as vol +import probatio from homeassistant.components import vacuum from homeassistant.components.vacuum import ( @@ -149,7 +149,7 @@ def validate_clean_area_config(config: ConfigType) -> ConfigType: if CONF_CLEAN_SEGMENTS_COMMAND_TOPIC not in config: return config if not config.get(CONF_UNIQUE_ID): - raise vol.Invalid( + raise probatio.Invalid( f"Option `{CONF_CLEAN_SEGMENTS_COMMAND_TOPIC}`" f" requires `{CONF_UNIQUE_ID}` to be configured" ) @@ -159,36 +159,38 @@ def validate_clean_area_config(config: ConfigType) -> ConfigType: _BASE_SCHEMA = MQTT_BASE_SCHEMA.extend( { - vol.Optional(CONF_CLEAN_SEGMENTS_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_CLEAN_SEGMENTS_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_FAN_SPEED_LIST, default=[]): vol.All( + probatio.Optional(CONF_CLEAN_SEGMENTS_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_CLEAN_SEGMENTS_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_FAN_SPEED_LIST, default=[]): probatio.All( cv.ensure_list, [cv.string] ), - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Optional( + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Optional( CONF_PAYLOAD_CLEAN_SPOT, default=DEFAULT_PAYLOAD_CLEAN_SPOT ): cv.string, - vol.Optional(CONF_PAYLOAD_LOCATE, default=DEFAULT_PAYLOAD_LOCATE): cv.string, - vol.Optional( + probatio.Optional( + CONF_PAYLOAD_LOCATE, default=DEFAULT_PAYLOAD_LOCATE + ): cv.string, + probatio.Optional( CONF_PAYLOAD_RETURN_TO_BASE, default=DEFAULT_PAYLOAD_RETURN_TO_BASE ): cv.string, - vol.Optional(CONF_PAYLOAD_START, default=DEFAULT_PAYLOAD_START): cv.string, - vol.Optional(CONF_PAYLOAD_PAUSE, default=DEFAULT_PAYLOAD_PAUSE): cv.string, - vol.Optional(CONF_PAYLOAD_STOP, default=DEFAULT_PAYLOAD_STOP): cv.string, - vol.Optional(CONF_SEND_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_SET_FAN_SPEED_TOPIC): valid_publish_topic, - vol.Optional(CONF_STATE_TOPIC): valid_publish_topic, - vol.Optional(CONF_SUPPORTED_FEATURES, default=DEFAULT_SERVICE_STRINGS): vol.All( - cv.ensure_list, [vol.In(STRING_TO_SERVICE.keys())] - ), - vol.Optional(CONF_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, + probatio.Optional(CONF_PAYLOAD_START, default=DEFAULT_PAYLOAD_START): cv.string, + probatio.Optional(CONF_PAYLOAD_PAUSE, default=DEFAULT_PAYLOAD_PAUSE): cv.string, + probatio.Optional(CONF_PAYLOAD_STOP, default=DEFAULT_PAYLOAD_STOP): cv.string, + probatio.Optional(CONF_SEND_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_SET_FAN_SPEED_TOPIC): valid_publish_topic, + probatio.Optional(CONF_STATE_TOPIC): valid_publish_topic, + probatio.Optional( + CONF_SUPPORTED_FEATURES, default=DEFAULT_SERVICE_STRINGS + ): probatio.All(cv.ensure_list, [probatio.In(STRING_TO_SERVICE.keys())]), + probatio.Optional(CONF_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, } ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) -PLATFORM_SCHEMA_MODERN = vol.All(_BASE_SCHEMA, validate_clean_area_config) -DISCOVERY_SCHEMA = vol.All( - _BASE_SCHEMA.extend({}, extra=vol.ALLOW_EXTRA), validate_clean_area_config +PLATFORM_SCHEMA_MODERN = probatio.All(_BASE_SCHEMA, validate_clean_area_config) +DISCOVERY_SCHEMA = probatio.All( + _BASE_SCHEMA.extend({}, extra=probatio.ALLOW_EXTRA), validate_clean_area_config ) diff --git a/homeassistant/components/mqtt/valve.py b/homeassistant/components/mqtt/valve.py index 4223a8b605fea..d6315610573eb 100644 --- a/homeassistant/components/mqtt/valve.py +++ b/homeassistant/components/mqtt/valve.py @@ -4,7 +4,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components import valve from homeassistant.components.valve import ( @@ -93,7 +93,7 @@ def _validate_and_add_defaults(config: ConfigType) -> ConfigType: """Validate config options and set defaults.""" if config[CONF_REPORTS_POSITION] and any(key in config for key in NO_POSITION_KEYS): - raise vol.Invalid( + raise probatio.Invalid( "Options `payload_open`, `payload_close`, `state_open` and " "`state_closed` are not allowed if the valve reports a position." ) @@ -102,35 +102,35 @@ def _validate_and_add_defaults(config: ConfigType) -> ConfigType: _PLATFORM_SCHEMA_BASE = MQTT_BASE_SCHEMA.extend( { - vol.Optional(CONF_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_DEVICE_CLASS): vol.Any(DEVICE_CLASSES_SCHEMA, None), - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Optional(CONF_OPTIMISTIC, default=DEFAULT_OPTIMISTIC): cv.boolean, - vol.Optional(CONF_PAYLOAD_CLOSE): vol.Any(cv.string, None), - vol.Optional(CONF_PAYLOAD_OPEN): vol.Any(cv.string, None), - vol.Optional(CONF_PAYLOAD_STOP): vol.Any(cv.string, None), - vol.Optional(CONF_POSITION_CLOSED, default=DEFAULT_POSITION_CLOSED): vol.Coerce( - int - ), - vol.Optional(CONF_POSITION_OPEN, default=DEFAULT_POSITION_OPEN): vol.Coerce( - int - ), - vol.Optional(CONF_REPORTS_POSITION, default=False): cv.boolean, - vol.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, - vol.Optional(CONF_STATE_CLOSED): cv.string, - vol.Optional(CONF_STATE_CLOSING, default=ValveState.CLOSING): cv.string, - vol.Optional(CONF_STATE_OPEN): cv.string, - vol.Optional(CONF_STATE_OPENING, default=ValveState.OPENING): cv.string, - vol.Optional(CONF_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_DEVICE_CLASS): probatio.Any(DEVICE_CLASSES_SCHEMA, None), + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Optional(CONF_OPTIMISTIC, default=DEFAULT_OPTIMISTIC): cv.boolean, + probatio.Optional(CONF_PAYLOAD_CLOSE): probatio.Any(cv.string, None), + probatio.Optional(CONF_PAYLOAD_OPEN): probatio.Any(cv.string, None), + probatio.Optional(CONF_PAYLOAD_STOP): probatio.Any(cv.string, None), + probatio.Optional( + CONF_POSITION_CLOSED, default=DEFAULT_POSITION_CLOSED + ): probatio.Coerce(int), + probatio.Optional( + CONF_POSITION_OPEN, default=DEFAULT_POSITION_OPEN + ): probatio.Coerce(int), + probatio.Optional(CONF_REPORTS_POSITION, default=False): cv.boolean, + probatio.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, + probatio.Optional(CONF_STATE_CLOSED): cv.string, + probatio.Optional(CONF_STATE_CLOSING, default=ValveState.CLOSING): cv.string, + probatio.Optional(CONF_STATE_OPEN): cv.string, + probatio.Optional(CONF_STATE_OPENING, default=ValveState.OPENING): cv.string, + probatio.Optional(CONF_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_VALUE_TEMPLATE): cv.template, } ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) -PLATFORM_SCHEMA_MODERN = vol.All(_PLATFORM_SCHEMA_BASE, _validate_and_add_defaults) +PLATFORM_SCHEMA_MODERN = probatio.All(_PLATFORM_SCHEMA_BASE, _validate_and_add_defaults) -DISCOVERY_SCHEMA = vol.All( - _PLATFORM_SCHEMA_BASE.extend({}, extra=vol.REMOVE_EXTRA), +DISCOVERY_SCHEMA = probatio.All( + _PLATFORM_SCHEMA_BASE.extend({}, extra=probatio.REMOVE_EXTRA), _validate_and_add_defaults, ) diff --git a/homeassistant/components/mqtt/water_heater.py b/homeassistant/components/mqtt/water_heater.py index 1f48c357cab3d..03cd20cc7edbc 100644 --- a/homeassistant/components/mqtt/water_heater.py +++ b/homeassistant/components/mqtt/water_heater.py @@ -3,7 +3,7 @@ import logging from typing import TYPE_CHECKING, Any, override -import voluptuous as vol +import probatio from homeassistant.components import water_heater from homeassistant.components.water_heater import ( @@ -112,11 +112,11 @@ _PLATFORM_SCHEMA_BASE = MQTT_BASE_SCHEMA.extend( { - vol.Optional(CONF_CURRENT_TEMP_TEMPLATE): cv.template, - vol.Optional(CONF_CURRENT_TEMP_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_MODE_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_MODE_COMMAND_TOPIC): valid_publish_topic, - vol.Optional( + probatio.Optional(CONF_CURRENT_TEMP_TEMPLATE): cv.template, + probatio.Optional(CONF_CURRENT_TEMP_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_MODE_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_MODE_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional( CONF_MODE_LIST, default=[ STATE_ECO, @@ -128,38 +128,38 @@ STATE_OFF, ], ): cv.ensure_list, - vol.Optional(CONF_MODE_STATE_TEMPLATE): cv.template, - vol.Optional(CONF_MODE_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_NAME): vol.Any(cv.string, None), - vol.Optional(CONF_OPTIMISTIC, default=DEFAULT_OPTIMISTIC): cv.boolean, - vol.Optional(CONF_PAYLOAD_ON, default="ON"): cv.string, - vol.Optional(CONF_PAYLOAD_OFF, default="OFF"): cv.string, - vol.Optional(CONF_POWER_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_POWER_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_PRECISION): vol.All( - vol.Coerce(float), - vol.In([PRECISION_TENTHS, PRECISION_HALVES, PRECISION_WHOLE]), + probatio.Optional(CONF_MODE_STATE_TEMPLATE): cv.template, + probatio.Optional(CONF_MODE_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_NAME): probatio.Any(cv.string, None), + probatio.Optional(CONF_OPTIMISTIC, default=DEFAULT_OPTIMISTIC): cv.boolean, + probatio.Optional(CONF_PAYLOAD_ON, default="ON"): cv.string, + probatio.Optional(CONF_PAYLOAD_OFF, default="OFF"): cv.string, + probatio.Optional(CONF_POWER_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_POWER_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_PRECISION): probatio.All( + probatio.Coerce(float), + probatio.In([PRECISION_TENTHS, PRECISION_HALVES, PRECISION_WHOLE]), ), - vol.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, - vol.Optional(CONF_TEMP_INITIAL): vol.Coerce(float), - vol.Optional(CONF_TEMP_MIN): vol.Coerce(float), - vol.Optional(CONF_TEMP_MAX): vol.Coerce(float), - vol.Optional(CONF_TEMP_COMMAND_TEMPLATE): cv.template, - vol.Optional(CONF_TEMP_COMMAND_TOPIC): valid_publish_topic, - vol.Optional(CONF_TEMP_STATE_TEMPLATE): cv.template, - vol.Optional(CONF_TEMP_STATE_TOPIC): valid_subscribe_topic, - vol.Optional(CONF_TEMPERATURE_UNIT): cv.temperature_unit, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, + probatio.Optional(CONF_TEMP_INITIAL): probatio.Coerce(float), + probatio.Optional(CONF_TEMP_MIN): probatio.Coerce(float), + probatio.Optional(CONF_TEMP_MAX): probatio.Coerce(float), + probatio.Optional(CONF_TEMP_COMMAND_TEMPLATE): cv.template, + probatio.Optional(CONF_TEMP_COMMAND_TOPIC): valid_publish_topic, + probatio.Optional(CONF_TEMP_STATE_TEMPLATE): cv.template, + probatio.Optional(CONF_TEMP_STATE_TOPIC): valid_subscribe_topic, + probatio.Optional(CONF_TEMPERATURE_UNIT): cv.temperature_unit, + probatio.Optional(CONF_VALUE_TEMPLATE): cv.template, } ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema) -PLATFORM_SCHEMA_MODERN = vol.All( +PLATFORM_SCHEMA_MODERN = probatio.All( _PLATFORM_SCHEMA_BASE, ) -_DISCOVERY_SCHEMA_BASE = _PLATFORM_SCHEMA_BASE.extend({}, extra=vol.REMOVE_EXTRA) +_DISCOVERY_SCHEMA_BASE = _PLATFORM_SCHEMA_BASE.extend({}, extra=probatio.REMOVE_EXTRA) -DISCOVERY_SCHEMA = vol.All( +DISCOVERY_SCHEMA = probatio.All( _DISCOVERY_SCHEMA_BASE, ) diff --git a/homeassistant/components/mqtt_eventstream/__init__.py b/homeassistant/components/mqtt_eventstream/__init__.py index 20602e03f81c4..a28e6bb5e2950 100644 --- a/homeassistant/components/mqtt_eventstream/__init__.py +++ b/homeassistant/components/mqtt_eventstream/__init__.py @@ -3,7 +3,7 @@ import json import logging -import voluptuous as vol +import probatio from homeassistant.components import mqtt from homeassistant.components.mqtt import valid_publish_topic, valid_subscribe_topic @@ -31,20 +31,20 @@ CONF_PUBLISH_EVENTSTREAM_RECEIVED = "publish_eventstream_received" CONF_IGNORE_EVENT = "ignore_event" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Optional(CONF_PUBLISH_TOPIC): valid_publish_topic, - vol.Optional(CONF_SUBSCRIBE_TOPIC): valid_subscribe_topic, - vol.Optional( + probatio.Optional(CONF_PUBLISH_TOPIC): valid_publish_topic, + probatio.Optional(CONF_SUBSCRIBE_TOPIC): valid_subscribe_topic, + probatio.Optional( CONF_PUBLISH_EVENTSTREAM_RECEIVED, default=False ): cv.boolean, - vol.Optional(CONF_IGNORE_EVENT, default=[]): cv.ensure_list, + probatio.Optional(CONF_IGNORE_EVENT, default=[]): cv.ensure_list, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) BLOCKED_EVENTS = [ diff --git a/homeassistant/components/mqtt_json/device_tracker.py b/homeassistant/components/mqtt_json/device_tracker.py index 1d5312ff34a0a..10f769114a5d7 100644 --- a/homeassistant/components/mqtt_json/device_tracker.py +++ b/homeassistant/components/mqtt_json/device_tracker.py @@ -3,7 +3,7 @@ import json import logging -import voluptuous as vol +import probatio from homeassistant.components import mqtt from homeassistant.components.device_tracker import ( @@ -24,18 +24,18 @@ _LOGGER = logging.getLogger(__name__) -GPS_JSON_PAYLOAD_SCHEMA = vol.Schema( +GPS_JSON_PAYLOAD_SCHEMA = probatio.Schema( { - vol.Required(ATTR_LATITUDE): vol.Coerce(float), - vol.Required(ATTR_LONGITUDE): vol.Coerce(float), - vol.Optional(ATTR_GPS_ACCURACY): vol.Coerce(int), - vol.Optional(ATTR_BATTERY_LEVEL): vol.Coerce(str), + probatio.Required(ATTR_LATITUDE): probatio.Coerce(float), + probatio.Required(ATTR_LONGITUDE): probatio.Coerce(float), + probatio.Optional(ATTR_GPS_ACCURACY): probatio.Coerce(int), + probatio.Optional(ATTR_BATTERY_LEVEL): probatio.Coerce(str), }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend(mqtt.config.SCHEMA_BASE).extend( - {vol.Required(CONF_DEVICES): {cv.string: mqtt.valid_subscribe_topic}} + {probatio.Required(CONF_DEVICES): {cv.string: mqtt.valid_subscribe_topic}} ) @@ -63,7 +63,7 @@ def async_message_received(msg, dev_id=dev_id): """Handle received MQTT message.""" try: data = GPS_JSON_PAYLOAD_SCHEMA(json.loads(msg.payload)) - except vol.MultipleInvalid: + except probatio.MultipleInvalid: _LOGGER.error( ( "Skipping update for following data " diff --git a/homeassistant/components/mqtt_room/sensor.py b/homeassistant/components/mqtt_room/sensor.py index 7b3d216f87cb3..3f4026560bcff 100644 --- a/homeassistant/components/mqtt_room/sensor.py +++ b/homeassistant/components/mqtt_room/sensor.py @@ -5,7 +5,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components import mqtt from homeassistant.components.mqtt import CONF_STATE_TOPIC @@ -43,11 +43,13 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_DEVICE_ID): cv.string, - vol.Required(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, - vol.Optional(CONF_AWAY_TIMEOUT, default=DEFAULT_AWAY_TIMEOUT): cv.positive_int, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Required(CONF_DEVICE_ID): cv.string, + probatio.Required(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, + probatio.Optional( + CONF_AWAY_TIMEOUT, default=DEFAULT_AWAY_TIMEOUT + ): cv.positive_int, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_UNIQUE_ID): cv.string, } ).extend(mqtt.MQTT_RO_SCHEMA.schema) @@ -58,15 +60,15 @@ def _slugify_upper(string: str) -> str: return slugify(string).upper() -MQTT_PAYLOAD = vol.Schema( - vol.All( +MQTT_PAYLOAD = probatio.Schema( + probatio.All( json_loads, - vol.Schema( + probatio.Schema( { - vol.Required(ATTR_ID): cv.string, - vol.Required(ATTR_DISTANCE): vol.Coerce(float), + probatio.Required(ATTR_ID): cv.string, + probatio.Required(ATTR_DISTANCE): probatio.Coerce(float), }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ), ) ) @@ -143,7 +145,7 @@ def message_received(msg): """Handle new MQTT messages.""" try: data = MQTT_PAYLOAD(msg.payload) - except vol.MultipleInvalid as error: + except probatio.MultipleInvalid as error: _LOGGER.debug("Skipping update because of malformatted data: %s", error) return diff --git a/homeassistant/components/mqtt_statestream/__init__.py b/homeassistant/components/mqtt_statestream/__init__.py index 9a08fa2c73ab7..a2b1674a58ff7 100644 --- a/homeassistant/components/mqtt_statestream/__init__.py +++ b/homeassistant/components/mqtt_statestream/__init__.py @@ -3,7 +3,7 @@ import json import logging -import voluptuous as vol +import probatio from homeassistant.components import mqtt from homeassistant.components.mqtt import valid_publish_topic @@ -24,17 +24,17 @@ DOMAIN = "mqtt_statestream" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { DOMAIN: INCLUDE_EXCLUDE_BASE_FILTER_SCHEMA.extend( { - vol.Required(CONF_BASE_TOPIC): valid_publish_topic, - vol.Optional(CONF_PUBLISH_ATTRIBUTES, default=False): cv.boolean, - vol.Optional(CONF_PUBLISH_TIMESTAMPS, default=False): cv.boolean, + probatio.Required(CONF_BASE_TOPIC): valid_publish_topic, + probatio.Optional(CONF_PUBLISH_ATTRIBUTES, default=False): cv.boolean, + probatio.Optional(CONF_PUBLISH_TIMESTAMPS, default=False): cv.boolean, } ), }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/msteams/notify.py b/homeassistant/components/msteams/notify.py index 623f856ba0c6b..ebaa4f4580523 100644 --- a/homeassistant/components/msteams/notify.py +++ b/homeassistant/components/msteams/notify.py @@ -1,6 +1,6 @@ """Microsoft Teams platform for notify component.""" -import voluptuous as vol +import probatio from homeassistant.components.notify import PLATFORM_SCHEMA as NOTIFY_PLATFORM_SCHEMA from homeassistant.const import CONF_URL @@ -10,7 +10,7 @@ DOMAIN = "msteams" -PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend({vol.Required(CONF_URL): cv.url}) +PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend({probatio.Required(CONF_URL): cv.url}) async def async_get_service( diff --git a/homeassistant/components/mta/config_flow.py b/homeassistant/components/mta/config_flow.py index e0ff26ed3f5b9..ea4a00bae4e32 100644 --- a/homeassistant/components/mta/config_flow.py +++ b/homeassistant/components/mta/config_flow.py @@ -4,8 +4,8 @@ import logging from typing import Any, override +import probatio from pymta import LINE_TO_FEED, BusFeed, MTAFeedError, SubwayFeed -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -93,9 +93,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional(CONF_API_KEY): TextSelector( + probatio.Optional(CONF_API_KEY): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } @@ -131,9 +131,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_LINE): SelectSelector( + probatio.Required(CONF_LINE): SelectSelector( SelectSelectorConfig( options=line_options, mode=SelectSelectorMode.DROPDOWN, @@ -193,9 +193,9 @@ async def async_step_stop( return self.async_show_form( step_id="stop", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_STOP_ID): SelectSelector( + probatio.Required(CONF_STOP_ID): SelectSelector( SelectSelectorConfig( options=stop_options, mode=SelectSelectorMode.DROPDOWN, @@ -273,9 +273,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_ROUTE): TextSelector(), + probatio.Required(CONF_ROUTE): TextSelector(), } ), errors=errors, @@ -321,9 +321,9 @@ async def async_step_stop( return self.async_show_form( step_id="stop", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_STOP_ID): SelectSelector( + probatio.Required(CONF_STOP_ID): SelectSelector( SelectSelectorConfig( options=stop_options, mode=SelectSelectorMode.DROPDOWN, diff --git a/homeassistant/components/music_assistant/config_flow.py b/homeassistant/components/music_assistant/config_flow.py index 7fdec56e03d45..a98b16db71984 100644 --- a/homeassistant/components/music_assistant/config_flow.py +++ b/homeassistant/components/music_assistant/config_flow.py @@ -13,7 +13,7 @@ ) from music_assistant_models.api import ServerInfoMessage from music_assistant_models.errors import AuthenticationFailed, InvalidToken -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -37,8 +37,8 @@ DEFAULT_URL = "http://mass.local:8095" -STEP_USER_SCHEMA = vol.Schema({vol.Required(CONF_URL): str}) -STEP_AUTH_TOKEN_SCHEMA = vol.Schema({vol.Required(CONF_TOKEN): str}) +STEP_USER_SCHEMA = probatio.Schema({probatio.Required(CONF_URL): str}) +STEP_AUTH_TOKEN_SCHEMA = probatio.Schema({probatio.Required(CONF_TOKEN): str}) def _parse_zeroconf_server_info(properties: dict[str, str]) -> ServerInfoMessage: @@ -384,7 +384,7 @@ async def async_step_auth_manual( return self.async_show_form( step_id="auth_manual", - data_schema=vol.Schema({vol.Required(CONF_TOKEN): str}), + data_schema=probatio.Schema({probatio.Required(CONF_TOKEN): str}), description_placeholders={"url": self.url}, errors=errors, ) diff --git a/homeassistant/components/music_assistant/schemas.py b/homeassistant/components/music_assistant/schemas.py index 38d86f7c155d5..1e59eeae90687 100644 --- a/homeassistant/components/music_assistant/schemas.py +++ b/homeassistant/components/music_assistant/schemas.py @@ -1,10 +1,10 @@ -"""Voluptuous schemas for Music Assistant integration service responses.""" +"""Probatio schemas for Music Assistant integration service responses.""" from typing import TYPE_CHECKING, Any from music_assistant_models.enums import ImageType, MediaType from music_assistant_models.media_items import ItemMapping -import voluptuous as vol +import probatio from homeassistant.const import ATTR_NAME from homeassistant.helpers import config_validation as cv @@ -56,19 +56,19 @@ from music_assistant_models.media_items import MediaItemType from music_assistant_models.queue_item import QueueItem -MEDIA_ITEM_SCHEMA = vol.Schema( +MEDIA_ITEM_SCHEMA = probatio.Schema( { - vol.Required(ATTR_MEDIA_TYPE): vol.Coerce(MediaType), - vol.Required(ATTR_URI): cv.string, - vol.Required(ATTR_NAME): cv.string, - vol.Required(ATTR_VERSION): cv.string, - vol.Required(ATTR_IMAGE, default=None): vol.Any(None, cv.string), - vol.Optional(ATTR_FAVORITE): bool, - vol.Optional(ATTR_EXPLICIT): vol.Any(None, bool), - vol.Optional(ATTR_DISCART_IMAGE): vol.Any(None, cv.string), - vol.Optional(ATTR_FANART_IMAGE): vol.Any(None, cv.string), - vol.Optional(ATTR_ARTISTS): [vol.Self], - vol.Optional(ATTR_ALBUM): vol.Self, + probatio.Required(ATTR_MEDIA_TYPE): probatio.Coerce(MediaType), + probatio.Required(ATTR_URI): cv.string, + probatio.Required(ATTR_NAME): cv.string, + probatio.Required(ATTR_VERSION): cv.string, + probatio.Required(ATTR_IMAGE, default=None): probatio.Any(None, cv.string), + probatio.Optional(ATTR_FAVORITE): bool, + probatio.Optional(ATTR_EXPLICIT): probatio.Any(None, bool), + probatio.Optional(ATTR_DISCART_IMAGE): probatio.Any(None, cv.string), + probatio.Optional(ATTR_FANART_IMAGE): probatio.Any(None, cv.string), + probatio.Optional(ATTR_ARTISTS): [probatio.Self], + probatio.Optional(ATTR_ALBUM): probatio.Self, } ) @@ -113,65 +113,67 @@ def media_item_dict_from_mass_item( return result -SEARCH_RESULT_SCHEMA = vol.Schema( +SEARCH_RESULT_SCHEMA = probatio.Schema( { - vol.Required(ATTR_ARTISTS): vol.All( - cv.ensure_list, [vol.Schema(MEDIA_ITEM_SCHEMA)] + probatio.Required(ATTR_ARTISTS): probatio.All( + cv.ensure_list, [probatio.Schema(MEDIA_ITEM_SCHEMA)] ), - vol.Required(ATTR_ALBUMS): vol.All( - cv.ensure_list, [vol.Schema(MEDIA_ITEM_SCHEMA)] + probatio.Required(ATTR_ALBUMS): probatio.All( + cv.ensure_list, [probatio.Schema(MEDIA_ITEM_SCHEMA)] ), - vol.Required(ATTR_TRACKS): vol.All( - cv.ensure_list, [vol.Schema(MEDIA_ITEM_SCHEMA)] + probatio.Required(ATTR_TRACKS): probatio.All( + cv.ensure_list, [probatio.Schema(MEDIA_ITEM_SCHEMA)] ), - vol.Required(ATTR_PLAYLISTS): vol.All( - cv.ensure_list, [vol.Schema(MEDIA_ITEM_SCHEMA)] + probatio.Required(ATTR_PLAYLISTS): probatio.All( + cv.ensure_list, [probatio.Schema(MEDIA_ITEM_SCHEMA)] ), - vol.Required(ATTR_RADIO): vol.All( - cv.ensure_list, [vol.Schema(MEDIA_ITEM_SCHEMA)] + probatio.Required(ATTR_RADIO): probatio.All( + cv.ensure_list, [probatio.Schema(MEDIA_ITEM_SCHEMA)] ), - vol.Required(ATTR_AUDIOBOOKS): vol.All( - cv.ensure_list, [vol.Schema(MEDIA_ITEM_SCHEMA)] + probatio.Required(ATTR_AUDIOBOOKS): probatio.All( + cv.ensure_list, [probatio.Schema(MEDIA_ITEM_SCHEMA)] ), - vol.Required(ATTR_PODCASTS): vol.All( - cv.ensure_list, [vol.Schema(MEDIA_ITEM_SCHEMA)] + probatio.Required(ATTR_PODCASTS): probatio.All( + cv.ensure_list, [probatio.Schema(MEDIA_ITEM_SCHEMA)] ), }, ) -LIBRARY_RESULTS_SCHEMA = vol.Schema( +LIBRARY_RESULTS_SCHEMA = probatio.Schema( { - vol.Required(ATTR_ITEMS): vol.All( - cv.ensure_list, [vol.Schema(MEDIA_ITEM_SCHEMA)] + probatio.Required(ATTR_ITEMS): probatio.All( + cv.ensure_list, [probatio.Schema(MEDIA_ITEM_SCHEMA)] ), - vol.Required(ATTR_LIMIT): int, - vol.Required(ATTR_OFFSET): int, - vol.Required(ATTR_ORDER_BY): str, - vol.Required(ATTR_MEDIA_TYPE): vol.Coerce(MediaType), + probatio.Required(ATTR_LIMIT): int, + probatio.Required(ATTR_OFFSET): int, + probatio.Required(ATTR_ORDER_BY): str, + probatio.Required(ATTR_MEDIA_TYPE): probatio.Coerce(MediaType), } ) -AUDIO_FORMAT_SCHEMA = vol.Schema( +AUDIO_FORMAT_SCHEMA = probatio.Schema( { - vol.Required(ATTR_PROVIDER): str, - vol.Required(ATTR_ITEM_ID): str, - vol.Required(ATTR_CONTENT_TYPE): str, - vol.Required(ATTR_SAMPLE_RATE): int, - vol.Required(ATTR_BIT_DEPTH): int, - vol.Optional(ATTR_BITRATE): int, + probatio.Required(ATTR_PROVIDER): str, + probatio.Required(ATTR_ITEM_ID): str, + probatio.Required(ATTR_CONTENT_TYPE): str, + probatio.Required(ATTR_SAMPLE_RATE): int, + probatio.Required(ATTR_BIT_DEPTH): int, + probatio.Optional(ATTR_BITRATE): int, } ) -QUEUE_ITEM_SCHEMA = vol.Schema( +QUEUE_ITEM_SCHEMA = probatio.Schema( { - vol.Required(ATTR_QUEUE_ITEM_ID): cv.string, - vol.Required(ATTR_NAME): cv.string, - vol.Optional(ATTR_DURATION, default=None): vol.Any(None, int), - vol.Optional(ATTR_MEDIA_ITEM, default=None): vol.Any( - None, vol.Schema(MEDIA_ITEM_SCHEMA) + probatio.Required(ATTR_QUEUE_ITEM_ID): cv.string, + probatio.Required(ATTR_NAME): cv.string, + probatio.Optional(ATTR_DURATION, default=None): probatio.Any(None, int), + probatio.Optional(ATTR_MEDIA_ITEM, default=None): probatio.Any( + None, probatio.Schema(MEDIA_ITEM_SCHEMA) ), - vol.Optional(ATTR_STREAM_TITLE, default=None): vol.Any(None, cv.string), - vol.Optional(ATTR_STREAM_DETAILS): vol.Schema(AUDIO_FORMAT_SCHEMA), + probatio.Optional(ATTR_STREAM_TITLE, default=None): probatio.Any( + None, cv.string + ), + probatio.Optional(ATTR_STREAM_DETAILS): probatio.Schema(AUDIO_FORMAT_SCHEMA), } ) @@ -209,17 +211,17 @@ def queue_item_dict_from_mass_item( return result -QUEUE_DETAILS_SCHEMA = vol.Schema( +QUEUE_DETAILS_SCHEMA = probatio.Schema( { - vol.Required(ATTR_QUEUE_ID): str, - vol.Required(ATTR_ACTIVE): bool, - vol.Required(ATTR_NAME): str, - vol.Required(ATTR_ITEMS): int, - vol.Required(ATTR_SHUFFLE_ENABLED): bool, - vol.Required(ATTR_REPEAT_MODE): str, - vol.Required(ATTR_CURRENT_INDEX): vol.Any(None, int), - vol.Required(ATTR_ELAPSED_TIME): vol.Coerce(int), - vol.Required(ATTR_CURRENT_ITEM): vol.Any(None, QUEUE_ITEM_SCHEMA), - vol.Required(ATTR_NEXT_ITEM): vol.Any(None, QUEUE_ITEM_SCHEMA), + probatio.Required(ATTR_QUEUE_ID): str, + probatio.Required(ATTR_ACTIVE): bool, + probatio.Required(ATTR_NAME): str, + probatio.Required(ATTR_ITEMS): int, + probatio.Required(ATTR_SHUFFLE_ENABLED): bool, + probatio.Required(ATTR_REPEAT_MODE): str, + probatio.Required(ATTR_CURRENT_INDEX): probatio.Any(None, int), + probatio.Required(ATTR_ELAPSED_TIME): probatio.Coerce(int), + probatio.Required(ATTR_CURRENT_ITEM): probatio.Any(None, QUEUE_ITEM_SCHEMA), + probatio.Required(ATTR_NEXT_ITEM): probatio.Any(None, QUEUE_ITEM_SCHEMA), } ) diff --git a/homeassistant/components/music_assistant/services.py b/homeassistant/components/music_assistant/services.py index 631c2132afcc2..140202c06b331 100644 --- a/homeassistant/components/music_assistant/services.py +++ b/homeassistant/components/music_assistant/services.py @@ -3,7 +3,7 @@ from typing import TYPE_CHECKING from music_assistant_models.enums import MediaType, QueueOption -import voluptuous as vol +import probatio from homeassistant.components.media_player import ( ATTR_MEDIA_ENQUEUE, @@ -94,18 +94,18 @@ def register_actions(hass: HomeAssistant) -> None: DOMAIN, SERVICE_SEARCH, handle_search, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): str, - vol.Required(ATTR_SEARCH_NAME): cv.string, - vol.Optional(ATTR_MEDIA_TYPE): vol.All( - cv.ensure_list, [vol.Coerce(MediaType)] + probatio.Required(ATTR_CONFIG_ENTRY_ID): str, + probatio.Required(ATTR_SEARCH_NAME): cv.string, + probatio.Optional(ATTR_MEDIA_TYPE): probatio.All( + cv.ensure_list, [probatio.Coerce(MediaType)] ), - vol.Optional(ATTR_SEARCH_ARTIST): cv.string, - vol.Optional(ATTR_SEARCH_ALBUM): cv.string, - vol.Optional(ATTR_LIMIT, default=5): vol.Coerce(int), - vol.Optional(ATTR_LIBRARY_ONLY, default=False): cv.boolean, - vol.Optional(ATTR_USERNAME): cv.string, + probatio.Optional(ATTR_SEARCH_ARTIST): cv.string, + probatio.Optional(ATTR_SEARCH_ALBUM): cv.string, + probatio.Optional(ATTR_LIMIT, default=5): probatio.Coerce(int), + probatio.Optional(ATTR_LIBRARY_ONLY, default=False): cv.boolean, + probatio.Optional(ATTR_USERNAME): cv.string, } ), supports_response=SupportsResponse.ONLY, @@ -114,18 +114,18 @@ def register_actions(hass: HomeAssistant) -> None: DOMAIN, SERVICE_GET_LIBRARY, handle_get_library, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): str, - vol.Required(ATTR_MEDIA_TYPE): vol.Coerce(MediaType), - vol.Optional(ATTR_FAVORITE): cv.boolean, - vol.Optional(ATTR_SEARCH): cv.string, - vol.Optional(ATTR_LIMIT): cv.positive_int, - vol.Optional(ATTR_OFFSET): int, - vol.Optional(ATTR_ORDER_BY): cv.string, - vol.Optional(ATTR_ALBUM_TYPE): list[MediaType], - vol.Optional(ATTR_ALBUM_ARTISTS_ONLY): cv.boolean, - vol.Optional(ATTR_USERNAME): cv.string, + probatio.Required(ATTR_CONFIG_ENTRY_ID): str, + probatio.Required(ATTR_MEDIA_TYPE): probatio.Coerce(MediaType), + probatio.Optional(ATTR_FAVORITE): cv.boolean, + probatio.Optional(ATTR_SEARCH): cv.string, + probatio.Optional(ATTR_LIMIT): cv.positive_int, + probatio.Optional(ATTR_OFFSET): int, + probatio.Optional(ATTR_ORDER_BY): cv.string, + probatio.Optional(ATTR_ALBUM_TYPE): list[MediaType], + probatio.Optional(ATTR_ALBUM_ARTISTS_ONLY): cv.boolean, + probatio.Optional(ATTR_USERNAME): cv.string, } ), supports_response=SupportsResponse.ONLY, @@ -138,13 +138,13 @@ def register_actions(hass: HomeAssistant) -> None: SERVICE_PLAY_MEDIA_ADVANCED, entity_domain=MEDIA_PLAYER_DOMAIN, schema={ - vol.Required(ATTR_MEDIA_ID): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(ATTR_MEDIA_TYPE): vol.Coerce(MediaType), - vol.Optional(ATTR_MEDIA_ENQUEUE): vol.Coerce(QueueOption), - vol.Optional(ATTR_ARTIST): cv.string, - vol.Optional(ATTR_ALBUM): cv.string, - vol.Optional(ATTR_RADIO_MODE): vol.Coerce(bool), - vol.Optional(ATTR_USERNAME): cv.string, + probatio.Required(ATTR_MEDIA_ID): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(ATTR_MEDIA_TYPE): probatio.Coerce(MediaType), + probatio.Optional(ATTR_MEDIA_ENQUEUE): probatio.Coerce(QueueOption), + probatio.Optional(ATTR_ARTIST): cv.string, + probatio.Optional(ATTR_ALBUM): cv.string, + probatio.Optional(ATTR_RADIO_MODE): probatio.Coerce(bool), + probatio.Optional(ATTR_USERNAME): cv.string, }, func="_async_handle_play_media", ) @@ -153,17 +153,17 @@ def register_actions(hass: HomeAssistant) -> None: DOMAIN, SERVICE_PLAY_ANNOUNCEMENT, entity_domain=MEDIA_PLAYER_DOMAIN, - schema=vol.All( + schema=probatio.All( cv.make_entity_service_schema( { - vol.Optional(ATTR_URL): cv.string, - vol.Inclusive(ATTR_MESSAGE, "spoken_announcement"): cv.string, - vol.Inclusive(ATTR_TTS_ENTITY_ID, "spoken_announcement"): vol.All( - cv.entity_id, cv.entity_domain(TTS_DOMAIN) - ), - vol.Optional(ATTR_USE_PRE_ANNOUNCE): vol.Coerce(bool), - vol.Optional(ATTR_PRE_ANNOUNCE_URL): cv.string, - vol.Optional(ATTR_ANNOUNCE_VOLUME): vol.Coerce(int), + probatio.Optional(ATTR_URL): cv.string, + probatio.Inclusive(ATTR_MESSAGE, "spoken_announcement"): cv.string, + probatio.Inclusive( + ATTR_TTS_ENTITY_ID, "spoken_announcement" + ): probatio.All(cv.entity_id, cv.entity_domain(TTS_DOMAIN)), + probatio.Optional(ATTR_USE_PRE_ANNOUNCE): probatio.Coerce(bool), + probatio.Optional(ATTR_PRE_ANNOUNCE_URL): cv.string, + probatio.Optional(ATTR_ANNOUNCE_VOLUME): probatio.Coerce(int), } ), cv.has_at_least_one_key(ATTR_URL, ATTR_MESSAGE), @@ -177,8 +177,8 @@ def register_actions(hass: HomeAssistant) -> None: SERVICE_TRANSFER_QUEUE, entity_domain=MEDIA_PLAYER_DOMAIN, schema={ - vol.Optional(ATTR_SOURCE_PLAYER): cv.entity_id, - vol.Optional(ATTR_AUTO_PLAY): vol.Coerce(bool), + probatio.Optional(ATTR_SOURCE_PLAYER): cv.entity_id, + probatio.Optional(ATTR_AUTO_PLAY): probatio.Coerce(bool), }, func="_async_handle_transfer_queue", ) diff --git a/homeassistant/components/mutesync/config_flow.py b/homeassistant/components/mutesync/config_flow.py index 87adaa3ac82e9..b110002c076d7 100644 --- a/homeassistant/components/mutesync/config_flow.py +++ b/homeassistant/components/mutesync/config_flow.py @@ -6,7 +6,7 @@ import aiohttp import mutesync -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.core import HomeAssistant @@ -17,7 +17,7 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema({vol.Required("host"): str}) +STEP_USER_DATA_SCHEMA = probatio.Schema({probatio.Required("host"): str}) async def validate_input(hass: HomeAssistant, data: dict[str, Any]) -> dict[str, Any]: diff --git a/homeassistant/components/mvglive/sensor.py b/homeassistant/components/mvglive/sensor.py index 45d362792b623..2540d59c11591 100644 --- a/homeassistant/components/mvglive/sensor.py +++ b/homeassistant/components/mvglive/sensor.py @@ -7,7 +7,7 @@ from typing import Any, override from mvg import MvgApi, MvgApiError, TransportType -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -49,22 +49,26 @@ SCAN_INTERVAL = timedelta(seconds=30) -PLATFORM_SCHEMA = vol.All( +PLATFORM_SCHEMA = probatio.All( cv.deprecated(CONF_DIRECTIONS), SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_NEXT_DEPARTURE): [ + probatio.Required(CONF_NEXT_DEPARTURE): [ { - vol.Required(CONF_STATION): cv.string, - vol.Optional(CONF_DESTINATIONS, default=[""]): cv.ensure_list_csv, - vol.Optional(CONF_DIRECTIONS, default=[""]): cv.ensure_list_csv, - vol.Optional(CONF_LINES, default=[""]): cv.ensure_list_csv, - vol.Optional( + probatio.Required(CONF_STATION): cv.string, + probatio.Optional( + CONF_DESTINATIONS, default=[""] + ): cv.ensure_list_csv, + probatio.Optional( + CONF_DIRECTIONS, default=[""] + ): cv.ensure_list_csv, + probatio.Optional(CONF_LINES, default=[""]): cv.ensure_list_csv, + probatio.Optional( CONF_PRODUCTS, default=DEFAULT_PRODUCT ): cv.ensure_list_csv, - vol.Optional(CONF_TIMEOFFSET, default=0): cv.positive_int, - vol.Optional(CONF_NUMBER, default=1): cv.positive_int, - vol.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_TIMEOFFSET, default=0): cv.positive_int, + probatio.Optional(CONF_NUMBER, default=1): cv.positive_int, + probatio.Optional(CONF_NAME): cv.string, } ] } diff --git a/homeassistant/components/my_pv/config_flow.py b/homeassistant/components/my_pv/config_flow.py index 0ee97e66aed89..78811ab00af3a 100644 --- a/homeassistant/components/my_pv/config_flow.py +++ b/homeassistant/components/my_pv/config_flow.py @@ -5,7 +5,7 @@ from my_pv import MyPVLocalDevice from my_pv.exceptions import MyPVAuthenticationError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_BASE, CONF_HOST, CONF_PASSWORD @@ -23,14 +23,14 @@ _LOGGER: Final = logging.getLogger(__name__) -HOST_SCHEMA: Final = vol.Schema( +HOST_SCHEMA: Final = probatio.Schema( { - vol.Required(CONF_HOST): TextSelector(), + probatio.Required(CONF_HOST): TextSelector(), } ) -AUTH_SCHEMA: Final = vol.Schema( +AUTH_SCHEMA: Final = probatio.Schema( { - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } diff --git a/homeassistant/components/myneomitis/config_flow.py b/homeassistant/components/myneomitis/config_flow.py index 111699a36afa7..4a790014dc7d3 100644 --- a/homeassistant/components/myneomitis/config_flow.py +++ b/homeassistant/components/myneomitis/config_flow.py @@ -4,8 +4,8 @@ from typing import Any, override import aiohttp +import probatio from pyaxencoapi import PyAxencoAPI -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_EMAIL, CONF_PASSWORD @@ -69,10 +69,10 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_EMAIL): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_EMAIL): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, diff --git a/homeassistant/components/mysensors/config_flow.py b/homeassistant/components/mysensors/config_flow.py index cc0ed3b313521..efc09765e1c91 100644 --- a/homeassistant/components/mysensors/config_flow.py +++ b/homeassistant/components/mysensors/config_flow.py @@ -8,7 +8,7 @@ AwesomeVersionStrategy, AwesomeVersionStrategyException, ) -import voluptuous as vol +import probatio from homeassistant.components.mqtt import ( DOMAIN as MQTT_DOMAIN, @@ -42,13 +42,13 @@ DEFAULT_TCP_PORT = 5003 DEFAULT_VERSION = "1.4" -_PORT_SELECTOR = vol.All( +_PORT_SELECTOR = probatio.All( selector.NumberSelector( selector.NumberSelectorConfig( min=1, max=65535, mode=selector.NumberSelectorMode.BOX ), ), - vol.Coerce(int), + probatio.Coerce(int), ) @@ -56,19 +56,19 @@ def is_persistence_file(value: str) -> str: """Validate that persistence file path ends in either .pickle or .json.""" if value.endswith((".json", ".pickle")): return value - raise vol.Invalid(f"{value} does not end in either `.json` or `.pickle`") + raise probatio.Invalid(f"{value} does not end in either `.json` or `.pickle`") def _get_schema_common(user_input: dict[str, str]) -> dict: """Create a schema with options common to all gateway types.""" return { - vol.Required( + probatio.Required( CONF_VERSION, description={ "suggested_value": user_input.get(CONF_VERSION, DEFAULT_VERSION) }, ): str, - vol.Optional(CONF_PERSISTENCE_FILE): str, + probatio.Optional(CONF_PERSISTENCE_FILE): str, } @@ -154,10 +154,10 @@ async def async_step_gw_serial( user_input = user_input or {} schema: VolDictType = { - vol.Required( + probatio.Required( CONF_DEVICE, default=user_input.get(CONF_DEVICE, "/dev/ttyACM0") ): str, - vol.Required( + probatio.Required( CONF_BAUD_RATE, default=user_input.get(CONF_BAUD_RATE, DEFAULT_BAUD_RATE), ): cv.positive_int, @@ -165,7 +165,7 @@ async def async_step_gw_serial( schema.update(_get_schema_common(user_input)) return self.async_show_form( - step_id="gw_serial", data_schema=vol.Schema(schema), errors=errors + step_id="gw_serial", data_schema=probatio.Schema(schema), errors=errors ) async def async_step_gw_tcp( @@ -182,17 +182,17 @@ async def async_step_gw_tcp( user_input = user_input or {} schema: VolDictType = { - vol.Required( + probatio.Required( CONF_DEVICE, default=user_input.get(CONF_DEVICE, "127.0.0.1") ): str, - vol.Optional( + probatio.Optional( CONF_TCP_PORT, default=user_input.get(CONF_TCP_PORT, DEFAULT_TCP_PORT) ): _PORT_SELECTOR, } schema.update(_get_schema_common(user_input)) return self.async_show_form( - step_id="gw_tcp", data_schema=vol.Schema(schema), errors=errors + step_id="gw_tcp", data_schema=probatio.Schema(schema), errors=errors ) def _check_topic_exists(self, topic: str) -> bool: @@ -219,7 +219,7 @@ async def async_step_gw_mqtt( try: valid_subscribe_topic(user_input[CONF_TOPIC_IN_PREFIX]) - except vol.Invalid: + except probatio.Invalid: errors[CONF_TOPIC_IN_PREFIX] = "invalid_subscribe_topic" else: if self._check_topic_exists(user_input[CONF_TOPIC_IN_PREFIX]): @@ -227,7 +227,7 @@ async def async_step_gw_mqtt( try: valid_publish_topic(user_input[CONF_TOPIC_OUT_PREFIX]) - except vol.Invalid: + except probatio.Invalid: errors[CONF_TOPIC_OUT_PREFIX] = "invalid_publish_topic" if not errors: if ( @@ -244,18 +244,20 @@ async def async_step_gw_mqtt( user_input = user_input or {} schema: VolDictType = { - vol.Required( + probatio.Required( CONF_TOPIC_IN_PREFIX, default=user_input.get(CONF_TOPIC_IN_PREFIX, "") ): str, - vol.Required( + probatio.Required( CONF_TOPIC_OUT_PREFIX, default=user_input.get(CONF_TOPIC_OUT_PREFIX, "") ): str, - vol.Required(CONF_RETAIN, default=user_input.get(CONF_RETAIN, True)): bool, + probatio.Required( + CONF_RETAIN, default=user_input.get(CONF_RETAIN, True) + ): bool, } schema.update(_get_schema_common(user_input)) return self.async_show_form( - step_id="gw_mqtt", data_schema=vol.Schema(schema), errors=errors + step_id="gw_mqtt", data_schema=probatio.Schema(schema), errors=errors ) @callback @@ -288,7 +290,7 @@ async def validate_common( await self.hass.async_add_executor_job( verification_func, user_input[CONF_DEVICE] ) - except vol.Invalid: + except probatio.Invalid: errors[CONF_DEVICE] = ( "invalid_ip" if gw_type == CONF_GATEWAY_TYPE_TCP @@ -297,7 +299,7 @@ async def validate_common( if CONF_PERSISTENCE_FILE in user_input: try: is_persistence_file(user_input[CONF_PERSISTENCE_FILE]) - except vol.Invalid: + except probatio.Invalid: errors[CONF_PERSISTENCE_FILE] = "invalid_persistence_file" else: real_persistence_path = user_input[CONF_PERSISTENCE_FILE] = ( diff --git a/homeassistant/components/mysensors/gateway.py b/homeassistant/components/mysensors/gateway.py index 466826d75d7bb..8ef361d482617 100644 --- a/homeassistant/components/mysensors/gateway.py +++ b/homeassistant/components/mysensors/gateway.py @@ -9,7 +9,7 @@ from typing import Any from mysensors import BaseAsyncGateway, Message, Sensor, get_const, mysensors -import voluptuous as vol +import probatio from homeassistant.components.mqtt import ( DOMAIN as MQTT_DOMAIN, @@ -58,7 +58,7 @@ def is_serial_port(value: str) -> str: ports = (f"COM{idx + 1}" for idx in range(256)) if value in ports: return value - raise vol.Invalid(f"{value} is not a serial port") + raise probatio.Invalid(f"{value} is not a serial port") return cv.isdevice(value) @@ -67,7 +67,9 @@ def is_socket_address(value: str) -> str: try: socket.getaddrinfo(value, None) except OSError as err: - raise vol.Invalid("Device is not a valid domain name or ip address") from err + raise probatio.Invalid( + "Device is not a valid domain name or ip address" + ) from err return value diff --git a/homeassistant/components/mysensors/helpers.py b/homeassistant/components/mysensors/helpers.py index 0b739065f021f..24d1b6a320f58 100644 --- a/homeassistant/components/mysensors/helpers.py +++ b/homeassistant/components/mysensors/helpers.py @@ -8,7 +8,7 @@ from mysensors import BaseAsyncGateway, Message from mysensors.sensor import ChildSensor -import voluptuous as vol +import probatio from homeassistant.const import CONF_NAME, Platform from homeassistant.core import HomeAssistant, callback @@ -34,7 +34,8 @@ _LOGGER = logging.getLogger(__name__) SCHEMAS: Registry[ - tuple[str, str], Callable[[BaseAsyncGateway, ChildSensor, ValueType], vol.Schema] + tuple[str, str], + Callable[[BaseAsyncGateway, ChildSensor, ValueType], probatio.Schema], ] = Registry() @@ -85,7 +86,7 @@ def remove_node_dev_ids(entry: MySensorsConfigEntry, node_id: int) -> None: def default_schema( gateway: BaseAsyncGateway, child: ChildSensor, value_type_name: ValueType -) -> vol.Schema: +) -> probatio.Schema: """Return a default validation schema for value types.""" schema = {value_type_name: cv.string} return get_child_schema(gateway, child, value_type_name, schema) @@ -94,7 +95,7 @@ def default_schema( @SCHEMAS.register(("light", "V_DIMMER")) def light_dimmer_schema( gateway: BaseAsyncGateway, child: ChildSensor, value_type_name: ValueType -) -> vol.Schema: +) -> probatio.Schema: """Return a validation schema for V_DIMMER.""" schema = {"V_DIMMER": cv.string, "V_LIGHT": cv.string} return get_child_schema(gateway, child, value_type_name, schema) @@ -103,7 +104,7 @@ def light_dimmer_schema( @SCHEMAS.register(("light", "V_PERCENTAGE")) def light_percentage_schema( gateway: BaseAsyncGateway, child: ChildSensor, value_type_name: ValueType -) -> vol.Schema: +) -> probatio.Schema: """Return a validation schema for V_PERCENTAGE.""" schema = {"V_PERCENTAGE": cv.string, "V_STATUS": cv.string} return get_child_schema(gateway, child, value_type_name, schema) @@ -112,7 +113,7 @@ def light_percentage_schema( @SCHEMAS.register(("light", "V_RGB")) def light_rgb_schema( gateway: BaseAsyncGateway, child: ChildSensor, value_type_name: ValueType -) -> vol.Schema: +) -> probatio.Schema: """Return a validation schema for V_RGB.""" schema = {"V_RGB": cv.string, "V_STATUS": cv.string} return get_child_schema(gateway, child, value_type_name, schema) @@ -121,7 +122,7 @@ def light_rgb_schema( @SCHEMAS.register(("light", "V_RGBW")) def light_rgbw_schema( gateway: BaseAsyncGateway, child: ChildSensor, value_type_name: ValueType -) -> vol.Schema: +) -> probatio.Schema: """Return a validation schema for V_RGBW.""" schema = {"V_RGBW": cv.string, "V_STATUS": cv.string} return get_child_schema(gateway, child, value_type_name, schema) @@ -130,7 +131,7 @@ def light_rgbw_schema( @SCHEMAS.register(("switch", "V_IR_SEND")) def switch_ir_send_schema( gateway: BaseAsyncGateway, child: ChildSensor, value_type_name: ValueType -) -> vol.Schema: +) -> probatio.Schema: """Return a validation schema for V_IR_SEND.""" schema = {"V_IR_SEND": cv.string, "V_LIGHT": cv.string} return get_child_schema(gateway, child, value_type_name, schema) @@ -141,18 +142,18 @@ def get_child_schema( child: ChildSensor, value_type_name: ValueType, schema: dict, -) -> vol.Schema: +) -> probatio.Schema: """Return a child schema.""" set_req = gateway.const.SetReq - child_schema = cast(vol.Schema, child.get_schema(gateway.protocol_version)) + child_schema = cast(probatio.Schema, child.get_schema(gateway.protocol_version)) return child_schema.extend( { - vol.Required( + probatio.Required( set_req[name].value, msg=invalid_msg(gateway, child, name) ): child_schema.schema.get(set_req[name].value, valid) for name, valid in schema.items() }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) @@ -229,7 +230,7 @@ def validate_child( child_schema = child_schema_gen(gateway, child, v_name) try: child_schema(child.values) - except vol.Invalid as exc: + except probatio.Invalid as exc: _LOGGER.warning( "Invalid %s on node %s, %s platform: %s", child, diff --git a/homeassistant/components/mystrom/config_flow.py b/homeassistant/components/mystrom/config_flow.py index 17106008eddfa..cbad3067311d2 100644 --- a/homeassistant/components/mystrom/config_flow.py +++ b/homeassistant/components/mystrom/config_flow.py @@ -3,9 +3,9 @@ import logging from typing import TYPE_CHECKING, Any, override +import probatio import pymystrom from pymystrom.exceptions import MyStromConnectionError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_NAME @@ -17,12 +17,12 @@ DEFAULT_NAME = "myStrom Device" -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Optional(CONF_NAME, default=DEFAULT_NAME): str, - vol.Required(CONF_HOST): str, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): str, + probatio.Required(CONF_HOST): str, } ) diff --git a/homeassistant/components/mythicbeastsdns/__init__.py b/homeassistant/components/mythicbeastsdns/__init__.py index 58ac6051c8ac6..00127b10ee218 100644 --- a/homeassistant/components/mythicbeastsdns/__init__.py +++ b/homeassistant/components/mythicbeastsdns/__init__.py @@ -3,7 +3,7 @@ from datetime import timedelta import mbddns -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_DOMAIN, @@ -21,20 +21,20 @@ DEFAULT_INTERVAL = timedelta(minutes=10) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_DOMAIN): cv.string, - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_SCAN_INTERVAL, default=DEFAULT_INTERVAL): vol.All( - cv.time_period, cv.positive_timedelta - ), + probatio.Required(CONF_DOMAIN): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Optional( + CONF_SCAN_INTERVAL, default=DEFAULT_INTERVAL + ): probatio.All(cv.time_period, cv.positive_timedelta), } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/nad/media_player.py b/homeassistant/components/nad/media_player.py index d666fca9c6beb..c67a77f350dc1 100644 --- a/homeassistant/components/nad/media_player.py +++ b/homeassistant/components/nad/media_player.py @@ -3,7 +3,7 @@ from typing import override from nad_receiver import NADReceiver, NADReceiverTCP, NADReceiverTelnet -import voluptuous as vol +import probatio from homeassistant.components.media_player import ( PLATFORM_SCHEMA as MEDIA_PLAYER_PLATFORM_SCHEMA, @@ -41,21 +41,21 @@ CONF_SOURCE_DICT = "sources" # for NADReceiver # Max value based on a C658 with an MDC HDM-2 card installed -SOURCE_DICT_SCHEMA = vol.Schema({vol.Range(min=1, max=12): cv.string}) +SOURCE_DICT_SCHEMA = probatio.Schema({probatio.Range(min=1, max=12): cv.string}) PLATFORM_SCHEMA = MEDIA_PLAYER_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_TYPE, default=DEFAULT_TYPE): vol.In( + probatio.Optional(CONF_TYPE, default=DEFAULT_TYPE): probatio.In( ["RS232", "Telnet", "TCP"] ), - vol.Optional(CONF_SERIAL_PORT, default=DEFAULT_SERIAL_PORT): cv.string, - vol.Optional(CONF_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): int, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_MIN_VOLUME, default=DEFAULT_MIN_VOLUME): int, - vol.Optional(CONF_MAX_VOLUME, default=DEFAULT_MAX_VOLUME): int, - vol.Optional(CONF_SOURCE_DICT, default={}): SOURCE_DICT_SCHEMA, - vol.Optional(CONF_VOLUME_STEP, default=DEFAULT_VOLUME_STEP): int, + probatio.Optional(CONF_SERIAL_PORT, default=DEFAULT_SERIAL_PORT): cv.string, + probatio.Optional(CONF_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_MIN_VOLUME, default=DEFAULT_MIN_VOLUME): int, + probatio.Optional(CONF_MAX_VOLUME, default=DEFAULT_MAX_VOLUME): int, + probatio.Optional(CONF_SOURCE_DICT, default={}): SOURCE_DICT_SCHEMA, + probatio.Optional(CONF_VOLUME_STEP, default=DEFAULT_VOLUME_STEP): int, } ) diff --git a/homeassistant/components/nam/config_flow.py b/homeassistant/components/nam/config_flow.py index 0796365954a04..2055253d44a57 100644 --- a/homeassistant/components/nam/config_flow.py +++ b/homeassistant/components/nam/config_flow.py @@ -12,7 +12,7 @@ ConnectionOptions, NettigoAirMonitor, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME @@ -25,8 +25,8 @@ _LOGGER = logging.getLogger(__name__) -AUTH_SCHEMA = vol.Schema( - {vol.Required(CONF_USERNAME): str, vol.Required(CONF_PASSWORD): str} +AUTH_SCHEMA = probatio.Schema( + {probatio.Required(CONF_USERNAME): str, probatio.Required(CONF_PASSWORD): str} ) @@ -80,7 +80,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_HOST): str}), + data_schema=probatio.Schema({probatio.Required(CONF_HOST): str}), errors=errors, ) @@ -220,9 +220,9 @@ async def async_step_reconfigure( return self.async_show_form( step_id="reconfigure", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST, default=self.host): str, + probatio.Required(CONF_HOST, default=self.host): str, } ), description_placeholders={"device_name": reconfigure_entry.title}, diff --git a/homeassistant/components/namecheapdns/config_flow.py b/homeassistant/components/namecheapdns/config_flow.py index 53038402233df..34612872b6bf4 100644 --- a/homeassistant/components/namecheapdns/config_flow.py +++ b/homeassistant/components/namecheapdns/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from aiohttp import ClientError -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_DOMAIN, CONF_HOST, CONF_NAME, CONF_PASSWORD @@ -23,11 +23,11 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST, default="@"): cv.string, - vol.Required(CONF_DOMAIN): cv.string, - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_HOST, default="@"): cv.string, + probatio.Required(CONF_DOMAIN): cv.string, + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password" ) @@ -35,9 +35,9 @@ } ) -STEP_RECONFIGURE_DATA_SCHEMA = vol.Schema( +STEP_RECONFIGURE_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password" ) diff --git a/homeassistant/components/nanoleaf/config_flow.py b/homeassistant/components/nanoleaf/config_flow.py index bd8ddf7d2739b..0723354f4d8a1 100644 --- a/homeassistant/components/nanoleaf/config_flow.py +++ b/homeassistant/components/nanoleaf/config_flow.py @@ -6,7 +6,7 @@ from typing import Any, Final, cast, override from aionanoleaf2 import InvalidToken, Nanoleaf, Unauthorized, Unavailable -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -31,9 +31,9 @@ # For discovery integration import CONFIG_FILE: Final = ".nanoleaf.conf" -USER_SCHEMA: Final = vol.Schema( +USER_SCHEMA: Final = probatio.Schema( { - vol.Required(CONF_HOST): str, + probatio.Required(CONF_HOST): str, } ) diff --git a/homeassistant/components/nanoleaf/device_trigger.py b/homeassistant/components/nanoleaf/device_trigger.py index df4a1d6d9eb9d..a3a701ce5a964 100644 --- a/homeassistant/components/nanoleaf/device_trigger.py +++ b/homeassistant/components/nanoleaf/device_trigger.py @@ -1,6 +1,6 @@ """Provides device triggers for Nanoleaf.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import ( DEVICE_TRIGGER_BASE_SCHEMA, @@ -26,9 +26,9 @@ TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_DOMAIN): DOMAIN, - vol.Required(CONF_DEVICE_ID): str, - vol.Required(CONF_TYPE): vol.In(TRIGGER_TYPES), + probatio.Required(CONF_DOMAIN): DOMAIN, + probatio.Required(CONF_DEVICE_ID): str, + probatio.Required(CONF_TYPE): probatio.In(TRIGGER_TYPES), } ) diff --git a/homeassistant/components/nasweb/config_flow.py b/homeassistant/components/nasweb/config_flow.py index f70b1a0b579e0..67bcecf394ec5 100644 --- a/homeassistant/components/nasweb/config_flow.py +++ b/homeassistant/components/nasweb/config_flow.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from webio_api import WebioAPI from webio_api.api_client import AuthError @@ -25,11 +25,11 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/neato/services.py b/homeassistant/components/neato/services.py index 184c83e1eb5d0..0f60954f2c085 100644 --- a/homeassistant/components/neato/services.py +++ b/homeassistant/components/neato/services.py @@ -1,6 +1,6 @@ """Neato services.""" -import voluptuous as vol +import probatio from homeassistant.components.vacuum import DOMAIN as VACUUM_DOMAIN from homeassistant.const import ATTR_MODE @@ -25,10 +25,10 @@ def async_setup_services(hass: HomeAssistant) -> None: "custom_cleaning", entity_domain=VACUUM_DOMAIN, schema={ - vol.Optional(ATTR_MODE, default=2): cv.positive_int, - vol.Optional(ATTR_NAVIGATION, default=1): cv.positive_int, - vol.Optional(ATTR_CATEGORY, default=4): cv.positive_int, - vol.Optional(ATTR_ZONE): cv.string, + probatio.Optional(ATTR_MODE, default=2): cv.positive_int, + probatio.Optional(ATTR_NAVIGATION, default=1): cv.positive_int, + probatio.Optional(ATTR_CATEGORY, default=4): cv.positive_int, + probatio.Optional(ATTR_ZONE): cv.string, }, func="neato_custom_cleaning", ) diff --git a/homeassistant/components/nederlandse_spoorwegen/config_flow.py b/homeassistant/components/nederlandse_spoorwegen/config_flow.py index d6b6ff0dcdfe1..ac29eed137788 100644 --- a/homeassistant/components/nederlandse_spoorwegen/config_flow.py +++ b/homeassistant/components/nederlandse_spoorwegen/config_flow.py @@ -4,12 +4,12 @@ from typing import Any, override from ns_api import NSAPI, Station +import probatio from requests.exceptions import ( ConnectionError as RequestsConnectionError, HTTPError, Timeout, ) -import voluptuous as vol from homeassistant.config_entries import ( ConfigEntry, @@ -92,7 +92,7 @@ async def async_step_user( ) return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_API_KEY): str}), + data_schema=probatio.Schema({probatio.Required(CONF_API_KEY): str}), errors=errors, ) @@ -119,7 +119,7 @@ async def async_step_reconfigure( ) return self.async_show_form( step_id="reconfigure", - data_schema=vol.Schema({vol.Required(CONF_API_KEY): str}), + data_schema=probatio.Schema({probatio.Required(CONF_API_KEY): str}), errors=errors, ) @@ -164,19 +164,19 @@ async def async_step_user( ] return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_NAME): str, - vol.Required(CONF_FROM): SelectSelector( + probatio.Required(CONF_NAME): str, + probatio.Required(CONF_FROM): SelectSelector( SelectSelectorConfig(options=options, sort=True), ), - vol.Required(CONF_TO): SelectSelector( + probatio.Required(CONF_TO): SelectSelector( SelectSelectorConfig(options=options, sort=True), ), - vol.Optional(CONF_VIA): SelectSelector( + probatio.Optional(CONF_VIA): SelectSelector( SelectSelectorConfig(options=options, sort=True), ), - vol.Optional(CONF_TIME): TimeSelector(), + probatio.Optional(CONF_TIME): TimeSelector(), } ), ) diff --git a/homeassistant/components/neopool/config_flow.py b/homeassistant/components/neopool/config_flow.py index debe7f4c16ee5..e5d6965e6045f 100644 --- a/homeassistant/components/neopool/config_flow.py +++ b/homeassistant/components/neopool/config_flow.py @@ -9,7 +9,7 @@ NeoPoolTimeoutError, ) from neopool_modbus.registers import DEFAULT_MODBUS_FRAMER -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigFlow, @@ -71,15 +71,19 @@ async def async_step_user( self, user_input: dict[str, Any] | None = None ) -> ConfigFlowResult: """Handle the initial step of the configuration flow.""" - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): vol.Coerce(int), - vol.Optional(CONF_UNIT_ID, default=DEFAULT_UNIT_ID): vol.Coerce(int), - vol.Optional( + probatio.Required(CONF_HOST): str, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): probatio.Coerce( + int + ), + probatio.Optional( + CONF_UNIT_ID, default=DEFAULT_UNIT_ID + ): probatio.Coerce(int), + probatio.Optional( CONF_MODBUS_FRAMER, default=DEFAULT_MODBUS_FRAMER, - ): vol.In(("tcp", "rtu")), + ): probatio.In(("tcp", "rtu")), } ) errors: dict[str, str] = {} @@ -109,20 +113,20 @@ async def async_step_reconfigure( entry = self._get_reconfigure_entry() current = entry.data - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_HOST, default=current[CONF_HOST]): str, - vol.Optional( + probatio.Required(CONF_HOST, default=current[CONF_HOST]): str, + probatio.Optional( CONF_PORT, default=current.get(CONF_PORT, DEFAULT_PORT) - ): vol.Coerce(int), - vol.Optional( + ): probatio.Coerce(int), + probatio.Optional( CONF_UNIT_ID, default=current.get(CONF_UNIT_ID, DEFAULT_UNIT_ID), - ): vol.Coerce(int), - vol.Optional( + ): probatio.Coerce(int), + probatio.Optional( CONF_MODBUS_FRAMER, default=current.get(CONF_MODBUS_FRAMER, DEFAULT_MODBUS_FRAMER), - ): vol.In(("tcp", "rtu")), + ): probatio.In(("tcp", "rtu")), } ) @@ -157,29 +161,29 @@ async def async_step_init( return self.async_create_entry(title="", data=user_input) options = self.config_entry.options - schema = vol.Schema( + schema = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_USE_LIGHT, default=options.get(CONF_USE_LIGHT, False), ): bool, - vol.Optional( + probatio.Optional( CONF_USE_COVER_SENSOR, default=options.get(CONF_USE_COVER_SENSOR, False), ): bool, - vol.Optional( + probatio.Optional( CONF_USE_AUX1, default=options.get(CONF_USE_AUX1, False), ): bool, - vol.Optional( + probatio.Optional( CONF_USE_AUX2, default=options.get(CONF_USE_AUX2, False), ): bool, - vol.Optional( + probatio.Optional( CONF_USE_AUX3, default=options.get(CONF_USE_AUX3, False), ): bool, - vol.Optional( + probatio.Optional( CONF_USE_AUX4, default=options.get(CONF_USE_AUX4, False), ): bool, diff --git a/homeassistant/components/ness_alarm/__init__.py b/homeassistant/components/ness_alarm/__init__.py index 3116cce3926fc..91d7bfd95e6f2 100644 --- a/homeassistant/components/ness_alarm/__init__.py +++ b/homeassistant/components/ness_alarm/__init__.py @@ -4,7 +4,7 @@ from typing import NamedTuple from nessclient import ArmingMode, ArmingState, Client -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import ( DEVICE_CLASSES_SCHEMA as BINARY_SENSOR_DEVICE_CLASSES_SCHEMA, @@ -52,34 +52,34 @@ class ZoneChangedData(NamedTuple): state: bool -ZONE_SCHEMA = vol.Schema( +ZONE_SCHEMA = probatio.Schema( { - vol.Required(CONF_ZONE_NAME): cv.string, - vol.Required(CONF_ZONE_ID): cv.positive_int, - vol.Optional( + probatio.Required(CONF_ZONE_NAME): cv.string, + probatio.Required(CONF_ZONE_ID): cv.positive_int, + probatio.Optional( CONF_ZONE_TYPE, default=DEFAULT_ZONE_TYPE ): BINARY_SENSOR_DEVICE_CLASSES_SCHEMA, } ) # YAML configuration is deprecated but supported for import -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_PORT): cv.port, - vol.Optional( + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_PORT): cv.port, + probatio.Optional( CONF_SCAN_INTERVAL, default=DEFAULT_SCAN_INTERVAL ): cv.positive_time_period, - vol.Optional(CONF_ZONES, default=[]): vol.All( + probatio.Optional(CONF_ZONES, default=[]): probatio.All( cv.ensure_list, [ZONE_SCHEMA] ), - vol.Optional(CONF_INFER_ARMING_STATE, default=False): cv.boolean, + probatio.Optional(CONF_INFER_ARMING_STATE, default=False): cv.boolean, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/ness_alarm/config_flow.py b/homeassistant/components/ness_alarm/config_flow.py index 48ab8dca7aa20..ade71988200d6 100644 --- a/homeassistant/components/ness_alarm/config_flow.py +++ b/homeassistant/components/ness_alarm/config_flow.py @@ -6,7 +6,7 @@ from typing import Any, override from nessclient import Client -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import BinarySensorDeviceClass from homeassistant.config_entries import ( @@ -41,17 +41,21 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_INFER_ARMING_STATE, default=DEFAULT_INFER_ARMING_STATE): bool, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional( + CONF_INFER_ARMING_STATE, default=DEFAULT_INFER_ARMING_STATE + ): bool, } ) -ZONE_SCHEMA = vol.Schema( +ZONE_SCHEMA = probatio.Schema( { - vol.Required(CONF_TYPE, default=DEFAULT_ZONE_TYPE): selector.SelectSelector( + probatio.Required( + CONF_TYPE, default=DEFAULT_ZONE_TYPE + ): selector.SelectSelector( selector.SelectSelectorConfig( options=[cls.value for cls in BinarySensorDeviceClass], mode=selector.SelectSelectorMode.DROPDOWN, @@ -216,9 +220,9 @@ async def async_step_init( return self.async_show_form( step_id="init", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_SHOW_HOME_MODE, default=True): bool, + probatio.Required(CONF_SHOW_HOME_MODE, default=True): bool, } ), self.config_entry.options, @@ -256,9 +260,9 @@ async def async_step_user( return self.async_show_form( step_id="user", errors=errors, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_ZONE_NUMBER): selector.NumberSelector( + probatio.Required(CONF_ZONE_NUMBER): selector.NumberSelector( selector.NumberSelectorConfig( min=1, max=32, diff --git a/homeassistant/components/ness_alarm/services.py b/homeassistant/components/ness_alarm/services.py index a2550bc07d16c..179e7fcca3065 100644 --- a/homeassistant/components/ness_alarm/services.py +++ b/homeassistant/components/ness_alarm/services.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING -import voluptuous as vol +import probatio from homeassistant.const import ATTR_CODE, ATTR_STATE from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -13,11 +13,11 @@ if TYPE_CHECKING: from . import NessAlarmConfigEntry -SERVICE_SCHEMA_PANIC = vol.Schema({vol.Required(ATTR_CODE): cv.string}) -SERVICE_SCHEMA_AUX = vol.Schema( +SERVICE_SCHEMA_PANIC = probatio.Schema({probatio.Required(ATTR_CODE): cv.string}) +SERVICE_SCHEMA_AUX = probatio.Schema( { - vol.Required(ATTR_OUTPUT_ID): cv.positive_int, - vol.Optional(ATTR_STATE, default=True): cv.boolean, + probatio.Required(ATTR_OUTPUT_ID): cv.positive_int, + probatio.Optional(ATTR_STATE, default=True): cv.boolean, } ) diff --git a/homeassistant/components/nest/__init__.py b/homeassistant/components/nest/__init__.py index 112e2f3db72c2..820f4f50733a0 100644 --- a/homeassistant/components/nest/__init__.py +++ b/homeassistant/components/nest/__init__.py @@ -21,7 +21,7 @@ SubscriberTimeoutException, ) from google_nest_sdm.traits import TraitType -import voluptuous as vol +import probatio from homeassistant.auth.permissions.const import POLICY_READ from homeassistant.components.camera import Image, img_util @@ -76,27 +76,29 @@ _LOGGER = logging.getLogger(__name__) -SENSOR_SCHEMA = vol.Schema( - {vol.Optional(CONF_MONITORED_CONDITIONS): vol.All(cv.ensure_list)} +SENSOR_SCHEMA = probatio.Schema( + {probatio.Optional(CONF_MONITORED_CONDITIONS): probatio.All(cv.ensure_list)} ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_CLIENT_ID): cv.string, - vol.Required(CONF_CLIENT_SECRET): cv.string, + probatio.Required(CONF_CLIENT_ID): cv.string, + probatio.Required(CONF_CLIENT_SECRET): cv.string, # Required to use the new API (optional for compatibility) - vol.Optional(CONF_PROJECT_ID): cv.string, - vol.Optional(CONF_SUBSCRIBER_ID): cv.string, + probatio.Optional(CONF_PROJECT_ID): cv.string, + probatio.Optional(CONF_SUBSCRIBER_ID): cv.string, # Config that only currently works on the old API - vol.Optional(CONF_STRUCTURE): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(CONF_SENSORS): SENSOR_SCHEMA, - vol.Optional(CONF_BINARY_SENSORS): SENSOR_SCHEMA, + probatio.Optional(CONF_STRUCTURE): probatio.All( + cv.ensure_list, [cv.string] + ), + probatio.Optional(CONF_SENSORS): SENSOR_SCHEMA, + probatio.Optional(CONF_BINARY_SENSORS): SENSOR_SCHEMA, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) # Platforms for SDM API diff --git a/homeassistant/components/nest/config_flow.py b/homeassistant/components/nest/config_flow.py index ec019b398cf58..47d46439a41a0 100644 --- a/homeassistant/components/nest/config_flow.py +++ b/homeassistant/components/nest/config_flow.py @@ -20,7 +20,7 @@ ) from google_nest_sdm.exceptions import ApiException from google_nest_sdm.structure import Structure -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlowResult from homeassistant.helpers import config_entry_oauth2_flow @@ -215,9 +215,9 @@ async def async_step_cloud_project( return await self.async_step_device_project() return self.async_show_form( step_id="cloud_project", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_CLOUD_PROJECT_ID): str, + probatio.Required(CONF_CLOUD_PROJECT_ID): str, } ), description_placeholders={ @@ -247,9 +247,9 @@ async def async_step_device_project( return self.async_show_form( step_id="device_project", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PROJECT_ID): str, + probatio.Required(CONF_PROJECT_ID): str, } ), description_placeholders={ @@ -303,9 +303,9 @@ async def async_step_pubsub_topic( ] return self.async_show_form( step_id="pubsub_topic", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_TOPIC_NAME, default=next(iter(topics)) ): SelectSelector( SelectSelectorConfig( @@ -410,9 +410,9 @@ async def async_step_pubsub_subscription( subscriptions.append(CREATE_NEW_SUBSCRIPTION_KEY) return self.async_show_form( step_id="pubsub_subscription", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_SUBSCRIPTION_NAME, default=next(iter(subscriptions)), ): SelectSelector( diff --git a/homeassistant/components/nest/device_trigger.py b/homeassistant/components/nest/device_trigger.py index 7ce87379e03c4..2936bb36d0315 100644 --- a/homeassistant/components/nest/device_trigger.py +++ b/homeassistant/components/nest/device_trigger.py @@ -1,6 +1,6 @@ """Provides device automations for Nest.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import ( DEVICE_TRIGGER_BASE_SCHEMA, @@ -22,7 +22,7 @@ TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): vol.In(TRIGGER_TYPES), + probatio.Required(CONF_TYPE): probatio.In(TRIGGER_TYPES), } ) diff --git a/homeassistant/components/nest/services.py b/homeassistant/components/nest/services.py index 0cb97f5a0a541..7fee3bd2e0afd 100644 --- a/homeassistant/components/nest/services.py +++ b/homeassistant/components/nest/services.py @@ -1,6 +1,6 @@ """Define services for the Nest integration.""" -import voluptuous as vol +import probatio from homeassistant.components.climate import ( DOMAIN as CLIMATE_DOMAIN, @@ -23,7 +23,7 @@ def async_setup_services(hass: HomeAssistant) -> None: SERVICE_SET_FAN_TIMER, entity_domain=CLIMATE_DOMAIN, schema={ - vol.Required("duration"): cv.time_period, + probatio.Required("duration"): cv.time_period, }, func="async_set_fan_timer", required_features=[ClimateEntityFeature.FAN_MODE], diff --git a/homeassistant/components/netatmo/camera.py b/homeassistant/components/netatmo/camera.py index 9ae69c6a24351..8017e5a5716d1 100644 --- a/homeassistant/components/netatmo/camera.py +++ b/homeassistant/components/netatmo/camera.py @@ -4,9 +4,9 @@ from typing import Any, cast, override import aiohttp +import probatio from pyatmo import ApiError as NetatmoApiError, modules as NaModules from pyatmo.event import Event as NaEvent -import voluptuous as vol from homeassistant.components.camera import Camera, CameraEntityFeature from homeassistant.const import ATTR_PERSONS @@ -68,17 +68,17 @@ def _create_entity(netatmo_device: NetatmoDevice) -> None: platform.async_register_entity_service( SERVICE_SET_PERSONS_HOME, - {vol.Required(ATTR_PERSONS): vol.All(cv.ensure_list, [cv.string])}, + {probatio.Required(ATTR_PERSONS): probatio.All(cv.ensure_list, [cv.string])}, "_service_set_persons_home", ) platform.async_register_entity_service( SERVICE_SET_PERSON_AWAY, - {vol.Optional(ATTR_PERSON): cv.string}, + {probatio.Optional(ATTR_PERSON): cv.string}, "_service_set_person_away", ) platform.async_register_entity_service( SERVICE_SET_CAMERA_LIGHT, - {vol.Required(ATTR_CAMERA_LIGHT_MODE): vol.In(CAMERA_LIGHT_MODES)}, + {probatio.Required(ATTR_CAMERA_LIGHT_MODE): probatio.In(CAMERA_LIGHT_MODES)}, "_service_set_camera_light", ) diff --git a/homeassistant/components/netatmo/climate.py b/homeassistant/components/netatmo/climate.py index 563d1cef8dc95..dbb1d72c7069a 100644 --- a/homeassistant/components/netatmo/climate.py +++ b/homeassistant/components/netatmo/climate.py @@ -3,9 +3,9 @@ import logging from typing import Any, cast, override +import probatio from pyatmo.modules import NATherm1 from pyatmo.modules.device_types import DeviceType -import voluptuous as vol from homeassistant.components.climate import ( ATTR_PRESET_MODE, @@ -140,34 +140,34 @@ def _create_entity(netatmo_device: NetatmoRoom) -> None: platform = entity_platform.async_get_current_platform() platform.async_register_entity_service( SERVICE_SET_SCHEDULE, - {vol.Required(ATTR_SCHEDULE_NAME): cv.string}, + {probatio.Required(ATTR_SCHEDULE_NAME): cv.string}, "_async_service_set_schedule", ) platform.async_register_entity_service( SERVICE_SET_PRESET_MODE_WITH_END_DATETIME, { - vol.Required(ATTR_PRESET_MODE): vol.In(THERM_MODES), - vol.Required(ATTR_END_DATETIME): cv.datetime, + probatio.Required(ATTR_PRESET_MODE): probatio.In(THERM_MODES), + probatio.Required(ATTR_END_DATETIME): cv.datetime, }, "_async_service_set_preset_mode_with_end_datetime", ) platform.async_register_entity_service( SERVICE_SET_TEMPERATURE_WITH_END_DATETIME, { - vol.Required(ATTR_TARGET_TEMPERATURE): vol.All( - vol.Coerce(float), vol.Range(min=7, max=30) + probatio.Required(ATTR_TARGET_TEMPERATURE): probatio.All( + probatio.Coerce(float), probatio.Range(min=7, max=30) ), - vol.Required(ATTR_END_DATETIME): cv.datetime, + probatio.Required(ATTR_END_DATETIME): cv.datetime, }, "_async_service_set_temperature_with_end_datetime", ) platform.async_register_entity_service( SERVICE_SET_TEMPERATURE_WITH_TIME_PERIOD, { - vol.Required(ATTR_TARGET_TEMPERATURE): vol.All( - vol.Coerce(float), vol.Range(min=7, max=30) + probatio.Required(ATTR_TARGET_TEMPERATURE): probatio.All( + probatio.Coerce(float), probatio.Range(min=7, max=30) ), - vol.Required(ATTR_TIME_PERIOD): vol.All( + probatio.Required(ATTR_TIME_PERIOD): probatio.All( cv.time_period, cv.positive_timedelta, ), diff --git a/homeassistant/components/netatmo/config_flow.py b/homeassistant/components/netatmo/config_flow.py index 3693bb76105ca..8131ad8ad894f 100644 --- a/homeassistant/components/netatmo/config_flow.py +++ b/homeassistant/components/netatmo/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override import uuid -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlowResult, OptionsFlow from homeassistant.const import CONF_SHOW_ON_MAP, CONF_UUID @@ -125,13 +125,13 @@ async def async_step_public_weather_areas( weather_areas = list(self.options[CONF_WEATHER_AREAS]) - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_WEATHER_AREAS, default=weather_areas, ): cv.multi_select(dict.fromkeys(weather_areas)), - vol.Optional(CONF_NEW_AREA): str, + probatio.Optional(CONF_NEW_AREA): str, } ) return self.async_show_form( @@ -161,38 +161,40 @@ async def async_step_public_weather(self, user_input: dict) -> ConfigFlowResult: default_latitude = self.hass.config.latitude default_size = 0.04 - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Optional(CONF_AREA_NAME, default=user_input[CONF_NEW_AREA]): str, - vol.Optional( + probatio.Optional( + CONF_AREA_NAME, default=user_input[CONF_NEW_AREA] + ): str, + probatio.Optional( CONF_LAT_NE, default=orig_options.get( CONF_LAT_NE, default_latitude + default_size ), ): cv.latitude, - vol.Optional( + probatio.Optional( CONF_LON_NE, default=orig_options.get( CONF_LON_NE, default_longitude + default_size ), ): cv.longitude, - vol.Optional( + probatio.Optional( CONF_LAT_SW, default=orig_options.get( CONF_LAT_SW, default_latitude - default_size ), ): cv.latitude, - vol.Optional( + probatio.Optional( CONF_LON_SW, default=orig_options.get( CONF_LON_SW, default_longitude - default_size ), ): cv.longitude, - vol.Required( + probatio.Required( CONF_PUBLIC_MODE, default=orig_options.get(CONF_PUBLIC_MODE, "avg"), - ): vol.In(["avg", "max", "min"]), - vol.Required( + ): probatio.In(["avg", "max", "min"]), + probatio.Required( CONF_SHOW_ON_MAP, default=orig_options.get(CONF_SHOW_ON_MAP, False), ): bool, diff --git a/homeassistant/components/netatmo/device_trigger.py b/homeassistant/components/netatmo/device_trigger.py index 9e2b8d2ec94f6..7f39fc73c9e67 100644 --- a/homeassistant/components/netatmo/device_trigger.py +++ b/homeassistant/components/netatmo/device_trigger.py @@ -1,6 +1,6 @@ """Provides device automations for Netatmo.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import ( DEVICE_TRIGGER_BASE_SCHEMA, @@ -55,9 +55,9 @@ TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In(TRIGGER_TYPES), - vol.Optional(CONF_SUBTYPE): str, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In(TRIGGER_TYPES), + probatio.Optional(CONF_SUBTYPE): str, } ) diff --git a/homeassistant/components/netdata/sensor.py b/homeassistant/components/netdata/sensor.py index 5094db183e226..418073b1fc609 100644 --- a/homeassistant/components/netdata/sensor.py +++ b/homeassistant/components/netdata/sensor.py @@ -5,7 +5,7 @@ from netdata import Netdata from netdata.exceptions import NetdataError -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -38,21 +38,23 @@ DEFAULT_ICON = "mdi:desktop-classic" -RESOURCE_SCHEMA = vol.Any( +RESOURCE_SCHEMA = probatio.Any( { - vol.Required(CONF_DATA_GROUP): cv.string, - vol.Required(CONF_ELEMENT): cv.string, - vol.Optional(CONF_ICON, default=DEFAULT_ICON): cv.icon, - vol.Optional(CONF_INVERT, default=False): cv.boolean, + probatio.Required(CONF_DATA_GROUP): cv.string, + probatio.Required(CONF_ELEMENT): cv.string, + probatio.Optional(CONF_ICON, default=DEFAULT_ICON): cv.icon, + probatio.Optional(CONF_INVERT, default=False): cv.boolean, } ) PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Required(CONF_RESOURCES): vol.Schema({cv.string: RESOURCE_SCHEMA}), + probatio.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Required(CONF_RESOURCES): probatio.Schema( + {cv.string: RESOURCE_SCHEMA} + ), } ) diff --git a/homeassistant/components/netgear/config_flow.py b/homeassistant/components/netgear/config_flow.py index c1bd1023fa1b1..8c5ff7884a1f8 100644 --- a/homeassistant/components/netgear/config_flow.py +++ b/homeassistant/components/netgear/config_flow.py @@ -4,8 +4,8 @@ from typing import Any, cast, override from urllib.parse import urlparse +import probatio from pynetgear import DEFAULT_HOST, DEFAULT_PORT, DEFAULT_USER -import voluptuous as vol from homeassistant.config_entries import ( ConfigEntry, @@ -46,20 +46,26 @@ def _discovery_schema_with_defaults(discovery_info): - return vol.Schema(_ordered_shared_schema(discovery_info)) + return probatio.Schema(_ordered_shared_schema(discovery_info)) def _user_schema_with_defaults(user_input): - user_schema = {vol.Optional(CONF_HOST, default=user_input.get(CONF_HOST, "")): str} + user_schema = { + probatio.Optional(CONF_HOST, default=user_input.get(CONF_HOST, "")): str + } user_schema.update(_ordered_shared_schema(user_input)) - return vol.Schema(user_schema) + return probatio.Schema(user_schema) def _ordered_shared_schema(schema_input): return { - vol.Optional(CONF_USERNAME, default=schema_input.get(CONF_USERNAME, "")): str, - vol.Required(CONF_PASSWORD, default=schema_input.get(CONF_PASSWORD, "")): str, + probatio.Optional( + CONF_USERNAME, default=schema_input.get(CONF_USERNAME, "") + ): str, + probatio.Required( + CONF_PASSWORD, default=schema_input.get(CONF_PASSWORD, "") + ): str, } @@ -73,9 +79,9 @@ async def async_step_init( if user_input is not None: return self.async_create_entry(title="", data=user_input) - settings_schema = vol.Schema( + settings_schema = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_CONSIDER_HOME, default=self.config_entry.options.get( CONF_CONSIDER_HOME, DEFAULT_CONSIDER_HOME.total_seconds() diff --git a/homeassistant/components/netgear_lte/config_flow.py b/homeassistant/components/netgear_lte/config_flow.py index 4733e5019cd82..1169fe8749bad 100644 --- a/homeassistant/components/netgear_lte/config_flow.py +++ b/homeassistant/components/netgear_lte/config_flow.py @@ -5,7 +5,7 @@ from aiohttp.cookiejar import CookieJar from eternalegypt import Error, Modem from eternalegypt.eternalegypt import Information -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PASSWORD @@ -44,10 +44,10 @@ async def async_step_user( return self.async_show_form( step_id="user", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PASSWORD): str, } ), user_input or {CONF_HOST: DEFAULT_HOST}, diff --git a/homeassistant/components/netgear_lte/services.py b/homeassistant/components/netgear_lte/services.py index 45b3e41189aaf..7bf76ea63b793 100644 --- a/homeassistant/components/netgear_lte/services.py +++ b/homeassistant/components/netgear_lte/services.py @@ -1,6 +1,6 @@ """Services for the Netgear LTE integration.""" -import voluptuous as vol +import probatio from homeassistant.const import CONF_HOST from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -23,27 +23,27 @@ SERVICE_CONNECT_LTE = "connect_lte" SERVICE_DISCONNECT_LTE = "disconnect_lte" -DELETE_SMS_SCHEMA = vol.Schema( +DELETE_SMS_SCHEMA = probatio.Schema( { - vol.Optional(ATTR_HOST): cv.string, - vol.Required(ATTR_SMS_ID): vol.All(cv.ensure_list, [cv.positive_int]), + probatio.Optional(ATTR_HOST): cv.string, + probatio.Required(ATTR_SMS_ID): probatio.All(cv.ensure_list, [cv.positive_int]), } ) -SET_OPTION_SCHEMA = vol.Schema( - vol.All( +SET_OPTION_SCHEMA = probatio.Schema( + probatio.All( cv.has_at_least_one_key(ATTR_FAILOVER, ATTR_AUTOCONNECT), { - vol.Optional(ATTR_HOST): cv.string, - vol.Optional(ATTR_FAILOVER): vol.In(FAILOVER_MODES), - vol.Optional(ATTR_AUTOCONNECT): vol.In(AUTOCONNECT_MODES), + probatio.Optional(ATTR_HOST): cv.string, + probatio.Optional(ATTR_FAILOVER): probatio.In(FAILOVER_MODES), + probatio.Optional(ATTR_AUTOCONNECT): probatio.In(AUTOCONNECT_MODES), }, ) ) -CONNECT_LTE_SCHEMA = vol.Schema({vol.Optional(ATTR_HOST): cv.string}) +CONNECT_LTE_SCHEMA = probatio.Schema({probatio.Optional(ATTR_HOST): cv.string}) -DISCONNECT_LTE_SCHEMA = vol.Schema({vol.Optional(ATTR_HOST): cv.string}) +DISCONNECT_LTE_SCHEMA = probatio.Schema({probatio.Optional(ATTR_HOST): cv.string}) async def _service_handler(call: ServiceCall) -> None: diff --git a/homeassistant/components/netio/config_flow.py b/homeassistant/components/netio/config_flow.py index 3e0d2cac164e3..2f1ac03616ab7 100644 --- a/homeassistant/components/netio/config_flow.py +++ b/homeassistant/components/netio/config_flow.py @@ -4,8 +4,8 @@ from typing import Any, override from Netio.exceptions import AuthError, CommunicationError +import probatio import requests -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -25,14 +25,14 @@ DEFAULT_PORT = 80 -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Required(CONF_SSL, default=False): bool, - vol.Required(CONF_VERIFY_SSL, default=True): bool, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Required(CONF_SSL, default=False): bool, + probatio.Required(CONF_VERIFY_SSL, default=True): bool, } ) diff --git a/homeassistant/components/netio/switch.py b/homeassistant/components/netio/switch.py index d70cbba382d20..9e84fcb03087b 100644 --- a/homeassistant/components/netio/switch.py +++ b/homeassistant/components/netio/switch.py @@ -5,8 +5,8 @@ import logging from typing import Any, override +import probatio from pynetio import Netio -import voluptuous as vol from homeassistant import util from homeassistant.components.http import HomeAssistantView @@ -56,11 +56,11 @@ PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Required(CONF_USERNAME, default=DEFAULT_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_OUTLETS): {cv.string: cv.string}, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Required(CONF_USERNAME, default=DEFAULT_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_OUTLETS): {cv.string: cv.string}, } ) diff --git a/homeassistant/components/network/const.py b/homeassistant/components/network/const.py index 4e313392dc4c3..26959d91d57f1 100644 --- a/homeassistant/components/network/const.py +++ b/homeassistant/components/network/const.py @@ -2,7 +2,7 @@ from typing import Final -import voluptuous as vol +import probatio from homeassistant.helpers import config_validation as cv @@ -19,10 +19,10 @@ PUBLIC_TARGET_IP: Final = "8.8.8.8" IPV4_BROADCAST_ADDR: Final = "255.255.255.255" -NETWORK_CONFIG_SCHEMA = vol.Schema( +NETWORK_CONFIG_SCHEMA = probatio.Schema( { - vol.Optional( + probatio.Optional( ATTR_CONFIGURED_ADAPTERS, default=DEFAULT_CONFIGURED_ADAPTERS - ): vol.Schema(vol.All(cv.ensure_list, [cv.string])), + ): probatio.Schema(probatio.All(cv.ensure_list, [cv.string])), } ) diff --git a/homeassistant/components/network/websocket.py b/homeassistant/components/network/websocket.py index 91e89f62364b0..fcc49804789a8 100644 --- a/homeassistant/components/network/websocket.py +++ b/homeassistant/components/network/websocket.py @@ -3,7 +3,7 @@ from contextlib import suppress from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.components.websocket_api import ActiveConnection @@ -23,7 +23,7 @@ def async_register_websocket_commands(hass: HomeAssistant) -> None: @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required("type"): "network"}) +@websocket_api.websocket_command({probatio.Required("type"): "network"}) @websocket_api.async_response async def websocket_network_adapters( hass: HomeAssistant, @@ -44,8 +44,8 @@ async def websocket_network_adapters( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "network/configure", - vol.Required("config", default={}): NETWORK_CONFIG_SCHEMA, + probatio.Required("type"): "network/configure", + probatio.Required("config", default={}): NETWORK_CONFIG_SCHEMA, } ) @websocket_api.async_response @@ -68,7 +68,7 @@ async def websocket_network_adapters_configure( @callback @websocket_api.websocket_command( { - vol.Required("type"): "network/url", + probatio.Required("type"): "network/url", } ) def websocket_network_url( diff --git a/homeassistant/components/neurio_energy/sensor.py b/homeassistant/components/neurio_energy/sensor.py index 6912e7ae03923..653f320ecac06 100644 --- a/homeassistant/components/neurio_energy/sensor.py +++ b/homeassistant/components/neurio_energy/sensor.py @@ -5,8 +5,8 @@ from typing import override import neurio +import probatio import requests.exceptions -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -42,9 +42,9 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_API_KEY): cv.string, - vol.Required(CONF_API_SECRET): cv.string, - vol.Required(CONF_SENSOR_ID): cv.string, + probatio.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_API_SECRET): cv.string, + probatio.Required(CONF_SENSOR_ID): cv.string, } ) diff --git a/homeassistant/components/nexblue/config_flow.py b/homeassistant/components/nexblue/config_flow.py index 3b5a29962e87b..778c64802e6cf 100644 --- a/homeassistant/components/nexblue/config_flow.py +++ b/homeassistant/components/nexblue/config_flow.py @@ -9,7 +9,7 @@ NexBlueError, TokenBundle, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -17,10 +17,10 @@ from .const import CONF_REFRESH_TOKEN, DEFAULT_API_URL, DOMAIN, LOGGER -AUTH_SCHEMA = vol.Schema( +AUTH_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/nexia/climate.py b/homeassistant/components/nexia/climate.py index 0c6178a540792..4bd2532e13f63 100644 --- a/homeassistant/components/nexia/climate.py +++ b/homeassistant/components/nexia/climate.py @@ -16,7 +16,7 @@ from nexia.thermostat import NexiaThermostat from nexia.util import find_humidity_setpoint from nexia.zone import NexiaThermostatZone -import voluptuous as vol +import probatio from homeassistant.components.climate import ( ATTR_HUMIDITY, @@ -53,23 +53,29 @@ SERVICE_SET_HVAC_RUN_MODE = "set_hvac_run_mode" SET_AIRCLEANER_SCHEMA: VolDictType = { - vol.Required(ATTR_AIRCLEANER_MODE): cv.string, + probatio.Required(ATTR_AIRCLEANER_MODE): cv.string, } SET_HUMIDIFY_SCHEMA: VolDictType = { - vol.Required(ATTR_HUMIDITY): vol.All(vol.Coerce(int), vol.Range(min=10, max=45)), + probatio.Required(ATTR_HUMIDITY): probatio.All( + probatio.Coerce(int), probatio.Range(min=10, max=45) + ), } SET_DEHUMIDIFY_SCHEMA: VolDictType = { - vol.Required(ATTR_HUMIDITY): vol.All(vol.Coerce(int), vol.Range(min=35, max=65)), + probatio.Required(ATTR_HUMIDITY): probatio.All( + probatio.Coerce(int), probatio.Range(min=35, max=65) + ), } -SET_HVAC_RUN_MODE_SCHEMA = vol.All( +SET_HVAC_RUN_MODE_SCHEMA = probatio.All( cv.has_at_least_one_key(ATTR_RUN_MODE, ATTR_HVAC_MODE), cv.make_entity_service_schema( { - vol.Optional(ATTR_RUN_MODE): vol.In([HOLD_PERMANENT, HOLD_RESUME_SCHEDULE]), - vol.Optional(ATTR_HVAC_MODE): vol.In( + probatio.Optional(ATTR_RUN_MODE): probatio.In( + [HOLD_PERMANENT, HOLD_RESUME_SCHEDULE] + ), + probatio.Optional(ATTR_HVAC_MODE): probatio.In( [HVACMode.HEAT, HVACMode.COOL, HVACMode.AUTO] ), } diff --git a/homeassistant/components/nexia/config_flow.py b/homeassistant/components/nexia/config_flow.py index 304e4672da1cd..00fbb9079a03d 100644 --- a/homeassistant/components/nexia/config_flow.py +++ b/homeassistant/components/nexia/config_flow.py @@ -6,7 +6,7 @@ import aiohttp from nexia.const import BRAND_ASAIR, BRAND_NEXIA, BRAND_TRANE from nexia.home import NexiaHome -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -25,11 +25,11 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Required(CONF_BRAND, default=BRAND_NEXIA): vol.In( + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Required(CONF_BRAND, default=BRAND_NEXIA): probatio.In( { BRAND_NEXIA: BRAND_NEXIA_NAME, BRAND_ASAIR: BRAND_ASAIR_NAME, diff --git a/homeassistant/components/nextbus/config_flow.py b/homeassistant/components/nextbus/config_flow.py index 07d8527ec059f..a9e71160652bf 100644 --- a/homeassistant/components/nextbus/config_flow.py +++ b/homeassistant/components/nextbus/config_flow.py @@ -4,8 +4,8 @@ import logging from typing import override +import probatio from py_nextbus import NextBusClient -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_STOP @@ -109,9 +109,9 @@ async def async_step_agency( return self.async_show_form( step_id="agency", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_AGENCY): _dict_to_select_selector( + probatio.Required(CONF_AGENCY): _dict_to_select_selector( self._agency_tags ), } @@ -134,9 +134,9 @@ async def async_step_route( return self.async_show_form( step_id="route", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_ROUTE): _dict_to_select_selector( + probatio.Required(CONF_ROUTE): _dict_to_select_selector( self._route_tags ), } @@ -177,9 +177,11 @@ async def async_step_stop( return self.async_show_form( step_id="stop", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_STOP): _dict_to_select_selector(self._stop_tags), + probatio.Required(CONF_STOP): _dict_to_select_selector( + self._stop_tags + ), } ), ) diff --git a/homeassistant/components/nextcloud/config_flow.py b/homeassistant/components/nextcloud/config_flow.py index 8b72fc8566903..e703af51c16f9 100644 --- a/homeassistant/components/nextcloud/config_flow.py +++ b/homeassistant/components/nextcloud/config_flow.py @@ -9,7 +9,7 @@ NextcloudMonitorConnectionError, NextcloudMonitorRequestError, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_RECONFIGURE, @@ -20,18 +20,18 @@ from .const import DEFAULT_VERIFY_SSL, DOMAIN -DATA_SCHEMA_USER = vol.Schema( +DATA_SCHEMA_USER = probatio.Schema( { - vol.Required(CONF_URL): str, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Required(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): bool, + probatio.Required(CONF_URL): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Required(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): bool, } ) -DATA_SCHEMA_REAUTH = vol.Schema( +DATA_SCHEMA_REAUTH = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/nextdns/config_flow.py b/homeassistant/components/nextdns/config_flow.py index ced39ec9cc6c4..68c7c3ae20a3c 100644 --- a/homeassistant/components/nextdns/config_flow.py +++ b/homeassistant/components/nextdns/config_flow.py @@ -6,8 +6,8 @@ from aiohttp.client_exceptions import ClientConnectorError from nextdns import ApiError, InvalidApiKeyError, NextDns +import probatio from tenacity import RetryError -import voluptuous as vol from homeassistant.config_entries import ( ConfigEntry, @@ -29,7 +29,7 @@ from .const import CONF_PROFILE_ID, DOMAIN, SUBENTRY_TYPE_PROFILE -AUTH_SCHEMA = vol.Schema({vol.Required(CONF_API_KEY): str}) +AUTH_SCHEMA = probatio.Schema({probatio.Required(CONF_API_KEY): str}) _LOGGER = logging.getLogger(__name__) @@ -129,9 +129,9 @@ async def async_step_profiles( return self.async_show_form( step_id="profiles", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PROFILE_ID): SelectSelector( + probatio.Required(CONF_PROFILE_ID): SelectSelector( SelectSelectorConfig( options=[ SelectOptionDict( @@ -275,9 +275,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PROFILE_ID): SelectSelector( + probatio.Required(CONF_PROFILE_ID): SelectSelector( SelectSelectorConfig( options=[ SelectOptionDict( diff --git a/homeassistant/components/nfandroidtv/config_flow.py b/homeassistant/components/nfandroidtv/config_flow.py index 5e6990dc4c195..3e2bcffeafb16 100644 --- a/homeassistant/components/nfandroidtv/config_flow.py +++ b/homeassistant/components/nfandroidtv/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from notifications_android_tv.notifications import ConnectError, Notifications -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_NAME @@ -35,7 +35,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_HOST): str}), + data_schema=probatio.Schema({probatio.Required(CONF_HOST): str}), errors=errors, ) @@ -57,7 +57,7 @@ async def async_step_reconfigure( return self.async_show_form( step_id="reconfigure", data_schema=self.add_suggested_values_to_schema( - data_schema=vol.Schema({vol.Required(CONF_HOST): str}), + data_schema=probatio.Schema({probatio.Required(CONF_HOST): str}), suggested_values=user_input or entry.data, ), description_placeholders={CONF_NAME: entry.title}, diff --git a/homeassistant/components/nfandroidtv/notify.py b/homeassistant/components/nfandroidtv/notify.py index 21672e6b9ae6e..2286ce2b9e768 100644 --- a/homeassistant/components/nfandroidtv/notify.py +++ b/homeassistant/components/nfandroidtv/notify.py @@ -5,9 +5,9 @@ from typing import Any, override from notifications_android_tv.notifications import ConnectError, Notifications +import probatio import requests from requests.auth import HTTPBasicAuth, HTTPDigestAuth -import voluptuous as vol from homeassistant.components.notify import ( ATTR_DATA, @@ -192,7 +192,7 @@ def send_message(self, message: str, **kwargs: Any) -> None: if ATTR_INTERRUPT in data: try: interrupt = cv.boolean(data.get(ATTR_INTERRUPT)) - except vol.Invalid as err: + except probatio.Invalid as err: raise ServiceValidationError( translation_domain=DOMAIN, translation_key="invalid_interrupt", diff --git a/homeassistant/components/nibe_heatpump/config_flow.py b/homeassistant/components/nibe_heatpump/config_flow.py index 13743a5dd0c9e..e30ea1a22f265 100644 --- a/homeassistant/components/nibe_heatpump/config_flow.py +++ b/homeassistant/components/nibe_heatpump/config_flow.py @@ -13,7 +13,7 @@ WriteException, ) from nibe.heatpump import HeatPump, Model -import voluptuous as vol +import probatio import yarl from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -35,37 +35,37 @@ LOGGER, ) -PORT_SELECTOR = vol.All( +PORT_SELECTOR = probatio.All( selector.NumberSelector( selector.NumberSelectorConfig( min=1, step=1, max=65535, mode=selector.NumberSelectorMode.BOX ) ), - vol.Coerce(int), + probatio.Coerce(int), ) -STEP_NIBEGW_DATA_SCHEMA = vol.Schema( +STEP_NIBEGW_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_MODEL): vol.In(list(Model.__members__)), - vol.Required(CONF_IP_ADDRESS): selector.TextSelector(), - vol.Required(CONF_LISTENING_PORT, default=9999): PORT_SELECTOR, - vol.Required(CONF_REMOTE_READ_PORT, default=9999): PORT_SELECTOR, - vol.Required(CONF_REMOTE_WRITE_PORT, default=10000): PORT_SELECTOR, + probatio.Required(CONF_MODEL): probatio.In(list(Model.__members__)), + probatio.Required(CONF_IP_ADDRESS): selector.TextSelector(), + probatio.Required(CONF_LISTENING_PORT, default=9999): PORT_SELECTOR, + probatio.Required(CONF_REMOTE_READ_PORT, default=9999): PORT_SELECTOR, + probatio.Required(CONF_REMOTE_WRITE_PORT, default=10000): PORT_SELECTOR, } ) -STEP_MODBUS_DATA_SCHEMA = vol.Schema( +STEP_MODBUS_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_MODEL): vol.In(list(Model.__members__)), - vol.Required(CONF_MODBUS_URL): selector.TextSelector(), - vol.Required(CONF_MODBUS_UNIT, default=0): vol.All( + probatio.Required(CONF_MODEL): probatio.In(list(Model.__members__)), + probatio.Required(CONF_MODBUS_URL): selector.TextSelector(), + probatio.Required(CONF_MODBUS_UNIT, default=0): probatio.All( selector.NumberSelector( selector.NumberSelectorConfig( min=0, step=1, mode=selector.NumberSelectorMode.BOX ) ), - vol.Coerce(int), + probatio.Coerce(int), ), } ) diff --git a/homeassistant/components/nice_go/config_flow.py b/homeassistant/components/nice_go/config_flow.py index 7e2555bd914b9..2b5c2e66a720b 100644 --- a/homeassistant/components/nice_go/config_flow.py +++ b/homeassistant/components/nice_go/config_flow.py @@ -6,7 +6,7 @@ from typing import Any, override from nice_go import AuthFailedError, NiceGOApi -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_EMAIL, CONF_NAME, CONF_PASSWORD @@ -16,10 +16,10 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_EMAIL): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_EMAIL): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/nightscout/config_flow.py b/homeassistant/components/nightscout/config_flow.py index b268030dc1aae..52388fdd83d0a 100644 --- a/homeassistant/components/nightscout/config_flow.py +++ b/homeassistant/components/nightscout/config_flow.py @@ -4,8 +4,8 @@ from typing import Any, override from aiohttp import ClientError, ClientResponseError +import probatio from py_nightscout import Api as NightscoutAPI -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY, CONF_URL @@ -16,7 +16,9 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema({vol.Required(CONF_URL): str, vol.Optional(CONF_API_KEY): str}) +DATA_SCHEMA = probatio.Schema( + {probatio.Required(CONF_URL): str, probatio.Optional(CONF_API_KEY): str} +) async def _validate_input(data: dict[str, Any]) -> dict[str, str]: diff --git a/homeassistant/components/niko_home_control/config_flow.py b/homeassistant/components/niko_home_control/config_flow.py index 8603959e09730..23a801d9cc89e 100644 --- a/homeassistant/components/niko_home_control/config_flow.py +++ b/homeassistant/components/niko_home_control/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from nhc.controller import NHCController -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST @@ -13,9 +13,9 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, + probatio.Required(CONF_HOST): str, } ) diff --git a/homeassistant/components/nilu/air_quality.py b/homeassistant/components/nilu/air_quality.py index 38558634a8a7f..7a866f45ef4cf 100644 --- a/homeassistant/components/nilu/air_quality.py +++ b/homeassistant/components/nilu/air_quality.py @@ -20,7 +20,7 @@ create_station_client, lookup_stations_in_area, ) -import voluptuous as vol +import probatio from homeassistant.components.air_quality import ( PLATFORM_SCHEMA as AIR_QUALITY_PLATFORM_SCHEMA, @@ -90,13 +90,13 @@ PLATFORM_SCHEMA = AIR_QUALITY_PLATFORM_SCHEMA.extend( { - vol.Inclusive( + probatio.Inclusive( CONF_LATITUDE, "coordinates", "Latitude and longitude must exist together" ): cv.latitude, - vol.Inclusive( + probatio.Inclusive( CONF_LONGITUDE, "coordinates", "Latitude and longitude must exist together" ): cv.longitude, - vol.Exclusive( + probatio.Exclusive( CONF_AREA, "station_collection", ( @@ -104,8 +104,8 @@ "stations in a specific area pr sensor. " "Please only configure station or area." ), - ): vol.All(cv.string, vol.In(CONF_ALLOWED_AREAS)), - vol.Exclusive( + ): probatio.All(cv.string, probatio.In(CONF_ALLOWED_AREAS)), + probatio.Exclusive( CONF_STATION, "station_collection", ( @@ -113,9 +113,9 @@ "stations in a specific area pr sensor. " "Please only configure station or area." ), - ): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_SHOW_ON_MAP, default=False): cv.boolean, + ): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_SHOW_ON_MAP, default=False): cv.boolean, } ) diff --git a/homeassistant/components/nina/config_flow.py b/homeassistant/components/nina/config_flow.py index b086ca47d9304..7b7d6797b0182 100644 --- a/homeassistant/components/nina/config_flow.py +++ b/homeassistant/components/nina/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from pynina import ApiError, Nina -import voluptuous as vol from homeassistant.config_entries import ( ConfigEntry, @@ -89,24 +89,24 @@ def prepare_user_input( return user_input -def create_schema(regions: dict[str, dict[str, Any]]) -> vol.Schema: +def create_schema(regions: dict[str, dict[str, Any]]) -> probatio.Schema: """Create the schema for the flows.""" schema_dict: VolDictType = { **{ - vol.Optional(region): cv.multi_select(regions[region]) + probatio.Optional(region): cv.multi_select(regions[region]) for region in CONST_REGIONS }, - vol.Required( + probatio.Required( CONF_MESSAGE_SLOTS, default=5, - ): vol.All(int, vol.Range(min=1, max=20)), - vol.Required(CONF_FILTERS): section( - vol.Schema( + ): probatio.All(int, probatio.Range(min=1, max=20)), + probatio.Required(CONF_FILTERS): section( + probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_HEADLINE_FILTER, ): cv.string, - vol.Optional( + probatio.Optional( CONF_AREA_FILTER, ): cv.string, } @@ -114,7 +114,7 @@ def create_schema(regions: dict[str, dict[str, Any]]) -> vol.Schema: ), } - return vol.Schema(schema_dict) + return probatio.Schema(schema_dict) class NinaConfigFlow(ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/components/nintendo_parental_controls/config_flow.py b/homeassistant/components/nintendo_parental_controls/config_flow.py index 45ca5f61ac543..14f0c0165252f 100644 --- a/homeassistant/components/nintendo_parental_controls/config_flow.py +++ b/homeassistant/components/nintendo_parental_controls/config_flow.py @@ -4,10 +4,10 @@ import logging from typing import TYPE_CHECKING, Any, override +import probatio from pynintendoauth.exceptions import HttpException, InvalidSessionTokenException from pynintendoparental import Authenticator from pynintendoparental.api import Api -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_TOKEN @@ -68,7 +68,7 @@ async def async_step_user( return self.async_show_form( step_id="user", description_placeholders={"link": self.auth.login_url}, - data_schema=vol.Schema({vol.Required(CONF_API_TOKEN): str}), + data_schema=probatio.Schema({probatio.Required(CONF_API_TOKEN): str}), errors=errors, ) @@ -102,6 +102,6 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", description_placeholders={"link": self.auth.login_url}, - data_schema=vol.Schema({vol.Required(CONF_API_TOKEN): str}), + data_schema=probatio.Schema({probatio.Required(CONF_API_TOKEN): str}), errors=errors, ) diff --git a/homeassistant/components/nintendo_parental_controls/services.py b/homeassistant/components/nintendo_parental_controls/services.py index 5a7d21bcd6c7e..ac9a467c35b92 100644 --- a/homeassistant/components/nintendo_parental_controls/services.py +++ b/homeassistant/components/nintendo_parental_controls/services.py @@ -3,10 +3,10 @@ from enum import StrEnum import logging +import probatio from pynintendoparental.device import Device from pynintendoparental.enum import SafeLaunchSetting from pynintendoparental.player import Player -import voluptuous as vol from homeassistant.const import ATTR_DEVICE_ID, ATTR_ENTITY_ID, CONF_PIN from homeassistant.core import HomeAssistant, ServiceCall, SupportsResponse, callback @@ -43,10 +43,12 @@ def async_setup_services( domain=DOMAIN, service=NintendoParentalServices.ADD_BONUS_TIME, service_func=async_add_bonus_time, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): cv.string, - vol.Required(ATTR_BONUS_TIME): vol.All(int, vol.Range(min=5, max=30)), + probatio.Required(ATTR_DEVICE_ID): cv.string, + probatio.Required(ATTR_BONUS_TIME): probatio.All( + int, probatio.Range(min=5, max=30) + ), } ), ) @@ -55,10 +57,10 @@ def async_setup_services( service=NintendoParentalServices.PLAYER_USAGE_REPORT, service_func=async_get_player_usage, supports_response=SupportsResponse.ONLY, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): cv.string, - vol.Required(ATTR_ENTITY_ID): cv.string, + probatio.Required(ATTR_DEVICE_ID): cv.string, + probatio.Required(ATTR_ENTITY_ID): cv.string, } ), ) @@ -67,9 +69,9 @@ def async_setup_services( service=NintendoParentalServices.DEVICE_USAGE_REPORT, service_func=async_get_device_usage_report, supports_response=SupportsResponse.ONLY, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): cv.string, + probatio.Required(ATTR_DEVICE_ID): cv.string, } ), ) @@ -78,10 +80,10 @@ def async_setup_services( DOMAIN, NintendoParentalServices.UPDATE_PIN_CODE, async_update_pin_code, - vol.Schema( + probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): cv.string, - vol.Required(CONF_PIN): cv.string, + probatio.Required(ATTR_DEVICE_ID): cv.string, + probatio.Required(CONF_PIN): cv.string, } ), ) diff --git a/homeassistant/components/nissan_leaf/__init__.py b/homeassistant/components/nissan_leaf/__init__.py index 42a4d973c0026..82e9c8a5a045f 100644 --- a/homeassistant/components/nissan_leaf/__init__.py +++ b/homeassistant/components/nissan_leaf/__init__.py @@ -7,12 +7,12 @@ import sys from typing import Any, cast +import probatio from pycarwings2 import CarwingsError, Leaf, Session from pycarwings2.responses import ( CarwingsLatestBatteryStatusResponse, CarwingsLatestClimateControlStatusResponse, ) -import voluptuous as vol from homeassistant.const import CONF_PASSWORD, CONF_REGION, CONF_USERNAME, Platform from homeassistant.core import CALLBACK_TYPE, HomeAssistant, ServiceCall @@ -51,36 +51,42 @@ _LOGGER = logging.getLogger(__name__) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.All( + DOMAIN: probatio.All( cv.ensure_list, [ - vol.Schema( + probatio.Schema( { - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Required(CONF_REGION): vol.In(CONF_VALID_REGIONS), - vol.Optional(CONF_INTERVAL, default=DEFAULT_INTERVAL): ( - vol.All(cv.time_period, vol.Clamp(min=MIN_UPDATE_INTERVAL)) + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_REGION): probatio.In(CONF_VALID_REGIONS), + probatio.Optional(CONF_INTERVAL, default=DEFAULT_INTERVAL): ( + probatio.All( + cv.time_period, probatio.Clamp(min=MIN_UPDATE_INTERVAL) + ) ), - vol.Optional( + probatio.Optional( CONF_CHARGING_INTERVAL, default=DEFAULT_CHARGING_INTERVAL ): ( - vol.All(cv.time_period, vol.Clamp(min=MIN_UPDATE_INTERVAL)) + probatio.All( + cv.time_period, probatio.Clamp(min=MIN_UPDATE_INTERVAL) + ) ), - vol.Optional( + probatio.Optional( CONF_CLIMATE_INTERVAL, default=DEFAULT_CLIMATE_INTERVAL ): ( - vol.All(cv.time_period, vol.Clamp(min=MIN_UPDATE_INTERVAL)) + probatio.All( + cv.time_period, probatio.Clamp(min=MIN_UPDATE_INTERVAL) + ) ), - vol.Optional(CONF_FORCE_MILES, default=False): cv.boolean, + probatio.Optional(CONF_FORCE_MILES, default=False): cv.boolean, } ) ], ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) PLATFORMS = [Platform.BINARY_SENSOR, Platform.BUTTON, Platform.SENSOR, Platform.SWITCH] @@ -90,8 +96,8 @@ SERVICE_START_CHARGE_LEAF = "start_charge" ATTR_VIN = "vin" -UPDATE_LEAF_SCHEMA = vol.Schema({vol.Required(ATTR_VIN): cv.string}) -START_CHARGE_LEAF_SCHEMA = vol.Schema({vol.Required(ATTR_VIN): cv.string}) +UPDATE_LEAF_SCHEMA = probatio.Schema({probatio.Required(ATTR_VIN): cv.string}) +START_CHARGE_LEAF_SCHEMA = probatio.Schema({probatio.Required(ATTR_VIN): cv.string}) def setup(hass: HomeAssistant, config: ConfigType) -> bool: diff --git a/homeassistant/components/nmap_tracker/config_flow.py b/homeassistant/components/nmap_tracker/config_flow.py index 7d9c70d6d601d..b563cbf6c86c4 100644 --- a/homeassistant/components/nmap_tracker/config_flow.py +++ b/homeassistant/components/nmap_tracker/config_flow.py @@ -4,7 +4,7 @@ import re from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components import network from homeassistant.components.device_tracker import ( @@ -137,7 +137,7 @@ def normalize_input(user_input: dict[str, Any]) -> dict[str, str]: async def _async_build_schema_with_user_input( hass: HomeAssistant, user_input: dict[str, Any], include_options: bool -) -> vol.Schema: +) -> probatio.Schema: hosts = user_input.get(CONF_HOSTS_LIST, [await async_get_network(hass)]) ip_exclude = user_input.get( CONF_HOSTS_EXCLUDE, [await network.async_get_source_ip(hass, MDNS_TARGET_IP)] @@ -146,19 +146,19 @@ async def _async_build_schema_with_user_input( mac_exclude = user_input.get(CONF_MAC_EXCLUDE, []) schema: VolDictType = { - vol.Required(CONF_HOSTS_LIST, default=hosts): TextSelector( + probatio.Required(CONF_HOSTS_LIST, default=hosts): TextSelector( TextSelectorConfig(multiple=True) ), - vol.Required( + probatio.Required( CONF_HOME_INTERVAL, default=user_input.get(CONF_HOME_INTERVAL, 0) ): int, - vol.Optional(CONF_HOSTS_EXCLUDE, default=ip_exclude): TextSelector( + probatio.Optional(CONF_HOSTS_EXCLUDE, default=ip_exclude): TextSelector( TextSelectorConfig(multiple=True) ), - vol.Optional(CONF_MAC_EXCLUDE, default=mac_exclude): TextSelector( + probatio.Optional(CONF_MAC_EXCLUDE, default=mac_exclude): TextSelector( TextSelectorConfig(multiple=True) ), - vol.Optional( + probatio.Optional( CONF_OPTIONS, default=user_input.get(CONF_OPTIONS, DEFAULT_OPTIONS) ): str, } @@ -167,18 +167,22 @@ async def _async_build_schema_with_user_input( { # Approved exemption: nmap scan interval is user-configurable # pylint: disable-next=home-assistant-config-flow-polling-field - vol.Optional( + probatio.Optional( CONF_SCAN_INTERVAL, default=user_input.get(CONF_SCAN_INTERVAL, TRACKER_SCAN_INTERVAL), - ): vol.All(vol.Coerce(int), vol.Range(min=10, max=MAX_SCAN_INTERVAL)), - vol.Optional( + ): probatio.All( + probatio.Coerce(int), probatio.Range(min=10, max=MAX_SCAN_INTERVAL) + ), + probatio.Optional( CONF_CONSIDER_HOME, default=user_input.get(CONF_CONSIDER_HOME) or DEFAULT_CONSIDER_HOME.total_seconds(), - ): vol.All(vol.Coerce(int), vol.Range(min=1, max=MAX_CONSIDER_HOME)), + ): probatio.All( + probatio.Coerce(int), probatio.Range(min=1, max=MAX_CONSIDER_HOME) + ), } ) - return vol.Schema(schema) + return probatio.Schema(schema) class OptionsFlowHandler(OptionsFlowWithReload): diff --git a/homeassistant/components/nmbs/config_flow.py b/homeassistant/components/nmbs/config_flow.py index 3a5a87213c51e..3e2f0e4141554 100644 --- a/homeassistant/components/nmbs/config_flow.py +++ b/homeassistant/components/nmbs/config_flow.py @@ -2,9 +2,9 @@ from typing import Any, override +import probatio from pyrail import iRail from pyrail.models import StationDetails -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_SHOW_ON_MAP @@ -87,22 +87,22 @@ async def async_step_user( data=user_input, ) - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required(CONF_STATION_FROM): SelectSelector( + probatio.Required(CONF_STATION_FROM): SelectSelector( SelectSelectorConfig( options=choices, mode=SelectSelectorMode.DROPDOWN, ) ), - vol.Required(CONF_STATION_TO): SelectSelector( + probatio.Required(CONF_STATION_TO): SelectSelector( SelectSelectorConfig( options=choices, mode=SelectSelectorMode.DROPDOWN, ) ), - vol.Optional(CONF_EXCLUDE_VIAS): BooleanSelector(), - vol.Optional(CONF_SHOW_ON_MAP): BooleanSelector(), + probatio.Optional(CONF_EXCLUDE_VIAS): BooleanSelector(), + probatio.Optional(CONF_SHOW_ON_MAP): BooleanSelector(), }, ) return self.async_show_form( diff --git a/homeassistant/components/no_ip/__init__.py b/homeassistant/components/no_ip/__init__.py index c23177ddf94cd..166344d8c14f2 100644 --- a/homeassistant/components/no_ip/__init__.py +++ b/homeassistant/components/no_ip/__init__.py @@ -7,7 +7,7 @@ import aiohttp from aiohttp.hdrs import AUTHORIZATION, USER_AGENT -import voluptuous as vol +import probatio from homeassistant.const import CONF_DOMAIN, CONF_PASSWORD, CONF_TIMEOUT, CONF_USERNAME from homeassistant.core import HomeAssistant @@ -42,18 +42,20 @@ UPDATE_URL = "https://dynupdate.no-ip.com/nic/update" HA_USER_AGENT = f"{SERVER_SOFTWARE} {EMAIL}" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_DOMAIN): cv.string, - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, + probatio.Required(CONF_DOMAIN): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Optional( + CONF_TIMEOUT, default=DEFAULT_TIMEOUT + ): cv.positive_int, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/noaa_tides/sensor.py b/homeassistant/components/noaa_tides/sensor.py index 4f842993be6c4..2cb734ed37b77 100644 --- a/homeassistant/components/noaa_tides/sensor.py +++ b/homeassistant/components/noaa_tides/sensor.py @@ -5,8 +5,8 @@ from typing import TYPE_CHECKING, Any, Literal, TypedDict, override import noaa_coops as coops +import probatio import requests -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -39,10 +39,12 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_STATION_ID): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_TIME_ZONE, default=DEFAULT_TIMEZONE): vol.In(TIMEZONES), - vol.Optional(CONF_UNIT_SYSTEM): vol.In(UNIT_SYSTEMS), + probatio.Required(CONF_STATION_ID): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_TIME_ZONE, default=DEFAULT_TIMEZONE): probatio.In( + TIMEZONES + ), + probatio.Optional(CONF_UNIT_SYSTEM): probatio.In(UNIT_SYSTEMS), } ) diff --git a/homeassistant/components/nobo_hub/config_flow.py b/homeassistant/components/nobo_hub/config_flow.py index 51b52f4e4a6e8..53baf9b08ea30 100644 --- a/homeassistant/components/nobo_hub/config_flow.py +++ b/homeassistant/components/nobo_hub/config_flow.py @@ -3,8 +3,8 @@ import ipaddress from typing import TYPE_CHECKING, Any, override +import probatio from pynobo import PynoboConnectionError, nobo -import voluptuous as vol from homeassistant.config_entries import ( ConfigEntryState, @@ -79,9 +79,9 @@ async def async_step_user( hubs = self._hubs() hubs["manual"] = "Manual" - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required("device"): vol.In(hubs), + probatio.Required("device"): probatio.In(hubs), } ) return self.async_show_form( @@ -187,9 +187,9 @@ async def async_step_selected( user_input = user_input or {} return self.async_show_form( step_id="selected", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( "serial_suffix", default=user_input.get("serial_suffix") ): str, } @@ -253,7 +253,7 @@ async def async_step_reconfigure( return self.async_show_form( step_id="reconfigure", data_schema=self.add_suggested_values_to_schema( - vol.Schema({vol.Required(CONF_IP_ADDRESS): str}), + probatio.Schema({probatio.Required(CONF_IP_ADDRESS): str}), user_input or reconfigure_entry.data, ), errors=errors, @@ -278,10 +278,12 @@ async def async_step_manual( user_input = user_input or {} return self.async_show_form( step_id="manual", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_SERIAL, default=user_input.get(CONF_SERIAL)): str, - vol.Required( + probatio.Required( + CONF_SERIAL, default=user_input.get(CONF_SERIAL) + ): str, + probatio.Required( CONF_IP_ADDRESS, default=user_input.get(CONF_IP_ADDRESS) ): str, } @@ -374,9 +376,11 @@ async def async_step_init( CONF_OVERRIDE_TYPE, OVERRIDE_TYPE_CONSTANT ) - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required(CONF_OVERRIDE_TYPE, default=override_type): SelectSelector( + probatio.Required( + CONF_OVERRIDE_TYPE, default=override_type + ): SelectSelector( SelectSelectorConfig( options=[OVERRIDE_TYPE_CONSTANT, OVERRIDE_TYPE_NOW], translation_key=CONF_OVERRIDE_TYPE, diff --git a/homeassistant/components/nordpool/config_flow.py b/homeassistant/components/nordpool/config_flow.py index 413d108882316..bc2f54d2774dd 100644 --- a/homeassistant/components/nordpool/config_flow.py +++ b/homeassistant/components/nordpool/config_flow.py @@ -2,6 +2,7 @@ from typing import Any, override +import probatio from pynordpool import ( Currency, NordPoolClient, @@ -9,7 +10,6 @@ NordPoolError, ) from pynordpool.const import AREAS -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_CURRENCY @@ -30,9 +30,9 @@ ] SELECT_CURRENCY = [currency.value for currency in Currency] -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_AREAS, default=[]): SelectSelector( + probatio.Required(CONF_AREAS, default=[]): SelectSelector( SelectSelectorConfig( options=SELECT_AREAS, multiple=True, @@ -40,7 +40,7 @@ sort=True, ) ), - vol.Required(CONF_CURRENCY, default="SEK"): SelectSelector( + probatio.Required(CONF_CURRENCY, default="SEK"): SelectSelector( SelectSelectorConfig( options=SELECT_CURRENCY, multiple=False, diff --git a/homeassistant/components/nordpool/services.py b/homeassistant/components/nordpool/services.py index e796ba0e87000..b096b05b29560 100644 --- a/homeassistant/components/nordpool/services.py +++ b/homeassistant/components/nordpool/services.py @@ -6,6 +6,7 @@ import logging from typing import TYPE_CHECKING +import probatio from pynordpool import ( AREAS, Currency, @@ -16,7 +17,6 @@ NordPoolError, PriceIndicesData, ) -import voluptuous as vol from homeassistant.const import ATTR_DATE from homeassistant.core import ( @@ -45,7 +45,7 @@ def _validate_areas(areas: list[str]) -> list[str]: validated_area = cv.string(area) validated_area = validated_area.upper() if validated_area not in AREAS: - raise vol.Invalid(f"Area {area} is not valid") + raise probatio.Invalid(f"Area {area} is not valid") validated_areas.append(validated_area) @@ -59,22 +59,27 @@ def _validate_areas(areas: list[str]) -> list[str]: SERVICE_GET_PRICES_FOR_DATE = "get_prices_for_date" SERVICE_GET_PRICE_INDICES_FOR_DATE = "get_price_indices_for_date" -SERVICE_GET_PRICES_SCHEMA = vol.Schema( +SERVICE_GET_PRICES_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY): ConfigEntrySelector({"integration": DOMAIN}), - vol.Required(ATTR_DATE): cv.date, - vol.Optional(ATTR_AREAS, default=[]): vol.All(cv.ensure_list, _validate_areas), - vol.Optional(ATTR_CURRENCY): vol.All( + probatio.Required(ATTR_CONFIG_ENTRY): ConfigEntrySelector( + {"integration": DOMAIN} + ), + probatio.Required(ATTR_DATE): cv.date, + probatio.Optional(ATTR_AREAS, default=[]): probatio.All( + cv.ensure_list, _validate_areas + ), + probatio.Optional(ATTR_CURRENCY): probatio.All( cv.string, - vol.Upper, - vol.In([currency.value for currency in Currency]), + probatio.Upper, + probatio.In([currency.value for currency in Currency]), ), } ) SERVICE_GET_PRICE_INDICES_SCHEMA = SERVICE_GET_PRICES_SCHEMA.extend( { - vol.Optional(ATTR_RESOLUTION, default=60): vol.All( - cv.positive_int, vol.All(vol.Coerce(int), vol.In((15, 30, 60))) + probatio.Optional(ATTR_RESOLUTION, default=60): probatio.All( + cv.positive_int, + probatio.All(probatio.Coerce(int), probatio.In((15, 30, 60))), ), } ) diff --git a/homeassistant/components/norway_air/air_quality.py b/homeassistant/components/norway_air/air_quality.py index 70a287d7db448..06bb1d0dc843a 100644 --- a/homeassistant/components/norway_air/air_quality.py +++ b/homeassistant/components/norway_air/air_quality.py @@ -5,7 +5,7 @@ from typing import override import metno -import voluptuous as vol +import probatio from homeassistant.components.air_quality import ( PLATFORM_SCHEMA as AIR_QUALITY_PLATFORM_SCHEMA, @@ -30,10 +30,12 @@ PLATFORM_SCHEMA = AIR_QUALITY_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_FORECAST, default=DEFAULT_FORECAST): vol.Coerce(int), - vol.Optional(CONF_LATITUDE): cv.latitude, - vol.Optional(CONF_LONGITUDE): cv.longitude, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_FORECAST, default=DEFAULT_FORECAST): probatio.Coerce( + int + ), + probatio.Optional(CONF_LATITUDE): cv.latitude, + probatio.Optional(CONF_LONGITUDE): cv.longitude, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/notify/__init__.py b/homeassistant/components/notify/__init__.py index 8d4f44e2cae09..92cafcb8bd8f0 100644 --- a/homeassistant/components/notify/__init__.py +++ b/homeassistant/components/notify/__init__.py @@ -6,8 +6,8 @@ import logging from typing import Any, final, override +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.components import persistent_notification as pn from homeassistant.config_entries import ConfigEntry @@ -54,9 +54,12 @@ _LOGGER = logging.getLogger(__name__) -PLATFORM_SCHEMA = vol.Schema( - {vol.Required(CONF_PLATFORM): cv.string, vol.Optional(CONF_NAME): cv.string}, - extra=vol.ALLOW_EXTRA, +PLATFORM_SCHEMA = probatio.Schema( + { + probatio.Required(CONF_PLATFORM): cv.string, + probatio.Optional(CONF_NAME): cv.string, + }, + extra=probatio.ALLOW_EXTRA, ) @@ -84,8 +87,8 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: component.async_register_entity_service( SERVICE_SEND_MESSAGE, { - vol.Required(ATTR_MESSAGE): cv.string, - vol.Optional(ATTR_TITLE): cv.string, + probatio.Required(ATTR_MESSAGE): cv.string, + probatio.Optional(ATTR_TITLE): cv.string, }, "_async_send_message", ) diff --git a/homeassistant/components/notify/const.py b/homeassistant/components/notify/const.py index 30b5a128ab2d9..d65e74ae6ae78 100644 --- a/homeassistant/components/notify/const.py +++ b/homeassistant/components/notify/const.py @@ -3,7 +3,7 @@ import logging from typing import Final -import voluptuous as vol +import probatio from homeassistant.helpers import config_validation as cv @@ -29,11 +29,11 @@ SERVICE_SEND_MESSAGE = "send_message" SERVICE_PERSISTENT_NOTIFICATION = "persistent_notification" -NOTIFY_SERVICE_SCHEMA = vol.Schema( +NOTIFY_SERVICE_SCHEMA = probatio.Schema( { - vol.Required(ATTR_MESSAGE): cv.string, - vol.Optional(ATTR_TITLE): cv.string, - vol.Optional(ATTR_TARGET): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(ATTR_DATA): dict, + probatio.Required(ATTR_MESSAGE): cv.string, + probatio.Optional(ATTR_TITLE): cv.string, + probatio.Optional(ATTR_TARGET): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(ATTR_DATA): dict, } ) diff --git a/homeassistant/components/notify_events/__init__.py b/homeassistant/components/notify_events/__init__.py index 76cfd9be4ff8c..3503e80e68eb6 100644 --- a/homeassistant/components/notify_events/__init__.py +++ b/homeassistant/components/notify_events/__init__.py @@ -1,6 +1,6 @@ """The notify_events component.""" -import voluptuous as vol +import probatio from homeassistant.const import CONF_TOKEN, Platform from homeassistant.core import HomeAssistant @@ -9,8 +9,9 @@ from .const import DOMAIN -CONFIG_SCHEMA = vol.Schema( - {DOMAIN: vol.Schema({vol.Required(CONF_TOKEN): cv.string})}, extra=vol.ALLOW_EXTRA +CONFIG_SCHEMA = probatio.Schema( + {DOMAIN: probatio.Schema({probatio.Required(CONF_TOKEN): cv.string})}, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/notion/config_flow.py b/homeassistant/components/notion/config_flow.py index daee8caaf7d89..99556399fa8fe 100644 --- a/homeassistant/components/notion/config_flow.py +++ b/homeassistant/components/notion/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from aionotion.errors import InvalidCredentialsError, NotionError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -14,15 +14,15 @@ from .const import CONF_REFRESH_TOKEN, CONF_USER_UUID, DOMAIN, LOGGER from .util import async_get_client_with_credentials -AUTH_SCHEMA = vol.Schema( +AUTH_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) -REAUTH_SCHEMA = vol.Schema( +REAUTH_SCHEMA = probatio.Schema( { - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/novy_cooker_hood/config_flow.py b/homeassistant/components/novy_cooker_hood/config_flow.py index 94c6e263632a1..b795a21e29774 100644 --- a/homeassistant/components/novy_cooker_hood/config_flow.py +++ b/homeassistant/components/novy_cooker_hood/config_flow.py @@ -3,8 +3,8 @@ import asyncio from typing import Any, override +import probatio from rf_protocols.codes.novy.cooker_hood import NovyCookerHoodButton -import voluptuous as vol from homeassistant.components.radio_frequency import ( async_get_transmitters, @@ -104,13 +104,15 @@ async def _async_step_picker( return await self.async_step_test_light() schema: dict[Any, Any] = { - vol.Required( + probatio.Required( CONF_TRANSMITTER, - default=self._transmitter_entity_id or vol.UNDEFINED, + default=self._transmitter_entity_id or probatio.UNDEFINED, ): selector.EntitySelector( selector.EntitySelectorConfig(include_entities=transmitters), ), - vol.Required(CONF_CODE, default=str(self._code)): selector.SelectSelector( + probatio.Required( + CONF_CODE, default=str(self._code) + ): selector.SelectSelector( selector.SelectSelectorConfig( options=_CODE_OPTIONS, mode=selector.SelectSelectorMode.DROPDOWN, @@ -120,7 +122,7 @@ async def _async_step_picker( } return self.async_show_form( step_id=step_id, - data_schema=vol.Schema(schema), + data_schema=probatio.Schema(schema), ) async def async_step_test_light( diff --git a/homeassistant/components/nrgkick/config_flow.py b/homeassistant/components/nrgkick/config_flow.py index 83d6dadde2584..3641b5d31d15d 100644 --- a/homeassistant/components/nrgkick/config_flow.py +++ b/homeassistant/components/nrgkick/config_flow.py @@ -5,7 +5,7 @@ from typing import TYPE_CHECKING, Any, override from nrgkick_api import NRGkickAPI -import voluptuous as vol +import probatio import yarl from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -42,33 +42,35 @@ def _normalize_host(value: str) -> str: value = value.strip() if not value: - raise vol.Invalid("host is required") + raise probatio.Invalid("host is required") if "://" in value: try: url = yarl.URL(cv.url(value)) except ValueError as err: - raise vol.Invalid("invalid url") from err + raise probatio.Invalid("invalid url") from err if not url.host: - raise vol.Invalid("invalid url") + raise probatio.Invalid("invalid url") if url.port is not None: return f"{url.host}:{url.port}" return url.host return value.strip("/").split("/", 1)[0] -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): TextSelector(TextSelectorConfig(autocomplete="off")), + probatio.Required(CONF_HOST): TextSelector( + TextSelectorConfig(autocomplete="off") + ), } ) -STEP_AUTH_DATA_SCHEMA = vol.Schema( +STEP_AUTH_DATA_SCHEMA = probatio.Schema( { - vol.Optional(CONF_USERNAME): TextSelector( + probatio.Optional(CONF_USERNAME): TextSelector( TextSelectorConfig(autocomplete="off") ), - vol.Optional(CONF_PASSWORD): TextSelector( + probatio.Optional(CONF_PASSWORD): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } @@ -177,7 +179,7 @@ async def async_step_user( if user_input is not None: try: host = _normalize_host(user_input[CONF_HOST]) - except vol.Invalid: + except probatio.Invalid: errors["base"] = "cannot_connect" else: info, needs_auth = await self._async_validate_host(host, errors) @@ -280,7 +282,7 @@ async def async_step_reconfigure( if user_input is not None: try: host = _normalize_host(user_input[CONF_HOST]) - except vol.Invalid: + except probatio.Invalid: errors["base"] = "cannot_connect" else: info, needs_auth = await self._async_validate_host(host, errors) @@ -426,7 +428,7 @@ async def async_step_zeroconf_enable_json_api( return self.async_show_form( step_id="zeroconf_enable_json_api", - data_schema=vol.Schema({}), + data_schema=probatio.Schema({}), description_placeholders={ "name": self._discovered_name, "device_ip": _normalize_host(self._discovered_host), @@ -450,7 +452,7 @@ async def async_step_zeroconf_confirm( return self.async_show_form( step_id="zeroconf_confirm", - data_schema=vol.Schema({}), + data_schema=probatio.Schema({}), description_placeholders={ "name": self._discovered_name, "device_ip": self._discovered_host, diff --git a/homeassistant/components/nsw_fuel_station/sensor.py b/homeassistant/components/nsw_fuel_station/sensor.py index 2adf00aac53fb..5f3ab031f694e 100644 --- a/homeassistant/components/nsw_fuel_station/sensor.py +++ b/homeassistant/components/nsw_fuel_station/sensor.py @@ -3,7 +3,7 @@ import logging from typing import override -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -43,10 +43,10 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_STATION_ID): cv.positive_int, - vol.Optional(CONF_FUEL_TYPES, default=CONF_DEFAULT_FUEL_TYPES): vol.All( - cv.ensure_list, [vol.In(CONF_ALLOWED_FUEL_TYPES)] - ), + probatio.Required(CONF_STATION_ID): cv.positive_int, + probatio.Optional( + CONF_FUEL_TYPES, default=CONF_DEFAULT_FUEL_TYPES + ): probatio.All(cv.ensure_list, [probatio.In(CONF_ALLOWED_FUEL_TYPES)]), } ) diff --git a/homeassistant/components/nsw_rural_fire_service_feed/geo_location.py b/homeassistant/components/nsw_rural_fire_service_feed/geo_location.py index 76e7371bc4771..35c30053a47a8 100644 --- a/homeassistant/components/nsw_rural_fire_service_feed/geo_location.py +++ b/homeassistant/components/nsw_rural_fire_service_feed/geo_location.py @@ -9,7 +9,7 @@ from aio_geojson_nsw_rfs_incidents.feed_entry import ( NswRuralFireServiceIncidentsFeedEntry, ) -import voluptuous as vol +import probatio from homeassistant.components.geo_location import ( PLATFORM_SCHEMA as GEO_LOCATION_PLATFORM_SCHEMA, @@ -62,12 +62,14 @@ PLATFORM_SCHEMA = GEO_LOCATION_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_CATEGORIES, default=[]): vol.All( - cv.ensure_list, [vol.In(VALID_CATEGORIES)] + probatio.Optional(CONF_CATEGORIES, default=[]): probatio.All( + cv.ensure_list, [probatio.In(VALID_CATEGORIES)] + ), + probatio.Optional(CONF_LATITUDE): cv.latitude, + probatio.Optional(CONF_LONGITUDE): cv.longitude, + probatio.Optional(CONF_RADIUS, default=DEFAULT_RADIUS_IN_KM): probatio.Coerce( + float ), - vol.Optional(CONF_LATITUDE): cv.latitude, - vol.Optional(CONF_LONGITUDE): cv.longitude, - vol.Optional(CONF_RADIUS, default=DEFAULT_RADIUS_IN_KM): vol.Coerce(float), } ) diff --git a/homeassistant/components/ntfy/config_flow.py b/homeassistant/components/ntfy/config_flow.py index 3c988e4f454d4..5e0bed63b50f5 100644 --- a/homeassistant/components/ntfy/config_flow.py +++ b/homeassistant/components/ntfy/config_flow.py @@ -13,7 +13,7 @@ NtfyHTTPError, NtfyUnauthorizedAuthenticationError, ) -import voluptuous as vol +import probatio from yarl import URL from homeassistant import data_entry_flow @@ -62,25 +62,25 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_URL, default=DEFAULT_URL): TextSelector( + probatio.Required(CONF_URL, default=DEFAULT_URL): TextSelector( TextSelectorConfig( type=TextSelectorType.URL, autocomplete="url", ), ), - vol.Required(CONF_VERIFY_SSL, default=True): bool, - vol.Required(SECTION_AUTH): data_entry_flow.section( - vol.Schema( + probatio.Required(CONF_VERIFY_SSL, default=True): bool, + probatio.Required(SECTION_AUTH): data_entry_flow.section( + probatio.Schema( { - vol.Optional(CONF_USERNAME): TextSelector( + probatio.Optional(CONF_USERNAME): TextSelector( TextSelectorConfig( type=TextSelectorType.TEXT, autocomplete="username", ), ), - vol.Optional(CONF_PASSWORD): TextSelector( + probatio.Optional(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", @@ -93,39 +93,39 @@ } ) -STEP_REAUTH_DATA_SCHEMA = vol.Schema( +STEP_REAUTH_DATA_SCHEMA = probatio.Schema( { - vol.Exclusive(CONF_PASSWORD, ATTR_CREDENTIALS): TextSelector( + probatio.Exclusive(CONF_PASSWORD, ATTR_CREDENTIALS): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", ), ), - vol.Exclusive(CONF_TOKEN, ATTR_CREDENTIALS): str, + probatio.Exclusive(CONF_TOKEN, ATTR_CREDENTIALS): str, } ) -STEP_RECONFIGURE_DATA_SCHEMA = vol.Schema( +STEP_RECONFIGURE_DATA_SCHEMA = probatio.Schema( { - vol.Exclusive(CONF_USERNAME, ATTR_CREDENTIALS): TextSelector( + probatio.Exclusive(CONF_USERNAME, ATTR_CREDENTIALS): TextSelector( TextSelectorConfig( type=TextSelectorType.TEXT, autocomplete="username", ), ), - vol.Optional(CONF_PASSWORD, default=""): TextSelector( + probatio.Optional(CONF_PASSWORD, default=""): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", ), ), - vol.Exclusive(CONF_TOKEN, ATTR_CREDENTIALS): str, + probatio.Exclusive(CONF_TOKEN, ATTR_CREDENTIALS): str, } ) -TOPIC_FILTER_SCHEMA = vol.Schema( +TOPIC_FILTER_SCHEMA = probatio.Schema( { - vol.Optional(CONF_PRIORITY): SelectSelector( + probatio.Optional(CONF_PRIORITY): SelectSelector( SelectSelectorConfig( multiple=True, options=["5", "4", "3", "2", "1"], @@ -133,25 +133,25 @@ translation_key="priority", ) ), - vol.Optional(CONF_TAGS): TextSelector( + probatio.Optional(CONF_TAGS): TextSelector( TextSelectorConfig( type=TextSelectorType.TEXT, multiple=True, ), ), - vol.Optional(CONF_TITLE): str, - vol.Optional(CONF_MESSAGE): str, + probatio.Optional(CONF_TITLE): str, + probatio.Optional(CONF_MESSAGE): str, } ) -STEP_USER_TOPIC_SCHEMA = vol.Schema( +STEP_USER_TOPIC_SCHEMA = probatio.Schema( { - vol.Required(CONF_TOPIC): str, + probatio.Required(CONF_TOPIC): str, # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Optional(CONF_NAME): str, - vol.Required(SECTION_FILTER): data_entry_flow.section( + probatio.Optional(CONF_NAME): str, + probatio.Required(SECTION_FILTER): data_entry_flow.section( TOPIC_FILTER_SCHEMA, {"collapsed": True}, ), diff --git a/homeassistant/components/ntfy/repairs.py b/homeassistant/components/ntfy/repairs.py index 6f8f59d4cafd9..0106c26a7dbf8 100644 --- a/homeassistant/components/ntfy/repairs.py +++ b/homeassistant/components/ntfy/repairs.py @@ -1,6 +1,6 @@ """Repairs for ntfy integration.""" -import voluptuous as vol +import probatio from homeassistant.components.repairs import ( ConfirmRepairFlow, @@ -41,7 +41,7 @@ async def async_step_confirm( return self.async_show_form( step_id="confirm", - data_schema=vol.Schema({}), + data_schema=probatio.Schema({}), description_placeholders={CONF_TOPIC: self.topic}, ) diff --git a/homeassistant/components/ntfy/services.py b/homeassistant/components/ntfy/services.py index b5fe790851f56..562d34666b473 100644 --- a/homeassistant/components/ntfy/services.py +++ b/homeassistant/components/ntfy/services.py @@ -4,7 +4,7 @@ from typing import Any from aiontfy import BroadcastAction, CopyAction, HttpAction, ViewAction -import voluptuous as vol +import probatio from yarl import URL from homeassistant.components.notify import ( @@ -64,75 +64,81 @@ def validate_filename(params: dict[str, Any]) -> dict[str, Any]: if ATTR_FILENAME in params and not ( ATTR_ATTACH_FILE in params or ATTR_ATTACH in params ): - raise vol.Invalid("Filename only allowed when attachment is provided") + raise probatio.Invalid("Filename only allowed when attachment is provided") return params -ACTION_SCHEMA = vol.Schema( +ACTION_SCHEMA = probatio.Schema( { - vol.Required(ATTR_LABEL): cv.string, - vol.Optional(ATTR_CLEAR, default=False): cv.boolean, + probatio.Required(ATTR_LABEL): cv.string, + probatio.Optional(ATTR_CLEAR, default=False): cv.boolean, } ) VIEW_SCHEMA = ACTION_SCHEMA.extend( { - vol.Required(ATTR_ACTION): vol.Equal("view"), - vol.Required(ATTR_URL): vol.All(vol.Url(), vol.Coerce(URL)), + probatio.Required(ATTR_ACTION): probatio.Equal("view"), + probatio.Required(ATTR_URL): probatio.All(probatio.Url(), probatio.Coerce(URL)), } ) BROADCAST_SCHEMA = ACTION_SCHEMA.extend( { - vol.Required(ATTR_ACTION): vol.Equal("broadcast"), - vol.Optional(ATTR_INTENT): cv.string, - vol.Optional(ATTR_EXTRAS): dict[str, str], + probatio.Required(ATTR_ACTION): probatio.Equal("broadcast"), + probatio.Optional(ATTR_INTENT): cv.string, + probatio.Optional(ATTR_EXTRAS): dict[str, str], } ) HTTP_SCHEMA = VIEW_SCHEMA.extend( { - vol.Required(ATTR_ACTION): vol.Equal("http"), - vol.Optional(ATTR_METHOD): cv.string, - vol.Optional(ATTR_HEADERS): dict[str, str], - vol.Optional(ATTR_BODY): cv.string, + probatio.Required(ATTR_ACTION): probatio.Equal("http"), + probatio.Optional(ATTR_METHOD): cv.string, + probatio.Optional(ATTR_HEADERS): dict[str, str], + probatio.Optional(ATTR_BODY): cv.string, } ) COPY_SCHEMA = ACTION_SCHEMA.extend( { - vol.Required(ATTR_ACTION): vol.Equal("copy"), - vol.Required(ATTR_VALUE): cv.string, + probatio.Required(ATTR_ACTION): probatio.Equal("copy"), + probatio.Required(ATTR_VALUE): cv.string, } ) -SERVICE_PUBLISH_SCHEMA = vol.All( +SERVICE_PUBLISH_SCHEMA = probatio.All( cv.make_entity_service_schema( { - vol.Optional(ATTR_TITLE): cv.string, - vol.Optional(ATTR_MESSAGE): cv.string, - vol.Optional(ATTR_MARKDOWN): cv.boolean, - vol.Optional(ATTR_TAGS): vol.All(cv.ensure_list, [str]), - vol.Optional(ATTR_PRIORITY): vol.All(vol.Coerce(int), vol.Range(1, 5)), - vol.Optional(ATTR_CLICK): vol.All(vol.Url(), vol.Coerce(URL)), - vol.Optional(ATTR_DELAY): vol.All( + probatio.Optional(ATTR_TITLE): cv.string, + probatio.Optional(ATTR_MESSAGE): cv.string, + probatio.Optional(ATTR_MARKDOWN): cv.boolean, + probatio.Optional(ATTR_TAGS): probatio.All(cv.ensure_list, [str]), + probatio.Optional(ATTR_PRIORITY): probatio.All( + probatio.Coerce(int), probatio.Range(1, 5) + ), + probatio.Optional(ATTR_CLICK): probatio.All( + probatio.Url(), probatio.Coerce(URL) + ), + probatio.Optional(ATTR_DELAY): probatio.All( cv.time_period, - vol.Range(min=timedelta(seconds=10), max=timedelta(days=3)), + probatio.Range(min=timedelta(seconds=10), max=timedelta(days=3)), ), - vol.Optional(ATTR_EMAIL): vol.Email(), - vol.Optional(ATTR_CALL): cv.string, - vol.Optional(ATTR_ICON): vol.All(vol.Url(), vol.Coerce(URL)), - vol.Optional(ATTR_SEQUENCE_ID): cv.string, - vol.Exclusive(ATTR_ATTACH, GRP_ATTACHMENT, MSG_ATTACHMENT): vol.All( - vol.Url(), vol.Coerce(URL) + probatio.Optional(ATTR_EMAIL): probatio.Email(), + probatio.Optional(ATTR_CALL): cv.string, + probatio.Optional(ATTR_ICON): probatio.All( + probatio.Url(), probatio.Coerce(URL) ), - vol.Exclusive( + probatio.Optional(ATTR_SEQUENCE_ID): cv.string, + probatio.Exclusive( + ATTR_ATTACH, GRP_ATTACHMENT, MSG_ATTACHMENT + ): probatio.All(probatio.Url(), probatio.Coerce(URL)), + probatio.Exclusive( ATTR_ATTACH_FILE, GRP_ATTACHMENT, MSG_ATTACHMENT ): MediaSelector({"accept": ["*/*"]}), - vol.Optional(ATTR_FILENAME): cv.string, - vol.Optional(ATTR_ACTIONS): vol.All( + probatio.Optional(ATTR_FILENAME): cv.string, + probatio.Optional(ATTR_ACTIONS): probatio.All( cv.ensure_list, - vol.Length( + probatio.Length( max=MAX_ACTIONS_ALLOWED, msg="Too many actions defined. A maximum of 3 is supported", ), - [vol.Any(VIEW_SCHEMA, BROADCAST_SCHEMA, HTTP_SCHEMA, COPY_SCHEMA)], + [probatio.Any(VIEW_SCHEMA, BROADCAST_SCHEMA, HTTP_SCHEMA, COPY_SCHEMA)], ), } ), @@ -141,7 +147,7 @@ def validate_filename(params: dict[str, Any]) -> dict[str, Any]: SERVICE_CLEAR_DELETE_SCHEMA = cv.make_entity_service_schema( { - vol.Required(ATTR_SEQUENCE_ID): cv.string, + probatio.Required(ATTR_SEQUENCE_ID): cv.string, } ) diff --git a/homeassistant/components/nuheat/config_flow.py b/homeassistant/components/nuheat/config_flow.py index 497b218796183..b2e487c4f8ccb 100644 --- a/homeassistant/components/nuheat/config_flow.py +++ b/homeassistant/components/nuheat/config_flow.py @@ -5,8 +5,8 @@ from typing import Any, override import nuheat +import probatio import requests.exceptions -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -17,11 +17,11 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Required(CONF_SERIAL_NUMBER): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Required(CONF_SERIAL_NUMBER): str, } ) diff --git a/homeassistant/components/nuki/config_flow.py b/homeassistant/components/nuki/config_flow.py index f2d538b83e9a8..c5971a819d57a 100644 --- a/homeassistant/components/nuki/config_flow.py +++ b/homeassistant/components/nuki/config_flow.py @@ -4,10 +4,10 @@ import logging from typing import Any, override +import probatio from pynuki import NukiBridge from pynuki.bridge import InvalidCredentialsException from requests.exceptions import RequestException -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PORT, CONF_TOKEN @@ -19,18 +19,18 @@ _LOGGER = logging.getLogger(__name__) -USER_SCHEMA = vol.Schema( +USER_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): vol.Coerce(int), - vol.Required(CONF_TOKEN): str, + probatio.Required(CONF_HOST): str, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): probatio.Coerce(int), + probatio.Required(CONF_TOKEN): str, } ) -REAUTH_SCHEMA = vol.Schema( +REAUTH_SCHEMA = probatio.Schema( { - vol.Required(CONF_TOKEN): str, - vol.Optional(CONF_ENCRYPT_TOKEN, default=True): bool, + probatio.Required(CONF_TOKEN): str, + probatio.Optional(CONF_ENCRYPT_TOKEN, default=True): bool, } ) @@ -68,7 +68,7 @@ class NukiConfigFlow(ConfigFlow, domain=DOMAIN): def __init__(self) -> None: """Initialize the Nuki config flow.""" - self.discovery_schema: vol.Schema | None = None + self.discovery_schema: probatio.Schema | None = None self._data: Mapping[str, Any] = {} @override @@ -87,11 +87,11 @@ async def async_step_dhcp( self._abort_if_unique_id_configured() - self.discovery_schema = vol.Schema( + self.discovery_schema = probatio.Schema( { - vol.Required(CONF_HOST, default=discovery_info.ip): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, - vol.Required(CONF_TOKEN): str, + probatio.Required(CONF_HOST, default=discovery_info.ip): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Required(CONF_TOKEN): str, } ) @@ -159,7 +159,7 @@ async def async_step_validate( if user_input is not None: data_schema = USER_SCHEMA.extend( { - vol.Optional(CONF_ENCRYPT_TOKEN, default=True): bool, + probatio.Optional(CONF_ENCRYPT_TOKEN, default=True): bool, } ) try: diff --git a/homeassistant/components/nuki/lock.py b/homeassistant/components/nuki/lock.py index 5093bcde73044..157f620d89e69 100644 --- a/homeassistant/components/nuki/lock.py +++ b/homeassistant/components/nuki/lock.py @@ -3,11 +3,11 @@ from abc import abstractmethod from typing import Any, override +import probatio from pynuki import NukiLock, NukiOpener from pynuki.constants import MODE_OPENER_CONTINUOUS from pynuki.device import NukiDevice from requests.exceptions import RequestException -import voluptuous as vol from homeassistant.components.lock import LockEntity, LockEntityFeature from homeassistant.core import HomeAssistant @@ -41,7 +41,7 @@ async def async_setup_entry( platform.async_register_entity_service( "lock_n_go", { - vol.Optional(ATTR_UNLATCH, default=False): cv.boolean, + probatio.Optional(ATTR_UNLATCH, default=False): cv.boolean, }, "lock_n_go", ) @@ -49,7 +49,7 @@ async def async_setup_entry( platform.async_register_entity_service( "set_continuous_mode", { - vol.Required(ATTR_ENABLE): cv.boolean, + probatio.Required(ATTR_ENABLE): cv.boolean, }, "set_continuous_mode", ) diff --git a/homeassistant/components/numato/__init__.py b/homeassistant/components/numato/__init__.py index c00e2ff2090bb..f823bcbf98bb4 100644 --- a/homeassistant/components/numato/__init__.py +++ b/homeassistant/components/numato/__init__.py @@ -4,7 +4,7 @@ import logging import numato_gpio as gpio -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_BINARY_SENSORS, @@ -48,26 +48,26 @@ def int_range(rng): """Validate the input array to describe a range by two integers.""" if not (isinstance(rng[0], int) and isinstance(rng[1], int)): - raise vol.Invalid(f"Only integers are allowed: {rng}") + raise probatio.Invalid(f"Only integers are allowed: {rng}") if len(rng) != 2: - raise vol.Invalid(f"Only two numbers allowed in a range: {rng}") + raise probatio.Invalid(f"Only two numbers allowed in a range: {rng}") if rng[0] > rng[1]: - raise vol.Invalid(f"Lower range bound must come first: {rng}") + raise probatio.Invalid(f"Lower range bound must come first: {rng}") return rng def float_range(rng): """Validate the input array to describe a range by two floats.""" try: - coe = vol.Coerce(float) + coe = probatio.Coerce(float) coe(rng[0]) coe(rng[1]) - except vol.CoerceInvalid as err: - raise vol.Invalid(f"Only int or float values are allowed: {rng}") from err + except probatio.CoerceInvalid as err: + raise probatio.Invalid(f"Only int or float values are allowed: {rng}") from err if len(rng) != 2: - raise vol.Invalid(f"Only two numbers allowed in a range: {rng}") + raise probatio.Invalid(f"Only two numbers allowed in a range: {rng}") if rng[0] > rng[1]: - raise vol.Invalid(f"Lower range bound must come first: {rng}") + raise probatio.Invalid(f"Lower range bound must come first: {rng}") return rng @@ -76,49 +76,49 @@ def adc_port_number(num): try: num = int(num) except ValueError as err: - raise vol.Invalid(f"Port numbers must be integers: {num}") from err + raise probatio.Invalid(f"Port numbers must be integers: {num}") from err if num not in range(1, 8): - raise vol.Invalid(f"Only port numbers from 1 to 7 are ADC capable: {num}") + raise probatio.Invalid(f"Only port numbers from 1 to 7 are ADC capable: {num}") return num -ADC_SCHEMA = vol.Schema( +ADC_SCHEMA = probatio.Schema( { - vol.Required(CONF_NAME): cv.string, - vol.Optional(CONF_SRC_RANGE, default=DEFAULT_SRC_RANGE): int_range, - vol.Optional(CONF_DST_RANGE, default=DEFAULT_DST_RANGE): float_range, - vol.Optional(CONF_DST_UNIT, default=PERCENTAGE): cv.string, + probatio.Required(CONF_NAME): cv.string, + probatio.Optional(CONF_SRC_RANGE, default=DEFAULT_SRC_RANGE): int_range, + probatio.Optional(CONF_DST_RANGE, default=DEFAULT_DST_RANGE): float_range, + probatio.Optional(CONF_DST_UNIT, default=PERCENTAGE): cv.string, } ) -PORTS_SCHEMA = vol.Schema({cv.positive_int: cv.string}) +PORTS_SCHEMA = probatio.Schema({cv.positive_int: cv.string}) -IO_PORTS_SCHEMA = vol.Schema( +IO_PORTS_SCHEMA = probatio.Schema( { - vol.Required(CONF_PORTS): PORTS_SCHEMA, - vol.Optional(CONF_INVERT_LOGIC, default=DEFAULT_INVERT_LOGIC): cv.boolean, + probatio.Required(CONF_PORTS): PORTS_SCHEMA, + probatio.Optional(CONF_INVERT_LOGIC, default=DEFAULT_INVERT_LOGIC): cv.boolean, } ) -DEVICE_SCHEMA = vol.Schema( +DEVICE_SCHEMA = probatio.Schema( { - vol.Required(CONF_ID): cv.positive_int, + probatio.Required(CONF_ID): cv.positive_int, CONF_BINARY_SENSORS: IO_PORTS_SCHEMA, CONF_SWITCHES: IO_PORTS_SCHEMA, CONF_SENSORS: {CONF_PORTS: {adc_port_number: ADC_SCHEMA}}, } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { DOMAIN: { - CONF_DEVICES: vol.All(cv.ensure_list, [DEVICE_SCHEMA]), - vol.Optional(CONF_DISCOVER, default=DEFAULT_DEV): vol.All( + CONF_DEVICES: probatio.All(cv.ensure_list, [DEVICE_SCHEMA]), + probatio.Optional(CONF_DISCOVER, default=DEFAULT_DEV): probatio.All( cv.ensure_list, [cv.string] ), }, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/number/__init__.py b/homeassistant/components/number/__init__.py index ce424b9344e9b..a20acb1573254 100644 --- a/homeassistant/components/number/__init__.py +++ b/homeassistant/components/number/__init__.py @@ -8,8 +8,8 @@ from math import ceil, floor from typing import TYPE_CHECKING, Any, Self, final, override +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( # noqa: F401 @@ -96,7 +96,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: component.async_register_entity_service( SERVICE_SET_VALUE, - {vol.Required(ATTR_VALUE): vol.Coerce(float)}, + {probatio.Required(ATTR_VALUE): probatio.Coerce(float)}, async_set_value, ) diff --git a/homeassistant/components/number/const.py b/homeassistant/components/number/const.py index 04728c18935ed..525a99b86c21c 100644 --- a/homeassistant/components/number/const.py +++ b/homeassistant/components/number/const.py @@ -3,7 +3,7 @@ from enum import StrEnum from typing import Final -import voluptuous as vol +import probatio from homeassistant.const import ( DEGREE, @@ -518,7 +518,9 @@ class NumberDeviceClass(StrEnum): """ -DEVICE_CLASSES_SCHEMA: Final = vol.All(vol.Lower, vol.Coerce(NumberDeviceClass)) +DEVICE_CLASSES_SCHEMA: Final = probatio.All( + probatio.Lower, probatio.Coerce(NumberDeviceClass) +) DEVICE_CLASS_UNITS: dict[NumberDeviceClass, set[type[StrEnum] | str | None]] = { NumberDeviceClass.ABSOLUTE_HUMIDITY: { UnitOfDensity.GRAMS_PER_CUBIC_METER, diff --git a/homeassistant/components/number/device_action.py b/homeassistant/components/number/device_action.py index e67720a5858cc..c843ab10cbc3f 100644 --- a/homeassistant/components/number/device_action.py +++ b/homeassistant/components/number/device_action.py @@ -1,6 +1,6 @@ """Provides device actions for Number.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import async_validate_entity_schema from homeassistant.const import ( @@ -20,9 +20,9 @@ _ACTION_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): ATYP_SET_VALUE, - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(ATTR_VALUE): vol.Coerce(float), + probatio.Required(CONF_TYPE): ATYP_SET_VALUE, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(ATTR_VALUE): probatio.Coerce(float), } ) @@ -79,8 +79,8 @@ async def async_call_action_from_config( async def async_get_action_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List action capabilities.""" - fields = {vol.Required(ATTR_VALUE): vol.Coerce(float)} + fields = {probatio.Required(ATTR_VALUE): probatio.Coerce(float)} - return {"extra_fields": vol.Schema(fields)} + return {"extra_fields": probatio.Schema(fields)} diff --git a/homeassistant/components/number/websocket_api.py b/homeassistant/components/number/websocket_api.py index 59be04345e4c2..5717653a95122 100644 --- a/homeassistant/components/number/websocket_api.py +++ b/homeassistant/components/number/websocket_api.py @@ -2,7 +2,7 @@ from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.core import HomeAssistant, callback @@ -19,8 +19,8 @@ def async_setup(hass: HomeAssistant) -> None: @callback @websocket_api.websocket_command( { - vol.Required("type"): "number/device_class_convertible_units", - vol.Required("device_class"): str, + probatio.Required("type"): "number/device_class_convertible_units", + probatio.Required("device_class"): str, } ) def ws_device_class_units( diff --git a/homeassistant/components/nut/config_flow.py b/homeassistant/components/nut/config_flow.py index 10bb64c9f07b2..45755c4c38a1d 100644 --- a/homeassistant/components/nut/config_flow.py +++ b/homeassistant/components/nut/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from aionut import NUTError, NUTLoginError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigEntry, ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -24,7 +24,10 @@ _LOGGER = logging.getLogger(__name__) -REAUTH_SCHEMA = {vol.Optional(CONF_USERNAME): str, vol.Optional(CONF_PASSWORD): str} +REAUTH_SCHEMA = { + probatio.Optional(CONF_USERNAME): str, + probatio.Optional(CONF_PASSWORD): str, +} PASSWORD_NOT_CHANGED = "__**password_not_changed**__" @@ -32,26 +35,32 @@ def _base_schema( nut_config: Mapping[str, Any], use_password_not_changed: bool = False, -) -> vol.Schema: +) -> probatio.Schema: """Generate base schema.""" base_schema = { - vol.Optional(CONF_HOST, default=nut_config.get(CONF_HOST) or DEFAULT_HOST): str, - vol.Optional(CONF_PORT, default=nut_config.get(CONF_PORT) or DEFAULT_PORT): int, - vol.Optional( - CONF_USERNAME, default=nut_config.get(CONF_USERNAME, vol.UNDEFINED) + probatio.Optional( + CONF_HOST, default=nut_config.get(CONF_HOST) or DEFAULT_HOST ): str, - vol.Optional( + probatio.Optional( + CONF_PORT, default=nut_config.get(CONF_PORT) or DEFAULT_PORT + ): int, + probatio.Optional( + CONF_USERNAME, default=nut_config.get(CONF_USERNAME, probatio.UNDEFINED) + ): str, + probatio.Optional( CONF_PASSWORD, - default=PASSWORD_NOT_CHANGED if use_password_not_changed else vol.UNDEFINED, + default=PASSWORD_NOT_CHANGED + if use_password_not_changed + else probatio.UNDEFINED, ): str, } - return vol.Schema(base_schema) + return probatio.Schema(base_schema) -def _ups_schema(ups_list: dict[str, str]) -> vol.Schema: +def _ups_schema(ups_list: dict[str, str]) -> probatio.Schema: """UPS selection schema.""" - return vol.Schema({vol.Required(CONF_ALIAS): vol.In(ups_list)}) + return probatio.Schema({probatio.Required(CONF_ALIAS): probatio.In(ups_list)}) async def validate_input(data: dict[str, Any]) -> dict[str, Any]: @@ -351,7 +360,7 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema(REAUTH_SCHEMA), + data_schema=probatio.Schema(REAUTH_SCHEMA), errors=errors, description_placeholders=description_placeholders, ) diff --git a/homeassistant/components/nut/device_action.py b/homeassistant/components/nut/device_action.py index f4c229e721dec..2b8150e2398fb 100644 --- a/homeassistant/components/nut/device_action.py +++ b/homeassistant/components/nut/device_action.py @@ -2,7 +2,7 @@ from typing import cast -import voluptuous as vol +import probatio from homeassistant.components.device_automation import InvalidDeviceAutomationConfig from homeassistant.config_entries import ConfigEntryState @@ -18,7 +18,7 @@ ACTION_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): vol.In(ACTION_TYPES), + probatio.Required(CONF_TYPE): probatio.In(ACTION_TYPES), } ) diff --git a/homeassistant/components/nws/config_flow.py b/homeassistant/components/nws/config_flow.py index 3cfadbe87d646..6c62ec8b90c6b 100644 --- a/homeassistant/components/nws/config_flow.py +++ b/homeassistant/components/nws/config_flow.py @@ -4,8 +4,8 @@ from typing import Any, override import aiohttp +import probatio from pynws import SimpleNWS -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY, CONF_LATITUDE, CONF_LONGITUDE @@ -80,16 +80,16 @@ async def async_step_location( _LOGGER.exception("Unexpected exception") errors["base"] = "unknown" - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_API_KEY): str, - vol.Required( + probatio.Required(CONF_API_KEY): str, + probatio.Required( CONF_LATITUDE, default=self.hass.config.latitude ): cv.latitude, - vol.Required( + probatio.Required( CONF_LONGITUDE, default=self.hass.config.longitude ): cv.longitude, - vol.Optional(CONF_STATION): str, + probatio.Optional(CONF_STATION): str, } ) @@ -142,10 +142,10 @@ async def async_step_entity( _LOGGER.exception("Unexpected exception") errors["base"] = "unknown" - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_API_KEY): str, - vol.Required(CONF_LOCATION_ENTITY): EntitySelector( + probatio.Required(CONF_API_KEY): str, + probatio.Required(CONF_LOCATION_ENTITY): EntitySelector( EntitySelectorConfig( domain=["person", "device_tracker", "zone"], ) diff --git a/homeassistant/components/nws/weather.py b/homeassistant/components/nws/weather.py index 31855522c3491..8cca6d85a4430 100644 --- a/homeassistant/components/nws/weather.py +++ b/homeassistant/components/nws/weather.py @@ -3,8 +3,8 @@ from functools import partial from typing import Any, Required, TypedDict, cast, override +import probatio from pynws import SimpleNWS -import voluptuous as vol from homeassistant.components.weather import ( ATTR_CONDITION_CLEAR_NIGHT, @@ -109,7 +109,7 @@ async def async_setup_entry( platform.async_register_entity_service( "get_forecasts_extra", - {vol.Required("type"): vol.In(("hourly", "twice_daily"))}, + {probatio.Required("type"): probatio.In(("hourly", "twice_daily"))}, "async_get_forecasts_extra_service", supports_response=SupportsResponse.ONLY, ) diff --git a/homeassistant/components/nx584/alarm_control_panel.py b/homeassistant/components/nx584/alarm_control_panel.py index 0c8104149a5b6..6b0e5b7cd830f 100644 --- a/homeassistant/components/nx584/alarm_control_panel.py +++ b/homeassistant/components/nx584/alarm_control_panel.py @@ -5,8 +5,8 @@ from typing import override from nx584 import client +import probatio import requests -import voluptuous as vol from homeassistant.components.alarm_control_panel import ( PLATFORM_SCHEMA as ALARM_CONTROL_PANEL_PLATFORM_SCHEMA, @@ -35,9 +35,9 @@ PLATFORM_SCHEMA = ALARM_CONTROL_PANEL_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, } ) @@ -72,13 +72,13 @@ async def async_setup_platform( platform.async_register_entity_service( SERVICE_BYPASS_ZONE, - {vol.Required(ATTR_ZONE): cv.positive_int}, + {probatio.Required(ATTR_ZONE): cv.positive_int}, "alarm_bypass", ) platform.async_register_entity_service( SERVICE_UNBYPASS_ZONE, - {vol.Required(ATTR_ZONE): cv.positive_int}, + {probatio.Required(ATTR_ZONE): cv.positive_int}, "alarm_unbypass", ) diff --git a/homeassistant/components/nx584/binary_sensor.py b/homeassistant/components/nx584/binary_sensor.py index 23d073f7c0c6e..7669f68c935fb 100644 --- a/homeassistant/components/nx584/binary_sensor.py +++ b/homeassistant/components/nx584/binary_sensor.py @@ -6,8 +6,8 @@ from typing import Any, override from nx584 import client as nx584_client +import probatio import requests -import voluptuous as vol from homeassistant.components.binary_sensor import ( DEVICE_CLASSES_SCHEMA as BINARY_SENSOR_DEVICE_CLASSES_SCHEMA, @@ -30,16 +30,18 @@ DEFAULT_PORT = 5007 BYPASS_ZONE_FLAGS = {"Bypass", "Inhibit"} -ZONE_TYPES_SCHEMA = vol.Schema({cv.positive_int: BINARY_SENSOR_DEVICE_CLASSES_SCHEMA}) +ZONE_TYPES_SCHEMA = probatio.Schema( + {cv.positive_int: BINARY_SENSOR_DEVICE_CLASSES_SCHEMA} +) PLATFORM_SCHEMA = BINARY_SENSOR_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_EXCLUDE_ZONES, default=[]): vol.All( + probatio.Optional(CONF_EXCLUDE_ZONES, default=[]): probatio.All( cv.ensure_list, [cv.positive_int] ), - vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_ZONE_TYPES, default={}): ZONE_TYPES_SCHEMA, + probatio.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_ZONE_TYPES, default={}): ZONE_TYPES_SCHEMA, } ) diff --git a/homeassistant/components/nyt_games/config_flow.py b/homeassistant/components/nyt_games/config_flow.py index 8b8ef243b1e99..d3ff6c24ef5cd 100644 --- a/homeassistant/components/nyt_games/config_flow.py +++ b/homeassistant/components/nyt_games/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from nyt_games import NYTGamesAuthenticationError, NYTGamesClient, NYTGamesError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_TOKEN @@ -42,6 +42,6 @@ async def async_step_user( ) return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_TOKEN): str}), + data_schema=probatio.Schema({probatio.Required(CONF_TOKEN): str}), errors=errors, ) diff --git a/homeassistant/components/nzbget/config_flow.py b/homeassistant/components/nzbget/config_flow.py index 39b0d5a0eaec4..4a3b94f567623 100644 --- a/homeassistant/components/nzbget/config_flow.py +++ b/homeassistant/components/nzbget/config_flow.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -76,17 +76,17 @@ async def async_step_user( data=user_input, ) - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Optional(CONF_USERNAME): str, - vol.Optional(CONF_PASSWORD): str, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): int, - vol.Optional(CONF_SSL, default=DEFAULT_SSL): bool, - vol.Required(CONF_MORE_OPTIONS): section( - vol.Schema( + probatio.Required(CONF_HOST): str, + probatio.Optional(CONF_USERNAME): str, + probatio.Optional(CONF_PASSWORD): str, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Optional(CONF_SSL, default=DEFAULT_SSL): bool, + probatio.Required(CONF_MORE_OPTIONS): section( + probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL ): bool, } diff --git a/homeassistant/components/nzbget/services.py b/homeassistant/components/nzbget/services.py index 0b5464c4f010a..2b67ce60a124e 100644 --- a/homeassistant/components/nzbget/services.py +++ b/homeassistant/components/nzbget/services.py @@ -1,6 +1,6 @@ """The NZBGet integration.""" -import voluptuous as vol +import probatio from homeassistant.core import HomeAssistant, ServiceCall, callback from homeassistant.exceptions import ServiceValidationError @@ -16,8 +16,8 @@ ) from .coordinator import NZBGetDataUpdateCoordinator -SPEED_LIMIT_SCHEMA = vol.Schema( - {vol.Optional(ATTR_SPEED, default=DEFAULT_SPEED_LIMIT): cv.positive_int} +SPEED_LIMIT_SCHEMA = probatio.Schema( + {probatio.Optional(ATTR_SPEED, default=DEFAULT_SPEED_LIMIT): cv.positive_int} ) @@ -51,8 +51,12 @@ def set_speed(call: ServiceCall) -> None: def async_setup_services(hass: HomeAssistant) -> None: """Register integration-level services.""" - hass.services.async_register(DOMAIN, SERVICE_PAUSE, pause, schema=vol.Schema({})) - hass.services.async_register(DOMAIN, SERVICE_RESUME, resume, schema=vol.Schema({})) + hass.services.async_register( + DOMAIN, SERVICE_PAUSE, pause, schema=probatio.Schema({}) + ) + hass.services.async_register( + DOMAIN, SERVICE_RESUME, resume, schema=probatio.Schema({}) + ) hass.services.async_register( DOMAIN, SERVICE_SET_SPEED, set_speed, schema=SPEED_LIMIT_SCHEMA ) diff --git a/homeassistant/components/oasa_telematics/sensor.py b/homeassistant/components/oasa_telematics/sensor.py index 49587d0be2bc9..2d61982583878 100644 --- a/homeassistant/components/oasa_telematics/sensor.py +++ b/homeassistant/components/oasa_telematics/sensor.py @@ -6,7 +6,7 @@ from typing import Any, override import oasatelematics -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -40,9 +40,9 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_STOP_ID): cv.string, - vol.Required(CONF_ROUTE_ID): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_STOP_ID): cv.string, + probatio.Required(CONF_ROUTE_ID): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/obihai/config_flow.py b/homeassistant/components/obihai/config_flow.py index dd0e908b7227d..60a59301d0ffc 100644 --- a/homeassistant/components/obihai/config_flow.py +++ b/homeassistant/components/obihai/config_flow.py @@ -3,8 +3,8 @@ from socket import gaierror, gethostbyname from typing import Any, override +import probatio from pyobihai import PyObihai -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME @@ -15,14 +15,14 @@ from .connectivity import validate_auth from .const import DEFAULT_PASSWORD, DEFAULT_USERNAME, DOMAIN -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required( + probatio.Required(CONF_HOST): str, + probatio.Required( CONF_USERNAME, default=DEFAULT_USERNAME, ): str, - vol.Required( + probatio.Required( CONF_PASSWORD, default=DEFAULT_PASSWORD, ): str, @@ -52,7 +52,7 @@ class ObihaiFlowHandler(ConfigFlow, domain=DOMAIN): """Config flow for Obihai.""" VERSION = 2 - discovery_schema: vol.Schema | None = None + discovery_schema: probatio.Schema | None = None _dhcp_discovery_info: DhcpServiceInfo | None = None @override diff --git a/homeassistant/components/octoprint/__init__.py b/homeassistant/components/octoprint/__init__.py index 24e9003d5cbca..d7786be5b597b 100644 --- a/homeassistant/components/octoprint/__init__.py +++ b/homeassistant/components/octoprint/__init__.py @@ -3,8 +3,8 @@ import logging import aiohttp +import probatio from pyoctoprintapi import OctoprintClient -import voluptuous as vol from homeassistant.config_entries import SOURCE_IMPORT from homeassistant.const import ( @@ -37,13 +37,13 @@ def has_all_unique_names(value): """Validate that printers have an unique name.""" names = [util_slugify(printer["name"]) for printer in value] - vol.Schema(vol.Unique())(names) + probatio.Schema(probatio.Unique())(names) return value def ensure_valid_path(value): """Validate the path, ensuring it starts and ends with a /.""" - vol.Schema(cv.string)(value) + probatio.Schema(cv.string)(value) if value[0] != "/": value = f"/{value}" if value[-1] != "/": @@ -67,12 +67,12 @@ def ensure_valid_path(value): "Printing Error", ] -BINARY_SENSOR_SCHEMA = vol.Schema( +BINARY_SENSOR_SCHEMA = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_MONITORED_CONDITIONS, default=list(BINARY_SENSOR_TYPES) - ): vol.All(cv.ensure_list, [vol.In(BINARY_SENSOR_TYPES)]), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + ): probatio.All(cv.ensure_list, [probatio.In(BINARY_SENSOR_TYPES)]), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) @@ -84,38 +84,42 @@ def ensure_valid_path(value): "Time Elapsed", ] -SENSOR_SCHEMA = vol.Schema( +SENSOR_SCHEMA = probatio.Schema( { - vol.Optional(CONF_MONITORED_CONDITIONS, default=list(SENSOR_TYPES)): vol.All( - cv.ensure_list, [vol.In(SENSOR_TYPES)] - ), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional( + CONF_MONITORED_CONDITIONS, default=list(SENSOR_TYPES) + ): probatio.All(cv.ensure_list, [probatio.In(SENSOR_TYPES)]), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) -CONFIG_SCHEMA = vol.Schema( - vol.All( +CONFIG_SCHEMA = probatio.Schema( + probatio.All( cv.deprecated(DOMAIN), { - DOMAIN: vol.All( + DOMAIN: probatio.All( cv.ensure_list, [ - vol.Schema( + probatio.Schema( { - vol.Required(CONF_API_KEY): cv.string, - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_SSL, default=False): cv.boolean, - vol.Optional(CONF_PORT, default=80): cv.port, - vol.Optional(CONF_PATH, default="/"): ensure_valid_path, + probatio.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_SSL, default=False): cv.boolean, + probatio.Optional(CONF_PORT, default=80): cv.port, + probatio.Optional( + CONF_PATH, default="/" + ): ensure_valid_path, # Following values are not longer used in the configuration # of the integration and are here for historical purposes - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional( + probatio.Optional( + CONF_NAME, default=DEFAULT_NAME + ): cv.string, + probatio.Optional( CONF_NUMBER_OF_TOOLS, default=0 ): cv.positive_int, - vol.Optional(CONF_BED, default=False): cv.boolean, - vol.Optional(CONF_SENSORS, default={}): SENSOR_SCHEMA, - vol.Optional( + probatio.Optional(CONF_BED, default=False): cv.boolean, + probatio.Optional(CONF_SENSORS, default={}): SENSOR_SCHEMA, + probatio.Optional( CONF_BINARY_SENSORS, default={} ): BINARY_SENSOR_SCHEMA, } @@ -125,7 +129,7 @@ def ensure_valid_path(value): ) }, ), - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/octoprint/config_flow.py b/homeassistant/components/octoprint/config_flow.py index b13b896e525a0..d6a54371dcfd8 100644 --- a/homeassistant/components/octoprint/config_flow.py +++ b/homeassistant/components/octoprint/config_flow.py @@ -6,8 +6,8 @@ from typing import TYPE_CHECKING, Any, override import aiohttp +import probatio from pyoctoprintapi import ApiError, OctoprintClient, OctoprintException -import voluptuous as vol from yarl import URL from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -35,16 +35,16 @@ def _schema_with_defaults( username="", host="", port=80, path="/", ssl=False, verify_ssl=True ): - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_USERNAME, default=username): str, - vol.Required(CONF_HOST, default=host): str, - vol.Required(CONF_PORT, default=port): cv.port, - vol.Required(CONF_PATH, default=path): str, - vol.Required(CONF_SSL, default=ssl): bool, - vol.Required(CONF_VERIFY_SSL, default=verify_ssl): bool, + probatio.Required(CONF_USERNAME, default=username): str, + probatio.Required(CONF_HOST, default=host): str, + probatio.Required(CONF_PORT, default=port): cv.port, + probatio.Required(CONF_PATH, default=path): str, + probatio.Required(CONF_SSL, default=ssl): bool, + probatio.Required(CONF_VERIFY_SSL, default=verify_ssl): bool, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) @@ -54,7 +54,7 @@ class OctoPrintConfigFlow(ConfigFlow, domain=DOMAIN): VERSION = 1 api_key_task: asyncio.Task[None] | None = None - discovery_schema: vol.Schema | None = None + discovery_schema: probatio.Schema | None = None _reauth_data: dict[str, Any] | None = None _user_input: dict[str, Any] | None = None @@ -245,9 +245,9 @@ async def async_step_reauth_confirm( if user_input is None: return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_USERNAME, default=self._reauth_data[CONF_USERNAME] ): str, } diff --git a/homeassistant/components/octoprint/services.py b/homeassistant/components/octoprint/services.py index 2f9948f704b9d..ea943391f25dd 100644 --- a/homeassistant/components/octoprint/services.py +++ b/homeassistant/components/octoprint/services.py @@ -2,8 +2,8 @@ from typing import cast +import probatio from pyoctoprintapi import OctoprintClient -import voluptuous as vol from homeassistant.const import CONF_DEVICE_ID, CONF_PORT, CONF_PROFILE_NAME from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -12,12 +12,12 @@ from .const import CONF_BAUDRATE, DOMAIN, SERVICE_CONNECT from .coordinator import OctoprintConfigEntry -SERVICE_CONNECT_SCHEMA = vol.Schema( +SERVICE_CONNECT_SCHEMA = probatio.Schema( { - vol.Required(CONF_DEVICE_ID): cv.string, - vol.Optional(CONF_PROFILE_NAME): cv.string, - vol.Optional(CONF_PORT): cv.string, - vol.Optional(CONF_BAUDRATE): cv.positive_int, + probatio.Required(CONF_DEVICE_ID): cv.string, + probatio.Optional(CONF_PROFILE_NAME): cv.string, + probatio.Optional(CONF_PORT): cv.string, + probatio.Optional(CONF_BAUDRATE): cv.positive_int, } ) diff --git a/homeassistant/components/oem/climate.py b/homeassistant/components/oem/climate.py index 108956303f3a6..fa799f212c7de 100644 --- a/homeassistant/components/oem/climate.py +++ b/homeassistant/components/oem/climate.py @@ -3,8 +3,8 @@ from typing import Any, override from oemthermostat import Thermostat +import probatio import requests -import voluptuous as vol from homeassistant.components.climate import ( PLATFORM_SCHEMA as CLIMATE_PLATFORM_SCHEMA, @@ -29,11 +29,11 @@ PLATFORM_SCHEMA = CLIMATE_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_NAME, default="Thermostat"): cv.string, - vol.Optional(CONF_PORT, default=80): cv.port, - vol.Inclusive(CONF_USERNAME, "authentication"): cv.string, - vol.Inclusive(CONF_PASSWORD, "authentication"): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_NAME, default="Thermostat"): cv.string, + probatio.Optional(CONF_PORT, default=80): cv.port, + probatio.Inclusive(CONF_USERNAME, "authentication"): cv.string, + probatio.Inclusive(CONF_PASSWORD, "authentication"): cv.string, } ) diff --git a/homeassistant/components/ohmconnect/sensor.py b/homeassistant/components/ohmconnect/sensor.py index bfb905cdf564a..a4d5ff43038dc 100644 --- a/homeassistant/components/ohmconnect/sensor.py +++ b/homeassistant/components/ohmconnect/sensor.py @@ -5,8 +5,8 @@ from typing import Any, override import defusedxml.ElementTree as ET +import probatio import requests -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -27,8 +27,8 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ID): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_ID): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/ohme/config_flow.py b/homeassistant/components/ohme/config_flow.py index 8ef639ba62a96..a6a82c9761b06 100644 --- a/homeassistant/components/ohme/config_flow.py +++ b/homeassistant/components/ohme/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from ohme import ApiException, AuthException, OhmeApiClient -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_EMAIL, CONF_PASSWORD @@ -16,15 +16,15 @@ from .const import DOMAIN -USER_SCHEMA = vol.Schema( +USER_SCHEMA = probatio.Schema( { - vol.Required(CONF_EMAIL): TextSelector( + probatio.Required(CONF_EMAIL): TextSelector( TextSelectorConfig( type=TextSelectorType.EMAIL, autocomplete="email", ), ), - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", @@ -33,9 +33,9 @@ } ) -REAUTH_SCHEMA = vol.Schema( +REAUTH_SCHEMA = probatio.Schema( { - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", diff --git a/homeassistant/components/ohme/services.py b/homeassistant/components/ohme/services.py index 62307521fd3e6..38136e1761927 100644 --- a/homeassistant/components/ohme/services.py +++ b/homeassistant/components/ohme/services.py @@ -3,7 +3,7 @@ from typing import Final from ohme import OhmeApiClient -import voluptuous as vol +import probatio from homeassistant.core import ( HomeAssistant, @@ -21,9 +21,9 @@ ATTR_PRICE_CAP: Final = "price_cap" SERVICE_LIST_CHARGE_SLOTS = "list_charge_slots" -SERVICE_LIST_CHARGE_SLOTS_SCHEMA: Final = vol.Schema( +SERVICE_LIST_CHARGE_SLOTS_SCHEMA: Final = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY): selector.ConfigEntrySelector( + probatio.Required(ATTR_CONFIG_ENTRY): selector.ConfigEntrySelector( { "integration": DOMAIN, } @@ -32,14 +32,14 @@ ) SERVICE_SET_PRICE_CAP = "set_price_cap" -SERVICE_SET_PRICE_CAP_SCHEMA: Final = vol.Schema( +SERVICE_SET_PRICE_CAP_SCHEMA: Final = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY): selector.ConfigEntrySelector( + probatio.Required(ATTR_CONFIG_ENTRY): selector.ConfigEntrySelector( { "integration": DOMAIN, } ), - vol.Required(ATTR_PRICE_CAP): vol.Coerce(float), + probatio.Required(ATTR_PRICE_CAP): probatio.Coerce(float), } ) diff --git a/homeassistant/components/ollama/config_flow.py b/homeassistant/components/ollama/config_flow.py index 19f79bff7a0f6..a9ae28c75206f 100644 --- a/homeassistant/components/ollama/config_flow.py +++ b/homeassistant/components/ollama/config_flow.py @@ -8,7 +8,7 @@ import httpx import ollama -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -65,20 +65,20 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_URL): TextSelector( + probatio.Required(CONF_URL): TextSelector( TextSelectorConfig(type=TextSelectorType.URL) ), - vol.Optional(CONF_API_KEY): TextSelector( + probatio.Optional(CONF_API_KEY): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), }, ) -STEP_REAUTH_DATA_SCHEMA = vol.Schema( +STEP_REAUTH_DATA_SCHEMA = probatio.Schema( { - vol.Optional(CONF_API_KEY): TextSelector( + probatio.Optional(CONF_API_KEY): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } @@ -144,7 +144,7 @@ async def async_step_user( try: url = cv.url(url) - except vol.Invalid: + except probatio.Invalid: errors["base"] = "invalid_url" return self.async_show_form( step_id="user", @@ -300,7 +300,7 @@ async def async_step_set_options( return self.async_show_form( step_id="set_options", - data_schema=vol.Schema( + data_schema=probatio.Schema( ollama_config_option_schema( self.hass, self._is_new, @@ -427,7 +427,7 @@ def ollama_config_option_schema( schema: dict = { # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Required(CONF_NAME, default=default_name): str, + probatio.Required(CONF_NAME, default=default_name): str, } else: schema = {} @@ -438,7 +438,7 @@ def ollama_config_option_schema( schema.update( { - vol.Required( + probatio.Required( CONF_MODEL, description={"suggested_value": options.get(CONF_MODEL, DEFAULT_MODEL)}, ): SelectSelector( @@ -449,7 +449,7 @@ def ollama_config_option_schema( if subentry_type == "conversation": schema.update( { - vol.Optional( + probatio.Optional( CONF_PROMPT, description={ "suggested_value": options.get( @@ -457,7 +457,7 @@ def ollama_config_option_schema( ) }, ): TemplateSelector(), - vol.Optional( + probatio.Optional( CONF_LLM_HASS_API, description={"suggested_value": selected_llm_apis}, ): SelectSelector( @@ -476,7 +476,7 @@ def ollama_config_option_schema( ) schema.update( { - vol.Optional( + probatio.Optional( CONF_NUM_CTX, description={ "suggested_value": options.get(CONF_NUM_CTX, DEFAULT_NUM_CTX) @@ -488,7 +488,7 @@ def ollama_config_option_schema( mode=NumberSelectorMode.BOX, ) ), - vol.Optional( + probatio.Optional( CONF_MAX_HISTORY, description={ "suggested_value": options.get( @@ -500,7 +500,7 @@ def ollama_config_option_schema( min=0, max=sys.maxsize, step=1, mode=NumberSelectorMode.BOX ) ), - vol.Optional( + probatio.Optional( CONF_KEEP_ALIVE, description={ "suggested_value": options.get(CONF_KEEP_ALIVE, DEFAULT_KEEP_ALIVE) @@ -510,7 +510,7 @@ def ollama_config_option_schema( min=-1, max=sys.maxsize, step=1, mode=NumberSelectorMode.BOX ) ), - vol.Optional( + probatio.Optional( CONF_THINK, description={ "suggested_value": options.get("think", DEFAULT_THINK), diff --git a/homeassistant/components/ollama/entity.py b/homeassistant/components/ollama/entity.py index a6113b6610170..2b756d3343081 100644 --- a/homeassistant/components/ollama/entity.py +++ b/homeassistant/components/ollama/entity.py @@ -6,8 +6,7 @@ from typing import Any import ollama -from probatio import to_openapi -import voluptuous as vol +import probatio from homeassistant.components import conversation from homeassistant.config_entries import ConfigSubentry @@ -43,7 +42,9 @@ def _format_tool( """Format tool specification.""" tool_spec = { "name": tool.name, - "parameters": to_openapi(tool.parameters, custom_serializer=custom_serializer), + "parameters": probatio.to_openapi( + tool.parameters, custom_serializer=custom_serializer + ), } if tool.description: tool_spec["description"] = tool.description @@ -202,7 +203,7 @@ def __init__(self, entry: OllamaConfigEntry, subentry: ConfigSubentry) -> None: async def _async_handle_chat_log( self, chat_log: conversation.ChatLog, - structure: vol.Schema | None = None, + structure: probatio.Schema | None = None, ) -> None: """Generate an answer for the chat log.""" settings = {**self.entry.data, **self.subentry.data} @@ -225,7 +226,7 @@ async def _async_handle_chat_log( output_format: dict[str, Any] | None = None if structure: - output_format = to_openapi( + output_format = probatio.to_openapi( structure, custom_serializer=( chat_log.llm_api.custom_serializer diff --git a/homeassistant/components/ombi/__init__.py b/homeassistant/components/ombi/__init__.py index c3a51bacce244..ad7df40671469 100644 --- a/homeassistant/components/ombi/__init__.py +++ b/homeassistant/components/ombi/__init__.py @@ -2,8 +2,8 @@ import logging +import probatio import pyombi -import voluptuous as vol from homeassistant.const import ( ATTR_NAME, @@ -39,44 +39,48 @@ def urlbase(value) -> str: """Validate and transform urlbase.""" if value is None: - raise vol.Invalid("string value is None") + raise probatio.Invalid("string value is None") value = str(value).strip("/") if not value: return value return f"{value}/" -SUBMIT_MOVIE_REQUEST_SERVICE_SCHEMA = vol.Schema({vol.Required(ATTR_NAME): cv.string}) +SUBMIT_MOVIE_REQUEST_SERVICE_SCHEMA = probatio.Schema( + {probatio.Required(ATTR_NAME): cv.string} +) -SUBMIT_MUSIC_REQUEST_SERVICE_SCHEMA = vol.Schema({vol.Required(ATTR_NAME): cv.string}) +SUBMIT_MUSIC_REQUEST_SERVICE_SCHEMA = probatio.Schema( + {probatio.Required(ATTR_NAME): cv.string} +) -SUBMIT_TV_REQUEST_SERVICE_SCHEMA = vol.Schema( +SUBMIT_TV_REQUEST_SERVICE_SCHEMA = probatio.Schema( { - vol.Required(ATTR_NAME): cv.string, - vol.Optional(ATTR_SEASON, default=DEFAULT_SEASON): vol.In( + probatio.Required(ATTR_NAME): cv.string, + probatio.Optional(ATTR_SEASON, default=DEFAULT_SEASON): probatio.In( ["first", "latest", "all"] ), } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.All( - vol.Schema( + DOMAIN: probatio.All( + probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_USERNAME): cv.string, - vol.Exclusive(CONF_API_KEY, "auth"): cv.string, - vol.Exclusive(CONF_PASSWORD, "auth"): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_URLBASE, default=DEFAULT_URLBASE): urlbase, - vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Exclusive(CONF_API_KEY, "auth"): cv.string, + probatio.Exclusive(CONF_PASSWORD, "auth"): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_URLBASE, default=DEFAULT_URLBASE): urlbase, + probatio.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, } ), cv.has_at_least_one_key(CONF_API_KEY, CONF_PASSWORD), ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/omie/services.py b/homeassistant/components/omie/services.py index 9dc3eab60a372..ed879627ffb48 100644 --- a/homeassistant/components/omie/services.py +++ b/homeassistant/components/omie/services.py @@ -5,8 +5,8 @@ from typing import Final import aiohttp +import probatio from pyomie import QUARTER_HOURLY_START_DATE -import voluptuous as vol from homeassistant.const import ATTR_DATE from homeassistant.core import ( @@ -34,12 +34,12 @@ class Country(StrEnum): SERVICE_GET_PRICES_FOR_DATE: Final = "get_prices_for_date" -SERVICE_GET_PRICES_SCHEMA: Final = vol.Schema( +SERVICE_GET_PRICES_SCHEMA: Final = probatio.Schema( { - vol.Required(ATTR_DATE): cv.date, - vol.Required(ATTR_COUNTRIES, default=[Country.ES, Country.PT]): vol.All( - cv.ensure_list, [vol.Coerce(Country)] - ), + probatio.Required(ATTR_DATE): cv.date, + probatio.Required( + ATTR_COUNTRIES, default=[Country.ES, Country.PT] + ): probatio.All(cv.ensure_list, [probatio.Coerce(Country)]), } ) diff --git a/homeassistant/components/omnilogic/config_flow.py b/homeassistant/components/omnilogic/config_flow.py index 7e38f90709546..20b644b35e184 100644 --- a/homeassistant/components/omnilogic/config_flow.py +++ b/homeassistant/components/omnilogic/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from omnilogic import LoginException, OmniLogic, OmniLogicException -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -65,10 +65,10 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, @@ -88,22 +88,22 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { # Polling interval is user-configurable, which is no longer allowed # pylint: disable-next=home-assistant-config-flow-polling-field - vol.Optional( + probatio.Optional( CONF_SCAN_INTERVAL, default=self.config_entry.options.get( CONF_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL ), ): int, - vol.Optional( + probatio.Optional( "ph_offset", default=self.config_entry.options.get( "ph_offset", DEFAULT_PH_OFFSET ), - ): vol.All(vol.Coerce(float)), + ): probatio.All(probatio.Coerce(float)), } ), ) diff --git a/homeassistant/components/omnilogic/switch.py b/homeassistant/components/omnilogic/switch.py index 13a395769f0d8..84e8e73ee0ea3 100644 --- a/homeassistant/components/omnilogic/switch.py +++ b/homeassistant/components/omnilogic/switch.py @@ -4,7 +4,7 @@ from typing import Any, override from omnilogic import OmniLogicException -import voluptuous as vol +import probatio from homeassistant.components.switch import SwitchEntity from homeassistant.core import HomeAssistant @@ -62,7 +62,7 @@ async def async_setup_entry( platform.async_register_entity_service( SERVICE_SET_SPEED, - {vol.Required("speed"): cv.positive_int}, + {probatio.Required("speed"): cv.positive_int}, "async_set_speed", ) diff --git a/homeassistant/components/onboarding/views.py b/homeassistant/components/onboarding/views.py index 2801f4266df1c..7440972a65233 100644 --- a/homeassistant/components/onboarding/views.py +++ b/homeassistant/components/onboarding/views.py @@ -7,7 +7,7 @@ from aiohttp import web from aiohttp.web_exceptions import HTTPUnauthorized -import voluptuous as vol +import probatio from homeassistant.auth.const import GROUP_ID_ADMIN from homeassistant.auth.providers.homeassistant import HassAuthProvider @@ -178,13 +178,13 @@ class UserOnboardingView(_BaseOnboardingStepView): step = STEP_USER @RequestDataValidator( - vol.Schema( + probatio.Schema( { - vol.Required("name"): str, - vol.Required("username"): str, - vol.Required("password"): str, - vol.Required("client_id"): str, - vol.Required("language"): str, + probatio.Required("name"): str, + probatio.Required("username"): str, + probatio.Required("password"): str, + probatio.Required("client_id"): str, + probatio.Required("language"): str, } ) ) @@ -288,7 +288,12 @@ class IntegrationOnboardingView(_BaseOnboardingStepView): step = STEP_INTEGRATION @RequestDataValidator( - vol.Schema({vol.Required("client_id"): str, vol.Required("redirect_uri"): str}) + probatio.Schema( + { + probatio.Required("client_id"): str, + probatio.Required("redirect_uri"): str, + } + ) ) async def post(self, request: web.Request, data: dict[str, Any]) -> web.Response: """Handle token creation.""" @@ -336,9 +341,9 @@ class WaitIntegrationOnboardingView(NoAuthBaseOnboardingView): name = "api:onboarding:integration:wait" @RequestDataValidator( - vol.Schema( + probatio.Schema( { - vol.Required("domain"): str, + probatio.Required("domain"): str, } ) ) diff --git a/homeassistant/components/onedrive/config_flow.py b/homeassistant/components/onedrive/config_flow.py index 3e6a95f139dbd..97764b5086a0d 100644 --- a/homeassistant/components/onedrive/config_flow.py +++ b/homeassistant/components/onedrive/config_flow.py @@ -7,7 +7,7 @@ from onedrive_personal_sdk.clients.client import OneDriveClient from onedrive_personal_sdk.exceptions import OneDriveException from onedrive_personal_sdk.models.items import AppRoot, ItemUpdate -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -31,7 +31,7 @@ ) from .coordinator import OneDriveConfigEntry -FOLDER_NAME_SCHEMA = vol.Schema({vol.Required(CONF_FOLDER_NAME): str}) +FOLDER_NAME_SCHEMA = probatio.Schema({probatio.Required(CONF_FOLDER_NAME): str}) class OneDriveConfigFlow(AbstractOAuth2FlowHandler, domain=DOMAIN): @@ -242,9 +242,9 @@ async def async_step_init( if user_input: return self.async_create_entry(title="", data=user_input) - options_schema = vol.Schema( + options_schema = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_DELETE_PERMANENTLY, default=self.config_entry.options.get( CONF_DELETE_PERMANENTLY, False diff --git a/homeassistant/components/onedrive/services.py b/homeassistant/components/onedrive/services.py index fdd69d2f5fd65..84c37fa9e456b 100644 --- a/homeassistant/components/onedrive/services.py +++ b/homeassistant/components/onedrive/services.py @@ -7,7 +7,7 @@ from typing import cast from onedrive_personal_sdk.exceptions import OneDriveException -import voluptuous as vol +import probatio from homeassistant.const import CONF_FILENAME from homeassistant.core import ( @@ -28,20 +28,20 @@ CONF_DESTINATION_PATH = "destination_path" UPLOAD_SERVICE = "upload" -UPLOAD_SERVICE_SCHEMA = vol.Schema( +UPLOAD_SERVICE_SCHEMA = probatio.Schema( { - vol.Required(CONF_CONFIG_ENTRY_ID): cv.string, - vol.Required(CONF_FILENAME): vol.All(cv.ensure_list, [cv.string]), - vol.Required(CONF_DESTINATION_FOLDER): cv.string, + probatio.Required(CONF_CONFIG_ENTRY_ID): cv.string, + probatio.Required(CONF_FILENAME): probatio.All(cv.ensure_list, [cv.string]), + probatio.Required(CONF_DESTINATION_FOLDER): cv.string, } ) DELETE_SERVICE = "delete" -DELETE_SERVICE_SCHEMA = vol.Schema( +DELETE_SERVICE_SCHEMA = probatio.Schema( { - vol.Required(CONF_CONFIG_ENTRY_ID): cv.string, - vol.Required(CONF_DESTINATION_PATH): vol.All( - cv.ensure_list, vol.Length(min=1), [cv.string] + probatio.Required(CONF_CONFIG_ENTRY_ID): cv.string, + probatio.Required(CONF_DESTINATION_PATH): probatio.All( + cv.ensure_list, probatio.Length(min=1), [cv.string] ), } ) diff --git a/homeassistant/components/onedrive_for_business/config_flow.py b/homeassistant/components/onedrive_for_business/config_flow.py index 065165c3a78be..fcf1dae2b91ab 100644 --- a/homeassistant/components/onedrive_for_business/config_flow.py +++ b/homeassistant/components/onedrive_for_business/config_flow.py @@ -7,7 +7,7 @@ from onedrive_personal_sdk.clients.client import OneDriveClient from onedrive_personal_sdk.exceptions import OneDriveException from onedrive_personal_sdk.models.items import Drive -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -27,7 +27,7 @@ OAUTH_SCOPES, ) -FOLDER_NAME_SCHEMA = vol.Schema({vol.Required(CONF_FOLDER_PATH): str}) +FOLDER_NAME_SCHEMA = probatio.Schema({probatio.Required(CONF_FOLDER_PATH): str}) class OneDriveForBusinessConfigFlow(AbstractOAuth2FlowHandler, domain=DOMAIN): @@ -74,9 +74,9 @@ async def async_step_pick_tenant( return self.async_show_form( step_id="pick_tenant", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_TENANT_ID): str, + probatio.Required(CONF_TENANT_ID): str, } ), description_placeholders={ diff --git a/homeassistant/components/onewire/config_flow.py b/homeassistant/components/onewire/config_flow.py index 3f0f1c23251f5..88e67b13c8e52 100644 --- a/homeassistant/components/onewire/config_flow.py +++ b/homeassistant/components/onewire/config_flow.py @@ -5,7 +5,7 @@ from aio_ownet.exceptions import OWServerConnectionError from aio_ownet.proxy import OWServerStatelessProxy -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigFlow, @@ -32,10 +32,10 @@ ) from .onewirehub import OneWireConfigEntry -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST, default=DEFAULT_HOST): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Required(CONF_HOST, default=DEFAULT_HOST): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, } ) @@ -230,13 +230,13 @@ async def async_step_device_selection( return self.async_show_form( step_id="device_selection", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( INPUT_ENTRY_CLEAR_OPTIONS, default=False, ): bool, - vol.Optional( + probatio.Optional( INPUT_ENTRY_DEVICE_SELECTION, default=self._get_current_configured_sensors(), description="Multiselect with list of devices to choose from", @@ -257,14 +257,14 @@ async def async_step_configure_device( return self.async_create_entry(data=self.options) self.current_device, onewire_id = self.devices_to_configure.popitem() - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required( + probatio.Required( OPTION_ENTRY_SENSOR_PRECISION, default=self._get_current_setting( onewire_id, OPTION_ENTRY_SENSOR_PRECISION, "temperature" ), - ): vol.In(PRECISION_MAPPING_FAMILY_28), + ): probatio.In(PRECISION_MAPPING_FAMILY_28), } ) diff --git a/homeassistant/components/onkyo/config_flow.py b/homeassistant/components/onkyo/config_flow.py index 9a82b2b94bb38..8f131b88fe56f 100644 --- a/homeassistant/components/onkyo/config_flow.py +++ b/homeassistant/components/onkyo/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from aioonkyo import ReceiverInfo -import voluptuous as vol +import probatio from yarl import URL from homeassistant.config_entries import ( @@ -55,22 +55,24 @@ LISTENING_MODES_ALL_MEANINGS = { get_meaning(listening_mode): listening_mode for listening_mode in ListeningMode } -STEP_MANUAL_SCHEMA = vol.Schema({vol.Required(CONF_HOST): str}) -STEP_RECONFIGURE_SCHEMA = vol.Schema( +STEP_MANUAL_SCHEMA = probatio.Schema({probatio.Required(CONF_HOST): str}) +STEP_RECONFIGURE_SCHEMA = probatio.Schema( { - vol.Required(OPTION_VOLUME_RESOLUTION): vol.In(VOLUME_RESOLUTION_ALLOWED), + probatio.Required(OPTION_VOLUME_RESOLUTION): probatio.In( + VOLUME_RESOLUTION_ALLOWED + ), } ) STEP_CONFIGURE_SCHEMA = STEP_RECONFIGURE_SCHEMA.extend( { - vol.Required(OPTION_INPUT_SOURCES): SelectSelector( + probatio.Required(OPTION_INPUT_SOURCES): SelectSelector( SelectSelectorConfig( options=list(INPUT_SOURCES_ALL_MEANINGS), multiple=True, mode=SelectSelectorMode.DROPDOWN, ) ), - vol.Required(OPTION_LISTENING_MODES): SelectSelector( + probatio.Required(OPTION_LISTENING_MODES): SelectSelector( SelectSelectorConfig( options=list(LISTENING_MODES_ALL_MEANINGS), multiple=True, @@ -180,8 +182,8 @@ async def async_step_eiscp_discovery( return self.async_show_form( step_id="eiscp_discovery", - data_schema=vol.Schema( - {vol.Required(CONF_DEVICE): vol.In(discovered_names)} + data_schema=probatio.Schema( + {probatio.Required(CONF_DEVICE): probatio.In(discovered_names)} ), ) @@ -342,19 +344,19 @@ def async_get_options_flow(config_entry: OnkyoConfigEntry) -> OptionsFlowWithRel return OnkyoOptionsFlowHandler() -OPTIONS_STEP_INIT_SCHEMA = vol.Schema( +OPTIONS_STEP_INIT_SCHEMA = probatio.Schema( { - vol.Required(OPTION_MAX_VOLUME): NumberSelector( + probatio.Required(OPTION_MAX_VOLUME): NumberSelector( NumberSelectorConfig(min=1, max=100, mode=NumberSelectorMode.BOX) ), - vol.Required(OPTION_INPUT_SOURCES): SelectSelector( + probatio.Required(OPTION_INPUT_SOURCES): SelectSelector( SelectSelectorConfig( options=list(INPUT_SOURCES_ALL_MEANINGS), multiple=True, mode=SelectSelectorMode.DROPDOWN, ) ), - vol.Required(OPTION_LISTENING_MODES): SelectSelector( + probatio.Required(OPTION_LISTENING_MODES): SelectSelector( SelectSelectorConfig( options=list(LISTENING_MODES_ALL_MEANINGS), multiple=True, @@ -474,24 +476,26 @@ async def async_step_names( input_sources_schema_dict: dict[Any, Selector] = {} for input_source, input_source_name in self._input_sources.items(): input_sources_schema_dict[ - vol.Required(get_meaning(input_source), default=input_source_name) + probatio.Required(get_meaning(input_source), default=input_source_name) ] = TextSelector() listening_modes_schema_dict: dict[Any, Selector] = {} for listening_mode, listening_mode_name in self._listening_modes.items(): listening_modes_schema_dict[ - vol.Required(get_meaning(listening_mode), default=listening_mode_name) + probatio.Required( + get_meaning(listening_mode), default=listening_mode_name + ) ] = TextSelector() return self.async_show_form( step_id="names", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(OPTION_INPUT_SOURCES): section( - vol.Schema(input_sources_schema_dict) + probatio.Required(OPTION_INPUT_SOURCES): section( + probatio.Schema(input_sources_schema_dict) ), - vol.Required(OPTION_LISTENING_MODES): section( - vol.Schema(listening_modes_schema_dict) + probatio.Required(OPTION_LISTENING_MODES): section( + probatio.Schema(listening_modes_schema_dict) ), } ), diff --git a/homeassistant/components/onkyo/services.py b/homeassistant/components/onkyo/services.py index 1fe85ba9c4e64..c3e435662d2d6 100644 --- a/homeassistant/components/onkyo/services.py +++ b/homeassistant/components/onkyo/services.py @@ -1,6 +1,6 @@ """Onkyo services.""" -import voluptuous as vol +import probatio from homeassistant.components.media_player import DOMAIN as MEDIA_PLAYER_DOMAIN from homeassistant.const import ATTR_ENTITY_ID @@ -11,10 +11,12 @@ from .media_player import DATA_MP_ENTITIES, OnkyoMediaPlayer ATTR_HDMI_OUTPUT = "hdmi_output" -ONKYO_SELECT_OUTPUT_SCHEMA = vol.Schema( +ONKYO_SELECT_OUTPUT_SCHEMA = probatio.Schema( { - vol.Required(ATTR_ENTITY_ID): cv.entity_ids, - vol.Required(ATTR_HDMI_OUTPUT): vol.In(LEGACY_REV_HDMI_OUTPUT_MAPPING), + probatio.Required(ATTR_ENTITY_ID): cv.entity_ids, + probatio.Required(ATTR_HDMI_OUTPUT): probatio.In( + LEGACY_REV_HDMI_OUTPUT_MAPPING + ), } ) SERVICE_SELECT_HDMI_OUTPUT = "onkyo_select_hdmi_output" diff --git a/homeassistant/components/onvif/camera.py b/homeassistant/components/onvif/camera.py index 66454c8a3f1ba..fbf3abc33564c 100644 --- a/homeassistant/components/onvif/camera.py +++ b/homeassistant/components/onvif/camera.py @@ -5,7 +5,7 @@ from haffmpeg.camera import CameraMjpeg from onvif.exceptions import ONVIFError -import voluptuous as vol +import probatio from yarl import URL from homeassistant.components import ffmpeg @@ -63,12 +63,12 @@ async def async_setup_entry( platform.async_register_entity_service( SERVICE_PTZ, { - vol.Optional(ATTR_PAN): vol.In([DIR_LEFT, DIR_RIGHT]), - vol.Optional(ATTR_TILT): vol.In([DIR_UP, DIR_DOWN]), - vol.Optional(ATTR_ZOOM): vol.In([ZOOM_OUT, ZOOM_IN]), - vol.Optional(ATTR_DISTANCE, default=0.1): cv.small_float, - vol.Optional(ATTR_SPEED): cv.small_float, - vol.Optional(ATTR_MOVE_MODE, default=RELATIVE_MOVE): vol.In( + probatio.Optional(ATTR_PAN): probatio.In([DIR_LEFT, DIR_RIGHT]), + probatio.Optional(ATTR_TILT): probatio.In([DIR_UP, DIR_DOWN]), + probatio.Optional(ATTR_ZOOM): probatio.In([ZOOM_OUT, ZOOM_IN]), + probatio.Optional(ATTR_DISTANCE, default=0.1): cv.small_float, + probatio.Optional(ATTR_SPEED): cv.small_float, + probatio.Optional(ATTR_MOVE_MODE, default=RELATIVE_MOVE): probatio.In( [ CONTINUOUS_MOVE, RELATIVE_MOVE, @@ -77,8 +77,8 @@ async def async_setup_entry( STOP_MOVE, ] ), - vol.Optional(ATTR_CONTINUOUS_DURATION, default=0.5): cv.small_float, - vol.Optional(ATTR_PRESET, default="0"): cv.string, + probatio.Optional(ATTR_CONTINUOUS_DURATION, default=0.5): cv.small_float, + probatio.Optional(ATTR_PRESET, default="0"): cv.string, }, "async_perform_ptz", ) diff --git a/homeassistant/components/onvif/config_flow.py b/homeassistant/components/onvif/config_flow.py index 931d130cd1eab..1a021761f2c24 100644 --- a/homeassistant/components/onvif/config_flow.py +++ b/homeassistant/components/onvif/config_flow.py @@ -7,7 +7,7 @@ from urllib.parse import urlparse from onvif.util import is_auth_error, stringify_onvif_error -import voluptuous as vol +import probatio from wsdiscovery.discovery import ThreadedWSDiscovery as WSDiscovery from wsdiscovery.qname import QName from wsdiscovery.scope import Scope @@ -136,7 +136,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required("auto", default=True): bool}), + data_schema=probatio.Schema( + {probatio.Required("auto", default=True): bool} + ), ) async def async_step_reauth( @@ -167,10 +169,10 @@ async def async_step_reauth_confirm( ] return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_USERNAME, default=username): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME, default=username): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, @@ -253,7 +255,9 @@ async def async_step_device( return self.async_show_form( step_id="device", - data_schema=vol.Schema({vol.Optional(CONF_HOST): vol.In(devices)}), + data_schema=probatio.Schema( + {probatio.Optional(CONF_HOST): probatio.In(devices)} + ), ) return await self.async_step_configure() @@ -280,15 +284,21 @@ def conf(name, default=None): # and https://github.com/home-assistant/core/issues/35904 return self.async_show_form( step_id="configure", - data_schema=vol.Schema( + data_schema=probatio.Schema( { # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Required(CONF_NAME, default=conf(CONF_NAME)): str, - vol.Required(CONF_HOST, default=conf(CONF_HOST)): str, - vol.Required(CONF_PORT, default=conf(CONF_PORT, DEFAULT_PORT)): int, - vol.Optional(CONF_USERNAME, default=conf(CONF_USERNAME, "")): str, - vol.Optional(CONF_PASSWORD, default=conf(CONF_PASSWORD, "")): str, + probatio.Required(CONF_NAME, default=conf(CONF_NAME)): str, + probatio.Required(CONF_HOST, default=conf(CONF_HOST)): str, + probatio.Required( + CONF_PORT, default=conf(CONF_PORT, DEFAULT_PORT) + ): int, + probatio.Optional( + CONF_USERNAME, default=conf(CONF_USERNAME, "") + ): str, + probatio.Optional( + CONF_PASSWORD, default=conf(CONF_PASSWORD, "") + ): str, } ), errors=errors, @@ -429,30 +439,30 @@ async def async_step_onvif_devices( return self.async_show_form( step_id="onvif_devices", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_EXTRA_ARGUMENTS, default=self.config_entry.options.get( CONF_EXTRA_ARGUMENTS, DEFAULT_ARGUMENTS ), ): str, - vol.Optional( + probatio.Optional( CONF_RTSP_TRANSPORT, default=self.config_entry.options.get( CONF_RTSP_TRANSPORT, next(iter(RTSP_TRANSPORTS)) ), - ): vol.In(RTSP_TRANSPORTS), - vol.Optional( + ): probatio.In(RTSP_TRANSPORTS), + probatio.Optional( CONF_ENABLE_WEBHOOKS, default=self.config_entry.options.get( CONF_ENABLE_WEBHOOKS, DEFAULT_ENABLE_WEBHOOKS ), ): bool, - vol.Required(CONF_MORE_OPTIONS): section( - vol.Schema( + probatio.Required(CONF_MORE_OPTIONS): section( + probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_USE_WALLCLOCK_AS_TIMESTAMPS, default=self.config_entry.options.get( CONF_USE_WALLCLOCK_AS_TIMESTAMPS, False diff --git a/homeassistant/components/open_meteo/config_flow.py b/homeassistant/components/open_meteo/config_flow.py index 47340f2902bce..0d5d64d9c95af 100644 --- a/homeassistant/components/open_meteo/config_flow.py +++ b/homeassistant/components/open_meteo/config_flow.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.zone import DOMAIN as ZONE_DOMAIN from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -34,9 +34,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_ZONE): EntitySelector( + probatio.Required(CONF_ZONE): EntitySelector( EntitySelectorConfig(domain=ZONE_DOMAIN), ), } diff --git a/homeassistant/components/open_router/config_flow.py b/homeassistant/components/open_router/config_flow.py index bbaade6e9b2e1..faa02092e1c2c 100644 --- a/homeassistant/components/open_router/config_flow.py +++ b/homeassistant/components/open_router/config_flow.py @@ -3,13 +3,13 @@ import logging from typing import Any, override +import probatio from python_open_router import ( Model, OpenRouterClient, OpenRouterError, SupportedParameter, ) -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_USER, @@ -85,9 +85,9 @@ async def async_step_user( ) return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_API_KEY): str, + probatio.Required(CONF_API_KEY): str, } ), errors=errors, @@ -187,16 +187,16 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_MODEL, default=self.options.get(CONF_MODEL) ): SelectSelector( SelectSelectorConfig( options=options, mode=SelectSelectorMode.DROPDOWN, sort=True ), ), - vol.Optional( + probatio.Optional( CONF_PROMPT, description={ "suggested_value": self.options.get( @@ -205,7 +205,7 @@ async def async_step_init( ) }, ): TemplateSelector(), - vol.Optional( + probatio.Optional( CONF_LLM_HASS_API, default=self.options.get( CONF_LLM_HASS_API, @@ -214,7 +214,7 @@ async def async_step_init( ): SelectSelector( SelectSelectorConfig(options=hass_apis, multiple=True) ), - vol.Optional( + probatio.Optional( CONF_WEB_SEARCH, default=self.options.get( CONF_WEB_SEARCH, @@ -302,9 +302,9 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_MODEL, default=self.options.get(CONF_MODEL) ): SelectSelector( SelectSelectorConfig( diff --git a/homeassistant/components/open_router/entity.py b/homeassistant/components/open_router/entity.py index 2030b1e97bfd2..f97d0b142720f 100644 --- a/homeassistant/components/open_router/entity.py +++ b/homeassistant/components/open_router/entity.py @@ -22,8 +22,7 @@ from openai.types.chat.chat_completion_message_function_tool_call_param import Function from openai.types.shared_params import FunctionDefinition, ResponseFormatJSONSchema from openai.types.shared_params.response_format_json_schema import JSONSchema -from probatio import to_openapi -import voluptuous as vol +import probatio from homeassistant.components import conversation from homeassistant.config_entries import ConfigSubentry @@ -63,14 +62,14 @@ def _adjust_schema(schema: dict[str, Any]) -> None: def _format_structured_output( - name: str, schema: vol.Schema, llm_api: llm.APIInstance | None + name: str, schema: probatio.Schema, llm_api: llm.APIInstance | None ) -> JSONSchema: """Format the schema to be compatible with OpenRouter API.""" result: JSONSchema = { "name": name, "strict": True, } - result_schema = to_openapi( + result_schema = probatio.to_openapi( schema, custom_serializer=( llm_api.custom_serializer if llm_api else llm.selector_serializer @@ -89,7 +88,7 @@ def _format_tool( ) -> ChatCompletionFunctionToolParam: """Format tool specification.""" unsupported_keys = {"oneOf", "anyOf", "allOf"} - schema = to_openapi(tool.parameters, custom_serializer=custom_serializer) + schema = probatio.to_openapi(tool.parameters, custom_serializer=custom_serializer) schema = {k: v for k, v in schema.items() if k not in unsupported_keys} tool_spec = FunctionDefinition( @@ -229,7 +228,7 @@ async def _async_handle_chat_log( self, chat_log: conversation.ChatLog, structure_name: str | None = None, - structure: vol.Schema | None = None, + structure: probatio.Schema | None = None, ) -> None: """Generate an answer for the chat log.""" diff --git a/homeassistant/components/openai_conversation/config_flow.py b/homeassistant/components/openai_conversation/config_flow.py index 3121843a618d1..c36bf437b0128 100644 --- a/homeassistant/components/openai_conversation/config_flow.py +++ b/homeassistant/components/openai_conversation/config_flow.py @@ -6,8 +6,7 @@ from typing import Any, cast, override import openai -from probatio import to_openapi -import voluptuous as vol +import probatio from homeassistant.components.zone import ENTITY_ID_HOME from homeassistant.config_entries import ( @@ -104,9 +103,9 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_KEY): str, + probatio.Required(CONF_API_KEY): str, } ) @@ -287,12 +286,12 @@ async def async_step_init( default_name = DEFAULT_AI_TASK_NAME else: default_name = DEFAULT_CONVERSATION_NAME - step_schema[vol.Required(CONF_NAME, default=default_name)] = str + step_schema[probatio.Required(CONF_NAME, default=default_name)] = str if self._subentry_type == "conversation": step_schema.update( { - vol.Optional( + probatio.Optional( CONF_PROMPT, description={ "suggested_value": options.get( @@ -300,14 +299,16 @@ async def async_step_init( ) }, ): TemplateSelector(), - vol.Optional(CONF_LLM_HASS_API): SelectSelector( + probatio.Optional(CONF_LLM_HASS_API): SelectSelector( SelectSelectorConfig(options=hass_apis, multiple=True) ), } ) step_schema[ - vol.Required(CONF_RECOMMENDED, default=options.get(CONF_RECOMMENDED, False)) + probatio.Required( + CONF_RECOMMENDED, default=options.get(CONF_RECOMMENDED, False) + ) ] = bool if user_input is not None: @@ -334,7 +335,7 @@ async def async_step_init( return self.async_show_form( step_id="init", data_schema=self.add_suggested_values_to_schema( - vol.Schema(step_schema), options + probatio.Schema(step_schema), options ), ) @@ -346,23 +347,23 @@ async def async_step_additional( errors: dict[str, str] = {} step_schema: VolDictType = { - vol.Optional( + probatio.Optional( CONF_CHAT_MODEL, default=RECOMMENDED_CHAT_MODEL, ): str, - vol.Optional( + probatio.Optional( CONF_MAX_TOKENS, default=RECOMMENDED_MAX_TOKENS, ): int, - vol.Optional( + probatio.Optional( CONF_TOP_P, default=RECOMMENDED_TOP_P, ): NumberSelector(NumberSelectorConfig(min=0, max=1, step=0.05)), - vol.Optional( + probatio.Optional( CONF_TEMPERATURE, default=RECOMMENDED_TEMPERATURE, ): NumberSelector(NumberSelectorConfig(min=0, max=2, step=0.05)), - vol.Optional( + probatio.Optional( CONF_STORE_RESPONSES, default=RECOMMENDED_STORE_RESPONSES, ): bool, @@ -379,7 +380,7 @@ async def async_step_additional( return self.async_show_form( step_id="additional", data_schema=self.add_suggested_values_to_schema( - vol.Schema(step_schema), options + probatio.Schema(step_schema), options ), errors=errors, ) @@ -398,7 +399,7 @@ async def async_step_model( if not model.startswith(tuple(UNSUPPORTED_CODE_INTERPRETER_MODELS)): step_schema.update( { - vol.Optional( + probatio.Optional( CONF_CODE_INTERPRETER, default=RECOMMENDED_CODE_INTERPRETER, ): bool, @@ -410,7 +411,7 @@ async def async_step_model( if reasoning_options := self._get_reasoning_options(model): step_schema.update( { - vol.Optional( + probatio.Optional( CONF_REASONING_EFFORT, default=RECOMMENDED_REASONING_EFFORT, ): SelectSelector( @@ -428,7 +429,7 @@ async def async_step_model( if model.startswith(("gpt-5.6", "gpt-6")): step_schema.update( { - vol.Optional( + probatio.Optional( CONF_PRO_MODE, default=RECOMMENDED_PRO_MODE, ): bool, @@ -440,7 +441,7 @@ async def async_step_model( if model.startswith(("gpt-5", "gpt-6")): step_schema.update( { - vol.Optional( + probatio.Optional( CONF_VERBOSITY, default=RECOMMENDED_VERBOSITY, ): SelectSelector( @@ -467,7 +468,7 @@ async def async_step_model( options[CONF_REASONING_SUMMARY] = stored_summary step_schema.update( { - vol.Optional( + probatio.Optional( CONF_REASONING_SUMMARY, default=stored_summary, ): SelectSelector( @@ -485,7 +486,7 @@ async def async_step_model( service_tiers = self._get_service_tiers(model) if "flex" in service_tiers or "priority" in service_tiers: step_schema[ - vol.Optional( + probatio.Optional( CONF_SERVICE_TIER, default=RECOMMENDED_SERVICE_TIER, ) @@ -506,11 +507,11 @@ async def async_step_model( ): step_schema.update( { - vol.Optional( + probatio.Optional( CONF_WEB_SEARCH, default=RECOMMENDED_WEB_SEARCH, ): bool, - vol.Optional( + probatio.Optional( CONF_WEB_SEARCH_CONTEXT_SIZE, default=RECOMMENDED_WEB_SEARCH_CONTEXT_SIZE, ): SelectSelector( @@ -520,11 +521,11 @@ async def async_step_model( mode=SelectSelectorMode.DROPDOWN, ) ), - vol.Optional( + probatio.Optional( CONF_WEB_SEARCH_USER_LOCATION, default=RECOMMENDED_WEB_SEARCH_USER_LOCATION, ): bool, - vol.Optional( + probatio.Optional( CONF_WEB_SEARCH_INLINE_CITATIONS, default=RECOMMENDED_WEB_SEARCH_INLINE_CITATIONS, ): bool, @@ -551,7 +552,7 @@ async def async_step_model( tuple(UNSUPPORTED_IMAGE_MODELS) ): step_schema[ - vol.Optional(CONF_IMAGE_MODEL, default=RECOMMENDED_IMAGE_MODEL) + probatio.Optional(CONF_IMAGE_MODEL, default=RECOMMENDED_IMAGE_MODEL) ] = SelectSelector( SelectSelectorConfig( options=[ @@ -599,7 +600,7 @@ async def async_step_model( return self.async_show_form( step_id="model", data_schema=self.add_suggested_values_to_schema( - vol.Schema(step_schema), options + probatio.Schema(step_schema), options ), errors=errors, ) @@ -655,15 +656,15 @@ async def _get_location_data(self) -> dict[str, str]: api_key=self._get_entry().data[CONF_API_KEY], http_client=cast(Any, get_async_client(self.hass)), ) - location_schema = vol.Schema( + location_schema = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_WEB_SEARCH_CITY, description=( "Free text input for the city, e.g. `San Francisco`" ), ): str, - vol.Optional( + probatio.Optional( CONF_WEB_SEARCH_REGION, description="Free text input for the region, e.g. `California`", ): str, @@ -685,7 +686,9 @@ async def _get_location_data(self) -> dict[str, str]: "name": "approximate_location", "description": "Approximate location data of the user " "for refined web search results", - "schema": to_openapi(location_schema, openapi_version="3.1.0"), + "schema": probatio.to_openapi( + location_schema, openapi_version="3.1.0" + ), "strict": False, } }, @@ -742,11 +745,11 @@ async def async_step_init( step_schema: VolDictType = {} if self._is_new: - step_schema[vol.Required(CONF_NAME, default=DEFAULT_STT_NAME)] = str + step_schema[probatio.Required(CONF_NAME, default=DEFAULT_STT_NAME)] = str step_schema.update( { - vol.Optional( + probatio.Optional( CONF_PROMPT, description={ "suggested_value": options.get(CONF_PROMPT, DEFAULT_STT_PROMPT) @@ -754,7 +757,7 @@ async def async_step_init( ): TextSelector( TextSelectorConfig(multiline=True, type=TextSelectorType.TEXT) ), - vol.Optional( + probatio.Optional( CONF_CHAT_MODEL, default=RECOMMENDED_STT_MODEL ): SelectSelector( SelectSelectorConfig( @@ -787,7 +790,7 @@ async def async_step_init( return self.async_show_form( step_id="init", data_schema=self.add_suggested_values_to_schema( - vol.Schema(step_schema), options + probatio.Schema(step_schema), options ), errors=errors, ) @@ -831,14 +834,14 @@ async def async_step_init( step_schema: VolDictType = {} if self._is_new: - step_schema[vol.Required(CONF_NAME, default=DEFAULT_TTS_NAME)] = str + step_schema[probatio.Required(CONF_NAME, default=DEFAULT_TTS_NAME)] = str step_schema.update( { - vol.Optional(CONF_PROMPT): TextSelector( + probatio.Optional(CONF_PROMPT): TextSelector( TextSelectorConfig(multiline=True, type=TextSelectorType.TEXT) ), - vol.Optional( + probatio.Optional( CONF_TTS_SPEED, default=RECOMMENDED_TTS_SPEED ): NumberSelector(NumberSelectorConfig(min=0.25, max=4.0, step=0.01)), } @@ -861,7 +864,7 @@ async def async_step_init( return self.async_show_form( step_id="init", data_schema=self.add_suggested_values_to_schema( - vol.Schema(step_schema), options + probatio.Schema(step_schema), options ), errors=errors, ) diff --git a/homeassistant/components/openai_conversation/entity.py b/homeassistant/components/openai_conversation/entity.py index 9156fa18955c5..df599ed68894c 100644 --- a/homeassistant/components/openai_conversation/entity.py +++ b/homeassistant/components/openai_conversation/entity.py @@ -56,8 +56,7 @@ ImageGeneration, ) from openai.types.responses.web_search_tool_param import UserLocation -from probatio import to_openapi -import voluptuous as vol +import probatio from homeassistant.components import conversation from homeassistant.config_entries import ConfigSubentry @@ -142,10 +141,10 @@ def _adjust_schema(schema: dict[str, Any]) -> None: def _format_structured_output( - schema: vol.Schema, llm_api: llm.APIInstance | None + schema: probatio.Schema, llm_api: llm.APIInstance | None ) -> dict[str, Any]: """Format the schema to be compatible with OpenAI API.""" - result: dict[str, Any] = to_openapi( + result: dict[str, Any] = probatio.to_openapi( schema, custom_serializer=( llm_api.custom_serializer if llm_api else llm.selector_serializer @@ -163,7 +162,7 @@ def _format_tool( ) -> FunctionToolParam: """Format tool specification.""" unsupported_keys = {"oneOf", "anyOf", "allOf", "enum", "not"} - schema = to_openapi( + schema = probatio.to_openapi( tool.parameters, custom_serializer=custom_serializer, openapi_version="3.1.0" ) if unsupported_keys.intersection(schema): @@ -506,7 +505,7 @@ async def _async_handle_chat_log( # noqa: C901 self, chat_log: conversation.ChatLog, structure_name: str | None = None, - structure: vol.Schema | None = None, + structure: probatio.Schema | None = None, force_image: bool = False, max_iterations: int = MAX_TOOL_ITERATIONS, ) -> None: diff --git a/homeassistant/components/openalpr_cloud/image_processing.py b/homeassistant/components/openalpr_cloud/image_processing.py index 615d1865a7080..6198a8e04fe29 100644 --- a/homeassistant/components/openalpr_cloud/image_processing.py +++ b/homeassistant/components/openalpr_cloud/image_processing.py @@ -7,7 +7,7 @@ from typing import Any, override import aiohttp -import voluptuous as vol +import probatio from homeassistant.components.image_processing import ( ATTR_CONFIDENCE, @@ -58,8 +58,10 @@ PLATFORM_SCHEMA = IMAGE_PROCESSING_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_API_KEY): cv.string, - vol.Required(CONF_REGION): vol.All(vol.Lower, vol.In(OPENALPR_REGIONS)), + probatio.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_REGION): probatio.All( + probatio.Lower, probatio.In(OPENALPR_REGIONS) + ), } ) diff --git a/homeassistant/components/opendisplay/config_flow.py b/homeassistant/components/opendisplay/config_flow.py index 8b051b6896549..0be0229037391 100644 --- a/homeassistant/components/opendisplay/config_flow.py +++ b/homeassistant/components/opendisplay/config_flow.py @@ -12,7 +12,7 @@ OpenDisplayDevice, OpenDisplayError, ) -import voluptuous as vol +import probatio from homeassistant.components.bluetooth import ( BluetoothServiceInfoBleak, @@ -27,7 +27,9 @@ _LOGGER = logging.getLogger(__name__) -_ENCRYPTION_KEY_VALIDATOR = vol.All(str.strip, str.lower, vol.Match(r"^[0-9a-f]{32}$")) +_ENCRYPTION_KEY_VALIDATOR = probatio.All( + str.strip, str.lower, probatio.Match(r"^[0-9a-f]{32}$") +) class OpenDisplayConfigFlow(ConfigFlow, domain=DOMAIN): @@ -131,9 +133,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_ADDRESS): vol.In( + probatio.Required(CONF_ADDRESS): probatio.In( { addr: f"{info.name} ({addr})" for addr, info in self._discovered_devices.items() @@ -174,7 +176,7 @@ async def async_step_encryption_key( if user_input is not None: try: key: str = _ENCRYPTION_KEY_VALIDATOR(user_input[CONF_ENCRYPTION_KEY]) - except vol.Invalid: + except probatio.Invalid: errors[CONF_ENCRYPTION_KEY] = "invalid_key_format" else: if TYPE_CHECKING: @@ -189,7 +191,7 @@ async def async_step_encryption_key( return self.async_show_form( step_id="encryption_key", - data_schema=vol.Schema({vol.Required(CONF_ENCRYPTION_KEY): str}), + data_schema=probatio.Schema({probatio.Required(CONF_ENCRYPTION_KEY): str}), description_placeholders={"name": name}, errors=errors, ) @@ -212,7 +214,7 @@ async def async_step_reauth_confirm( if user_input[CONF_ENCRYPTION_KEY].strip(): try: key = _ENCRYPTION_KEY_VALIDATOR(user_input[CONF_ENCRYPTION_KEY]) - except vol.Invalid: + except probatio.Invalid: errors[CONF_ENCRYPTION_KEY] = "invalid_key_format" if not errors: @@ -234,8 +236,8 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( - {vol.Optional(CONF_ENCRYPTION_KEY, default=""): str} + data_schema=probatio.Schema( + {probatio.Optional(CONF_ENCRYPTION_KEY, default=""): str} ), description_placeholders={"name": reauth_entry.title}, errors=errors, diff --git a/homeassistant/components/opendisplay/services.py b/homeassistant/components/opendisplay/services.py index 4fabade0c2e1a..971d0076860d2 100644 --- a/homeassistant/components/opendisplay/services.py +++ b/homeassistant/components/opendisplay/services.py @@ -19,7 +19,7 @@ Rotation, ) from PIL import Image as PILImage, ImageOps -import voluptuous as vol +import probatio from homeassistant.components.bluetooth import ( BluetoothReachabilityIntent, @@ -55,26 +55,30 @@ def _str_to_int_enum(enum_class: type[IntEnum]) -> Callable[[str], Any]: def validate(value: str) -> IntEnum: if (result := members.get(value)) is None: - raise vol.Invalid(f"Invalid value: {value}") + raise probatio.Invalid(f"Invalid value: {value}") return result return validate -SCHEMA_UPLOAD_IMAGE = vol.Schema( +SCHEMA_UPLOAD_IMAGE = probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): cv.string, - vol.Required(ATTR_IMAGE): MediaSelector( + probatio.Required(ATTR_DEVICE_ID): cv.string, + probatio.Required(ATTR_IMAGE): MediaSelector( MediaSelectorConfig(accept=["image/*"]) ), - vol.Optional(ATTR_ROTATION, default=Rotation.ROTATE_0): vol.All( - vol.Coerce(int), vol.Coerce(Rotation) + probatio.Optional(ATTR_ROTATION, default=Rotation.ROTATE_0): probatio.All( + probatio.Coerce(int), probatio.Coerce(Rotation) ), - vol.Optional(ATTR_DITHER_MODE, default="burkes"): _str_to_int_enum(DitherMode), - vol.Optional(ATTR_REFRESH_MODE, default="full"): _str_to_int_enum(RefreshMode), - vol.Optional(ATTR_FIT_MODE, default="contain"): _str_to_int_enum(FitMode), - vol.Optional(ATTR_TONE_COMPRESSION): vol.All( - vol.Coerce(float), vol.Range(min=0.0, max=100.0) + probatio.Optional(ATTR_DITHER_MODE, default="burkes"): _str_to_int_enum( + DitherMode + ), + probatio.Optional(ATTR_REFRESH_MODE, default="full"): _str_to_int_enum( + RefreshMode + ), + probatio.Optional(ATTR_FIT_MODE, default="contain"): _str_to_int_enum(FitMode), + probatio.Optional(ATTR_TONE_COMPRESSION): probatio.All( + probatio.Coerce(float), probatio.Range(min=0.0, max=100.0) ), } ) diff --git a/homeassistant/components/openerz/sensor.py b/homeassistant/components/openerz/sensor.py index 383df7d70fd72..7f2506ec9b3a0 100644 --- a/homeassistant/components/openerz/sensor.py +++ b/homeassistant/components/openerz/sensor.py @@ -4,7 +4,7 @@ from typing import override from openerz_api.main import OpenERZConnector -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -23,9 +23,9 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ZIP): cv.positive_int, - vol.Required(CONF_WASTE_TYPE, default="waste"): cv.string, - vol.Optional(CONF_NAME): cv.string, + probatio.Required(CONF_ZIP): cv.positive_int, + probatio.Required(CONF_WASTE_TYPE, default="waste"): cv.string, + probatio.Optional(CONF_NAME): cv.string, } ) diff --git a/homeassistant/components/openevse/config_flow.py b/homeassistant/components/openevse/config_flow.py index c8c451f80dd01..0af019e9ca2c2 100644 --- a/homeassistant/components/openevse/config_flow.py +++ b/homeassistant/components/openevse/config_flow.py @@ -5,7 +5,7 @@ from openevsehttp.__main__ import OpenEVSE from openevsehttp.exceptions import AuthenticationError, MissingSerial -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -25,14 +25,14 @@ from .const import CONF_SERIAL, DOMAIN -USER_SCHEMA = vol.Schema({vol.Required(CONF_HOST): TextSelector()}) +USER_SCHEMA = probatio.Schema({probatio.Required(CONF_HOST): TextSelector()}) -AUTH_SCHEMA = vol.Schema( +AUTH_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): TextSelector( + probatio.Required(CONF_USERNAME): TextSelector( TextSelectorConfig(autocomplete="username") ), - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password" ) @@ -40,13 +40,13 @@ } ) -RECONFIGURE_SCHEMA = vol.Schema( +RECONFIGURE_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): TextSelector(), - vol.Optional(CONF_USERNAME): TextSelector( + probatio.Required(CONF_HOST): TextSelector(), + probatio.Optional(CONF_USERNAME): TextSelector( TextSelectorConfig(autocomplete="username") ), - vol.Optional(CONF_PASSWORD): TextSelector( + probatio.Optional(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", diff --git a/homeassistant/components/openevse/sensor.py b/homeassistant/components/openevse/sensor.py index aac20577b4370..03d60ee101752 100644 --- a/homeassistant/components/openevse/sensor.py +++ b/homeassistant/components/openevse/sensor.py @@ -7,7 +7,7 @@ from typing import override from openevsehttp.__main__ import OpenEVSE -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -387,9 +387,9 @@ class OpenEVSESensorDescription(SensorEntityDescription): PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_MONITORED_VARIABLES, default=["status"]): vol.All( - cv.ensure_list, [vol.In(SENSOR_KEYS)] + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_MONITORED_VARIABLES, default=["status"]): probatio.All( + cv.ensure_list, [probatio.In(SENSOR_KEYS)] ), } ) diff --git a/homeassistant/components/openexchangerates/config_flow.py b/homeassistant/components/openexchangerates/config_flow.py index 9ecb72b2c5373..ead33df3ce9ab 100644 --- a/homeassistant/components/openexchangerates/config_flow.py +++ b/homeassistant/components/openexchangerates/config_flow.py @@ -9,7 +9,7 @@ OpenExchangeRatesAuthError, OpenExchangeRatesClientError, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY, CONF_BASE @@ -22,14 +22,14 @@ def get_data_schema( currencies: dict[str, str], existing_data: Mapping[str, str] -) -> vol.Schema: +) -> probatio.Schema: """Return a form schema.""" - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_API_KEY): str, - vol.Optional( + probatio.Required(CONF_API_KEY): str, + probatio.Optional( CONF_BASE, default=existing_data.get(CONF_BASE) or DEFAULT_BASE - ): vol.In(currencies), + ): probatio.In(currencies), } ) diff --git a/homeassistant/components/opengarage/config_flow.py b/homeassistant/components/opengarage/config_flow.py index 405b50182da11..d6f6deea81ec4 100644 --- a/homeassistant/components/opengarage/config_flow.py +++ b/homeassistant/components/opengarage/config_flow.py @@ -5,7 +5,7 @@ import aiohttp import opengarage -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PORT, CONF_VERIFY_SSL @@ -18,12 +18,12 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_DEVICE_KEY): str, - vol.Required(CONF_HOST, default="http://"): str, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): int, - vol.Optional(CONF_VERIFY_SSL, default=False): bool, + probatio.Required(CONF_DEVICE_KEY): str, + probatio.Required(CONF_HOST, default="http://"): str, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Optional(CONF_VERIFY_SSL, default=False): bool, } ) diff --git a/homeassistant/components/openhardwaremonitor/sensor.py b/homeassistant/components/openhardwaremonitor/sensor.py index 0234255817d65..e1f685af7a1c3 100644 --- a/homeassistant/components/openhardwaremonitor/sensor.py +++ b/homeassistant/components/openhardwaremonitor/sensor.py @@ -3,8 +3,8 @@ from datetime import timedelta import logging +import probatio import requests -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -39,7 +39,10 @@ OHM_NAME = "Text" PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_HOST): cv.string, vol.Optional(CONF_PORT, default=8085): cv.port} + { + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_PORT, default=8085): cv.port, + } ) diff --git a/homeassistant/components/openhome/services.py b/homeassistant/components/openhome/services.py index d6f59d0902b18..1cbdcc12691d2 100644 --- a/homeassistant/components/openhome/services.py +++ b/homeassistant/components/openhome/services.py @@ -1,6 +1,6 @@ """Support for Openhome Devices.""" -import voluptuous as vol +import probatio from homeassistant.components.media_player import DOMAIN as MEDIA_PLAYER_DOMAIN from homeassistant.core import HomeAssistant, callback @@ -20,6 +20,6 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, SERVICE_INVOKE_PIN, entity_domain=MEDIA_PLAYER_DOMAIN, - schema={vol.Required(ATTR_PIN_INDEX): cv.positive_int}, + schema={probatio.Required(ATTR_PIN_INDEX): cv.positive_int}, func="async_invoke_pin", ) diff --git a/homeassistant/components/openrgb/config_flow.py b/homeassistant/components/openrgb/config_flow.py index ab70535748852..dc135e7e612e3 100644 --- a/homeassistant/components/openrgb/config_flow.py +++ b/homeassistant/components/openrgb/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from openrgb import OpenRGBClient -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PORT @@ -15,20 +15,20 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Required(CONF_NAME): str, - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Required(CONF_NAME): str, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): cv.port, } ) -STEP_RECONFIGURE_DATA_SCHEMA = vol.Schema( +STEP_RECONFIGURE_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): cv.port, } ) diff --git a/homeassistant/components/opensensemap/air_quality.py b/homeassistant/components/opensensemap/air_quality.py index 8862421b56b07..d1bbabf97698d 100644 --- a/homeassistant/components/opensensemap/air_quality.py +++ b/homeassistant/components/opensensemap/air_quality.py @@ -2,7 +2,7 @@ from typing import override -import voluptuous as vol +import probatio from homeassistant.components.air_quality import ( DOMAIN as AIR_QUALITY_DOMAIN, @@ -38,7 +38,10 @@ from .coordinator import OpenSenseMapConfigEntry, OpenSenseMapCoordinator PLATFORM_SCHEMA = AIR_QUALITY_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_STATION_ID): cv.string, vol.Optional(CONF_NAME): cv.string} + { + probatio.Required(CONF_STATION_ID): cv.string, + probatio.Optional(CONF_NAME): cv.string, + } ) diff --git a/homeassistant/components/opensensemap/config_flow.py b/homeassistant/components/opensensemap/config_flow.py index 2ced23b8264fa..c448bd9b46c1a 100644 --- a/homeassistant/components/opensensemap/config_flow.py +++ b/homeassistant/components/opensensemap/config_flow.py @@ -4,7 +4,7 @@ from opensensemap_api import OpenSenseMap from opensensemap_api.exceptions import OpenSenseMapError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_NAME @@ -65,7 +65,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_STATION_ID): str}), + data_schema=probatio.Schema({probatio.Required(CONF_STATION_ID): str}), errors=errors, ) diff --git a/homeassistant/components/opensky/config_flow.py b/homeassistant/components/opensky/config_flow.py index 5866564b71f0f..c09507e839bdf 100644 --- a/homeassistant/components/opensky/config_flow.py +++ b/homeassistant/components/opensky/config_flow.py @@ -3,9 +3,9 @@ from typing import Any, override from aiohttp import BasicAuth +import probatio from python_opensky import OpenSky from python_opensky.exceptions import OpenSkyUnauthenticatedError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, OptionsFlow from homeassistant.const import ( @@ -61,12 +61,12 @@ async def async_step_user( return self.async_show_form( step_id="user", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_RADIUS): vol.Coerce(float), - vol.Required(CONF_LATITUDE): cv.latitude, - vol.Required(CONF_LONGITUDE): cv.longitude, - vol.Optional(CONF_ALTITUDE): vol.Coerce(float), + probatio.Required(CONF_RADIUS): probatio.Coerce(float), + probatio.Required(CONF_LATITUDE): cv.latitude, + probatio.Required(CONF_LONGITUDE): cv.longitude, + probatio.Optional(CONF_ALTITUDE): probatio.Coerce(float), } ), { @@ -113,13 +113,13 @@ async def async_step_init( step_id="init", errors=errors, data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_RADIUS): vol.Coerce(float), - vol.Optional(CONF_ALTITUDE): vol.Coerce(float), - vol.Optional(CONF_USERNAME): str, - vol.Optional(CONF_PASSWORD): str, - vol.Optional(CONF_CONTRIBUTING_USER, default=False): bool, + probatio.Required(CONF_RADIUS): probatio.Coerce(float), + probatio.Optional(CONF_ALTITUDE): probatio.Coerce(float), + probatio.Optional(CONF_USERNAME): str, + probatio.Optional(CONF_PASSWORD): str, + probatio.Optional(CONF_CONTRIBUTING_USER, default=False): bool, } ), user_input or self.config_entry.options, diff --git a/homeassistant/components/opentherm_gw/config_flow.py b/homeassistant/components/opentherm_gw/config_flow.py index 2a0dcdb68a102..70577ae451596 100644 --- a/homeassistant/components/opentherm_gw/config_flow.py +++ b/homeassistant/components/opentherm_gw/config_flow.py @@ -3,10 +3,10 @@ import asyncio from typing import Any, override +import probatio import pyotgw from pyotgw import vars as gw_vars from serial import SerialException -import voluptuous as vol from homeassistant.config_entries import ( ConfigEntry, @@ -97,10 +97,10 @@ def _show_form(self, errors: dict[str, str] | None = None) -> ConfigFlowResult: """Show the config flow form with possible errors.""" return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_DEVICE): str, - vol.Required(CONF_ID): str, + probatio.Required(CONF_DEVICE): str, + probatio.Required(CONF_ID): str, } ), errors=errors or {}, @@ -125,33 +125,33 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_READ_PRECISION, default=self.config_entry.options.get(CONF_READ_PRECISION, 0), - ): vol.All( - vol.Coerce(float), - vol.In( + ): probatio.All( + probatio.Coerce(float), + probatio.In( [0, PRECISION_TENTHS, PRECISION_HALVES, PRECISION_WHOLE] ), ), - vol.Optional( + probatio.Optional( CONF_SET_PRECISION, default=self.config_entry.options.get(CONF_SET_PRECISION, 0), - ): vol.All( - vol.Coerce(float), - vol.In( + ): probatio.All( + probatio.Coerce(float), + probatio.In( [0, PRECISION_TENTHS, PRECISION_HALVES, PRECISION_WHOLE] ), ), - vol.Optional( + probatio.Optional( CONF_TEMPORARY_OVRD_MODE, default=self.config_entry.options.get( CONF_TEMPORARY_OVRD_MODE, True ), ): bool, - vol.Optional( + probatio.Optional( CONF_FLOOR_TEMP, default=self.config_entry.options.get(CONF_FLOOR_TEMP, False), ): bool, diff --git a/homeassistant/components/opentherm_gw/services.py b/homeassistant/components/opentherm_gw/services.py index 475fb41175ffe..2d36f8c2f2867 100644 --- a/homeassistant/components/opentherm_gw/services.py +++ b/homeassistant/components/opentherm_gw/services.py @@ -3,8 +3,8 @@ from datetime import date, datetime from typing import TYPE_CHECKING +import probatio import pyotgw.vars as gw_vars -import voluptuous as vol from homeassistant.const import ( ATTR_DATE, @@ -63,100 +63,103 @@ def _get_gateway(call: ServiceCall) -> OpenThermGatewayHub: @callback def async_setup_services(hass: HomeAssistant) -> None: """Register services for the component.""" - service_reset_schema = vol.Schema({vol.Required(ATTR_GW_ID): vol.All(cv.string)}) - service_set_central_heating_ovrd_schema = vol.Schema( + service_reset_schema = probatio.Schema( + {probatio.Required(ATTR_GW_ID): probatio.All(cv.string)} + ) + service_set_central_heating_ovrd_schema = probatio.Schema( { - vol.Required(ATTR_GW_ID): vol.All(cv.string), - vol.Required(ATTR_CH_OVRD): cv.boolean, + probatio.Required(ATTR_GW_ID): probatio.All(cv.string), + probatio.Required(ATTR_CH_OVRD): cv.boolean, } ) - service_set_clock_schema = vol.Schema( + service_set_clock_schema = probatio.Schema( { - vol.Required(ATTR_GW_ID): vol.All(cv.string), - vol.Optional(ATTR_DATE, default=date.today): cv.date, - vol.Optional( + probatio.Required(ATTR_GW_ID): probatio.All(cv.string), + probatio.Optional(ATTR_DATE, default=date.today): cv.date, + probatio.Optional( ATTR_TIME, default=lambda: dt_util.naive_now().time() ): cv.time, } ) - service_set_control_setpoint_schema = vol.Schema( + service_set_control_setpoint_schema = probatio.Schema( { - vol.Required(ATTR_GW_ID): vol.All(cv.string), - vol.Required(ATTR_TEMPERATURE): vol.All( - vol.Coerce(float), vol.Range(min=0, max=90) + probatio.Required(ATTR_GW_ID): probatio.All(cv.string), + probatio.Required(ATTR_TEMPERATURE): probatio.All( + probatio.Coerce(float), probatio.Range(min=0, max=90) ), } ) service_set_hot_water_setpoint_schema = service_set_control_setpoint_schema - service_set_hot_water_ovrd_schema = vol.Schema( + service_set_hot_water_ovrd_schema = probatio.Schema( { - vol.Required(ATTR_GW_ID): vol.All(cv.string), - vol.Required(ATTR_DHW_OVRD): vol.Any( - vol.Equal("A"), vol.All(vol.Coerce(int), vol.Range(min=0, max=1)) + probatio.Required(ATTR_GW_ID): probatio.All(cv.string), + probatio.Required(ATTR_DHW_OVRD): probatio.Any( + probatio.Equal("A"), + probatio.All(probatio.Coerce(int), probatio.Range(min=0, max=1)), ), } ) - service_set_gpio_mode_schema = vol.Schema( - vol.Any( - vol.Schema( + service_set_gpio_mode_schema = probatio.Schema( + probatio.Any( + probatio.Schema( { - vol.Required(ATTR_GW_ID): vol.All(cv.string), - vol.Required(ATTR_ID): vol.Equal("A"), - vol.Required(ATTR_MODE): vol.All( - vol.Coerce(int), vol.Range(min=0, max=6) + probatio.Required(ATTR_GW_ID): probatio.All(cv.string), + probatio.Required(ATTR_ID): probatio.Equal("A"), + probatio.Required(ATTR_MODE): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=6) ), } ), - vol.Schema( + probatio.Schema( { - vol.Required(ATTR_GW_ID): vol.All(cv.string), - vol.Required(ATTR_ID): vol.Equal("B"), - vol.Required(ATTR_MODE): vol.All( - vol.Coerce(int), vol.Range(min=0, max=7) + probatio.Required(ATTR_GW_ID): probatio.All(cv.string), + probatio.Required(ATTR_ID): probatio.Equal("B"), + probatio.Required(ATTR_MODE): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=7) ), } ), ) ) - service_set_led_mode_schema = vol.Schema( + service_set_led_mode_schema = probatio.Schema( { - vol.Required(ATTR_GW_ID): vol.All(cv.string), - vol.Required(ATTR_ID): vol.In("ABCDEF"), - vol.Required(ATTR_MODE): vol.In("RXTBOFHWCEMP"), + probatio.Required(ATTR_GW_ID): probatio.All(cv.string), + probatio.Required(ATTR_ID): probatio.In("ABCDEF"), + probatio.Required(ATTR_MODE): probatio.In("RXTBOFHWCEMP"), } ) - service_set_max_mod_schema = vol.Schema( + service_set_max_mod_schema = probatio.Schema( { - vol.Required(ATTR_GW_ID): vol.All(cv.string), - vol.Required(ATTR_LEVEL): vol.All( - vol.Coerce(int), vol.Range(min=-1, max=100) + probatio.Required(ATTR_GW_ID): probatio.All(cv.string), + probatio.Required(ATTR_LEVEL): probatio.All( + probatio.Coerce(int), probatio.Range(min=-1, max=100) ), } ) - service_set_oat_schema = vol.Schema( + service_set_oat_schema = probatio.Schema( { - vol.Required(ATTR_GW_ID): vol.All(cv.string), - vol.Required(ATTR_TEMPERATURE): vol.All( - vol.Coerce(float), vol.Range(min=-40, max=99) + probatio.Required(ATTR_GW_ID): probatio.All(cv.string), + probatio.Required(ATTR_TEMPERATURE): probatio.All( + probatio.Coerce(float), probatio.Range(min=-40, max=99) ), } ) - service_set_sb_temp_schema = vol.Schema( + service_set_sb_temp_schema = probatio.Schema( { - vol.Required(ATTR_GW_ID): vol.All(cv.string), - vol.Required(ATTR_TEMPERATURE): vol.All( - vol.Coerce(float), vol.Range(min=0, max=30) + probatio.Required(ATTR_GW_ID): probatio.All(cv.string), + probatio.Required(ATTR_TEMPERATURE): probatio.All( + probatio.Coerce(float), probatio.Range(min=0, max=30) ), } ) - service_send_transp_cmd_schema = vol.Schema( + service_send_transp_cmd_schema = probatio.Schema( { - vol.Required(ATTR_GW_ID): vol.All(cv.string), - vol.Required(ATTR_TRANSP_CMD): vol.All( - cv.string, vol.Length(min=2, max=2), vol.Coerce(str.upper) + probatio.Required(ATTR_GW_ID): probatio.All(cv.string), + probatio.Required(ATTR_TRANSP_CMD): probatio.All( + cv.string, probatio.Length(min=2, max=2), probatio.Coerce(str.upper) ), - vol.Required(ATTR_TRANSP_ARG): vol.All( - cv.string, vol.Length(min=1, max=12) + probatio.Required(ATTR_TRANSP_ARG): probatio.All( + cv.string, probatio.Length(min=1, max=12) ), } ) diff --git a/homeassistant/components/openuv/config_flow.py b/homeassistant/components/openuv/config_flow.py index 73d6151e882e2..98359ef4e76a0 100644 --- a/homeassistant/components/openuv/config_flow.py +++ b/homeassistant/components/openuv/config_flow.py @@ -4,9 +4,9 @@ from dataclasses import dataclass from typing import Any, override +import probatio from pyopenuv import Client from pyopenuv.errors import OpenUvError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -31,20 +31,20 @@ ) from .coordinator import OpenUvConfigEntry -STEP_REAUTH_SCHEMA = vol.Schema( +STEP_REAUTH_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_KEY): str, + probatio.Required(CONF_API_KEY): str, } ) -OPTIONS_SCHEMA = vol.Schema( +OPTIONS_SCHEMA = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_FROM_WINDOW, description={"suggested_value": DEFAULT_FROM_WINDOW} - ): vol.Coerce(float), - vol.Optional( + ): probatio.Coerce(float), + probatio.Optional( CONF_TO_WINDOW, description={"suggested_value": DEFAULT_TO_WINDOW} - ): vol.Coerce(float), + ): probatio.Coerce(float), } ) @@ -78,25 +78,25 @@ def __init__(self) -> None: self._reauth_data: Mapping[str, Any] = {} @property - def step_user_schema(self) -> vol.Schema: + def step_user_schema(self) -> probatio.Schema: """Return the config schema.""" - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_API_KEY): str, - vol.Inclusive( + probatio.Required(CONF_API_KEY): str, + probatio.Inclusive( CONF_LATITUDE, "coords", default=self.hass.config.latitude ): cv.latitude, - vol.Inclusive( + probatio.Inclusive( CONF_LONGITUDE, "coords", default=self.hass.config.longitude ): cv.longitude, - vol.Optional( + probatio.Optional( CONF_ELEVATION, default=self.hass.config.elevation - ): vol.Coerce(float), + ): probatio.Coerce(float), } ) async def _async_verify( - self, data: OpenUvData, error_step_id: str, error_schema: vol.Schema + self, data: OpenUvData, error_step_id: str, error_schema: probatio.Schema ) -> ConfigFlowResult: """Verify the credentials and create/re-auth the entry.""" websession = aiohttp_client.async_get_clientsession(self.hass) diff --git a/homeassistant/components/openweathermap/config_flow.py b/homeassistant/components/openweathermap/config_flow.py index 3eb06c2501835..5952c103e373f 100644 --- a/homeassistant/components/openweathermap/config_flow.py +++ b/homeassistant/components/openweathermap/config_flow.py @@ -2,7 +2,7 @@ from typing import override -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -37,25 +37,25 @@ ) from .utils import build_data_and_options, validate_api_key -USER_SCHEMA = vol.Schema( +USER_SCHEMA = probatio.Schema( { - vol.Required(CONF_LOCATION): LocationSelector( + probatio.Required(CONF_LOCATION): LocationSelector( LocationSelectorConfig(radius=False) ), - vol.Optional(CONF_LANGUAGE, default=DEFAULT_LANGUAGE): LanguageSelector( + probatio.Optional(CONF_LANGUAGE, default=DEFAULT_LANGUAGE): LanguageSelector( LanguageSelectorConfig(languages=LANGUAGES, native_name=True) ), - vol.Required(CONF_API_KEY): str, - vol.Optional(CONF_MODE, default=DEFAULT_OWM_MODE): vol.In(OWM_MODES), + probatio.Required(CONF_API_KEY): str, + probatio.Optional(CONF_MODE, default=DEFAULT_OWM_MODE): probatio.In(OWM_MODES), } ) -OPTIONS_SCHEMA = vol.Schema( +OPTIONS_SCHEMA = probatio.Schema( { - vol.Optional(CONF_LANGUAGE, default=DEFAULT_LANGUAGE): LanguageSelector( + probatio.Optional(CONF_LANGUAGE, default=DEFAULT_LANGUAGE): LanguageSelector( LanguageSelectorConfig(languages=LANGUAGES, native_name=True) ), - vol.Optional(CONF_MODE, default=DEFAULT_OWM_MODE): vol.In(OWM_MODES), + probatio.Optional(CONF_MODE, default=DEFAULT_OWM_MODE): probatio.In(OWM_MODES), } ) diff --git a/homeassistant/components/opnsense/__init__.py b/homeassistant/components/opnsense/__init__.py index 2029a019a7c25..4378a5c10e452 100644 --- a/homeassistant/components/opnsense/__init__.py +++ b/homeassistant/components/opnsense/__init__.py @@ -11,7 +11,7 @@ OPNsenseTimeoutError, OPNsenseUnknownFirmware, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_IMPORT from homeassistant.const import CONF_API_KEY, CONF_URL, CONF_VERIFY_SSL, Platform @@ -24,21 +24,21 @@ from .const import CONF_API_SECRET, CONF_TRACKER_INTERFACES, DOMAIN from .types import OPNsenseConfigEntry, OPNsenseRuntimeData -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_URL): cv.url, - vol.Required(CONF_API_KEY): cv.string, - vol.Required(CONF_API_SECRET): cv.string, - vol.Optional(CONF_VERIFY_SSL, default=False): cv.boolean, - vol.Optional(CONF_TRACKER_INTERFACES, default=[]): vol.All( + probatio.Required(CONF_URL): cv.url, + probatio.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_API_SECRET): cv.string, + probatio.Optional(CONF_VERIFY_SSL, default=False): cv.boolean, + probatio.Optional(CONF_TRACKER_INTERFACES, default=[]): probatio.All( cv.ensure_list, [cv.string] ), } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) PLATFORMS = [Platform.DEVICE_TRACKER] diff --git a/homeassistant/components/opnsense/config_flow.py b/homeassistant/components/opnsense/config_flow.py index b9236385e4f1a..3d6651293fcc0 100644 --- a/homeassistant/components/opnsense/config_flow.py +++ b/homeassistant/components/opnsense/config_flow.py @@ -14,7 +14,7 @@ OPNsenseTimeoutError, OPNsenseUnknownFirmware, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY, CONF_URL, CONF_VERIFY_SSL @@ -35,23 +35,23 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_URL): str, - vol.Required(CONF_API_KEY): str, - vol.Required(CONF_API_SECRET): str, - vol.Required(CONF_VERIFY_SSL, default=True): bool, + probatio.Required(CONF_URL): str, + probatio.Required(CONF_API_KEY): str, + probatio.Required(CONF_API_SECRET): str, + probatio.Required(CONF_VERIFY_SSL, default=True): bool, } ) def tracker_interfaces_schema( interfaces: list[str], selected: list[str] | None = None -) -> vol.Schema: +) -> probatio.Schema: """Schema to display available interfaces for device tracking selection.""" - return vol.Schema( + return probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_TRACKER_INTERFACES, default=selected or [], ): SelectSelector( diff --git a/homeassistant/components/opower/config_flow.py b/homeassistant/components/opower/config_flow.py index c52609427b219..74bb5ffa0b77c 100644 --- a/homeassistant/components/opower/config_flow.py +++ b/homeassistant/components/opower/config_flow.py @@ -14,7 +14,7 @@ get_supported_utility_names, select_utility, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_NAME, CONF_PASSWORD, CONF_USERNAME @@ -67,8 +67,12 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_UTILITY): vol.In(get_supported_utility_names())} + data_schema=probatio.Schema( + { + probatio.Required(CONF_UTILITY): probatio.In( + get_supported_utility_names() + ) + } ), ) @@ -102,16 +106,16 @@ async def async_step_credentials( return self._async_create_opower_entry(self._data) schema_dict: VolDictType = { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } if utility.accepts_totp_secret(): - schema_dict[vol.Optional(CONF_TOTP_SECRET)] = str + schema_dict[probatio.Optional(CONF_TOTP_SECRET)] = str return self.async_show_form( step_id="credentials", data_schema=self.add_suggested_values_to_schema( - vol.Schema(schema_dict), user_input + probatio.Schema(schema_dict), user_input ), errors=errors, ) @@ -138,7 +142,9 @@ async def async_step_mfa_options( return self.async_show_form( step_id="mfa_options", data_schema=self.add_suggested_values_to_schema( - vol.Schema({vol.Required(CONF_MFA_METHOD): vol.In(mfa_options)}), + probatio.Schema( + {probatio.Required(CONF_MFA_METHOD): probatio.In(mfa_options)} + ), user_input, ), errors=errors, @@ -169,7 +175,7 @@ async def async_step_mfa_code( return self.async_show_form( step_id="mfa_code", data_schema=self.add_suggested_values_to_schema( - vol.Schema({vol.Required(CONF_MFA_CODE): str}), user_input + probatio.Schema({probatio.Required(CONF_MFA_CODE): str}), user_input ), errors=errors, ) @@ -219,16 +225,16 @@ async def async_step_reauth_confirm( utility = select_utility(self._data[CONF_UTILITY]) schema_dict: VolDictType = { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } if utility.accepts_totp_secret(): - schema_dict[vol.Optional(CONF_TOTP_SECRET)] = str + schema_dict[probatio.Optional(CONF_TOTP_SECRET)] = str return self.async_show_form( step_id="reauth_confirm", data_schema=self.add_suggested_values_to_schema( - vol.Schema(schema_dict), self._data + probatio.Schema(schema_dict), self._data ), errors=errors, description_placeholders={CONF_NAME: reauth_entry.title}, diff --git a/homeassistant/components/opple/light.py b/homeassistant/components/opple/light.py index 891a72955f94a..4798f69c399de 100644 --- a/homeassistant/components/opple/light.py +++ b/homeassistant/components/opple/light.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from pyoppleio.OppleLightDevice import OppleLightDevice -import voluptuous as vol from homeassistant.components.light import ( ATTR_BRIGHTNESS, @@ -25,8 +25,8 @@ PLATFORM_SCHEMA = LIGHT_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/oralb/config_flow.py b/homeassistant/components/oralb/config_flow.py index 136d90545e89c..605382276a00c 100644 --- a/homeassistant/components/oralb/config_flow.py +++ b/homeassistant/components/oralb/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from oralb_ble import OralBBluetoothDeviceData as DeviceData -import voluptuous as vol +import probatio from homeassistant.components.bluetooth import ( BluetoothServiceInfoBleak, @@ -88,7 +88,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_ADDRESS): vol.In(self._discovered_devices)} + data_schema=probatio.Schema( + {probatio.Required(CONF_ADDRESS): probatio.In(self._discovered_devices)} ), ) diff --git a/homeassistant/components/oru/sensor.py b/homeassistant/components/oru/sensor.py index 82fd0d5b3a37e..c623d77824911 100644 --- a/homeassistant/components/oru/sensor.py +++ b/homeassistant/components/oru/sensor.py @@ -5,7 +5,7 @@ from typing import override from oru import Meter, MeterError -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -25,7 +25,7 @@ SCAN_INTERVAL = timedelta(minutes=15) PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_METER_NUMBER): cv.string} + {probatio.Required(CONF_METER_NUMBER): cv.string} ) diff --git a/homeassistant/components/orvibo/config_flow.py b/homeassistant/components/orvibo/config_flow.py index efcffa819f894..905a18d186928 100644 --- a/homeassistant/components/orvibo/config_flow.py +++ b/homeassistant/components/orvibo/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from orvibo.s20 import S20, S20Exception, discover -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_MAC, CONF_NAME @@ -17,10 +17,10 @@ _LOGGER = logging.getLogger(__name__) -FULL_EDIT_SCHEMA = vol.Schema( +FULL_EDIT_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_MAC): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_MAC): cv.string, } ) @@ -180,7 +180,9 @@ async def async_step_choose_switch( } return self.async_show_form( step_id="choose_switch", - data_schema=vol.Schema({vol.Required(CONF_SWITCH_LIST): vol.In(_options)}), + data_schema=probatio.Schema( + {probatio.Required(CONF_SWITCH_LIST): probatio.In(_options)} + ), ) async def async_step_discovery_failed( diff --git a/homeassistant/components/orvibo/switch.py b/homeassistant/components/orvibo/switch.py index 35258ba71efb0..126508f5745d6 100644 --- a/homeassistant/components/orvibo/switch.py +++ b/homeassistant/components/orvibo/switch.py @@ -4,7 +4,7 @@ from typing import Any, override from orvibo.s20 import S20, S20Exception -import voluptuous as vol +import probatio from homeassistant import config_entries from homeassistant.components.switch import ( @@ -42,17 +42,17 @@ PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_SWITCHES, default=[]): vol.All( + probatio.Required(CONF_SWITCHES, default=[]): probatio.All( cv.ensure_list, [ { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_MAC): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_MAC): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ], ), - vol.Optional(CONF_DISCOVERY, default=DEFAULT_DISCOVERY): cv.boolean, + probatio.Optional(CONF_DISCOVERY, default=DEFAULT_DISCOVERY): cv.boolean, } ) diff --git a/homeassistant/components/osoenergy/config_flow.py b/homeassistant/components/osoenergy/config_flow.py index 9b779e0085890..8409ebbad5246 100644 --- a/homeassistant/components/osoenergy/config_flow.py +++ b/homeassistant/components/osoenergy/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from apyosoenergyapi import OSOEnergy -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY @@ -14,7 +14,7 @@ from .const import DOMAIN _LOGGER = logging.getLogger(__name__) -_SCHEMA_STEP_USER = vol.Schema({vol.Required(CONF_API_KEY): str}) +_SCHEMA_STEP_USER = probatio.Schema({probatio.Required(CONF_API_KEY): str}) CONF_PORTAL_URL = "portal_url" OSOENERGY_PORTAL_URL = "https://portal.osoenergy.no/" diff --git a/homeassistant/components/osoenergy/water_heater.py b/homeassistant/components/osoenergy/water_heater.py index 13d0e3e10c382..56af861b0e81f 100644 --- a/homeassistant/components/osoenergy/water_heater.py +++ b/homeassistant/components/osoenergy/water_heater.py @@ -5,7 +5,7 @@ from apyosoenergyapi import OSOEnergy from apyosoenergyapi.helper.const import OSOEnergyWaterHeaterData -import voluptuous as vol +import probatio from homeassistant.components.water_heater import ( STATE_ECO, @@ -71,8 +71,8 @@ async def async_setup_entry( platform.async_register_entity_service( SERVICE_TURN_AWAY_MODE_ON, { - vol.Required(ATTR_DURATION_DAYS): vol.All( - vol.Coerce(int), vol.Range(min=1, max=365) + probatio.Required(ATTR_DURATION_DAYS): probatio.All( + probatio.Coerce(int), probatio.Range(min=1, max=365) ), }, OSOEnergyWaterHeater.async_oso_turn_away_mode_on.__name__, @@ -80,8 +80,8 @@ async def async_setup_entry( service_set_profile_schema = cv.make_entity_service_schema( { - vol.Optional(f"hour_{hour:02d}"): vol.All( - vol.Coerce(int), vol.Range(min=10, max=75) + probatio.Optional(f"hour_{hour:02d}"): probatio.All( + probatio.Coerce(int), probatio.Range(min=10, max=75) ) for hour in range(24) } @@ -96,8 +96,8 @@ async def async_setup_entry( platform.async_register_entity_service( SERVICE_SET_V40MIN, { - vol.Required(ATTR_V40MIN): vol.All( - vol.Coerce(float), vol.Range(min=200, max=550) + probatio.Required(ATTR_V40MIN): probatio.All( + probatio.Coerce(float), probatio.Range(min=200, max=550) ), }, OSOEnergyWaterHeater.async_set_v40_min.__name__, @@ -105,13 +105,13 @@ async def async_setup_entry( platform.async_register_entity_service( SERVICE_TURN_OFF, - {vol.Required(ATTR_UNTIL_TEMP_LIMIT): vol.All(cv.boolean)}, + {probatio.Required(ATTR_UNTIL_TEMP_LIMIT): probatio.All(cv.boolean)}, OSOEnergyWaterHeater.async_oso_turn_off.__name__, ) platform.async_register_entity_service( SERVICE_TURN_ON, - {vol.Required(ATTR_UNTIL_TEMP_LIMIT): vol.All(cv.boolean)}, + {probatio.Required(ATTR_UNTIL_TEMP_LIMIT): probatio.All(cv.boolean)}, OSOEnergyWaterHeater.async_oso_turn_on.__name__, ) diff --git a/homeassistant/components/osramlightify/light.py b/homeassistant/components/osramlightify/light.py index efb4c8deb1db7..6b66c9af7ac5d 100644 --- a/homeassistant/components/osramlightify/light.py +++ b/homeassistant/components/osramlightify/light.py @@ -5,7 +5,7 @@ from typing import Any, override from lightify import Lightify -import voluptuous as vol +import probatio from homeassistant.components.light import ( ATTR_BRIGHTNESS, @@ -45,23 +45,23 @@ PLATFORM_SCHEMA = LIGHT_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Optional( + probatio.Required(CONF_HOST): cv.string, + probatio.Optional( CONF_ALLOW_LIGHTIFY_NODES, default=DEFAULT_ALLOW_LIGHTIFY_NODES ): cv.boolean, - vol.Optional( + probatio.Optional( CONF_ALLOW_LIGHTIFY_GROUPS, default=DEFAULT_ALLOW_LIGHTIFY_GROUPS ): cv.boolean, - vol.Optional( + probatio.Optional( CONF_ALLOW_LIGHTIFY_SENSORS, default=DEFAULT_ALLOW_LIGHTIFY_SENSORS ): cv.boolean, - vol.Optional( + probatio.Optional( CONF_ALLOW_LIGHTIFY_SWITCHES, default=DEFAULT_ALLOW_LIGHTIFY_SWITCHES ): cv.boolean, - vol.Optional( + probatio.Optional( CONF_INTERVAL_LIGHTIFY_STATUS, default=DEFAULT_INTERVAL_LIGHTIFY_STATUS ): cv.positive_int, - vol.Optional( + probatio.Optional( CONF_INTERVAL_LIGHTIFY_CONF, default=DEFAULT_INTERVAL_LIGHTIFY_CONF ): cv.positive_int, } diff --git a/homeassistant/components/otbr/config_flow.py b/homeassistant/components/otbr/config_flow.py index 9f6c615187420..851f747664854 100644 --- a/homeassistant/components/otbr/config_flow.py +++ b/homeassistant/components/otbr/config_flow.py @@ -5,10 +5,10 @@ from typing import TYPE_CHECKING, cast, override import aiohttp +import probatio import python_otbr_api from python_otbr_api import tlv_parser from python_otbr_api.tlv_parser import MeshcopTLVType -import voluptuous as vol import yarl from homeassistant.components.hassio import AddonError, AddonManager @@ -182,7 +182,7 @@ async def async_step_user( data={CONF_URL: url}, ) - data_schema = vol.Schema({CONF_URL: str}) + data_schema = probatio.Schema({CONF_URL: str}) return self.async_show_form( step_id="user", data_schema=data_schema, errors=errors ) diff --git a/homeassistant/components/otbr/websocket_api.py b/homeassistant/components/otbr/websocket_api.py index 2bcd0da8f16c5..5827bbd150d5d 100644 --- a/homeassistant/components/otbr/websocket_api.py +++ b/homeassistant/components/otbr/websocket_api.py @@ -4,10 +4,10 @@ from functools import wraps from typing import TYPE_CHECKING, Any, cast +import probatio import python_otbr_api from python_otbr_api import PENDING_DATASET_DELAY_TIMER, tlv_parser from python_otbr_api.tlv_parser import MeshcopTLVType -import voluptuous as vol from homeassistant.components import websocket_api from homeassistant.components.homeassistant_hardware.silabs_multiprotocol_addon import ( @@ -136,7 +136,7 @@ async def async_check_extended_address_func( @websocket_api.websocket_command( { "type": "otbr/create_network", - vol.Required("extended_address"): str, + probatio.Required("extended_address"): str, } ) @websocket_api.require_admin @@ -202,8 +202,8 @@ async def websocket_create_network( @websocket_api.websocket_command( { "type": "otbr/set_network", - vol.Required("extended_address"): str, - vol.Required("dataset_id"): str, + probatio.Required("extended_address"): str, + probatio.Required("dataset_id"): str, } ) @websocket_api.require_admin @@ -263,8 +263,8 @@ async def websocket_set_network( @websocket_api.websocket_command( { "type": "otbr/set_channel", - vol.Required("extended_address"): str, - vol.Required("channel"): int, + probatio.Required("extended_address"): str, + probatio.Required("channel"): int, } ) @websocket_api.require_admin diff --git a/homeassistant/components/otp/config_flow.py b/homeassistant/components/otp/config_flow.py index 068dc0334e53f..351f000efc140 100644 --- a/homeassistant/components/otp/config_flow.py +++ b/homeassistant/components/otp/config_flow.py @@ -5,8 +5,8 @@ from re import sub from typing import Any, override +import probatio import pyotp -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_CODE, CONF_NAME, CONF_TOKEN @@ -22,17 +22,17 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Optional(CONF_TOKEN): str, - vol.Optional(CONF_NEW_TOKEN): BooleanSelector(BooleanSelectorConfig()), + probatio.Optional(CONF_TOKEN): str, + probatio.Optional(CONF_NEW_TOKEN): BooleanSelector(BooleanSelectorConfig()), # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Required(CONF_NAME, default=DEFAULT_NAME): str, + probatio.Required(CONF_NAME, default=DEFAULT_NAME): str, } ) -STEP_CONFIRM_DATA_SCHEMA = vol.Schema({vol.Required(CONF_CODE): str}) +STEP_CONFIRM_DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_CODE): str}) class TOTPConfigFlow(ConfigFlow, domain=DOMAIN): @@ -111,7 +111,7 @@ async def async_step_confirm( ) data_schema = STEP_CONFIRM_DATA_SCHEMA.extend( { - vol.Optional("qr_code"): QrCodeSelector( + probatio.Optional("qr_code"): QrCodeSelector( config=QrCodeSelectorConfig( data=provisioning_uri, scale=6, diff --git a/homeassistant/components/ouman_eh_800/config_flow.py b/homeassistant/components/ouman_eh_800/config_flow.py index 1718d534b23c1..5dc09bf3cd1d3 100644 --- a/homeassistant/components/ouman_eh_800/config_flow.py +++ b/homeassistant/components/ouman_eh_800/config_flow.py @@ -9,7 +9,7 @@ OumanClientCommunicationError, OumanEh800Client, ) -import voluptuous as vol +import probatio from yarl import URL from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -25,22 +25,22 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_URL): TextSelector( + probatio.Required(CONF_URL): TextSelector( TextSelectorConfig(type=TextSelectorType.URL) ), - vol.Required(CONF_USERNAME): TextSelector(), - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_USERNAME): TextSelector(), + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } ) -STEP_REAUTH_DATA_SCHEMA = vol.Schema( +STEP_REAUTH_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): TextSelector(), - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_USERNAME): TextSelector(), + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } diff --git a/homeassistant/components/ourgroceries/config_flow.py b/homeassistant/components/ourgroceries/config_flow.py index 94a00e155f89b..bd2d16a8ad648 100644 --- a/homeassistant/components/ourgroceries/config_flow.py +++ b/homeassistant/components/ourgroceries/config_flow.py @@ -6,7 +6,7 @@ from aiohttp import ClientError from ourgroceries import OurGroceries from ourgroceries.exceptions import InvalidLoginException -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -15,10 +15,10 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/overkiz/config_flow.py b/homeassistant/components/overkiz/config_flow.py index 6c11e9ea40178..617bd6e6522e3 100644 --- a/homeassistant/components/overkiz/config_flow.py +++ b/homeassistant/components/overkiz/config_flow.py @@ -5,6 +5,7 @@ from typing import Any, cast, override from aiohttp import ClientConnectorCertificateError, ClientError +import probatio from pyoverkiz.auth.credentials import ( LocalTokenCredentials, RexelTokenCredentials, @@ -30,7 +31,6 @@ ) from pyoverkiz.obfuscate import obfuscate_id from pyoverkiz.utils import create_local_server_config, is_overkiz_gateway -import voluptuous as vol from homeassistant.components.application_credentials import ( ClientCredential, @@ -166,9 +166,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HUB, default=self._server): vol.In( + probatio.Required(CONF_HUB, default=self._server): probatio.In( {key: hub.name for key, hub in SUPPORTED_SERVERS.items()} ), } @@ -193,9 +193,9 @@ async def async_step_local_or_cloud( return self.async_show_form( step_id="local_or_cloud", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_API_TYPE): vol.In( + probatio.Required(CONF_API_TYPE): probatio.In( { APIType.LOCAL: "Local API", APIType.CLOUD: "Cloud API", @@ -287,10 +287,10 @@ async def async_step_cloud( return self.async_show_form( step_id="cloud", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_USERNAME, default=self._user): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME, default=self._user): str, + probatio.Required(CONF_PASSWORD): str, } ), description_placeholders=description_placeholders, @@ -347,11 +347,11 @@ async def async_step_local( return self.async_show_form( step_id="local", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST, default=self._host): str, - vol.Required(CONF_TOKEN): str, - vol.Required(CONF_VERIFY_SSL, default=self._verify_ssl): bool, + probatio.Required(CONF_HOST, default=self._host): str, + probatio.Required(CONF_TOKEN): str, + probatio.Required(CONF_VERIFY_SSL, default=self._verify_ssl): bool, } ), description_placeholders=description_placeholders, @@ -401,9 +401,9 @@ async def async_step_select_gateway( return self.async_show_form( step_id="select_gateway", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_GATEWAY_ID): vol.In( + probatio.Required(CONF_GATEWAY_ID): probatio.In( { candidate.gateway_id: candidate.label or candidate.gateway_id diff --git a/homeassistant/components/overkiz/services.py b/homeassistant/components/overkiz/services.py index f32fa307e5985..de8ac405f26d3 100644 --- a/homeassistant/components/overkiz/services.py +++ b/homeassistant/components/overkiz/services.py @@ -1,6 +1,6 @@ """Services for the Overkiz integration.""" -import voluptuous as vol +import probatio from homeassistant.components.cover import ( ATTR_POSITION, @@ -28,11 +28,11 @@ def async_setup_services(hass: HomeAssistant) -> None: SERVICE_SET_COVER_POSITION_AND_TILT, entity_domain=COVER_DOMAIN, schema={ - vol.Required(ATTR_POSITION): vol.All( - vol.Coerce(int), vol.Range(min=POSITION_MIN, max=POSITION_MAX) + probatio.Required(ATTR_POSITION): probatio.All( + probatio.Coerce(int), probatio.Range(min=POSITION_MIN, max=POSITION_MAX) ), - vol.Required(ATTR_TILT_POSITION): vol.All( - vol.Coerce(int), vol.Range(min=POSITION_MIN, max=POSITION_MAX) + probatio.Required(ATTR_TILT_POSITION): probatio.All( + probatio.Coerce(int), probatio.Range(min=POSITION_MIN, max=POSITION_MAX) ), }, func="async_set_cover_position_and_tilt", diff --git a/homeassistant/components/overseerr/config_flow.py b/homeassistant/components/overseerr/config_flow.py index c53b1b87161fe..87b84392f17bc 100644 --- a/homeassistant/components/overseerr/config_flow.py +++ b/homeassistant/components/overseerr/config_flow.py @@ -3,12 +3,12 @@ from collections.abc import Mapping from typing import Any, override +import probatio from python_overseerr import ( OverseerrAuthenticationError, OverseerrClient, OverseerrError, ) -import voluptuous as vol from yarl import URL from homeassistant.components.webhook import async_generate_id @@ -92,8 +92,8 @@ async def async_step_user( ) return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_URL): str, vol.Required(CONF_API_KEY): str} + data_schema=probatio.Schema( + {probatio.Required(CONF_URL): str, probatio.Required(CONF_API_KEY): str} ), errors=errors, ) @@ -126,7 +126,7 @@ async def async_step_reauth_confirm( ) return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema({vol.Required(CONF_API_KEY): str}), + data_schema=probatio.Schema({probatio.Required(CONF_API_KEY): str}), errors=errors, ) diff --git a/homeassistant/components/overseerr/services.py b/homeassistant/components/overseerr/services.py index 9405b21ea6dd8..c02507bf940c9 100644 --- a/homeassistant/components/overseerr/services.py +++ b/homeassistant/components/overseerr/services.py @@ -4,8 +4,8 @@ from dataclasses import asdict from typing import Any, Literal, cast +import probatio from python_overseerr import OverseerrClient, OverseerrConnectionError -import voluptuous as vol from homeassistant.const import ATTR_CONFIG_ENTRY_ID from homeassistant.core import ( @@ -36,35 +36,35 @@ SERVICE_SEARCH_MEDIA = "search_media" SERVICE_REQUEST_MEDIA = "request_media" -SERVICE_GET_REQUESTS_SCHEMA = vol.Schema( +SERVICE_GET_REQUESTS_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): str, - vol.Optional(ATTR_STATUS): vol.In( + probatio.Required(ATTR_CONFIG_ENTRY_ID): str, + probatio.Optional(ATTR_STATUS): probatio.In( ["approved", "pending", "available", "processing", "unavailable", "failed"] ), - vol.Optional(ATTR_SORT_ORDER): vol.In(["added", "modified"]), - vol.Optional(ATTR_REQUESTED_BY): int, + probatio.Optional(ATTR_SORT_ORDER): probatio.In(["added", "modified"]), + probatio.Optional(ATTR_REQUESTED_BY): int, } ) -SERVICE_SEARCH_MEDIA_SCHEMA = vol.Schema( +SERVICE_SEARCH_MEDIA_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): str, - vol.Required(ATTR_QUERY): str, + probatio.Required(ATTR_CONFIG_ENTRY_ID): str, + probatio.Required(ATTR_QUERY): str, } ) -SERVICE_REQUEST_MEDIA_SCHEMA = vol.Schema( +SERVICE_REQUEST_MEDIA_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): str, - vol.Required(ATTR_MEDIA_TYPE): vol.In(["movie", "tv"]), - vol.Required(ATTR_MEDIA_ID): vol.All( - vol.Coerce(int), - vol.Range(min=1), + probatio.Required(ATTR_CONFIG_ENTRY_ID): str, + probatio.Required(ATTR_MEDIA_TYPE): probatio.In(["movie", "tv"]), + probatio.Required(ATTR_MEDIA_ID): probatio.All( + probatio.Coerce(int), + probatio.Range(min=1), ), - vol.Optional(ATTR_SEASONS): vol.Any( - vol.Coerce(int), - [vol.Coerce(int)], + probatio.Optional(ATTR_SEASONS): probatio.Any( + probatio.Coerce(int), + [probatio.Coerce(int)], str, ), } diff --git a/homeassistant/components/ovhcloud_ai_endpoints/config_flow.py b/homeassistant/components/ovhcloud_ai_endpoints/config_flow.py index d3970fcfc7362..6a8d38f7f3c09 100644 --- a/homeassistant/components/ovhcloud_ai_endpoints/config_flow.py +++ b/homeassistant/components/ovhcloud_ai_endpoints/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from openai import AsyncOpenAI, AuthenticationError, OpenAIError, PermissionDeniedError -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -31,7 +31,7 @@ _LOGGER = logging.getLogger(__name__) -STEP_REAUTH_DATA_SCHEMA = vol.Schema({vol.Required(CONF_API_KEY): str}) +STEP_REAUTH_DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_API_KEY): str}) class OVHcloudAIEndpointsConfigFlow(ConfigFlow, domain=DOMAIN): @@ -74,9 +74,9 @@ async def async_step_user( ) return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_API_KEY): str, + probatio.Required(CONF_API_KEY): str, } ), errors=errors, @@ -189,9 +189,9 @@ async def async_step_reconfigure( ] return self.async_show_form( step_id="reconfigure", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_PROMPT, description={ "suggested_value": existing.get( @@ -200,7 +200,7 @@ async def async_step_reconfigure( ) }, ): TemplateSelector(), - vol.Optional( + probatio.Optional( CONF_LLM_HASS_API, default=existing.get( CONF_LLM_HASS_API, @@ -249,16 +249,16 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_MODEL): SelectSelector( + probatio.Required(CONF_MODEL): SelectSelector( SelectSelectorConfig( options=options, mode=SelectSelectorMode.DROPDOWN, sort=True, ), ), - vol.Optional( + probatio.Optional( CONF_PROMPT, description={ "suggested_value": self.options.get( @@ -267,7 +267,7 @@ async def async_step_init( ) }, ): TemplateSelector(), - vol.Optional( + probatio.Optional( CONF_LLM_HASS_API, default=self.options.get( CONF_LLM_HASS_API, diff --git a/homeassistant/components/ovo_energy/config_flow.py b/homeassistant/components/ovo_energy/config_flow.py index f4fd53b5bbd01..86bf59affa420 100644 --- a/homeassistant/components/ovo_energy/config_flow.py +++ b/homeassistant/components/ovo_energy/config_flow.py @@ -5,7 +5,7 @@ import aiohttp from ovoenergy import OVOEnergy -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -13,12 +13,12 @@ from .const import CONF_ACCOUNT, DOMAIN -REAUTH_SCHEMA = vol.Schema({vol.Required(CONF_PASSWORD): str}) -USER_SCHEMA = vol.Schema( +REAUTH_SCHEMA = probatio.Schema({probatio.Required(CONF_PASSWORD): str}) +USER_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Optional(CONF_ACCOUNT): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Optional(CONF_ACCOUNT): str, } ) diff --git a/homeassistant/components/owntracks/__init__.py b/homeassistant/components/owntracks/__init__.py index 5edab3dc942a1..b0b34c4eaf827 100644 --- a/homeassistant/components/owntracks/__init__.py +++ b/homeassistant/components/owntracks/__init__.py @@ -7,7 +7,7 @@ import re from aiohttp import web -import voluptuous as vol +import probatio from homeassistant.components import cloud, mqtt, webhook from homeassistant.components.device_tracker import TrackerEntityStateAttribute @@ -42,27 +42,28 @@ DEFAULT_OWNTRACKS_TOPIC = "owntracks/#" -CONFIG_SCHEMA = vol.All( +CONFIG_SCHEMA = probatio.All( cv.removed(CONF_WEBHOOK_ID), - vol.Schema( + probatio.Schema( { - vol.Optional(DOMAIN, default={}): { - vol.Optional(CONF_MAX_GPS_ACCURACY): vol.Coerce(float), - vol.Optional(CONF_WAYPOINT_IMPORT, default=True): cv.boolean, - vol.Optional(CONF_EVENTS_ONLY, default=False): cv.boolean, - vol.Optional( + probatio.Optional(DOMAIN, default={}): { + probatio.Optional(CONF_MAX_GPS_ACCURACY): probatio.Coerce(float), + probatio.Optional(CONF_WAYPOINT_IMPORT, default=True): cv.boolean, + probatio.Optional(CONF_EVENTS_ONLY, default=False): cv.boolean, + probatio.Optional( CONF_MQTT_TOPIC, default=DEFAULT_OWNTRACKS_TOPIC ): mqtt.valid_subscribe_topic, - vol.Optional(CONF_WAYPOINT_WHITELIST): vol.All( + probatio.Optional(CONF_WAYPOINT_WHITELIST): probatio.All( cv.ensure_list, [cv.string] ), - vol.Optional(CONF_SECRET): vol.Any( - vol.Schema({vol.Optional(cv.string): cv.string}), cv.string + probatio.Optional(CONF_SECRET): probatio.Any( + probatio.Schema({probatio.Optional(cv.string): cv.string}), + cv.string, ), - vol.Optional(CONF_REGION_MAPPING, default={}): dict, + probatio.Optional(CONF_REGION_MAPPING, default={}): dict, } }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ), ) diff --git a/homeassistant/components/p1_monitor/config_flow.py b/homeassistant/components/p1_monitor/config_flow.py index 336fe87475e80..b17daf0825898 100644 --- a/homeassistant/components/p1_monitor/config_flow.py +++ b/homeassistant/components/p1_monitor/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from p1monitor import P1Monitor, P1MonitorError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PORT @@ -53,16 +53,16 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST): TextSelector(), - vol.Required(CONF_PORT, default=80): vol.All( + probatio.Required(CONF_HOST): TextSelector(), + probatio.Required(CONF_PORT, default=80): probatio.All( NumberSelector( NumberSelectorConfig( min=1, max=65535, mode=NumberSelectorMode.BOX ), ), - vol.Coerce(int), + probatio.Coerce(int), ), } ), diff --git a/homeassistant/components/paj_gps/config_flow.py b/homeassistant/components/paj_gps/config_flow.py index 64e4e2dbd6462..55d399a6396aa 100644 --- a/homeassistant/components/paj_gps/config_flow.py +++ b/homeassistant/components/paj_gps/config_flow.py @@ -7,7 +7,7 @@ from pajgps_api import PajGpsApi from pajgps_api.models.auth import AuthResponse from pajgps_api.pajgps_api_error import AuthenticationError, TokenRefreshError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_EMAIL, CONF_PASSWORD @@ -22,15 +22,15 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_EMAIL): TextSelector( + probatio.Required(CONF_EMAIL): TextSelector( TextSelectorConfig( type=TextSelectorType.EMAIL, autocomplete="email", ) ), - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", diff --git a/homeassistant/components/palazzetti/config_flow.py b/homeassistant/components/palazzetti/config_flow.py index 919758b74750d..c78b6da20f5df 100644 --- a/homeassistant/components/palazzetti/config_flow.py +++ b/homeassistant/components/palazzetti/config_flow.py @@ -2,9 +2,9 @@ from typing import Any, override +import probatio from pypalazzetti.client import PalazzettiClient from pypalazzetti.exceptions import CommunicationError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST @@ -49,7 +49,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_HOST): str}), + data_schema=probatio.Schema({probatio.Required(CONF_HOST): str}), errors=errors, ) diff --git a/homeassistant/components/panasonic_bluray/media_player.py b/homeassistant/components/panasonic_bluray/media_player.py index 463bf82ebb63d..64ea718fe48f2 100644 --- a/homeassistant/components/panasonic_bluray/media_player.py +++ b/homeassistant/components/panasonic_bluray/media_player.py @@ -4,7 +4,7 @@ from typing import override from panacotta import PanasonicBD -import voluptuous as vol +import probatio from homeassistant.components.media_player import ( PLATFORM_SCHEMA as MEDIA_PLAYER_PLATFORM_SCHEMA, @@ -26,8 +26,8 @@ PLATFORM_SCHEMA = MEDIA_PLAYER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/panasonic_viera/__init__.py b/homeassistant/components/panasonic_viera/__init__.py index 4f010e55cff85..742e4c2344b5c 100644 --- a/homeassistant/components/panasonic_viera/__init__.py +++ b/homeassistant/components/panasonic_viera/__init__.py @@ -7,7 +7,7 @@ from urllib.error import HTTPError, URLError from panasonic_viera import EncryptionRequired, Keys, RemoteControl, SOAPError -import voluptuous as vol +import probatio from homeassistant.components.media_player import MediaPlayerState, MediaType from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry @@ -32,23 +32,23 @@ _LOGGER = logging.getLogger(__name__) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.All( + DOMAIN: probatio.All( cv.ensure_list, [ - vol.Schema( + probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_ON_ACTION): cv.SCRIPT_SCHEMA, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_ON_ACTION): cv.SCRIPT_SCHEMA, } ) ], ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) PLATFORMS = [Platform.MEDIA_PLAYER, Platform.REMOTE] diff --git a/homeassistant/components/panasonic_viera/config_flow.py b/homeassistant/components/panasonic_viera/config_flow.py index 0a67ede14b64b..4cb9ca487bb98 100644 --- a/homeassistant/components/panasonic_viera/config_flow.py +++ b/homeassistant/components/panasonic_viera/config_flow.py @@ -6,7 +6,7 @@ from urllib.error import URLError from panasonic_viera import TV_TYPE_ENCRYPTED, RemoteControl, SOAPError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PIN, CONF_PORT @@ -86,9 +86,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_HOST, default=self._data[CONF_HOST] if self._data[CONF_HOST] is not None @@ -96,7 +96,7 @@ async def async_step_user( ): str, # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Optional( + probatio.Optional( CONF_NAME, default=self._data[CONF_NAME] if self._data[CONF_NAME] is not None @@ -156,7 +156,7 @@ async def async_step_pairing( return self.async_show_form( step_id="pairing", - data_schema=vol.Schema({vol.Required(CONF_PIN): str}), + data_schema=probatio.Schema({probatio.Required(CONF_PIN): str}), errors=errors, ) diff --git a/homeassistant/components/panel_custom/__init__.py b/homeassistant/components/panel_custom/__init__.py index a76490ccb01ac..9f34ead6527d8 100644 --- a/homeassistant/components/panel_custom/__init__.py +++ b/homeassistant/components/panel_custom/__init__.py @@ -2,7 +2,7 @@ import logging -import voluptuous as vol +import probatio from homeassistant.components import frontend from homeassistant.core import HomeAssistant @@ -35,33 +35,37 @@ PANEL_DIR = "panels" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.All( + DOMAIN: probatio.All( cv.ensure_list, [ - vol.Schema( + probatio.Schema( { - vol.Required(CONF_COMPONENT_NAME): cv.string, - vol.Optional(CONF_SIDEBAR_TITLE): cv.string, - vol.Optional(CONF_SIDEBAR_ICON, default=DEFAULT_ICON): cv.icon, - vol.Optional(CONF_URL_PATH): cv.string, - vol.Optional(CONF_CONFIG): dict, - vol.Optional( + probatio.Required(CONF_COMPONENT_NAME): cv.string, + probatio.Optional(CONF_SIDEBAR_TITLE): cv.string, + probatio.Optional( + CONF_SIDEBAR_ICON, default=DEFAULT_ICON + ): cv.icon, + probatio.Optional(CONF_URL_PATH): cv.string, + probatio.Optional(CONF_CONFIG): dict, + probatio.Optional( CONF_JS_URL, ): cv.string, - vol.Optional( + probatio.Optional( CONF_MODULE_URL, ): cv.string, - vol.Optional( + probatio.Optional( CONF_EMBED_IFRAME, default=DEFAULT_EMBED_IFRAME ): cv.boolean, - vol.Optional( + probatio.Optional( CONF_TRUST_EXTERNAL_SCRIPT, default=DEFAULT_TRUST_EXTERNAL, ): cv.boolean, - vol.Optional(CONF_REQUIRE_ADMIN, default=False): cv.boolean, - vol.Optional( + probatio.Optional( + CONF_REQUIRE_ADMIN, default=False + ): cv.boolean, + probatio.Optional( CONF_HANDLE_SAFE_AREA, default=DEFAULT_HANDLE_SAFE_AREA ): cv.boolean, } @@ -69,7 +73,7 @@ ], ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/paperless_ngx/config_flow.py b/homeassistant/components/paperless_ngx/config_flow.py index ef2876d68f198..0eac845b6e43c 100644 --- a/homeassistant/components/paperless_ngx/config_flow.py +++ b/homeassistant/components/paperless_ngx/config_flow.py @@ -3,6 +3,7 @@ from collections.abc import Mapping from typing import Any, override +import probatio from pypaperless import Paperless from pypaperless.exceptions import ( InitializationError, @@ -11,7 +12,6 @@ PaperlessInactiveOrDeletedError, PaperlessInvalidTokenError, ) -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY, CONF_URL, CONF_VERIFY_SSL @@ -19,11 +19,11 @@ from .const import DOMAIN, LOGGER -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_URL): str, - vol.Required(CONF_API_KEY): str, - vol.Required(CONF_VERIFY_SSL, default=True): bool, + probatio.Required(CONF_URL): str, + probatio.Required(CONF_API_KEY): str, + probatio.Required(CONF_VERIFY_SSL, default=True): bool, } ) @@ -122,7 +122,7 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema({vol.Required(CONF_API_KEY): str}), + data_schema=probatio.Schema({probatio.Required(CONF_API_KEY): str}), errors=errors, ) diff --git a/homeassistant/components/peblar/config_flow.py b/homeassistant/components/peblar/config_flow.py index bef880a6647d7..72e8499cc9f4a 100644 --- a/homeassistant/components/peblar/config_flow.py +++ b/homeassistant/components/peblar/config_flow.py @@ -5,7 +5,7 @@ from aiohttp import CookieJar from peblar import Peblar, PeblarAuthenticationError, PeblarConnectionError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PASSWORD @@ -62,12 +62,12 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_HOST, default=user_input.get(CONF_HOST) ): TextSelector(TextSelectorConfig(autocomplete="off")), - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } @@ -113,12 +113,12 @@ async def async_step_reconfigure( return self.async_show_form( step_id="reconfigure", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST, default=host): TextSelector( + probatio.Required(CONF_HOST, default=host): TextSelector( TextSelectorConfig(autocomplete="off") ), - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } @@ -181,9 +181,9 @@ async def async_step_zeroconf_confirm( return self.async_show_form( step_id="zeroconf_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } @@ -235,9 +235,9 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } diff --git a/homeassistant/components/peblar/services.py b/homeassistant/components/peblar/services.py index 827f3e12cf5a5..c77f467875682 100644 --- a/homeassistant/components/peblar/services.py +++ b/homeassistant/components/peblar/services.py @@ -10,7 +10,7 @@ PeblarConnectionError, PeblarError, ) -import voluptuous as vol +import probatio from homeassistant.const import ATTR_CONFIG_ENTRY_ID, CONF_ALIAS, CONF_DESCRIPTION from homeassistant.core import ( @@ -38,21 +38,21 @@ SERVICE_LIST_RFID_TOKENS = "list_rfid_tokens" SERVICE_LIST_VEHICLE_TOKENS = "list_vehicle_tokens" -CHARGER_SCHEMA = vol.Schema({vol.Required(ATTR_CONFIG_ENTRY_ID): str}) +CHARGER_SCHEMA = probatio.Schema({probatio.Required(ATTR_CONFIG_ENTRY_ID): str}) -TOKEN_SCHEMA = CHARGER_SCHEMA.extend({vol.Required(CONF_UID): str}) -ADD_TOKEN_SCHEMA = TOKEN_SCHEMA.extend({vol.Required(CONF_DESCRIPTION): str}) +TOKEN_SCHEMA = CHARGER_SCHEMA.extend({probatio.Required(CONF_UID): str}) +ADD_TOKEN_SCHEMA = TOKEN_SCHEMA.extend({probatio.Required(CONF_DESCRIPTION): str}) -VEHICLE_SCHEMA = CHARGER_SCHEMA.extend({vol.Required(CONF_EVCC_ID): str}) -ADD_VEHICLE_SCHEMA = VEHICLE_SCHEMA.extend({vol.Required(CONF_ALIAS): str}) +VEHICLE_SCHEMA = CHARGER_SCHEMA.extend({probatio.Required(CONF_EVCC_ID): str}) +ADD_VEHICLE_SCHEMA = VEHICLE_SCHEMA.extend({probatio.Required(CONF_ALIAS): str}) # The charger takes the token by UID or by description, and wants exactly # one of the two. -AUTHORIZE_SCHEMA = vol.All( +AUTHORIZE_SCHEMA = probatio.All( CHARGER_SCHEMA.extend( { - vol.Exclusive(CONF_UID, "token"): str, - vol.Exclusive(CONF_DESCRIPTION, "token"): str, + probatio.Exclusive(CONF_UID, "token"): str, + probatio.Exclusive(CONF_DESCRIPTION, "token"): str, } ), cv.has_at_least_one_key(CONF_UID, CONF_DESCRIPTION), diff --git a/homeassistant/components/peco/config_flow.py b/homeassistant/components/peco/config_flow.py index 985da4db56091..1fced5ea19433 100644 --- a/homeassistant/components/peco/config_flow.py +++ b/homeassistant/components/peco/config_flow.py @@ -9,17 +9,17 @@ PecoOutageApi, UnresponsiveMeterError, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.helpers import config_validation as cv from .const import CONF_COUNTY, CONF_PHONE_NUMBER, COUNTY_LIST, DOMAIN -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_COUNTY): vol.In(COUNTY_LIST), - vol.Optional(CONF_PHONE_NUMBER): cv.string, + probatio.Required(CONF_COUNTY): probatio.In(COUNTY_LIST), + probatio.Optional(CONF_PHONE_NUMBER): cv.string, } ) diff --git a/homeassistant/components/pegel_online/config_flow.py b/homeassistant/components/pegel_online/config_flow.py index 7b16c662079b7..08bb99fb42d4f 100644 --- a/homeassistant/components/pegel_online/config_flow.py +++ b/homeassistant/components/pegel_online/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from aiopegelonline import CONNECT_ERRORS, PegelOnline -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -77,9 +77,9 @@ async def async_step_select_station( return self.async_show_form( step_id="select_station", description_placeholders={"stations_count": str(len(self._stations))}, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_STATION): SelectSelector( + probatio.Required(CONF_STATION): SelectSelector( SelectSelectorConfig( options=stations, mode=SelectSelectorMode.DROPDOWN ) @@ -105,9 +105,9 @@ def _show_form_user( user_input = {} return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_LOCATION, default=user_input.get( CONF_LOCATION, @@ -117,7 +117,7 @@ def _show_form_user( }, ), ): LocationSelector(), - vol.Required( + probatio.Required( CONF_RADIUS, default=user_input.get(CONF_RADIUS, DEFAULT_RADIUS) ): NumberSelector( NumberSelectorConfig( diff --git a/homeassistant/components/pencom/switch.py b/homeassistant/components/pencom/switch.py index cd2195079a9d3..77e4d34a29e1f 100644 --- a/homeassistant/components/pencom/switch.py +++ b/homeassistant/components/pencom/switch.py @@ -4,7 +4,7 @@ from typing import Any, override from pencompy.pencompy import Pencompy -import voluptuous as vol +import probatio from homeassistant.components.switch import ( PLATFORM_SCHEMA as SWITCH_PLATFORM_SCHEMA, @@ -24,20 +24,20 @@ CONF_ADDR = "addr" CONF_RELAYS = "relays" -RELAY_SCHEMA = vol.Schema( +RELAY_SCHEMA = probatio.Schema( { - vol.Required(CONF_NAME): cv.string, - vol.Required(CONF_ADDR): cv.positive_int, - vol.Optional(CONF_BOARD, default=0): cv.positive_int, + probatio.Required(CONF_NAME): cv.string, + probatio.Required(CONF_ADDR): cv.positive_int, + probatio.Optional(CONF_BOARD, default=0): cv.positive_int, } ) PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_PORT): cv.port, - vol.Optional(CONF_BOARDS, default=1): cv.positive_int, - vol.Required(CONF_RELAYS): vol.All(cv.ensure_list, [RELAY_SCHEMA]), + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_PORT): cv.port, + probatio.Optional(CONF_BOARDS, default=1): cv.positive_int, + probatio.Required(CONF_RELAYS): probatio.All(cv.ensure_list, [RELAY_SCHEMA]), } ) diff --git a/homeassistant/components/persang_infrared/config_flow.py b/homeassistant/components/persang_infrared/config_flow.py index e30a98fa00d0c..ef9de1468820a 100644 --- a/homeassistant/components/persang_infrared/config_flow.py +++ b/homeassistant/components/persang_infrared/config_flow.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.infrared import ( DOMAIN as INFRARED_DOMAIN, @@ -38,9 +38,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_INFRARED_EMITTER_ENTITY_ID): EntitySelector( + probatio.Required(CONF_INFRARED_EMITTER_ENTITY_ID): EntitySelector( EntitySelectorConfig( domain=INFRARED_DOMAIN, include_entities=emitter_entity_ids, diff --git a/homeassistant/components/persistent_notification/__init__.py b/homeassistant/components/persistent_notification/__init__.py index d02bd2f2659ec..817b359700d08 100644 --- a/homeassistant/components/persistent_notification/__init__.py +++ b/homeassistant/components/persistent_notification/__init__.py @@ -7,7 +7,7 @@ import logging from typing import Any, Final, TypedDict -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.core import CALLBACK_TYPE, HomeAssistant, ServiceCall, callback @@ -52,8 +52,8 @@ class UpdateType(StrEnum): UpdateType, dict[str, Notification] ]("persistent_notifications_updated") -SCHEMA_SERVICE_NOTIFICATION = vol.Schema( - {vol.Required(ATTR_NOTIFICATION_ID): cv.string} +SCHEMA_SERVICE_NOTIFICATION = probatio.Schema( + {probatio.Required(ATTR_NOTIFICATION_ID): cv.string} ) _LOGGER = logging.getLogger(__name__) @@ -178,11 +178,11 @@ def dismiss_all_service(call: ServiceCall) -> None: DOMAIN, "create", create_service, - vol.Schema( + probatio.Schema( { - vol.Required(ATTR_MESSAGE): cv.string, - vol.Optional(ATTR_TITLE): cv.string, - vol.Optional(ATTR_NOTIFICATION_ID): cv.string, + probatio.Required(ATTR_MESSAGE): cv.string, + probatio.Optional(ATTR_TITLE): cv.string, + probatio.Optional(ATTR_NOTIFICATION_ID): cv.string, } ), ) @@ -200,7 +200,9 @@ def dismiss_all_service(call: ServiceCall) -> None: @callback -@websocket_api.websocket_command({vol.Required("type"): "persistent_notification/get"}) +@websocket_api.websocket_command( + {probatio.Required("type"): "persistent_notification/get"} +) def websocket_get_notifications( hass: HomeAssistant, connection: websocket_api.ActiveConnection, @@ -231,7 +233,7 @@ def _async_send_notification_update( @callback @websocket_api.websocket_command( - {vol.Required("type"): "persistent_notification/subscribe"} + {probatio.Required("type"): "persistent_notification/subscribe"} ) def websocket_subscribe_notifications( hass: HomeAssistant, diff --git a/homeassistant/components/persistent_notification/trigger.py b/homeassistant/components/persistent_notification/trigger.py index fb9a92b5ca70a..353025c982124 100644 --- a/homeassistant/components/persistent_notification/trigger.py +++ b/homeassistant/components/persistent_notification/trigger.py @@ -3,7 +3,7 @@ import logging from typing import Final -import voluptuous as vol +import probatio from homeassistant.const import CONF_PLATFORM from homeassistant.core import CALLBACK_TYPE, HassJob, HomeAssistant, callback @@ -21,10 +21,10 @@ TRIGGER_SCHEMA = cv.TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_PLATFORM): "persistent_notification", - vol.Optional(CONF_NOTIFICATION_ID): str, - vol.Optional(CONF_UPDATE_TYPE): vol.All( - cv.ensure_list, [vol.Coerce(UpdateType)] + probatio.Required(CONF_PLATFORM): "persistent_notification", + probatio.Optional(CONF_NOTIFICATION_ID): str, + probatio.Optional(CONF_UPDATE_TYPE): probatio.All( + cv.ensure_list, [probatio.Coerce(UpdateType)] ), } ) diff --git a/homeassistant/components/person/__init__.py b/homeassistant/components/person/__init__.py index 3b4d390e025b9..85908832d68e2 100644 --- a/homeassistant/components/person/__init__.py +++ b/homeassistant/components/person/__init__.py @@ -4,7 +4,7 @@ import logging from typing import Any, Self, override -import voluptuous as vol +import probatio from homeassistant.auth import EVENT_USER_REMOVED from homeassistant.components import persistent_notification, websocket_api @@ -71,25 +71,25 @@ # Device tracker states to ignore IGNORE_STATES = (STATE_UNKNOWN, STATE_UNAVAILABLE) -PERSON_SCHEMA = vol.Schema( +PERSON_SCHEMA = probatio.Schema( { - vol.Required(CONF_ID): cv.string, - vol.Required(CONF_NAME): cv.string, - vol.Optional(CONF_USER_ID): cv.string, - vol.Optional(CONF_DEVICE_TRACKERS, default=[]): vol.All( + probatio.Required(CONF_ID): cv.string, + probatio.Required(CONF_NAME): cv.string, + probatio.Optional(CONF_USER_ID): cv.string, + probatio.Optional(CONF_DEVICE_TRACKERS, default=[]): probatio.All( cv.ensure_list, cv.entities_domain(DEVICE_TRACKER_DOMAIN) ), - vol.Optional(CONF_PICTURE): cv.string, + probatio.Optional(CONF_PICTURE): cv.string, } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Optional(DOMAIN, default=[]): vol.All( + probatio.Optional(DOMAIN, default=[]): probatio.All( cv.ensure_list, cv.remove_falsy, [PERSON_SCHEMA] ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) @@ -165,22 +165,22 @@ def entities_in_person(hass: HomeAssistant, entity_id: str) -> list[str]: CREATE_FIELDS: VolDictType = { - vol.Required(CONF_NAME): vol.All(str, vol.Length(min=1)), - vol.Optional(CONF_USER_ID): vol.Any(str, None), - vol.Optional(CONF_DEVICE_TRACKERS, default=list): vol.All( + probatio.Required(CONF_NAME): probatio.All(str, probatio.Length(min=1)), + probatio.Optional(CONF_USER_ID): probatio.Any(str, None), + probatio.Optional(CONF_DEVICE_TRACKERS, default=list): probatio.All( cv.ensure_list, cv.entities_domain(DEVICE_TRACKER_DOMAIN) ), - vol.Optional(CONF_PICTURE): vol.Any(str, None), + probatio.Optional(CONF_PICTURE): probatio.Any(str, None), } UPDATE_FIELDS: VolDictType = { - vol.Optional(CONF_NAME): vol.All(str, vol.Length(min=1)), - vol.Optional(CONF_USER_ID): vol.Any(str, None), - vol.Optional(CONF_DEVICE_TRACKERS, default=list): vol.All( + probatio.Optional(CONF_NAME): probatio.All(str, probatio.Length(min=1)), + probatio.Optional(CONF_USER_ID): probatio.Any(str, None), + probatio.Optional(CONF_DEVICE_TRACKERS, default=list): probatio.All( cv.ensure_list, cv.entities_domain(DEVICE_TRACKER_DOMAIN) ), - vol.Optional(CONF_PICTURE): vol.Any(str, None), + probatio.Optional(CONF_PICTURE): probatio.Any(str, None), } @@ -201,8 +201,8 @@ async def _async_migrate_func( class PersonStorageCollection(collection.DictStorageCollection): """Person collection stored in storage.""" - CREATE_SCHEMA = vol.Schema(CREATE_FIELDS) - UPDATE_SCHEMA = vol.Schema(UPDATE_FIELDS) + CREATE_SCHEMA = probatio.Schema(CREATE_FIELDS) + UPDATE_SCHEMA = probatio.Schema(UPDATE_FIELDS) def __init__( self, diff --git a/homeassistant/components/philips_js/config_flow.py b/homeassistant/components/philips_js/config_flow.py index 6515f70ba4e1e..02835f65fd4a0 100644 --- a/homeassistant/components/philips_js/config_flow.py +++ b/homeassistant/components/philips_js/config_flow.py @@ -11,7 +11,7 @@ PairingFailure, PhilipsTV, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -38,21 +38,21 @@ from . import LOGGER from .const import CONF_ALLOW_NOTIFY, CONF_SYSTEM, CONST_APP_ID, CONST_APP_NAME, DOMAIN -USER_SCHEMA = vol.Schema( +USER_SCHEMA = probatio.Schema( { - vol.Required( + probatio.Required( CONF_HOST, ): str, - vol.Required( + probatio.Required( CONF_API_VERSION, default="1", - ): vol.In(["1", "5", "6"]), + ): probatio.In(["1", "5", "6"]), } ) -OPTIONS_SCHEMA = vol.Schema( +OPTIONS_SCHEMA = probatio.Schema( { - vol.Optional(CONF_ALLOW_NOTIFY, default=False): selector.BooleanSelector(), + probatio.Optional(CONF_ALLOW_NOTIFY, default=False): selector.BooleanSelector(), } ) OPTIONS_FLOW = { @@ -123,9 +123,9 @@ async def async_step_pair( assert self._hub errors: dict[str, str] = {} - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required(CONF_PIN): str, + probatio.Required(CONF_PIN): str, } ) diff --git a/homeassistant/components/philips_js/device_trigger.py b/homeassistant/components/philips_js/device_trigger.py index e5723c08eb7af..5d5602c5b7737 100644 --- a/homeassistant/components/philips_js/device_trigger.py +++ b/homeassistant/components/philips_js/device_trigger.py @@ -1,6 +1,6 @@ """Provides device automations for control of device.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import DEVICE_TRIGGER_BASE_SCHEMA from homeassistant.const import CONF_DEVICE_ID, CONF_TYPE @@ -19,7 +19,7 @@ TRIGGER_TYPES = {TRIGGER_TYPE_TURN_ON} TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): vol.In(TRIGGER_TYPES), + probatio.Required(CONF_TYPE): probatio.In(TRIGGER_TYPES), } ) diff --git a/homeassistant/components/pi_hole/config_flow.py b/homeassistant/components/pi_hole/config_flow.py index de6cc4c2b2cc4..bb6573318aefc 100644 --- a/homeassistant/components/pi_hole/config_flow.py +++ b/homeassistant/components/pi_hole/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from hole.exceptions import HoleError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -67,25 +67,27 @@ async def async_step_user( user_input = user_input or {} return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST, default=user_input.get(CONF_HOST, "")): str, - vol.Required( + probatio.Required( + CONF_HOST, default=user_input.get(CONF_HOST, "") + ): str, + probatio.Required( CONF_PORT, default=user_input.get(CONF_PORT, 80) - ): vol.Coerce(int), - vol.Required( + ): probatio.Coerce(int), + probatio.Required( CONF_LOCATION, default=user_input.get(CONF_LOCATION, DEFAULT_LOCATION), ): str, - vol.Required( + probatio.Required( CONF_API_KEY, default=user_input.get(CONF_API_KEY), ): str, - vol.Required( + probatio.Required( CONF_SSL, default=user_input.get(CONF_SSL, DEFAULT_SSL), ): bool, - vol.Required( + probatio.Required( CONF_VERIFY_SSL, default=user_input.get(CONF_VERIFY_SSL, DEFAULT_VERIFY_SSL), ): bool, @@ -120,7 +122,7 @@ async def async_step_reauth_confirm( CONF_HOST: self._config[CONF_HOST], CONF_LOCATION: self._config[CONF_LOCATION], }, - data_schema=vol.Schema({vol.Required(CONF_API_KEY): str}), + data_schema=probatio.Schema({probatio.Required(CONF_API_KEY): str}), errors=errors, ) diff --git a/homeassistant/components/pi_hole/switch.py b/homeassistant/components/pi_hole/switch.py index 9e2e4d6d6f26f..943750c8eb58b 100644 --- a/homeassistant/components/pi_hole/switch.py +++ b/homeassistant/components/pi_hole/switch.py @@ -4,7 +4,7 @@ from typing import Any, override from hole.exceptions import HoleError -import voluptuous as vol +import probatio from homeassistant.components.switch import SwitchEntity from homeassistant.core import HomeAssistant @@ -42,7 +42,7 @@ async def async_setup_entry( platform.async_register_entity_service( SERVICE_DISABLE, { - vol.Required(SERVICE_DISABLE_ATTR_DURATION): vol.All( + probatio.Required(SERVICE_DISABLE_ATTR_DURATION): probatio.All( cv.time_period_str, cv.positive_timedelta ), }, diff --git a/homeassistant/components/picnic/config_flow.py b/homeassistant/components/picnic/config_flow.py index 03ee261bcb11c..d242f9cbd8155 100644 --- a/homeassistant/components/picnic/config_flow.py +++ b/homeassistant/components/picnic/config_flow.py @@ -4,6 +4,7 @@ import logging from typing import Any, override +import probatio from python_picnic_api2 import PicnicAPI from python_picnic_api2.session import ( Picnic2FAError, @@ -11,7 +12,6 @@ PicnicAuthError, ) import requests -import voluptuous as vol from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -33,19 +33,19 @@ CONF_2FA_CODE = "two_fa_code" CONF_2FA_CHANNEL = "two_fa_channel" -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Required(CONF_COUNTRY_CODE, default=COUNTRY_CODES[0]): vol.In( + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Required(CONF_COUNTRY_CODE, default=COUNTRY_CODES[0]): probatio.In( COUNTRY_CODES ), } ) -STEP_2FA_CHANNEL_SCHEMA = vol.Schema( +STEP_2FA_CHANNEL_SCHEMA = probatio.Schema( { - vol.Required(CONF_2FA_CHANNEL, default=TWO_FA_CHANNELS[0]): SelectSelector( + probatio.Required(CONF_2FA_CHANNEL, default=TWO_FA_CHANNELS[0]): SelectSelector( SelectSelectorConfig( options=TWO_FA_CHANNELS, mode=SelectSelectorMode.LIST, @@ -55,9 +55,9 @@ } ) -STEP_2FA_SCHEMA = vol.Schema( +STEP_2FA_SCHEMA = probatio.Schema( { - vol.Required(CONF_2FA_CODE): str, + probatio.Required(CONF_2FA_CODE): str, } ) diff --git a/homeassistant/components/picnic/services.py b/homeassistant/components/picnic/services.py index 630bf23162beb..bcc1d3bbb1f70 100644 --- a/homeassistant/components/picnic/services.py +++ b/homeassistant/components/picnic/services.py @@ -2,8 +2,8 @@ from typing import cast +import probatio from python_picnic_api2 import PicnicAPI -import voluptuous as vol from homeassistant.const import ATTR_CONFIG_ENTRY_ID from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -36,12 +36,18 @@ async def async_add_product_service(call: ServiceCall): DOMAIN, SERVICE_ADD_PRODUCT_TO_CART, async_add_product_service, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): cv.string, - vol.Exclusive(ATTR_PRODUCT_ID, ATTR_PRODUCT_IDENTIFIERS): cv.string, - vol.Exclusive(ATTR_PRODUCT_NAME, ATTR_PRODUCT_IDENTIFIERS): cv.string, - vol.Optional(ATTR_AMOUNT): vol.All(vol.Coerce(int), vol.Range(min=1)), + probatio.Required(ATTR_CONFIG_ENTRY_ID): cv.string, + probatio.Exclusive( + ATTR_PRODUCT_ID, ATTR_PRODUCT_IDENTIFIERS + ): cv.string, + probatio.Exclusive( + ATTR_PRODUCT_NAME, ATTR_PRODUCT_IDENTIFIERS + ): cv.string, + probatio.Optional(ATTR_AMOUNT): probatio.All( + probatio.Coerce(int), probatio.Range(min=1) + ), } ), ) diff --git a/homeassistant/components/picotts/config_flow.py b/homeassistant/components/picotts/config_flow.py index 23b9c76cb5dee..efb0d64703960 100644 --- a/homeassistant/components/picotts/config_flow.py +++ b/homeassistant/components/picotts/config_flow.py @@ -3,15 +3,15 @@ import shutil from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.tts import CONF_LANG from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from .const import DEFAULT_LANG, DOMAIN, SUPPORT_LANGUAGES -STEP_USER_DATA_SCHEMA = vol.Schema( - {vol.Required(CONF_LANG, default=DEFAULT_LANG): vol.In(SUPPORT_LANGUAGES)} +STEP_USER_DATA_SCHEMA = probatio.Schema( + {probatio.Required(CONF_LANG, default=DEFAULT_LANG): probatio.In(SUPPORT_LANGUAGES)} ) diff --git a/homeassistant/components/picotts/tts.py b/homeassistant/components/picotts/tts.py index d48dfd53927bf..05cacbedc9541 100644 --- a/homeassistant/components/picotts/tts.py +++ b/homeassistant/components/picotts/tts.py @@ -8,7 +8,7 @@ import tempfile from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.tts import ( CONF_LANG, @@ -30,7 +30,7 @@ _LOGGER = logging.getLogger(__name__) PLATFORM_SCHEMA = TTS_PLATFORM_SCHEMA.extend( - {vol.Optional(CONF_LANG, default=DEFAULT_LANG): vol.In(SUPPORT_LANGUAGES)} + {probatio.Optional(CONF_LANG, default=DEFAULT_LANG): probatio.In(SUPPORT_LANGUAGES)} ) diff --git a/homeassistant/components/pilight/__init__.py b/homeassistant/components/pilight/__init__.py index 2cb83de66884b..7b5a2f3712d2f 100644 --- a/homeassistant/components/pilight/__init__.py +++ b/homeassistant/components/pilight/__init__.py @@ -8,7 +8,7 @@ from typing import Any from pilight import pilight -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_HOST, @@ -40,27 +40,27 @@ # The Pilight code schema depends on the protocol. Thus only require to have # the protocol information. Ensure that protocol is in a list otherwise # segfault in pilight-daemon, https://github.com/pilight/pilight/issues/296 -RF_CODE_SCHEMA = vol.Schema( - {vol.Required(CONF_PROTOCOL): vol.All(cv.ensure_list, [cv.string])}, - extra=vol.ALLOW_EXTRA, +RF_CODE_SCHEMA = probatio.Schema( + {probatio.Required(CONF_PROTOCOL): probatio.All(cv.ensure_list, [cv.string])}, + extra=probatio.ALLOW_EXTRA, ) SERVICE_NAME = "send" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_WHITELIST, default={}): {cv.string: [cv.string]}, - vol.Optional(CONF_SEND_DELAY, default=DEFAULT_SEND_DELAY): vol.Coerce( - float - ), + probatio.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_WHITELIST, default={}): {cv.string: [cv.string]}, + probatio.Optional( + CONF_SEND_DELAY, default=DEFAULT_SEND_DELAY + ): probatio.Coerce(float), } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/pilight/binary_sensor.py b/homeassistant/components/pilight/binary_sensor.py index 7ba0a06fe1dca..3616d8ba648aa 100644 --- a/homeassistant/components/pilight/binary_sensor.py +++ b/homeassistant/components/pilight/binary_sensor.py @@ -3,7 +3,7 @@ import datetime from typing import Any -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import ( PLATFORM_SCHEMA as BINARY_SENSOR_PLATFORM_SCHEMA, @@ -31,17 +31,17 @@ DEFAULT_NAME = "Pilight Binary Sensor" PLATFORM_SCHEMA = BINARY_SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_VARIABLE): cv.string, - vol.Required(CONF_PAYLOAD): vol.Schema(dict), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_PAYLOAD_ON, default="on"): vol.Any( + probatio.Required(CONF_VARIABLE): cv.string, + probatio.Required(CONF_PAYLOAD): probatio.Schema(dict), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_PAYLOAD_ON, default="on"): probatio.Any( cv.positive_int, cv.small_float, cv.string ), - vol.Optional(CONF_PAYLOAD_OFF, default="off"): vol.Any( + probatio.Optional(CONF_PAYLOAD_OFF, default="off"): probatio.Any( cv.positive_int, cv.small_float, cv.string ), - vol.Optional(CONF_DISARM_AFTER_TRIGGER, default=False): cv.boolean, - vol.Optional(CONF_RESET_DELAY_SEC, default=30): cv.positive_int, + probatio.Optional(CONF_DISARM_AFTER_TRIGGER, default=False): cv.boolean, + probatio.Optional(CONF_RESET_DELAY_SEC, default=30): cv.positive_int, } ) diff --git a/homeassistant/components/pilight/entity.py b/homeassistant/components/pilight/entity.py index 6b49adbfcf6bb..9bd6ef0346201 100644 --- a/homeassistant/components/pilight/entity.py +++ b/homeassistant/components/pilight/entity.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.light import LightEntityStateAttribute from homeassistant.const import ( @@ -32,29 +32,33 @@ CONF_UNITCODE, ) -COMMAND_SCHEMA = vol.Schema( +COMMAND_SCHEMA = probatio.Schema( { - vol.Optional(CONF_PROTOCOL): cv.string, - vol.Optional(CONF_ON): cv.positive_int, - vol.Optional(CONF_OFF): cv.positive_int, - vol.Optional(CONF_UNIT): cv.positive_int, - vol.Optional(CONF_UNITCODE): cv.positive_int, - vol.Optional(CONF_ID): vol.Any(cv.positive_int, cv.string), - vol.Optional(CONF_STATE): vol.Any(STATE_ON, STATE_OFF), - vol.Optional(CONF_SYSTEMCODE): cv.positive_int, + probatio.Optional(CONF_PROTOCOL): cv.string, + probatio.Optional(CONF_ON): cv.positive_int, + probatio.Optional(CONF_OFF): cv.positive_int, + probatio.Optional(CONF_UNIT): cv.positive_int, + probatio.Optional(CONF_UNITCODE): cv.positive_int, + probatio.Optional(CONF_ID): probatio.Any(cv.positive_int, cv.string), + probatio.Optional(CONF_STATE): probatio.Any(STATE_ON, STATE_OFF), + probatio.Optional(CONF_SYSTEMCODE): cv.positive_int, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -RECEIVE_SCHEMA = COMMAND_SCHEMA.extend({vol.Optional(CONF_ECHO): cv.boolean}) +RECEIVE_SCHEMA = COMMAND_SCHEMA.extend({probatio.Optional(CONF_ECHO): cv.boolean}) -SWITCHES_SCHEMA = vol.Schema( +SWITCHES_SCHEMA = probatio.Schema( { - vol.Required(CONF_ON_CODE): COMMAND_SCHEMA, - vol.Required(CONF_OFF_CODE): COMMAND_SCHEMA, - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_OFF_CODE_RECEIVE): vol.All(cv.ensure_list, [COMMAND_SCHEMA]), - vol.Optional(CONF_ON_CODE_RECEIVE): vol.All(cv.ensure_list, [COMMAND_SCHEMA]), + probatio.Required(CONF_ON_CODE): COMMAND_SCHEMA, + probatio.Required(CONF_OFF_CODE): COMMAND_SCHEMA, + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_OFF_CODE_RECEIVE): probatio.All( + cv.ensure_list, [COMMAND_SCHEMA] + ), + probatio.Optional(CONF_ON_CODE_RECEIVE): probatio.All( + cv.ensure_list, [COMMAND_SCHEMA] + ), } ) diff --git a/homeassistant/components/pilight/light.py b/homeassistant/components/pilight/light.py index f8a801c03ff16..e89d53be3afb7 100644 --- a/homeassistant/components/pilight/light.py +++ b/homeassistant/components/pilight/light.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.light import ( ATTR_BRIGHTNESS, @@ -21,13 +21,13 @@ LIGHTS_SCHEMA = SWITCHES_SCHEMA.extend( { - vol.Optional(CONF_DIMLEVEL_MIN, default=0): cv.positive_int, - vol.Optional(CONF_DIMLEVEL_MAX, default=15): cv.positive_int, + probatio.Optional(CONF_DIMLEVEL_MIN, default=0): cv.positive_int, + probatio.Optional(CONF_DIMLEVEL_MAX, default=15): cv.positive_int, } ) PLATFORM_SCHEMA = LIGHT_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_LIGHTS): vol.Schema({cv.string: LIGHTS_SCHEMA})} + {probatio.Required(CONF_LIGHTS): probatio.Schema({cv.string: LIGHTS_SCHEMA})} ) diff --git a/homeassistant/components/pilight/sensor.py b/homeassistant/components/pilight/sensor.py index c1ac3d161d03b..30990d58b6184 100644 --- a/homeassistant/components/pilight/sensor.py +++ b/homeassistant/components/pilight/sensor.py @@ -3,7 +3,7 @@ import logging from typing import Any -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -24,10 +24,10 @@ DEFAULT_NAME = "Pilight Sensor" PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_VARIABLE): cv.string, - vol.Required(CONF_PAYLOAD): vol.Schema(dict), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, + probatio.Required(CONF_VARIABLE): cv.string, + probatio.Required(CONF_PAYLOAD): probatio.Schema(dict), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, } ) diff --git a/homeassistant/components/pilight/switch.py b/homeassistant/components/pilight/switch.py index b8965831809eb..a1104d70f33c4 100644 --- a/homeassistant/components/pilight/switch.py +++ b/homeassistant/components/pilight/switch.py @@ -1,6 +1,6 @@ """Support for switching devices via Pilight to on and off.""" -import voluptuous as vol +import probatio from homeassistant.components.switch import ( PLATFORM_SCHEMA as SWITCH_PLATFORM_SCHEMA, @@ -15,7 +15,7 @@ from .entity import SWITCHES_SCHEMA, PilightBaseDevice PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_SWITCHES): vol.Schema({cv.string: SWITCHES_SCHEMA})} + {probatio.Required(CONF_SWITCHES): probatio.Schema({cv.string: SWITCHES_SCHEMA})} ) diff --git a/homeassistant/components/ping/config_flow.py b/homeassistant/components/ping/config_flow.py index dc79ae09883e6..c1c9aa4120c65 100644 --- a/homeassistant/components/ping/config_flow.py +++ b/homeassistant/components/ping/config_flow.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.device_tracker import ( CONF_CONSIDER_HOME, @@ -45,9 +45,9 @@ async def async_step_user( if user_input is None: return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST): str, + probatio.Required(CONF_HOST): str, } ), ) @@ -89,12 +89,12 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_HOST, default=self.config_entry.options[CONF_HOST] ): str, - vol.Optional( + probatio.Optional( CONF_PING_COUNT, default=self.config_entry.options[CONF_PING_COUNT], ): selector.NumberSelector( @@ -102,7 +102,7 @@ async def async_step_init( min=1, max=100, mode=selector.NumberSelectorMode.BOX ) ), - vol.Optional( + probatio.Optional( CONF_CONSIDER_HOME, default=self.config_entry.options.get( CONF_CONSIDER_HOME, DEFAULT_CONSIDER_HOME.seconds diff --git a/homeassistant/components/pioneer/media_player.py b/homeassistant/components/pioneer/media_player.py index a7832e70719a1..72a67879d0e17 100644 --- a/homeassistant/components/pioneer/media_player.py +++ b/homeassistant/components/pioneer/media_player.py @@ -3,8 +3,8 @@ import logging from typing import Final, override +import probatio import telnetlib # pylint: disable=deprecated-module -import voluptuous as vol from homeassistant.components.media_player import ( PLATFORM_SCHEMA as MEDIA_PLAYER_PLATFORM_SCHEMA, @@ -33,11 +33,13 @@ PLATFORM_SCHEMA = MEDIA_PLAYER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.socket_timeout, - vol.Optional(CONF_SOURCES, default=DEFAULT_SOURCES): {cv.string: cv.string}, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.socket_timeout, + probatio.Optional(CONF_SOURCES, default=DEFAULT_SOURCES): { + cv.string: cv.string + }, } ) diff --git a/homeassistant/components/pjlink/config_flow.py b/homeassistant/components/pjlink/config_flow.py index 864166e594ad1..b6ef5a060638d 100644 --- a/homeassistant/components/pjlink/config_flow.py +++ b/homeassistant/components/pjlink/config_flow.py @@ -3,9 +3,9 @@ import logging from typing import Any, override +import probatio from pypjlink import Projector from pypjlink.projector import ProjectorError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PASSWORD, CONF_PORT @@ -15,11 +15,11 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_PASSWORD): str, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/pjlink/media_player.py b/homeassistant/components/pjlink/media_player.py index 38a0c20fd6477..ad61827594b9c 100644 --- a/homeassistant/components/pjlink/media_player.py +++ b/homeassistant/components/pjlink/media_player.py @@ -2,9 +2,9 @@ from typing import Any, override +import probatio from pypjlink import MUTE_AUDIO, Projector from pypjlink.projector import ProjectorError -import voluptuous as vol from homeassistant.components.media_player import ( PLATFORM_SCHEMA as MEDIA_PLAYER_PLATFORM_SCHEMA, @@ -29,11 +29,11 @@ PLATFORM_SCHEMA = MEDIA_PLAYER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_ENCODING, default=DEFAULT_ENCODING): cv.string, - vol.Optional(CONF_PASSWORD): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_ENCODING, default=DEFAULT_ENCODING): cv.string, + probatio.Optional(CONF_PASSWORD): cv.string, } ) diff --git a/homeassistant/components/plaato/__init__.py b/homeassistant/components/plaato/__init__.py index 68f68ad90b7d1..2793c62909623 100644 --- a/homeassistant/components/plaato/__init__.py +++ b/homeassistant/components/plaato/__init__.py @@ -4,6 +4,7 @@ import logging from aiohttp import web +import probatio from pyplaato.models.airlock import PlaatoAirlock from pyplaato.plaato import ( ATTR_ABV, @@ -19,7 +20,6 @@ ATTR_TEMP_UNIT, ATTR_VOLUME_UNIT, ) -import voluptuous as vol from homeassistant.components import webhook from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN @@ -52,26 +52,26 @@ SENSOR_UPDATE = f"{DOMAIN}_sensor_update" SENSOR_DATA_KEY = f"{DOMAIN}.{SENSOR_DOMAIN}" -WEBHOOK_SCHEMA = vol.Schema( +WEBHOOK_SCHEMA = probatio.Schema( { - vol.Required(ATTR_DEVICE_NAME): cv.string, - vol.Required(ATTR_DEVICE_ID): cv.positive_int, - vol.Required(ATTR_TEMP_UNIT): vol.In( + probatio.Required(ATTR_DEVICE_NAME): cv.string, + probatio.Required(ATTR_DEVICE_ID): cv.positive_int, + probatio.Required(ATTR_TEMP_UNIT): probatio.In( [UnitOfTemperature.CELSIUS, UnitOfTemperature.FAHRENHEIT] ), - vol.Required(ATTR_VOLUME_UNIT): vol.In( + probatio.Required(ATTR_VOLUME_UNIT): probatio.In( [UnitOfVolume.LITERS, UnitOfVolume.GALLONS] ), - vol.Required(ATTR_BPM): cv.positive_int, - vol.Required(ATTR_TEMP): vol.Coerce(float), - vol.Required(ATTR_SG): vol.Coerce(float), - vol.Required(ATTR_OG): vol.Coerce(float), - vol.Required(ATTR_ABV): vol.Coerce(float), - vol.Required(ATTR_CO2_VOLUME): vol.Coerce(float), - vol.Required(ATTR_BATCH_VOLUME): vol.Coerce(float), - vol.Required(ATTR_BUBBLES): cv.positive_int, + probatio.Required(ATTR_BPM): cv.positive_int, + probatio.Required(ATTR_TEMP): probatio.Coerce(float), + probatio.Required(ATTR_SG): probatio.Coerce(float), + probatio.Required(ATTR_OG): probatio.Coerce(float), + probatio.Required(ATTR_ABV): probatio.Coerce(float), + probatio.Required(ATTR_CO2_VOLUME): probatio.Coerce(float), + probatio.Required(ATTR_BATCH_VOLUME): probatio.Coerce(float), + probatio.Required(ATTR_BUBBLES): cv.positive_int, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) @@ -174,7 +174,7 @@ async def handle_webhook( """Handle incoming webhook from Plaato.""" try: data = WEBHOOK_SCHEMA(await request.json()) - except vol.MultipleInvalid as error: + except probatio.MultipleInvalid as error: _LOGGER.warning("An error occurred when parsing webhook data <%s>", error) return None diff --git a/homeassistant/components/plaato/config_flow.py b/homeassistant/components/plaato/config_flow.py index ce60f85b04323..41e142d072789 100644 --- a/homeassistant/components/plaato/config_flow.py +++ b/homeassistant/components/plaato/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from pyplaato.plaato import PlaatoDeviceType -import voluptuous as vol from homeassistant.components import cloud, webhook from homeassistant.config_entries import ( @@ -58,18 +58,18 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Required( + probatio.Required( CONF_DEVICE_NAME, default=self._init_info.get(CONF_DEVICE_NAME, None), ): str, - vol.Required( + probatio.Required( CONF_DEVICE_TYPE, default=self._init_info.get(CONF_DEVICE_TYPE, None), - ): vol.In(list(PlaatoDeviceType)), + ): probatio.In(list(PlaatoDeviceType)), } ), ) @@ -148,11 +148,11 @@ async def _async_create_entry(self): async def _show_api_method_form( self, device_type: PlaatoDeviceType, errors: dict[str, str] | None = None ) -> ConfigFlowResult: - data_schema = vol.Schema({vol.Optional(CONF_TOKEN, default=""): str}) + data_schema = probatio.Schema({probatio.Optional(CONF_TOKEN, default=""): str}) if device_type == PlaatoDeviceType.Airlock: data_schema = data_schema.extend( - {vol.Optional(CONF_USE_WEBHOOK, default=False): bool} + {probatio.Optional(CONF_USE_WEBHOOK, default=False): bool} ) return self.async_show_form( @@ -213,11 +213,11 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { # Polling interval is user-configurable, which is no longer allowed # pylint: disable-next=home-assistant-config-flow-polling-field - vol.Optional( + probatio.Optional( CONF_SCAN_INTERVAL, default=self.config_entry.options.get( CONF_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL diff --git a/homeassistant/components/plant/__init__.py b/homeassistant/components/plant/__init__.py index 20c6fb24a2059..d3c8706669693 100644 --- a/homeassistant/components/plant/__init__.py +++ b/homeassistant/components/plant/__init__.py @@ -10,7 +10,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.recorder import get_instance, history from homeassistant.const import ( @@ -80,39 +80,45 @@ CONF_SENSOR_BRIGHTNESS = READING_BRIGHTNESS -SCHEMA_SENSORS = vol.Schema( +SCHEMA_SENSORS = probatio.Schema( { - vol.Optional(CONF_SENSOR_BATTERY_LEVEL): cv.entity_id, - vol.Optional(CONF_SENSOR_MOISTURE): cv.entity_id, - vol.Optional(CONF_SENSOR_CONDUCTIVITY): cv.entity_id, - vol.Optional(CONF_SENSOR_TEMPERATURE): cv.entity_id, - vol.Optional(CONF_SENSOR_BRIGHTNESS): cv.entity_id, + probatio.Optional(CONF_SENSOR_BATTERY_LEVEL): cv.entity_id, + probatio.Optional(CONF_SENSOR_MOISTURE): cv.entity_id, + probatio.Optional(CONF_SENSOR_CONDUCTIVITY): cv.entity_id, + probatio.Optional(CONF_SENSOR_TEMPERATURE): cv.entity_id, + probatio.Optional(CONF_SENSOR_BRIGHTNESS): cv.entity_id, } ) -PLANT_SCHEMA = vol.Schema( +PLANT_SCHEMA = probatio.Schema( { - vol.Required(CONF_SENSORS): vol.Schema(SCHEMA_SENSORS), - vol.Optional( + probatio.Required(CONF_SENSORS): probatio.Schema(SCHEMA_SENSORS), + probatio.Optional( CONF_MIN_BATTERY_LEVEL, default=DEFAULT_MIN_BATTERY_LEVEL ): cv.positive_int, - vol.Optional(CONF_MIN_TEMPERATURE): vol.Coerce(float), - vol.Optional(CONF_MAX_TEMPERATURE): vol.Coerce(float), - vol.Optional(CONF_MIN_MOISTURE, default=DEFAULT_MIN_MOISTURE): cv.positive_int, - vol.Optional(CONF_MAX_MOISTURE, default=DEFAULT_MAX_MOISTURE): cv.positive_int, - vol.Optional( + probatio.Optional(CONF_MIN_TEMPERATURE): probatio.Coerce(float), + probatio.Optional(CONF_MAX_TEMPERATURE): probatio.Coerce(float), + probatio.Optional( + CONF_MIN_MOISTURE, default=DEFAULT_MIN_MOISTURE + ): cv.positive_int, + probatio.Optional( + CONF_MAX_MOISTURE, default=DEFAULT_MAX_MOISTURE + ): cv.positive_int, + probatio.Optional( CONF_MIN_CONDUCTIVITY, default=DEFAULT_MIN_CONDUCTIVITY ): cv.positive_int, - vol.Optional( + probatio.Optional( CONF_MAX_CONDUCTIVITY, default=DEFAULT_MAX_CONDUCTIVITY ): cv.positive_int, - vol.Optional(CONF_MIN_BRIGHTNESS): cv.positive_int, - vol.Optional(CONF_MAX_BRIGHTNESS): cv.positive_int, - vol.Optional(CONF_CHECK_DAYS, default=DEFAULT_CHECK_DAYS): cv.positive_int, + probatio.Optional(CONF_MIN_BRIGHTNESS): cv.positive_int, + probatio.Optional(CONF_MAX_BRIGHTNESS): cv.positive_int, + probatio.Optional(CONF_CHECK_DAYS, default=DEFAULT_CHECK_DAYS): cv.positive_int, } ) -CONFIG_SCHEMA = vol.Schema({DOMAIN: {cv.string: PLANT_SCHEMA}}, extra=vol.ALLOW_EXTRA) +CONFIG_SCHEMA = probatio.Schema( + {DOMAIN: {cv.string: PLANT_SCHEMA}}, extra=probatio.ALLOW_EXTRA +) async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: diff --git a/homeassistant/components/playstation_network/config_flow.py b/homeassistant/components/playstation_network/config_flow.py index 94240cf0138d5..0a85612a08056 100644 --- a/homeassistant/components/playstation_network/config_flow.py +++ b/homeassistant/components/playstation_network/config_flow.py @@ -4,6 +4,7 @@ import logging from typing import Any, override +import probatio from psnawp_api.core.psnawp_exceptions import ( PSNAWPAuthenticationError, PSNAWPError, @@ -11,7 +12,6 @@ PSNAWPNotFoundError, ) from psnawp_api.utils.misc import parse_npsso_token -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -36,7 +36,7 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema({vol.Required(CONF_NPSSO): str}) +STEP_USER_DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_NPSSO): str}) class PlaystationNetworkConfigFlow(ConfigFlow, domain=DOMAIN): @@ -212,9 +212,9 @@ async def async_step_user( return self.async_show_form( step_id="user", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_ACCOUNT_ID): SelectSelector( + probatio.Required(CONF_ACCOUNT_ID): SelectSelector( SelectSelectorConfig(options=options) ) } diff --git a/homeassistant/components/plex/config_flow.py b/homeassistant/components/plex/config_flow.py index 1fb44858b067d..882c3daab3508 100644 --- a/homeassistant/components/plex/config_flow.py +++ b/homeassistant/components/plex/config_flow.py @@ -9,8 +9,8 @@ import plexapi.exceptions from plexapi.gdm import GDM from plexauth import PlexAuth +import probatio import requests.exceptions -import voluptuous as vol from homeassistant.components.http import KEY_HASS, HomeAssistantView from homeassistant.components.media_player import DOMAIN as MP_DOMAIN @@ -153,23 +153,23 @@ async def async_step_manual_setup( previous_input = user_input or {} - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_HOST, description={"suggested_value": previous_input.get(CONF_HOST)}, ): str, - vol.Required( + probatio.Required( CONF_PORT, default=previous_input.get(CONF_PORT, DEFAULT_PORT) ): int, - vol.Required( + probatio.Required( CONF_SSL, default=previous_input.get(CONF_SSL, DEFAULT_SSL) ): bool, - vol.Required( + probatio.Required( CONF_VERIFY_SSL, default=previous_input.get(CONF_VERIFY_SSL, DEFAULT_VERIFY_SSL), ): bool, - vol.Optional( + probatio.Optional( CONF_TOKEN, description={"suggested_value": previous_input.get(CONF_TOKEN)}, ): str, @@ -283,8 +283,12 @@ async def async_step_select_server( return self.async_show_form( step_id="select_server", - data_schema=vol.Schema( - {vol.Required(CONF_SERVER_IDENTIFIER): vol.In(available_servers)} + data_schema=probatio.Schema( + { + probatio.Required(CONF_SERVER_IDENTIFIER): probatio.In( + available_servers + ) + } ), errors={}, ) @@ -423,20 +427,20 @@ async def async_step_plex_mp_settings( return self.async_show_form( step_id="plex_mp_settings", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_USE_EPISODE_ART, default=plex_server.option_use_episode_art, ): bool, - vol.Optional( + probatio.Optional( CONF_MONITORED_USERS, default=default_accounts ): cv.multi_select(available_accounts), - vol.Required( + probatio.Required( CONF_IGNORE_NEW_SHARED_USERS, default=plex_server.option_ignore_new_shared_users, ): bool, - vol.Required( + probatio.Required( CONF_IGNORE_PLEX_WEB_CLIENTS, default=plex_server.option_ignore_plexweb_clients, ): bool, diff --git a/homeassistant/components/plex/services.py b/homeassistant/components/plex/services.py index 9ad2286f1b7cd..bd94f2bc560e4 100644 --- a/homeassistant/components/plex/services.py +++ b/homeassistant/components/plex/services.py @@ -4,7 +4,7 @@ import logging from plexapi.exceptions import NotFound -import voluptuous as vol +import probatio from yarl import URL from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -16,8 +16,8 @@ from .models import PlexMediaSearchResult from .server import PlexServer -REFRESH_LIBRARY_SCHEMA = vol.Schema( - {vol.Optional("server_name"): str, vol.Required("library_name"): str} +REFRESH_LIBRARY_SCHEMA = probatio.Schema( + {probatio.Optional("server_name"): str, probatio.Required("library_name"): str} ) _LOGGER = logging.getLogger(__package__) diff --git a/homeassistant/components/plugwise/config_flow.py b/homeassistant/components/plugwise/config_flow.py index 082dfeca3ab24..e66e1ff68aaf7 100644 --- a/homeassistant/components/plugwise/config_flow.py +++ b/homeassistant/components/plugwise/config_flow.py @@ -12,7 +12,7 @@ ResponseError, UnsupportedDeviceError, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_USER, ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -46,22 +46,22 @@ _LOGGER = logging.getLogger(__name__) -SMILE_RECONF_SCHEMA = vol.Schema( +SMILE_RECONF_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, + probatio.Required(CONF_HOST): str, } ) -def smile_user_schema(discovery_info: ZeroconfServiceInfo | None) -> vol.Schema: +def smile_user_schema(discovery_info: ZeroconfServiceInfo | None) -> probatio.Schema: """Generate base schema for gateways.""" - schema = vol.Schema({vol.Required(CONF_PASSWORD): str}) + schema = probatio.Schema({probatio.Required(CONF_PASSWORD): str}) if not discovery_info: schema = schema.extend( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_USERNAME, default=SMILE): vol.In( + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_USERNAME, default=SMILE): probatio.In( {SMILE: FLOW_SMILE, STRETCH: FLOW_STRETCH} ), } diff --git a/homeassistant/components/pocketcasts/sensor.py b/homeassistant/components/pocketcasts/sensor.py index 543dcb80fc308..999b92a04dc8d 100644 --- a/homeassistant/components/pocketcasts/sensor.py +++ b/homeassistant/components/pocketcasts/sensor.py @@ -4,8 +4,8 @@ import logging from typing import override +import probatio from pycketcasts import pocketcasts -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -25,7 +25,10 @@ SCAN_INTERVAL = timedelta(minutes=5) PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_PASSWORD): cv.string, vol.Required(CONF_USERNAME): cv.string} + { + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + } ) diff --git a/homeassistant/components/pooldose/config_flow.py b/homeassistant/components/pooldose/config_flow.py index 964e5a19f8694..c3d970739576d 100644 --- a/homeassistant/components/pooldose/config_flow.py +++ b/homeassistant/components/pooldose/config_flow.py @@ -6,7 +6,7 @@ from pooldose.client import PooldoseClient from pooldose.request_status import RequestStatus from pooldose.type_definitions import APIVersionResponse -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_MAC @@ -18,9 +18,9 @@ _LOGGER = logging.getLogger(__name__) -SCHEMA_DEVICE = vol.Schema( +SCHEMA_DEVICE = probatio.Schema( { - vol.Required(CONF_HOST): cv.string, + probatio.Required(CONF_HOST): cv.string, } ) diff --git a/homeassistant/components/poolsense/config_flow.py b/homeassistant/components/poolsense/config_flow.py index b0e1c11d7ced9..af1c55ca89c40 100644 --- a/homeassistant/components/poolsense/config_flow.py +++ b/homeassistant/components/poolsense/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from poolsense import PoolSense -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_EMAIL, CONF_PASSWORD @@ -57,8 +57,11 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_EMAIL): str, vol.Required(CONF_PASSWORD): str} + data_schema=probatio.Schema( + { + probatio.Required(CONF_EMAIL): str, + probatio.Required(CONF_PASSWORD): str, + } ), errors=errors, ) diff --git a/homeassistant/components/portainer/config_flow.py b/homeassistant/components/portainer/config_flow.py index 8aa037d7b386f..9fe473538c3e8 100644 --- a/homeassistant/components/portainer/config_flow.py +++ b/homeassistant/components/portainer/config_flow.py @@ -4,6 +4,7 @@ import logging from typing import Any, override +import probatio from pyportainer import ( Portainer, PortainerAuthenticationError, @@ -11,7 +12,6 @@ PortainerTimeoutError, ) from pyportainer.models.portainer import PortainerSystemStatus -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_TOKEN, CONF_URL, CONF_VERIFY_SSL @@ -27,15 +27,15 @@ from .const import DOMAIN _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_URL): TextSelector( + probatio.Required(CONF_URL): TextSelector( TextSelectorConfig(type=TextSelectorType.URL) ), - vol.Required(CONF_API_TOKEN): TextSelector( + probatio.Required(CONF_API_TOKEN): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), - vol.Optional(CONF_VERIFY_SSL, default=True): BooleanSelector(), + probatio.Optional(CONF_VERIFY_SSL, default=True): BooleanSelector(), } ) @@ -135,9 +135,9 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_API_TOKEN): TextSelector( + probatio.Required(CONF_API_TOKEN): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ) } diff --git a/homeassistant/components/portainer/services.py b/homeassistant/components/portainer/services.py index f191998e7cec7..527cbf973c70d 100644 --- a/homeassistant/components/portainer/services.py +++ b/homeassistant/components/portainer/services.py @@ -2,12 +2,12 @@ from datetime import timedelta +import probatio from pyportainer import ( PortainerAuthenticationError, PortainerConnectionError, PortainerTimeoutError, ) -import voluptuous as vol from homeassistant.const import ATTR_DEVICE_ID from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -28,24 +28,24 @@ ATTR_CONTAINER_DEVICE_ID = "container_device_id" SERVICE_PRUNE_IMAGES = "prune_images" -SERVICE_PRUNE_IMAGES_SCHEMA = vol.Schema( +SERVICE_PRUNE_IMAGES_SCHEMA = probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): cv.string, - vol.Optional(ATTR_DATE_UNTIL): vol.All( - cv.time_period, vol.Range(min=timedelta(minutes=1)) + probatio.Required(ATTR_DEVICE_ID): cv.string, + probatio.Optional(ATTR_DATE_UNTIL): probatio.All( + cv.time_period, probatio.Range(min=timedelta(minutes=1)) ), - vol.Optional(ATTR_DANGLING): cv.boolean, + probatio.Optional(ATTR_DANGLING): cv.boolean, }, ) SERVICE_RECREATE_CONTAINER = "recreate_container" -SERVICE_RECREATE_CONTAINER_SCHEMA = vol.Schema( +SERVICE_RECREATE_CONTAINER_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONTAINER_DEVICE_ID): cv.string, - vol.Optional(ATTR_TIMEOUT): vol.All( - cv.time_period, vol.Range(min=timedelta(minutes=1)) + probatio.Required(ATTR_CONTAINER_DEVICE_ID): cv.string, + probatio.Optional(ATTR_TIMEOUT): probatio.All( + cv.time_period, probatio.Range(min=timedelta(minutes=1)) ), - vol.Optional(ATTR_PULL_IMAGE): cv.boolean, + probatio.Optional(ATTR_PULL_IMAGE): cv.boolean, } ) diff --git a/homeassistant/components/powerfox/config_flow.py b/homeassistant/components/powerfox/config_flow.py index 94ddda9304d7d..d9f4387af157e 100644 --- a/homeassistant/components/powerfox/config_flow.py +++ b/homeassistant/components/powerfox/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from powerfox import Powerfox, PowerfoxAuthenticationError, PowerfoxConnectionError -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_RECONFIGURE, @@ -16,16 +16,16 @@ from .const import DOMAIN -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_EMAIL): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_EMAIL): str, + probatio.Required(CONF_PASSWORD): str, } ) -STEP_REAUTH_SCHEMA = vol.Schema( +STEP_REAUTH_SCHEMA = probatio.Schema( { - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/powerfox_local/config_flow.py b/homeassistant/components/powerfox_local/config_flow.py index fba973d6ba553..9ee08b703749f 100644 --- a/homeassistant/components/powerfox_local/config_flow.py +++ b/homeassistant/components/powerfox_local/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from powerfox import PowerfoxAuthenticationError, PowerfoxConnectionError, PowerfoxLocal -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_RECONFIGURE, @@ -18,16 +18,16 @@ from .const import DOMAIN -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_API_KEY): str, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_API_KEY): str, } ) -STEP_REAUTH_DATA_SCHEMA = vol.Schema( +STEP_REAUTH_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_KEY): str, + probatio.Required(CONF_API_KEY): str, } ) diff --git a/homeassistant/components/powerwall/config_flow.py b/homeassistant/components/powerwall/config_flow.py index 8fc147fdaf100..2843d8a8abd11 100644 --- a/homeassistant/components/powerwall/config_flow.py +++ b/homeassistant/components/powerwall/config_flow.py @@ -5,6 +5,7 @@ from typing import Any, override from aiohttp import CookieJar +import probatio from tesla_powerwall import ( AccessDeniedError, ApiError, @@ -12,7 +13,6 @@ Powerwall, PowerwallUnreachableError, ) -import voluptuous as vol from homeassistant.config_entries import ( ConfigEntry, @@ -283,10 +283,10 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_IP_ADDRESS, default=self.ip_address): str, - vol.Optional(CONF_PASSWORD): str, + probatio.Required(CONF_IP_ADDRESS, default=self.ip_address): str, + probatio.Optional(CONF_PASSWORD): str, } ), errors=errors, @@ -317,7 +317,7 @@ async def async_step_reauth_confirm( } return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema({vol.Optional(CONF_PASSWORD): str}), + data_schema=probatio.Schema({probatio.Optional(CONF_PASSWORD): str}), errors=errors, description_placeholders=description_placeholders, ) diff --git a/homeassistant/components/prana/config_flow.py b/homeassistant/components/prana/config_flow.py index 6971f32da65e9..e060365922f97 100644 --- a/homeassistant/components/prana/config_flow.py +++ b/homeassistant/components/prana/config_flow.py @@ -6,7 +6,7 @@ from prana_local_api_client.exceptions import PranaApiCommunicationError from prana_local_api_client.models.prana_device_info import PranaDeviceInfo from prana_local_api_client.prana_local_api_client import PranaLocalApiClient -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST @@ -16,9 +16,9 @@ _LOGGER = logging.getLogger(__name__) -USER_SCHEMA = vol.Schema( +USER_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, + probatio.Required(CONF_HOST): str, } ) diff --git a/homeassistant/components/private_ble_device/config_flow.py b/homeassistant/components/private_ble_device/config_flow.py index 2da8e4121b972..b65c8f5582149 100644 --- a/homeassistant/components/private_ble_device/config_flow.py +++ b/homeassistant/components/private_ble_device/config_flow.py @@ -5,7 +5,7 @@ import logging from typing import override -import voluptuous as vol +import probatio from homeassistant.components import bluetooth from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -70,7 +70,7 @@ async def async_step_user( data={CONF_IRK: irk_bytes.hex()}, ) - data_schema = vol.Schema({vol.Required(CONF_IRK): str}) + data_schema = probatio.Schema({probatio.Required(CONF_IRK): str}) return self.async_show_form( step_id="user", data_schema=data_schema, errors=errors ) diff --git a/homeassistant/components/probe_plus/config_flow.py b/homeassistant/components/probe_plus/config_flow.py index f019633ed04cf..bb28e3f790ff8 100644 --- a/homeassistant/components/probe_plus/config_flow.py +++ b/homeassistant/components/probe_plus/config_flow.py @@ -4,7 +4,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.bluetooth import ( BluetoothServiceInfo, @@ -118,9 +118,9 @@ async def async_step_user( } return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_ADDRESS): vol.In(titles), + probatio.Required(CONF_ADDRESS): probatio.In(titles), } ), ) diff --git a/homeassistant/components/profiler/services.py b/homeassistant/components/profiler/services.py index 34c217d4f4fd5..c2cd77d8d6319 100644 --- a/homeassistant/components/profiler/services.py +++ b/homeassistant/components/profiler/services.py @@ -15,7 +15,7 @@ from typing import Any, cast from lru import LRU -import voluptuous as vol +import probatio from homeassistant.components import persistent_notification from homeassistant.const import CONF_ENABLED, CONF_SCAN_INTERVAL, CONF_TYPE @@ -274,8 +274,8 @@ async def _async_asyncio_debug(call: ServiceCall) -> None: DOMAIN, SERVICE_START, _async_run_profile, - schema=vol.Schema( - {vol.Optional(CONF_SECONDS, default=60.0): vol.Coerce(float)} + schema=probatio.Schema( + {probatio.Optional(CONF_SECONDS, default=60.0): probatio.Coerce(float)} ), ) @@ -284,8 +284,8 @@ async def _async_asyncio_debug(call: ServiceCall) -> None: DOMAIN, SERVICE_MEMORY, _async_run_memory_profile, - schema=vol.Schema( - {vol.Optional(CONF_SECONDS, default=60.0): vol.Coerce(float)} + schema=probatio.Schema( + {probatio.Optional(CONF_SECONDS, default=60.0): probatio.Coerce(float)} ), ) @@ -294,9 +294,9 @@ async def _async_asyncio_debug(call: ServiceCall) -> None: DOMAIN, SERVICE_START_LOG_OBJECTS, _async_start_log_objects, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_SCAN_INTERVAL, default=DEFAULT_SCAN_INTERVAL ): cv.time_period } @@ -315,14 +315,14 @@ async def _async_asyncio_debug(call: ServiceCall) -> None: DOMAIN, SERVICE_START_LOG_OBJECT_SOURCES, _async_start_object_sources, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_SCAN_INTERVAL, default=DEFAULT_SCAN_INTERVAL ): cv.time_period, - vol.Optional(CONF_MAX_OBJECTS, default=DEFAULT_MAX_OBJECTS): vol.Range( - min=1, max=1024 - ), + probatio.Optional( + CONF_MAX_OBJECTS, default=DEFAULT_MAX_OBJECTS + ): probatio.Range(min=1, max=1024), } ), ) @@ -339,7 +339,7 @@ async def _async_asyncio_debug(call: ServiceCall) -> None: DOMAIN, SERVICE_DUMP_LOG_OBJECTS, _dump_log_objects, - schema=vol.Schema({vol.Required(CONF_TYPE): str}), + schema=probatio.Schema({probatio.Required(CONF_TYPE): str}), ) async_register_admin_service( @@ -375,7 +375,9 @@ async def _async_asyncio_debug(call: ServiceCall) -> None: DOMAIN, SERVICE_SET_ASYNCIO_DEBUG, _async_asyncio_debug, - schema=vol.Schema({vol.Optional(CONF_ENABLED, default=True): cv.boolean}), + schema=probatio.Schema( + {probatio.Optional(CONF_ENABLED, default=True): cv.boolean} + ), ) async_register_admin_service( diff --git a/homeassistant/components/progettihwsw/config_flow.py b/homeassistant/components/progettihwsw/config_flow.py index 95db83388c6df..17bbe73ed3a85 100644 --- a/homeassistant/components/progettihwsw/config_flow.py +++ b/homeassistant/components/progettihwsw/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import TYPE_CHECKING, Any, override +import probatio from ProgettiHWSW.ProgettiHWSWAPI import ProgettiHWSWAPI -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.core import HomeAssistant @@ -14,8 +14,8 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( - {vol.Required("host"): str, vol.Required("port", default=80): int} +DATA_SCHEMA = probatio.Schema( + {probatio.Required("host"): str, probatio.Required("port", default=80): int} ) @@ -60,18 +60,18 @@ async def async_step_relay_modes( relay_modes_schema = {} for i in range(1, int(self.s1_in["relay_count"]) + 1): - relay_modes_schema[vol.Required(f"relay_{i!s}", default="bistable")] = ( - vol.In( - { - "bistable": "Bistable (ON/OFF Mode)", - "monostable": "Monostable (Timer Mode)", - } - ) + relay_modes_schema[ + probatio.Required(f"relay_{i!s}", default="bistable") + ] = probatio.In( + { + "bistable": "Bistable (ON/OFF Mode)", + "monostable": "Monostable (Timer Mode)", + } ) return self.async_show_form( step_id="relay_modes", - data_schema=vol.Schema(relay_modes_schema), + data_schema=probatio.Schema(relay_modes_schema), errors=errors, ) diff --git a/homeassistant/components/proliphix/climate.py b/homeassistant/components/proliphix/climate.py index fd684692660f0..5c1b93abb61f4 100644 --- a/homeassistant/components/proliphix/climate.py +++ b/homeassistant/components/proliphix/climate.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio import proliphix -import voluptuous as vol from homeassistant.components.climate import ( PLATFORM_SCHEMA as CLIMATE_PLATFORM_SCHEMA, @@ -29,9 +29,9 @@ PLATFORM_SCHEMA = CLIMATE_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, } ) diff --git a/homeassistant/components/prometheus/__init__.py b/homeassistant/components/prometheus/__init__.py index d747c7b79aa19..b97a117634b3b 100644 --- a/homeassistant/components/prometheus/__init__.py +++ b/homeassistant/components/prometheus/__init__.py @@ -8,9 +8,9 @@ from typing import Any, cast from aiohttp import web +import probatio import prometheus_client from prometheus_client.metrics import MetricWrapperBase -import voluptuous as vol from homeassistant import core as hacore from homeassistant.components.alarm_control_panel import AlarmControlPanelState @@ -101,35 +101,37 @@ CONF_COMPONENT_CONFIG_DOMAIN = "component_config_domain" CONF_DEFAULT_METRIC = "default_metric" CONF_OVERRIDE_METRIC = "override_metric" -COMPONENT_CONFIG_SCHEMA_ENTRY = vol.Schema( - {vol.Optional(CONF_OVERRIDE_METRIC): cv.string} +COMPONENT_CONFIG_SCHEMA_ENTRY = probatio.Schema( + {probatio.Optional(CONF_OVERRIDE_METRIC): cv.string} ) ALLOWED_METRIC_CHARS = set(string.ascii_letters + string.digits + "_:") DEFAULT_NAMESPACE = "homeassistant" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.All( + DOMAIN: probatio.All( { - vol.Optional(CONF_FILTER, default={}): entityfilter.FILTER_SCHEMA, - vol.Optional(CONF_PROM_NAMESPACE, default=DEFAULT_NAMESPACE): cv.string, - vol.Optional(CONF_REQUIRES_AUTH, default=True): cv.boolean, - vol.Optional(CONF_DEFAULT_METRIC): cv.string, - vol.Optional(CONF_OVERRIDE_METRIC): cv.string, - vol.Optional(CONF_COMPONENT_CONFIG, default={}): vol.Schema( + probatio.Optional(CONF_FILTER, default={}): entityfilter.FILTER_SCHEMA, + probatio.Optional( + CONF_PROM_NAMESPACE, default=DEFAULT_NAMESPACE + ): cv.string, + probatio.Optional(CONF_REQUIRES_AUTH, default=True): cv.boolean, + probatio.Optional(CONF_DEFAULT_METRIC): cv.string, + probatio.Optional(CONF_OVERRIDE_METRIC): cv.string, + probatio.Optional(CONF_COMPONENT_CONFIG, default={}): probatio.Schema( {cv.entity_id: COMPONENT_CONFIG_SCHEMA_ENTRY} ), - vol.Optional(CONF_COMPONENT_CONFIG_GLOB, default={}): vol.Schema( - {cv.string: COMPONENT_CONFIG_SCHEMA_ENTRY} - ), - vol.Optional(CONF_COMPONENT_CONFIG_DOMAIN, default={}): vol.Schema( - {cv.string: COMPONENT_CONFIG_SCHEMA_ENTRY} - ), + probatio.Optional( + CONF_COMPONENT_CONFIG_GLOB, default={} + ): probatio.Schema({cv.string: COMPONENT_CONFIG_SCHEMA_ENTRY}), + probatio.Optional( + CONF_COMPONENT_CONFIG_DOMAIN, default={} + ): probatio.Schema({cv.string: COMPONENT_CONFIG_SCHEMA_ENTRY}), } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/prosegur/config_flow.py b/homeassistant/components/prosegur/config_flow.py index 7a324faf508f8..611ca71d26301 100644 --- a/homeassistant/components/prosegur/config_flow.py +++ b/homeassistant/components/prosegur/config_flow.py @@ -4,9 +4,9 @@ import logging from typing import Any, override +import probatio from pyprosegur.auth import COUNTRY, Auth from pyprosegur.installation import Installation -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_COUNTRY, CONF_PASSWORD, CONF_USERNAME @@ -18,11 +18,11 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Required(CONF_COUNTRY): selector.CountrySelector( + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Required(CONF_COUNTRY): selector.CountrySelector( selector.CountrySelectorConfig(countries=list(COUNTRY)) ), } @@ -97,9 +97,9 @@ async def async_step_choose_contract( return self.async_show_form( step_id="choose_contract", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_CONTRACT): selector.SelectSelector( + probatio.Required(CONF_CONTRACT): selector.SelectSelector( selector.SelectSelectorConfig(options=contract_options) ), } @@ -142,12 +142,12 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_USERNAME, default=reauth_entry.data[CONF_USERNAME] ): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, diff --git a/homeassistant/components/prowl/config_flow.py b/homeassistant/components/prowl/config_flow.py index 8dd4c5ac027bf..8c45fd6908f2d 100644 --- a/homeassistant/components/prowl/config_flow.py +++ b/homeassistant/components/prowl/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio import prowlpy -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY, CONF_NAME @@ -43,12 +43,12 @@ async def async_step_user( return self.async_show_form( step_id="user", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_API_KEY): str, + probatio.Required(CONF_API_KEY): str, # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Required(CONF_NAME): str, + probatio.Required(CONF_NAME): str, }, ), user_input or {CONF_NAME: "Prowl"}, diff --git a/homeassistant/components/prowl/notify.py b/homeassistant/components/prowl/notify.py index 51321eb048818..db03bd7333cc2 100644 --- a/homeassistant/components/prowl/notify.py +++ b/homeassistant/components/prowl/notify.py @@ -5,8 +5,8 @@ from typing import Any, override import httpx +import probatio import prowlpy -import voluptuous as vol from homeassistant.components.notify import ( ATTR_DATA, @@ -27,7 +27,9 @@ _LOGGER = logging.getLogger(__name__) -PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend({vol.Required(CONF_API_KEY): cv.string}) +PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( + {probatio.Required(CONF_API_KEY): cv.string} +) async def async_get_service( diff --git a/homeassistant/components/proximity/config_flow.py b/homeassistant/components/proximity/config_flow.py index 71b0803c32e77..26fe7fa56354c 100644 --- a/homeassistant/components/proximity/config_flow.py +++ b/homeassistant/components/proximity/config_flow.py @@ -2,7 +2,7 @@ from typing import Any, cast, override -import voluptuous as vol +import probatio from homeassistant.components.device_tracker import DOMAIN as DEVICE_TRACKER_DOMAIN from homeassistant.components.person import DOMAIN as PERSON_DOMAIN @@ -38,19 +38,19 @@ def _base_schema(user_input: dict[str, Any]) -> VolDictType: return { - vol.Required( + probatio.Required( CONF_TRACKED_ENTITIES, default=user_input.get(CONF_TRACKED_ENTITIES, []) ): EntitySelector( EntitySelectorConfig( domain=[DEVICE_TRACKER_DOMAIN, PERSON_DOMAIN], multiple=True ), ), - vol.Optional( + probatio.Optional( CONF_IGNORED_ZONES, default=user_input.get(CONF_IGNORED_ZONES, []) ): EntitySelector( EntitySelectorConfig(domain=ZONE_DOMAIN, multiple=True), ), - vol.Required( + probatio.Required( CONF_TOLERANCE, default=user_input.get(CONF_TOLERANCE, DEFAULT_TOLERANCE), ): NumberSelector( @@ -66,12 +66,14 @@ class ProximityConfigFlow(ConfigFlow, domain=DOMAIN): VERSION = 1 - def _user_form_schema(self, user_input: dict[str, Any] | None = None) -> vol.Schema: + def _user_form_schema( + self, user_input: dict[str, Any] | None = None + ) -> probatio.Schema: if user_input is None: user_input = {} - return vol.Schema( + return probatio.Schema( { - vol.Required( + probatio.Required( CONF_ZONE, default=user_input.get( CONF_ZONE, f"{ZONE_DOMAIN}.{DEFAULT_PROXIMITY_ZONE}" @@ -121,8 +123,8 @@ async def async_step_user( class ProximityOptionsFlow(OptionsFlowWithReload): """Handle a option flow.""" - def _user_form_schema(self, user_input: dict[str, Any]) -> vol.Schema: - return vol.Schema(_base_schema(user_input)) + def _user_form_schema(self, user_input: dict[str, Any]) -> probatio.Schema: + return probatio.Schema(_base_schema(user_input)) async def async_step_init( self, user_input: dict[str, Any] | None = None diff --git a/homeassistant/components/proxmoxve/config_flow.py b/homeassistant/components/proxmoxve/config_flow.py index 6a1a91b7fb205..5106f2425e29f 100644 --- a/homeassistant/components/proxmoxve/config_flow.py +++ b/homeassistant/components/proxmoxve/config_flow.py @@ -4,11 +4,11 @@ import logging from typing import Any, override +import probatio from proxmoxer import AuthenticationError, ProxmoxAPI from proxmoxer.core import ResourceException import requests from requests.exceptions import ConnectTimeout, SSLError -import voluptuous as vol from homeassistant.config_entries import ConfigEntry, ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -51,28 +51,28 @@ ) _LOGGER = logging.getLogger(__name__) -BASE_SCHEMA = vol.Schema( +BASE_SCHEMA = probatio.Schema( { - vol.Required(CONF_AUTH_METHOD, default=DEFAULT_REALM): SelectSelector( + probatio.Required(CONF_AUTH_METHOD, default=DEFAULT_REALM): SelectSelector( SelectSelectorConfig( options=AUTH_METHODS, translation_key=CONF_AUTH_METHOD, mode=SelectSelectorMode.DROPDOWN, ) ), - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_USERNAME): TextSelector( + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_USERNAME): TextSelector( TextSelectorConfig(type=TextSelectorType.TEXT, autocomplete="username") ), - vol.Required(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Required(CONF_TOKEN, default=False): cv.boolean, - vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Required(CONF_TOKEN, default=False): cv.boolean, + probatio.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, } ) -PASSWORD_SCHEMA = vol.Schema( +PASSWORD_SCHEMA = probatio.Schema( { - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", @@ -80,10 +80,10 @@ ), } ) -TOKEN_SCHEMA = vol.Schema( +TOKEN_SCHEMA = probatio.Schema( { - vol.Required(CONF_TOKEN_ID): cv.string, - vol.Required(CONF_TOKEN_SECRET): cv.string, + probatio.Required(CONF_TOKEN_ID): cv.string, + probatio.Required(CONF_TOKEN_SECRET): cv.string, } ) @@ -359,13 +359,13 @@ async def _validate_input( def _get_auth_schema( self, data: Mapping[str, Any], - ) -> vol.Schema: + ) -> probatio.Schema: """Return the auth schema based on the flow data.""" schema = PASSWORD_SCHEMA if data.get(CONF_TOKEN): schema = TOKEN_SCHEMA if data.get(CONF_AUTH_METHOD) == AUTH_OTHER: - schema = schema.extend({vol.Required(CONF_REALM): cv.string}) + schema = schema.extend({probatio.Required(CONF_REALM): cv.string}) return schema def _get_auth_updates( diff --git a/homeassistant/components/proxy/camera.py b/homeassistant/components/proxy/camera.py index 7f5d103480960..0318506b97d34 100644 --- a/homeassistant/components/proxy/camera.py +++ b/homeassistant/components/proxy/camera.py @@ -7,7 +7,7 @@ from typing import override from PIL import Image -import voluptuous as vol +import probatio from homeassistant.components.camera import ( PLATFORM_SCHEMA as CAMERA_PLATFORM_SCHEMA, @@ -46,20 +46,22 @@ PLATFORM_SCHEMA = CAMERA_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id, - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_CACHE_IMAGES, default=False): cv.boolean, - vol.Optional(CONF_FORCE_RESIZE, default=False): cv.boolean, - vol.Optional(CONF_MODE, default=MODE_RESIZE): vol.In([MODE_RESIZE, MODE_CROP]), - vol.Optional(CONF_IMAGE_QUALITY): int, - vol.Optional(CONF_IMAGE_REFRESH_RATE): float, - vol.Optional(CONF_MAX_IMAGE_WIDTH): int, - vol.Optional(CONF_MAX_IMAGE_HEIGHT): int, - vol.Optional(CONF_MAX_STREAM_WIDTH): int, - vol.Optional(CONF_MAX_STREAM_HEIGHT): int, - vol.Optional(CONF_IMAGE_LEFT): int, - vol.Optional(CONF_IMAGE_TOP): int, - vol.Optional(CONF_STREAM_QUALITY): int, + probatio.Required(CONF_ENTITY_ID): cv.entity_id, + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_CACHE_IMAGES, default=False): cv.boolean, + probatio.Optional(CONF_FORCE_RESIZE, default=False): cv.boolean, + probatio.Optional(CONF_MODE, default=MODE_RESIZE): probatio.In( + [MODE_RESIZE, MODE_CROP] + ), + probatio.Optional(CONF_IMAGE_QUALITY): int, + probatio.Optional(CONF_IMAGE_REFRESH_RATE): float, + probatio.Optional(CONF_MAX_IMAGE_WIDTH): int, + probatio.Optional(CONF_MAX_IMAGE_HEIGHT): int, + probatio.Optional(CONF_MAX_STREAM_WIDTH): int, + probatio.Optional(CONF_MAX_STREAM_HEIGHT): int, + probatio.Optional(CONF_IMAGE_LEFT): int, + probatio.Optional(CONF_IMAGE_TOP): int, + probatio.Optional(CONF_STREAM_QUALITY): int, } ) diff --git a/homeassistant/components/prusalink/config_flow.py b/homeassistant/components/prusalink/config_flow.py index f8ee8076fb32a..a816c0cdc37e6 100644 --- a/homeassistant/components/prusalink/config_flow.py +++ b/homeassistant/components/prusalink/config_flow.py @@ -6,9 +6,9 @@ from awesomeversion import AwesomeVersion, AwesomeVersionException from httpx import HTTPError, InvalidURL +import probatio from pyprusalink import PrusaLink from pyprusalink.types import InvalidAuth, VersionInfo -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME @@ -21,13 +21,13 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, + probatio.Required(CONF_HOST): str, # "maker" is currently hardcoded in the firmware # https://github.com/prusa3d/Prusa-Firmware-Buddy/blob/bfb0ffc745ee6546e7efdba618d0e7c0f4c909cd/lib/WUI/wui_api.h#L19 - vol.Required(CONF_USERNAME, default="maker"): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME, default="maker"): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/ps4/config_flow.py b/homeassistant/components/ps4/config_flow.py index 9e30e5355bf30..f724737a341fe 100644 --- a/homeassistant/components/ps4/config_flow.py +++ b/homeassistant/components/ps4/config_flow.py @@ -3,10 +3,10 @@ from collections import OrderedDict from typing import Any, override +import probatio from pyps4_2ndscreen.errors import CredentialTimeout from pyps4_2ndscreen.helpers import Helper from pyps4_2ndscreen.media_art import COUNTRIES -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -112,12 +112,14 @@ async def async_step_mode( if not errors: return await self.async_step_link() - mode_schema = OrderedDict[vol.Marker, Any]() - mode_schema[vol.Required(CONF_MODE, default=CONF_AUTO)] = vol.In(list(mode)) - mode_schema[vol.Optional(CONF_IP_ADDRESS)] = str + mode_schema = OrderedDict[probatio.Marker, Any]() + mode_schema[probatio.Required(CONF_MODE, default=CONF_AUTO)] = probatio.In( + list(mode) + ) + mode_schema[probatio.Optional(CONF_IP_ADDRESS)] = str return self.async_show_form( - step_id="mode", data_schema=vol.Schema(mode_schema), errors=errors + step_id="mode", data_schema=probatio.Schema(mode_schema), errors=errors ) async def async_step_link( @@ -206,15 +208,17 @@ async def async_step_link( default_region = country # Show User Input form. - link_schema = OrderedDict[vol.Marker, Any]() - link_schema[vol.Required(CONF_IP_ADDRESS)] = vol.In(list(self.device_list)) - link_schema[vol.Required(CONF_REGION, default=default_region)] = vol.In( - list(regions) + link_schema = OrderedDict[probatio.Marker, Any]() + link_schema[probatio.Required(CONF_IP_ADDRESS)] = probatio.In( + list(self.device_list) + ) + link_schema[probatio.Required(CONF_REGION, default=default_region)] = ( + probatio.In(list(regions)) ) - link_schema[vol.Required(CONF_CODE)] = vol.All( - vol.Strip, vol.Length(max=PIN_LENGTH), vol.Coerce(int) + link_schema[probatio.Required(CONF_CODE)] = probatio.All( + probatio.Strip, probatio.Length(max=PIN_LENGTH), probatio.Coerce(int) ) return self.async_show_form( - step_id="link", data_schema=vol.Schema(link_schema), errors=errors + step_id="link", data_schema=probatio.Schema(link_schema), errors=errors ) diff --git a/homeassistant/components/ps4/services.py b/homeassistant/components/ps4/services.py index dd655fd3fd70b..8d1c1ce8da610 100644 --- a/homeassistant/components/ps4/services.py +++ b/homeassistant/components/ps4/services.py @@ -1,6 +1,6 @@ """Support for PlayStation 4 consoles.""" -import voluptuous as vol +import probatio from homeassistant.const import ATTR_COMMAND, ATTR_ENTITY_ID from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -10,10 +10,10 @@ SERVICE_COMMAND = "send_command" -PS4_COMMAND_SCHEMA = vol.Schema( +PS4_COMMAND_SCHEMA = probatio.Schema( { - vol.Required(ATTR_ENTITY_ID): cv.entity_ids, - vol.Required(ATTR_COMMAND): vol.In(list(COMMANDS)), + probatio.Required(ATTR_ENTITY_ID): cv.entity_ids, + probatio.Required(ATTR_COMMAND): probatio.In(list(COMMANDS)), } ) diff --git a/homeassistant/components/ptdevices/config_flow.py b/homeassistant/components/ptdevices/config_flow.py index 307f12c6c924e..9070173407e2f 100644 --- a/homeassistant/components/ptdevices/config_flow.py +++ b/homeassistant/components/ptdevices/config_flow.py @@ -6,7 +6,7 @@ import aioptdevices from aioptdevices.configuration import Configuration from aioptdevices.interface import Interface -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_TOKEN @@ -18,9 +18,9 @@ _LOGGER = logging.getLogger(__name__) -_CONF_SCHEMA = vol.Schema( +_CONF_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_TOKEN): str, + probatio.Required(CONF_API_TOKEN): str, } ) diff --git a/homeassistant/components/pterodactyl/config_flow.py b/homeassistant/components/pterodactyl/config_flow.py index 148ad763ccf13..86a6cbe748505 100644 --- a/homeassistant/components/pterodactyl/config_flow.py +++ b/homeassistant/components/pterodactyl/config_flow.py @@ -4,7 +4,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from yarl import URL from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -21,16 +21,16 @@ DEFAULT_URL = "http://localhost:8080" -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_URL, default=DEFAULT_URL): str, - vol.Required(CONF_API_KEY): str, + probatio.Required(CONF_URL, default=DEFAULT_URL): str, + probatio.Required(CONF_API_KEY): str, } ) -STEP_REAUTH_DATA_SCHEMA = vol.Schema( +STEP_REAUTH_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_KEY): str, + probatio.Required(CONF_API_KEY): str, } ) diff --git a/homeassistant/components/pulseaudio_loopback/switch.py b/homeassistant/components/pulseaudio_loopback/switch.py index 272a338f879bf..0f35ab7af56e9 100644 --- a/homeassistant/components/pulseaudio_loopback/switch.py +++ b/homeassistant/components/pulseaudio_loopback/switch.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from pulsectl import Pulse, PulseError -import voluptuous as vol from homeassistant.components.switch import ( PLATFORM_SCHEMA as SWITCH_PLATFORM_SCHEMA, @@ -30,11 +30,11 @@ PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_SINK_NAME): cv.string, - vol.Required(CONF_SOURCE_NAME): cv.string, - vol.Optional(CONF_HOST): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Required(CONF_SINK_NAME): cv.string, + probatio.Required(CONF_SOURCE_NAME): cv.string, + probatio.Optional(CONF_HOST): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, } ) diff --git a/homeassistant/components/pure_energie/config_flow.py b/homeassistant/components/pure_energie/config_flow.py index 64f4e19a783a7..6e8cf8f2e730e 100644 --- a/homeassistant/components/pure_energie/config_flow.py +++ b/homeassistant/components/pure_energie/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override from gridnet import Device, GridNet, GridNetConnectionError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_NAME @@ -48,9 +48,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST): TextSelector(), + probatio.Required(CONF_HOST): TextSelector(), } ), errors=errors or {}, diff --git a/homeassistant/components/purpleair/config_flow.py b/homeassistant/components/purpleair/config_flow.py index 518ab03a541b3..782f9ffe530de 100644 --- a/homeassistant/components/purpleair/config_flow.py +++ b/homeassistant/components/purpleair/config_flow.py @@ -9,7 +9,7 @@ from aiopurpleair import API from aiopurpleair.endpoints.sensors import NearbySensorResult from aiopurpleair.errors import InvalidApiKeyError, PurpleAirError -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -47,9 +47,9 @@ DEFAULT_DISTANCE = 5 -API_KEY_SCHEMA = vol.Schema( +API_KEY_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_API_KEY): cv.string, } ) @@ -62,17 +62,17 @@ def async_get_api(hass: HomeAssistant, api_key: str) -> API: @callback -def async_get_coordinates_schema(hass: HomeAssistant) -> vol.Schema: +def async_get_coordinates_schema(hass: HomeAssistant) -> probatio.Schema: """Define a schema for searching for sensors near a coordinate pair.""" - return vol.Schema( + return probatio.Schema( { - vol.Inclusive( + probatio.Inclusive( CONF_LATITUDE, "coords", default=hass.config.latitude ): cv.latitude, - vol.Inclusive( + probatio.Inclusive( CONF_LONGITUDE, "coords", default=hass.config.longitude ): cv.longitude, - vol.Optional(CONF_DISTANCE, default=DEFAULT_DISTANCE): cv.positive_int, + probatio.Optional(CONF_DISTANCE, default=DEFAULT_DISTANCE): cv.positive_int, } ) @@ -91,11 +91,11 @@ def async_get_nearby_sensors_options( @callback -def async_get_nearby_sensors_schema(options: list[SelectOptionDict]) -> vol.Schema: +def async_get_nearby_sensors_schema(options: list[SelectOptionDict]) -> probatio.Schema: """Define a schema for selecting a sensor from a list.""" - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_SENSOR_INDEX): SelectSelector( + probatio.Required(CONF_SENSOR_INDEX): SelectSelector( SelectSelectorConfig(options=options, mode=SelectSelectorMode.DROPDOWN) ) } @@ -117,11 +117,11 @@ def async_get_remove_sensor_options( @callback -def async_get_remove_sensor_schema(sensors: list[SelectOptionDict]) -> vol.Schema: +def async_get_remove_sensor_schema(sensors: list[SelectOptionDict]) -> probatio.Schema: """Define a schema removing a sensor.""" - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_SENSOR_DEVICE_ID): SelectSelector( + probatio.Required(CONF_SENSOR_DEVICE_ID): SelectSelector( SelectSelectorConfig(options=sensors, mode=SelectSelectorMode.DROPDOWN) ) } @@ -320,11 +320,11 @@ def __init__(self) -> None: self._flow_data: dict[str, Any] = {} @property - def settings_schema(self) -> vol.Schema: + def settings_schema(self) -> probatio.Schema: """Return the settings schema.""" - return vol.Schema( + return probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_SHOW_ON_MAP, description={ "suggested_value": self.config_entry.options.get( diff --git a/homeassistant/components/push/camera.py b/homeassistant/components/push/camera.py index 2d990759c527b..0848e19b97a55 100644 --- a/homeassistant/components/push/camera.py +++ b/homeassistant/components/push/camera.py @@ -7,7 +7,7 @@ from typing import Any, cast, override from aiohttp import web -import voluptuous as vol +import probatio from homeassistant.components import webhook from homeassistant.components.camera import ( @@ -38,13 +38,13 @@ PLATFORM_SCHEMA = CAMERA_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_BUFFER_SIZE, default=1): cv.positive_int, - vol.Optional(CONF_TIMEOUT, default=timedelta(seconds=5)): vol.All( + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_BUFFER_SIZE, default=1): cv.positive_int, + probatio.Optional(CONF_TIMEOUT, default=timedelta(seconds=5)): probatio.All( cv.time_period, cv.positive_timedelta ), - vol.Optional(CONF_IMAGE_FIELD, default="image"): cv.string, - vol.Required(CONF_WEBHOOK_ID): cv.string, + probatio.Optional(CONF_IMAGE_FIELD, default="image"): cv.string, + probatio.Required(CONF_WEBHOOK_ID): cv.string, } ) diff --git a/homeassistant/components/pushbullet/config_flow.py b/homeassistant/components/pushbullet/config_flow.py index e836da8ebab59..705c45ab54f4f 100644 --- a/homeassistant/components/pushbullet/config_flow.py +++ b/homeassistant/components/pushbullet/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from pushbullet import InvalidKeyError, PushBullet, PushbulletError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY, CONF_NAME @@ -11,12 +11,12 @@ from .const import DEFAULT_NAME, DOMAIN -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Optional(CONF_NAME, default=DEFAULT_NAME): selector.TextSelector(), - vol.Required(CONF_API_KEY): selector.TextSelector(), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): selector.TextSelector(), + probatio.Required(CONF_API_KEY): selector.TextSelector(), } ) diff --git a/homeassistant/components/pushover/__init__.py b/homeassistant/components/pushover/__init__.py index 1a27469ba354b..08afe497c9e16 100644 --- a/homeassistant/components/pushover/__init__.py +++ b/homeassistant/components/pushover/__init__.py @@ -3,10 +3,10 @@ from dataclasses import dataclass from typing import TYPE_CHECKING +import probatio from pushover_complete import BadAPIRequestError, PushoverAPI from requests.exceptions import RequestException from urllib3.exceptions import HTTPError -import voluptuous as vol from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_API_KEY, CONF_NAME, Platform @@ -35,10 +35,10 @@ CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN) -SERVICE_CANCEL_SCHEMA = vol.Schema( +SERVICE_CANCEL_SCHEMA = probatio.Schema( { - vol.Required(ATTR_ENTRY_ID): cv.string, - vol.Optional(ATTR_TAG): cv.string, + probatio.Required(ATTR_ENTRY_ID): cv.string, + probatio.Optional(ATTR_TAG): cv.string, } ) diff --git a/homeassistant/components/pushover/config_flow.py b/homeassistant/components/pushover/config_flow.py index 99c7f4422720a..b9760105c1f0c 100644 --- a/homeassistant/components/pushover/config_flow.py +++ b/homeassistant/components/pushover/config_flow.py @@ -3,8 +3,8 @@ from collections.abc import Mapping from typing import Any, override +import probatio from pushover_complete import BadAPIRequestError, PushoverAPI -import voluptuous as vol from homeassistant.config_entries import ConfigEntry, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY, CONF_NAME @@ -12,13 +12,13 @@ from .const import CONF_USER_KEY, DEFAULT_NAME, DOMAIN -USER_SCHEMA = vol.Schema( +USER_SCHEMA = probatio.Schema( { # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Optional(CONF_NAME, default=DEFAULT_NAME): str, - vol.Required(CONF_API_KEY): str, - vol.Required(CONF_USER_KEY): str, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): str, + probatio.Required(CONF_API_KEY): str, + probatio.Required(CONF_USER_KEY): str, } ) @@ -76,9 +76,9 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_API_KEY): str, + probatio.Required(CONF_API_KEY): str, } ), errors=errors, diff --git a/homeassistant/components/pushsafer/notify.py b/homeassistant/components/pushsafer/notify.py index ca975329670a9..0e88168cb1d22 100644 --- a/homeassistant/components/pushsafer/notify.py +++ b/homeassistant/components/pushsafer/notify.py @@ -6,9 +6,9 @@ import mimetypes from typing import Any, override +import probatio import requests from requests.auth import HTTPBasicAuth -import voluptuous as vol from homeassistant.components.notify import ( ATTR_DATA, @@ -54,7 +54,7 @@ ATTR_PICTURE1_AUTH = "auth" PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_DEVICE_KEY): cv.string} + {probatio.Required(CONF_DEVICE_KEY): cv.string} ) diff --git a/homeassistant/components/pvoutput/config_flow.py b/homeassistant/components/pvoutput/config_flow.py index 7d619c398b33e..f2197505c4dcb 100644 --- a/homeassistant/components/pvoutput/config_flow.py +++ b/homeassistant/components/pvoutput/config_flow.py @@ -3,8 +3,8 @@ from collections.abc import Mapping from typing import Any, override +import probatio from pvo import PVOutput, PVOutputAuthenticationError, PVOutputError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY @@ -67,12 +67,12 @@ async def async_step_user( description_placeholders={ "account_url": "https://pvoutput.org/account.jsp" }, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_API_KEY, default=user_input.get(CONF_API_KEY, "") ): str, - vol.Required( + probatio.Required( CONF_SYSTEM_ID, default=user_input.get(CONF_SYSTEM_ID, "") ): int, } @@ -111,9 +111,9 @@ async def async_step_reconfigure( description_placeholders={ "account_url": "https://pvoutput.org/account.jsp" }, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_API_KEY): str, + probatio.Required(CONF_API_KEY): str, } ), errors=errors, @@ -153,6 +153,6 @@ async def async_step_reauth_confirm( description_placeholders={ "account_url": "https://pvoutput.org/account.jsp" }, - data_schema=vol.Schema({vol.Required(CONF_API_KEY): str}), + data_schema=probatio.Schema({probatio.Required(CONF_API_KEY): str}), errors=errors, ) diff --git a/homeassistant/components/pvpc_hourly_pricing/config_flow.py b/homeassistant/components/pvpc_hourly_pricing/config_flow.py index 221c58e3d5d92..bac6ad1dbba55 100644 --- a/homeassistant/components/pvpc_hourly_pricing/config_flow.py +++ b/homeassistant/components/pvpc_hourly_pricing/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from esios_api import DEFAULT_POWER_KW, PVPCData -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -84,12 +84,12 @@ async def async_step_user( self._use_api_token = user_input[CONF_USE_API_TOKEN] return await self.async_step_api_token() - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(ATTR_TARIFF, default=DEFAULT_TARIFF): VALID_TARIFF, - vol.Required(ATTR_POWER, default=DEFAULT_POWER_KW): VALID_POWER, - vol.Required(ATTR_POWER_P3, default=DEFAULT_POWER_KW): VALID_POWER, - vol.Required(CONF_USE_API_TOKEN, default=False): bool, + probatio.Required(ATTR_TARIFF, default=DEFAULT_TARIFF): VALID_TARIFF, + probatio.Required(ATTR_POWER, default=DEFAULT_POWER_KW): VALID_POWER, + probatio.Required(ATTR_POWER_P3, default=DEFAULT_POWER_KW): VALID_POWER, + probatio.Required(CONF_USE_API_TOKEN, default=False): bool, } ) return self.async_show_form(step_id="user", data_schema=data_schema) @@ -102,20 +102,20 @@ async def async_step_api_token( self._api_token = user_input[CONF_API_TOKEN] return await self._async_verify( "api_token", - data_schema=vol.Schema( - {vol.Required(CONF_API_TOKEN, default=self._api_token): str} + data_schema=probatio.Schema( + {probatio.Required(CONF_API_TOKEN, default=self._api_token): str} ), ) return self.async_show_form( step_id="api_token", - data_schema=vol.Schema( - {vol.Required(CONF_API_TOKEN, default=self._api_token): str} + data_schema=probatio.Schema( + {probatio.Required(CONF_API_TOKEN, default=self._api_token): str} ), description_placeholders={"mail_to_link": _MAIL_TO_LINK}, ) async def _async_verify( - self, step_id: str, data_schema: vol.Schema + self, step_id: str, data_schema: probatio.Schema ) -> ConfigFlowResult: """Attempt to verify the provided configuration.""" errors: dict[str, str] = {} @@ -163,10 +163,12 @@ async def async_step_reauth_confirm( self, user_input: dict[str, Any] | None = None ) -> ConfigFlowResult: """Confirm reauth dialog.""" - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_USE_API_TOKEN, default=self._use_api_token): bool, - vol.Optional(CONF_API_TOKEN, default=self._api_token): str, + probatio.Required( + CONF_USE_API_TOKEN, default=self._use_api_token + ): bool, + probatio.Optional(CONF_API_TOKEN, default=self._api_token): str, } ) if user_input: @@ -202,8 +204,8 @@ async def async_step_api_token( ) return self.async_show_form( step_id="api_token", - data_schema=vol.Schema( - {vol.Required(CONF_API_TOKEN, default=api_token): str} + data_schema=probatio.Schema( + {probatio.Required(CONF_API_TOKEN, default=api_token): str} ), description_placeholders={"mail_to_link": _MAIL_TO_LINK}, ) @@ -233,11 +235,11 @@ async def async_step_init( power_valley = options.get(ATTR_POWER_P3, data[ATTR_POWER_P3]) api_token = options.get(CONF_API_TOKEN, data.get(CONF_API_TOKEN)) use_api_token = api_token is not None - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required(ATTR_POWER, default=power): VALID_POWER, - vol.Required(ATTR_POWER_P3, default=power_valley): VALID_POWER, - vol.Required(CONF_USE_API_TOKEN, default=use_api_token): bool, + probatio.Required(ATTR_POWER, default=power): VALID_POWER, + probatio.Required(ATTR_POWER_P3, default=power_valley): VALID_POWER, + probatio.Required(CONF_USE_API_TOKEN, default=use_api_token): bool, } ) return self.async_show_form(step_id="init", data_schema=schema) diff --git a/homeassistant/components/pvpc_hourly_pricing/const.py b/homeassistant/components/pvpc_hourly_pricing/const.py index b4f23c1ac66ea..2142408d1c2bc 100644 --- a/homeassistant/components/pvpc_hourly_pricing/const.py +++ b/homeassistant/components/pvpc_hourly_pricing/const.py @@ -1,7 +1,7 @@ """Constant values for pvpc_hourly_pricing.""" from esios_api.const import TARIFFS -import voluptuous as vol +import probatio DOMAIN = "pvpc_hourly_pricing" @@ -11,6 +11,6 @@ DEFAULT_NAME = "PVPC" CONF_USE_API_TOKEN = "use_api_token" -VALID_POWER = vol.All(vol.Coerce(float), vol.Range(min=1.0, max=15.0)) -VALID_TARIFF = vol.In(TARIFFS) +VALID_POWER = probatio.All(probatio.Coerce(float), probatio.Range(min=1.0, max=15.0)) +VALID_TARIFF = probatio.In(TARIFFS) DEFAULT_TARIFF = TARIFFS[0] diff --git a/homeassistant/components/pyload/config_flow.py b/homeassistant/components/pyload/config_flow.py index d418577e3be74..615f834a1c571 100644 --- a/homeassistant/components/pyload/config_flow.py +++ b/homeassistant/components/pyload/config_flow.py @@ -5,8 +5,8 @@ from typing import Any, override from aiohttp import CookieJar +import probatio from pyloadapi import CannotConnect, InvalidAuth, ParserError, PyLoadAPI -import voluptuous as vol from yarl import URL from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -31,23 +31,23 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_URL): TextSelector( + probatio.Required(CONF_URL): TextSelector( TextSelectorConfig( type=TextSelectorType.URL, autocomplete="url", ), ), - vol.Required(CONF_VERIFY_SSL, default=True): bool, - vol.Exclusive(CONF_API_KEY, "credentials"): cv.string, - vol.Exclusive(CONF_USERNAME, "credentials"): TextSelector( + probatio.Required(CONF_VERIFY_SSL, default=True): bool, + probatio.Exclusive(CONF_API_KEY, "credentials"): cv.string, + probatio.Exclusive(CONF_USERNAME, "credentials"): TextSelector( TextSelectorConfig( type=TextSelectorType.TEXT, autocomplete="username", ), ), - vol.Optional(CONF_PASSWORD): TextSelector( + probatio.Optional(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", @@ -56,16 +56,16 @@ } ) -REAUTH_SCHEMA = vol.Schema( +REAUTH_SCHEMA = probatio.Schema( { - vol.Exclusive(CONF_API_KEY, "credentials"): cv.string, - vol.Exclusive(CONF_USERNAME, "credentials"): TextSelector( + probatio.Exclusive(CONF_API_KEY, "credentials"): cv.string, + probatio.Exclusive(CONF_USERNAME, "credentials"): TextSelector( TextSelectorConfig( type=TextSelectorType.TEXT, autocomplete="username", ), ), - vol.Optional(CONF_PASSWORD): TextSelector( + probatio.Optional(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", diff --git a/homeassistant/components/python_script/__init__.py b/homeassistant/components/python_script/__init__.py index dfe8947411aab..7fb327f1fd820 100644 --- a/homeassistant/components/python_script/__init__.py +++ b/homeassistant/components/python_script/__init__.py @@ -11,6 +11,7 @@ import types from typing import TYPE_CHECKING, Any +import probatio from RestrictedPython import ( compile_restricted_exec, limited_builtins, @@ -23,7 +24,6 @@ guarded_iter_unpack_sequence, guarded_unpack_sequence, ) -import voluptuous as vol from homeassistant.const import CONF_DESCRIPTION, CONF_NAME, SERVICE_RELOAD from homeassistant.core import ( @@ -44,7 +44,9 @@ FOLDER = "python_scripts" -CONFIG_SCHEMA = vol.Schema({DOMAIN: vol.Schema(dict)}, extra=vol.ALLOW_EXTRA) +CONFIG_SCHEMA = probatio.Schema( + {DOMAIN: probatio.Schema(dict)}, extra=probatio.ALLOW_EXTRA +) ALLOWED_HASS = {"bus", "services", "states"} ALLOWED_EVENTBUS = {"fire"} diff --git a/homeassistant/components/qbittorrent/config_flow.py b/homeassistant/components/qbittorrent/config_flow.py index 4b7137a9d2e52..b0204177729ce 100644 --- a/homeassistant/components/qbittorrent/config_flow.py +++ b/homeassistant/components/qbittorrent/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from qbittorrentapi import APIConnectionError, Forbidden403Error, LoginFailed -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_URL, CONF_USERNAME, CONF_VERIFY_SSL @@ -14,12 +14,12 @@ _LOGGER = logging.getLogger(__name__) -USER_DATA_SCHEMA = vol.Schema( +USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_URL, default=DEFAULT_URL): str, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Optional(CONF_VERIFY_SSL, default=True): bool, + probatio.Required(CONF_URL, default=DEFAULT_URL): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Optional(CONF_VERIFY_SSL, default=True): bool, } ) diff --git a/homeassistant/components/qingping/config_flow.py b/homeassistant/components/qingping/config_flow.py index 9c27be47c3942..85cb6efd251e9 100644 --- a/homeassistant/components/qingping/config_flow.py +++ b/homeassistant/components/qingping/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from qingping_ble import QingpingBluetoothDeviceData as DeviceData -import voluptuous as vol from homeassistant.components import bluetooth from homeassistant.components.bluetooth import ( @@ -116,7 +116,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_ADDRESS): vol.In(self._discovered_devices)} + data_schema=probatio.Schema( + {probatio.Required(CONF_ADDRESS): probatio.In(self._discovered_devices)} ), ) diff --git a/homeassistant/components/qld_bushfire/geo_location.py b/homeassistant/components/qld_bushfire/geo_location.py index 3858f3971f1dd..3c2e2122d1fbf 100644 --- a/homeassistant/components/qld_bushfire/geo_location.py +++ b/homeassistant/components/qld_bushfire/geo_location.py @@ -9,7 +9,7 @@ QldBushfireAlertFeedEntry, QldBushfireAlertFeedManager, ) -import voluptuous as vol +import probatio from homeassistant.components.geo_location import ( PLATFORM_SCHEMA as GEO_LOCATION_PLATFORM_SCHEMA, @@ -59,11 +59,13 @@ PLATFORM_SCHEMA = GEO_LOCATION_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_LATITUDE): cv.latitude, - vol.Optional(CONF_LONGITUDE): cv.longitude, - vol.Optional(CONF_RADIUS, default=DEFAULT_RADIUS_IN_KM): vol.Coerce(float), - vol.Optional(CONF_CATEGORIES, default=[]): vol.All( - cv.ensure_list, [vol.In(VALID_CATEGORIES)] + probatio.Optional(CONF_LATITUDE): cv.latitude, + probatio.Optional(CONF_LONGITUDE): cv.longitude, + probatio.Optional(CONF_RADIUS, default=DEFAULT_RADIUS_IN_KM): probatio.Coerce( + float + ), + probatio.Optional(CONF_CATEGORIES, default=[]): probatio.All( + cv.ensure_list, [probatio.In(VALID_CATEGORIES)] ), } ) diff --git a/homeassistant/components/qnap/config_flow.py b/homeassistant/components/qnap/config_flow.py index 6d6c8507d26fa..a5358c3176478 100644 --- a/homeassistant/components/qnap/config_flow.py +++ b/homeassistant/components/qnap/config_flow.py @@ -3,9 +3,9 @@ import logging from typing import Any, override +import probatio from qnapstats import QNAPStats from requests.exceptions import ConnectTimeout -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -26,14 +26,14 @@ DOMAIN, ) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, - vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, + probatio.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, } ) diff --git a/homeassistant/components/qnap_qsw/config_flow.py b/homeassistant/components/qnap_qsw/config_flow.py index 53facefaff77e..f04438b4c35e3 100644 --- a/homeassistant/components/qnap_qsw/config_flow.py +++ b/homeassistant/components/qnap_qsw/config_flow.py @@ -5,7 +5,7 @@ from aioqsw.exceptions import LoginError, QswError from aioqsw.localapi import ConnectionOptions, QnapQswApi -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_URL, CONF_USERNAME @@ -61,11 +61,11 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_URL): str, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_URL): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, @@ -127,10 +127,10 @@ async def async_step_discovered_connection( return self.async_show_form( step_id="discovered_connection", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, diff --git a/homeassistant/components/quantum_gateway/device_tracker.py b/homeassistant/components/quantum_gateway/device_tracker.py index 80d196dc6e084..93a97de994012 100644 --- a/homeassistant/components/quantum_gateway/device_tracker.py +++ b/homeassistant/components/quantum_gateway/device_tracker.py @@ -2,9 +2,9 @@ from typing import override +import probatio from quantum_gateway import QuantumGatewayScanner from requests.exceptions import RequestException -import voluptuous as vol from homeassistant.components.device_tracker import ( DOMAIN as DEVICE_TRACKER_DOMAIN, @@ -20,9 +20,9 @@ PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, - vol.Optional(CONF_SSL, default=True): cv.boolean, - vol.Required(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, + probatio.Optional(CONF_SSL, default=True): cv.boolean, + probatio.Required(CONF_PASSWORD): cv.string, } ) diff --git a/homeassistant/components/qvr_pro/__init__.py b/homeassistant/components/qvr_pro/__init__.py index 98f0bcbaf99a1..9dbfbcd97fb41 100644 --- a/homeassistant/components/qvr_pro/__init__.py +++ b/homeassistant/components/qvr_pro/__init__.py @@ -2,10 +2,10 @@ import logging +import probatio from pyqvrpro import Client from pyqvrpro.client import AuthenticationError, InsufficientPermissionsError from requests.exceptions import ConnectionError as RequestsConnectionError -import voluptuous as vol from homeassistant.const import ( CONF_HOST, @@ -32,25 +32,25 @@ _LOGGER = logging.getLogger(__name__) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_EXCLUDE_CHANNELS, default=[]): vol.All( + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_EXCLUDE_CHANNELS, default=[]): probatio.All( cv.ensure_list_csv, [cv.positive_int] ), } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -SERVICE_CHANNEL_RECORD_SCHEMA = vol.Schema( - {vol.Required(SERVICE_CHANNEL_GUID): cv.string} +SERVICE_CHANNEL_RECORD_SCHEMA = probatio.Schema( + {probatio.Required(SERVICE_CHANNEL_GUID): cv.string} ) diff --git a/homeassistant/components/qwikswitch/__init__.py b/homeassistant/components/qwikswitch/__init__.py index aafb718fc60c4..9627efc870066 100644 --- a/homeassistant/components/qwikswitch/__init__.py +++ b/homeassistant/components/qwikswitch/__init__.py @@ -2,9 +2,9 @@ import logging +import probatio from pyqwikswitch.async_ import QSUsb from pyqwikswitch.qwikswitch import CMD_BUTTONS, QS_CMD, QS_ID, SENSORS, QSType -import voluptuous as vol from homeassistant.components.binary_sensor import DEVICE_CLASSES_SCHEMA from homeassistant.const import ( @@ -28,38 +28,40 @@ CONF_DIMMER_ADJUST = "dimmer_adjust" CONF_BUTTON_EVENTS = "button_events" -CV_DIM_VALUE = vol.All(vol.Coerce(float), vol.Range(min=1, max=3)) +CV_DIM_VALUE = probatio.All(probatio.Coerce(float), probatio.Range(min=1, max=3)) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_URL, default="http://127.0.0.1:2020"): vol.Coerce( - str - ), - vol.Optional(CONF_DIMMER_ADJUST, default=1): CV_DIM_VALUE, - vol.Optional(CONF_BUTTON_EVENTS, default=[]): cv.ensure_list_csv, - vol.Optional(CONF_SENSORS, default=[]): vol.All( + probatio.Required( + CONF_URL, default="http://127.0.0.1:2020" + ): probatio.Coerce(str), + probatio.Optional(CONF_DIMMER_ADJUST, default=1): CV_DIM_VALUE, + probatio.Optional(CONF_BUTTON_EVENTS, default=[]): cv.ensure_list_csv, + probatio.Optional(CONF_SENSORS, default=[]): probatio.All( cv.ensure_list, [ - vol.Schema( + probatio.Schema( { - vol.Required("id"): str, - vol.Optional("channel", default=1): int, - vol.Required("name"): str, - vol.Required("type"): str, - vol.Optional("class"): DEVICE_CLASSES_SCHEMA, - vol.Optional("invert"): bool, + probatio.Required("id"): str, + probatio.Optional("channel", default=1): int, + probatio.Required("name"): str, + probatio.Required("type"): str, + probatio.Optional("class"): DEVICE_CLASSES_SCHEMA, + probatio.Optional("invert"): bool, } ) ], ), - vol.Optional(CONF_SWITCHES, default=[]): vol.All(cv.ensure_list, [str]), + probatio.Optional(CONF_SWITCHES, default=[]): probatio.All( + cv.ensure_list, [str] + ), } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/rabbitair/config_flow.py b/homeassistant/components/rabbitair/config_flow.py index 46aa342c29c5d..761a42428af55 100644 --- a/homeassistant/components/rabbitair/config_flow.py +++ b/homeassistant/components/rabbitair/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from rabbitair import UdpClient -import voluptuous as vol from homeassistant.components import zeroconf from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -87,11 +87,11 @@ async def async_step_user( token = user_input.get(CONF_ACCESS_TOKEN) return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST, default=host): str, - vol.Required(CONF_ACCESS_TOKEN, default=token): vol.All( - str, vol.Length(min=32, max=32) + probatio.Required(CONF_HOST, default=host): str, + probatio.Required(CONF_ACCESS_TOKEN, default=token): probatio.All( + str, probatio.Length(min=32, max=32) ), } ), diff --git a/homeassistant/components/rachio/config_flow.py b/homeassistant/components/rachio/config_flow.py index 882d3256b97fa..9fe9ba4465ec4 100644 --- a/homeassistant/components/rachio/config_flow.py +++ b/homeassistant/components/rachio/config_flow.py @@ -4,9 +4,9 @@ import logging from typing import Any, override +import probatio from rachiopy import Rachio from requests.exceptions import ConnectTimeout -import voluptuous as vol from homeassistant.config_entries import ( ConfigEntry, @@ -33,7 +33,9 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema({vol.Required(CONF_API_KEY): str}, extra=vol.ALLOW_EXTRA) +DATA_SCHEMA = probatio.Schema( + {probatio.Required(CONF_API_KEY): str}, extra=probatio.ALLOW_EXTRA +) async def validate_input(hass: HomeAssistant, data): @@ -128,9 +130,9 @@ async def async_step_init( if user_input is not None: return self.async_create_entry(title="", data=user_input) - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_MANUAL_RUN_MINS, default=self.config_entry.options.get( CONF_MANUAL_RUN_MINS, DEFAULT_MANUAL_RUN_MINS diff --git a/homeassistant/components/rachio/services.py b/homeassistant/components/rachio/services.py index 1e30e85e4645d..ca375098c7972 100644 --- a/homeassistant/components/rachio/services.py +++ b/homeassistant/components/rachio/services.py @@ -2,7 +2,7 @@ import logging -import voluptuous as vol +import probatio from homeassistant.const import ATTR_ENTITY_ID, ATTR_ID, Platform from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -30,23 +30,23 @@ ATTR_DURATION = "duration" ATTR_SORT_ORDER = "sortOrder" -PAUSE_SERVICE_SCHEMA = vol.Schema( +PAUSE_SERVICE_SCHEMA = probatio.Schema( { - vol.Optional(ATTR_DEVICES): cv.string, - vol.Optional(ATTR_DURATION, default=60): cv.positive_int, + probatio.Optional(ATTR_DEVICES): cv.string, + probatio.Optional(ATTR_DURATION, default=60): cv.positive_int, } ) -RESUME_SERVICE_SCHEMA = vol.Schema({vol.Optional(ATTR_DEVICES): cv.string}) +RESUME_SERVICE_SCHEMA = probatio.Schema({probatio.Optional(ATTR_DEVICES): cv.string}) -START_MULTIPLE_ZONES_SCHEMA = vol.Schema( +START_MULTIPLE_ZONES_SCHEMA = probatio.Schema( { - vol.Required(ATTR_ENTITY_ID): cv.entity_ids, - vol.Required(ATTR_DURATION): cv.ensure_list_csv, + probatio.Required(ATTR_ENTITY_ID): cv.entity_ids, + probatio.Required(ATTR_DURATION): cv.ensure_list_csv, } ) -STOP_SERVICE_SCHEMA = vol.Schema({vol.Optional(ATTR_DEVICES): cv.string}) +STOP_SERVICE_SCHEMA = probatio.Schema({probatio.Optional(ATTR_DEVICES): cv.string}) def _stop_water(call: ServiceCall) -> None: diff --git a/homeassistant/components/rachio/switch.py b/homeassistant/components/rachio/switch.py index 02acfb268e796..c0fe5dbc1ac4c 100644 --- a/homeassistant/components/rachio/switch.py +++ b/homeassistant/components/rachio/switch.py @@ -6,7 +6,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.switch import SwitchEntity from homeassistant.core import CALLBACK_TYPE, HomeAssistant, callback @@ -102,7 +102,7 @@ async def async_setup_entry( platform.async_register_entity_service( SERVICE_START_WATERING, { - vol.Optional(ATTR_DURATION): cv.positive_int, + probatio.Optional(ATTR_DURATION): cv.positive_int, }, "turn_on", ) @@ -111,7 +111,7 @@ async def async_setup_entry( platform = entity_platform.async_get_current_platform() platform.async_register_entity_service( SERVICE_SET_ZONE_MOISTURE, - {vol.Required(ATTR_PERCENT): cv.positive_int}, + {probatio.Required(ATTR_PERCENT): cv.positive_int}, "set_moisture_percent", ) diff --git a/homeassistant/components/radarr/config_flow.py b/homeassistant/components/radarr/config_flow.py index a94aa6111746a..d47660c7e9af8 100644 --- a/homeassistant/components/radarr/config_flow.py +++ b/homeassistant/components/radarr/config_flow.py @@ -7,7 +7,7 @@ from aiopyarr import exceptions from aiopyarr.models.host_configuration import PyArrHostConfiguration from aiopyarr.radarr_client import RadarrClient -import voluptuous as vol +import probatio from yarl import URL from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult @@ -86,13 +86,13 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_URL, default=user_input.get(CONF_URL, DEFAULT_URL) ): str, - vol.Optional(CONF_API_KEY): str, - vol.Optional( + probatio.Optional(CONF_API_KEY): str, + probatio.Optional( CONF_VERIFY_SSL, default=user_input.get(CONF_VERIFY_SSL, False), ): bool, diff --git a/homeassistant/components/radarr/services.py b/homeassistant/components/radarr/services.py index 1f1949d765db8..7fc22c695e52a 100644 --- a/homeassistant/components/radarr/services.py +++ b/homeassistant/components/radarr/services.py @@ -4,7 +4,7 @@ from typing import Any, Final, cast from aiopyarr import exceptions -import voluptuous as vol +import probatio from homeassistant.const import CONF_URL from homeassistant.core import HomeAssistant, ServiceCall, SupportsResponse, callback @@ -29,9 +29,9 @@ # Default values - 0 means no limit DEFAULT_MAX_ITEMS = 0 -SERVICE_BASE_SCHEMA = vol.Schema( +SERVICE_BASE_SCHEMA = probatio.Schema( { - vol.Required(ATTR_ENTRY_ID): selector.ConfigEntrySelector( + probatio.Required(ATTR_ENTRY_ID): selector.ConfigEntrySelector( {"integration": DOMAIN} ), } @@ -41,8 +41,8 @@ SERVICE_GET_QUEUE_SCHEMA = SERVICE_BASE_SCHEMA.extend( { - vol.Optional(CONF_MAX_ITEMS, default=DEFAULT_MAX_ITEMS): vol.All( - vol.Coerce(int), vol.Range(min=0, max=500) + probatio.Optional(CONF_MAX_ITEMS, default=DEFAULT_MAX_ITEMS): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=500) ), } ) diff --git a/homeassistant/components/radio_frequency/helpers.py b/homeassistant/components/radio_frequency/helpers.py index 1fbefbfcfd523..cefcd50c5ce71 100644 --- a/homeassistant/components/radio_frequency/helpers.py +++ b/homeassistant/components/radio_frequency/helpers.py @@ -36,7 +36,7 @@ async def async_send_command( """Send an RF command to the specified radio_frequency entity. Raises: - vol.Invalid: If `entity_id_or_uuid` is not a valid entity ID or known entity + probatio.Invalid: If `entity_id_or_uuid` is not a valid entity ID or known entity registry UUID. HomeAssistantError: If the radio_frequency component is not loaded or the resolved entity is not found. diff --git a/homeassistant/components/radio_frequency/websocket_api.py b/homeassistant/components/radio_frequency/websocket_api.py index 052ddefe5cc5c..f24d4554cdc6f 100644 --- a/homeassistant/components/radio_frequency/websocket_api.py +++ b/homeassistant/components/radio_frequency/websocket_api.py @@ -2,8 +2,8 @@ from typing import Any +import probatio from rf_protocols import ModulationType -import voluptuous as vol from homeassistant.components import websocket_api from homeassistant.core import HomeAssistant, callback @@ -19,7 +19,7 @@ def async_setup(hass: HomeAssistant) -> None: @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required("type"): "radio_frequency/list"}) +@websocket_api.websocket_command({probatio.Required("type"): "radio_frequency/list"}) @callback def ws_list_transmitters( hass: HomeAssistant, diff --git a/homeassistant/components/radiotherm/config_flow.py b/homeassistant/components/radiotherm/config_flow.py index 62f63fa73491b..48c664e3a22dd 100644 --- a/homeassistant/components/radiotherm/config_flow.py +++ b/homeassistant/components/radiotherm/config_flow.py @@ -4,8 +4,8 @@ from typing import Any, override from urllib.error import URLError +import probatio from radiotherm.validate import RadiothermTstatError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST @@ -112,6 +112,6 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_HOST): str}), + data_schema=probatio.Schema({probatio.Required(CONF_HOST): str}), errors=errors, ) diff --git a/homeassistant/components/rainbird/config_flow.py b/homeassistant/components/rainbird/config_flow.py index 15a6ce06005da..9f1c02f46f361 100644 --- a/homeassistant/components/rainbird/config_flow.py +++ b/homeassistant/components/rainbird/config_flow.py @@ -5,10 +5,10 @@ import logging from typing import Any, override +import probatio from pyrainbird.async_client import create_controller from pyrainbird.data import WifiParams from pyrainbird.exceptions import RainbirdApiException, RainbirdAuthException -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, OptionsFlow from homeassistant.const import CONF_HOST, CONF_MAC, CONF_PASSWORD @@ -29,17 +29,17 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): selector.TextSelector(), - vol.Required(CONF_PASSWORD): selector.TextSelector( + probatio.Required(CONF_HOST): selector.TextSelector(), + probatio.Required(CONF_PASSWORD): selector.TextSelector( selector.TextSelectorConfig(type=selector.TextSelectorType.PASSWORD) ), } ) -REAUTH_SCHEMA = vol.Schema( +REAUTH_SCHEMA = probatio.Schema( { - vol.Required(CONF_PASSWORD): selector.TextSelector( + probatio.Required(CONF_PASSWORD): selector.TextSelector( selector.TextSelectorConfig(type=selector.TextSelectorType.PASSWORD) ), } @@ -205,9 +205,9 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( ATTR_DURATION, default=self.config_entry.options[ATTR_DURATION], ): cv.positive_int, diff --git a/homeassistant/components/rainbird/services.py b/homeassistant/components/rainbird/services.py index 669eed3072a75..e881940d61c22 100644 --- a/homeassistant/components/rainbird/services.py +++ b/homeassistant/components/rainbird/services.py @@ -1,6 +1,6 @@ """Rain Bird Irrigation system services.""" -import voluptuous as vol +import probatio from homeassistant.components.switch import DOMAIN as SWITCH_DOMAIN from homeassistant.core import HomeAssistant, callback @@ -12,7 +12,7 @@ SERVICE_START_IRRIGATION = "start_irrigation" SERVICE_SCHEMA_IRRIGATION: VolDictType = { - vol.Required(ATTR_DURATION): cv.positive_float, + probatio.Required(ATTR_DURATION): cv.positive_float, } diff --git a/homeassistant/components/raincloud/__init__.py b/homeassistant/components/raincloud/__init__.py index 0ee12612323f4..7a119d4109d05 100644 --- a/homeassistant/components/raincloud/__init__.py +++ b/homeassistant/components/raincloud/__init__.py @@ -3,9 +3,9 @@ from datetime import timedelta import logging +import probatio from raincloudy.core import RainCloudy from requests.exceptions import ConnectTimeout, HTTPError -import voluptuous as vol from homeassistant.components import persistent_notification from homeassistant.const import CONF_PASSWORD, CONF_SCAN_INTERVAL, CONF_USERNAME @@ -26,17 +26,19 @@ SCAN_INTERVAL = timedelta(seconds=20) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_SCAN_INTERVAL, default=SCAN_INTERVAL): cv.time_period, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Optional( + CONF_SCAN_INTERVAL, default=SCAN_INTERVAL + ): cv.time_period, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/raincloud/binary_sensor.py b/homeassistant/components/raincloud/binary_sensor.py index 899b97b53836e..3dbe0aa9a489c 100644 --- a/homeassistant/components/raincloud/binary_sensor.py +++ b/homeassistant/components/raincloud/binary_sensor.py @@ -3,7 +3,7 @@ import logging from typing import override -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import ( PLATFORM_SCHEMA as BINARY_SENSOR_PLATFORM_SCHEMA, @@ -24,9 +24,9 @@ PLATFORM_SCHEMA = BINARY_SENSOR_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_MONITORED_CONDITIONS, default=list(BINARY_SENSORS)): vol.All( - cv.ensure_list, [vol.In(BINARY_SENSORS)] - ) + probatio.Optional( + CONF_MONITORED_CONDITIONS, default=list(BINARY_SENSORS) + ): probatio.All(cv.ensure_list, [probatio.In(BINARY_SENSORS)]) } ) diff --git a/homeassistant/components/raincloud/sensor.py b/homeassistant/components/raincloud/sensor.py index f34d77953d4c8..b63440a48ca00 100644 --- a/homeassistant/components/raincloud/sensor.py +++ b/homeassistant/components/raincloud/sensor.py @@ -3,7 +3,7 @@ import logging from typing import cast, override -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -25,9 +25,9 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_MONITORED_CONDITIONS, default=list(SENSORS)): vol.All( - cv.ensure_list, [vol.In(SENSORS)] - ) + probatio.Optional( + CONF_MONITORED_CONDITIONS, default=list(SENSORS) + ): probatio.All(cv.ensure_list, [probatio.In(SENSORS)]) } ) diff --git a/homeassistant/components/raincloud/switch.py b/homeassistant/components/raincloud/switch.py index 87ddbb9b17252..8548b63d9cb0f 100644 --- a/homeassistant/components/raincloud/switch.py +++ b/homeassistant/components/raincloud/switch.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.switch import ( PLATFORM_SCHEMA as SWITCH_PLATFORM_SCHEMA, @@ -28,12 +28,12 @@ PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_MONITORED_CONDITIONS, default=list(SWITCHES)): vol.All( - cv.ensure_list, [vol.In(SWITCHES)] - ), - vol.Optional(CONF_WATERING_TIME, default=DEFAULT_WATERING_TIME): vol.All( - vol.In(ALLOWED_WATERING_TIME) - ), + probatio.Optional( + CONF_MONITORED_CONDITIONS, default=list(SWITCHES) + ): probatio.All(cv.ensure_list, [probatio.In(SWITCHES)]), + probatio.Optional( + CONF_WATERING_TIME, default=DEFAULT_WATERING_TIME + ): probatio.All(probatio.In(ALLOWED_WATERING_TIME)), } ) diff --git a/homeassistant/components/rainforest_eagle/config_flow.py b/homeassistant/components/rainforest_eagle/config_flow.py index d7d32ecd844cc..508e6138640d1 100644 --- a/homeassistant/components/rainforest_eagle/config_flow.py +++ b/homeassistant/components/rainforest_eagle/config_flow.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_TYPE @@ -21,15 +21,17 @@ _LOGGER = logging.getLogger(__name__) -def create_schema(user_input: dict[str, Any] | None) -> vol.Schema: +def create_schema(user_input: dict[str, Any] | None) -> probatio.Schema: """Create user schema with passed in defaults if available.""" if user_input is None: user_input = {} - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_HOST, default=user_input.get(CONF_HOST)): str, - vol.Required(CONF_CLOUD_ID, default=user_input.get(CONF_CLOUD_ID)): str, - vol.Required( + probatio.Required(CONF_HOST, default=user_input.get(CONF_HOST)): str, + probatio.Required( + CONF_CLOUD_ID, default=user_input.get(CONF_CLOUD_ID) + ): str, + probatio.Required( CONF_INSTALL_CODE, default=user_input.get(CONF_INSTALL_CODE) ): str, } diff --git a/homeassistant/components/rainforest_raven/config_flow.py b/homeassistant/components/rainforest_raven/config_flow.py index f96e98586b9fc..5a0b7c5000bab 100644 --- a/homeassistant/components/rainforest_raven/config_flow.py +++ b/homeassistant/components/rainforest_raven/config_flow.py @@ -6,7 +6,7 @@ from aioraven.data import MeterType from aioraven.device import RAVEnConnectionError from aioraven.serial import RAVEnSerialDevice -import voluptuous as vol +import probatio from homeassistant.components import usb from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -84,9 +84,9 @@ async def async_step_meters( }, ) - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required(CONF_MAC): SelectSelector( + probatio.Required(CONF_MAC): SelectSelector( SelectSelectorConfig( options=sorted(self._meter_macs), mode=SelectSelectorMode.DROPDOWN, @@ -153,5 +153,7 @@ async def async_step_user( else: return await self.async_step_meters() - schema = vol.Schema({vol.Required(CONF_DEVICE): vol.In(list(port_map))}) + schema = probatio.Schema( + {probatio.Required(CONF_DEVICE): probatio.In(list(port_map))} + ) return self.async_show_form(step_id="user", data_schema=schema, errors=errors) diff --git a/homeassistant/components/rainmachine/config_flow.py b/homeassistant/components/rainmachine/config_flow.py index 50dd814043b4f..321b3822f72e9 100644 --- a/homeassistant/components/rainmachine/config_flow.py +++ b/homeassistant/components/rainmachine/config_flow.py @@ -2,10 +2,10 @@ from typing import Any, override +import probatio from regenmaschine import Client from regenmaschine.controller import Controller from regenmaschine.errors import RainMachineError -import voluptuous as vol from homeassistant.config_entries import ( ConfigEntry, @@ -113,13 +113,15 @@ async def async_step_homekit_zeroconf( return await self.async_step_user() @callback - def _async_generate_schema(self) -> vol.Schema: + def _async_generate_schema(self) -> probatio.Schema: """Generate schema.""" - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_IP_ADDRESS, default=self.discovered_ip_address): str, - vol.Required(CONF_PASSWORD): str, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Required( + CONF_IP_ADDRESS, default=self.discovered_ip_address + ): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): int, } ) @@ -182,19 +184,19 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_DEFAULT_ZONE_RUN_TIME, default=self.config_entry.options.get( CONF_DEFAULT_ZONE_RUN_TIME ), ): cv.positive_int, - vol.Optional( + probatio.Optional( CONF_USE_APP_RUN_TIMES, default=self.config_entry.options.get(CONF_USE_APP_RUN_TIMES), ): bool, - vol.Optional( + probatio.Optional( CONF_ALLOW_INACTIVE_ZONES_TO_RUN, default=self.config_entry.options.get( CONF_ALLOW_INACTIVE_ZONES_TO_RUN diff --git a/homeassistant/components/rainmachine/services.py b/homeassistant/components/rainmachine/services.py index bb527c5d847c6..100db300e6281 100644 --- a/homeassistant/components/rainmachine/services.py +++ b/homeassistant/components/rainmachine/services.py @@ -4,9 +4,9 @@ from functools import wraps from typing import TYPE_CHECKING, Any +import probatio from regenmaschine.controller import Controller from regenmaschine.errors import RainMachineError -import voluptuous as vol from homeassistant.const import CONF_CONDITION, CONF_DEVICE_ID, CONF_UNIT_OF_MEASUREMENT from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -48,12 +48,24 @@ "m3", } -CV_WX_DATA_VALID_PERCENTAGE = vol.All(vol.Coerce(int), vol.Range(min=0, max=100)) -CV_WX_DATA_VALID_TEMP_RANGE = vol.All(vol.Coerce(float), vol.Range(min=-40.0, max=40.0)) -CV_WX_DATA_VALID_RAIN_RANGE = vol.All(vol.Coerce(float), vol.Range(min=0.0, max=1000.0)) -CV_WX_DATA_VALID_WIND_SPEED = vol.All(vol.Coerce(float), vol.Range(min=0.0, max=65.0)) -CV_WX_DATA_VALID_PRESSURE = vol.All(vol.Coerce(float), vol.Range(min=60.0, max=110.0)) -CV_WX_DATA_VALID_SOLARRAD = vol.All(vol.Coerce(float), vol.Range(min=0.0, max=100.0)) +CV_WX_DATA_VALID_PERCENTAGE = probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) +) +CV_WX_DATA_VALID_TEMP_RANGE = probatio.All( + probatio.Coerce(float), probatio.Range(min=-40.0, max=40.0) +) +CV_WX_DATA_VALID_RAIN_RANGE = probatio.All( + probatio.Coerce(float), probatio.Range(min=0.0, max=1000.0) +) +CV_WX_DATA_VALID_WIND_SPEED = probatio.All( + probatio.Coerce(float), probatio.Range(min=0.0, max=65.0) +) +CV_WX_DATA_VALID_PRESSURE = probatio.All( + probatio.Coerce(float), probatio.Range(min=60.0, max=110.0) +) +CV_WX_DATA_VALID_SOLARRAD = probatio.All( + probatio.Coerce(float), probatio.Range(min=0.0, max=100.0) +) SERVICE_NAME_PAUSE_WATERING = "pause_watering" SERVICE_NAME_PUSH_FLOW_METER_DATA = "push_flow_meter_data" @@ -63,49 +75,49 @@ SERVICE_NAME_UNPAUSE_WATERING = "unpause_watering" SERVICE_NAME_UNRESTRICT_WATERING = "unrestrict_watering" -SERVICE_SCHEMA = vol.Schema( +SERVICE_SCHEMA = probatio.Schema( { - vol.Required(CONF_DEVICE_ID): cv.string, + probatio.Required(CONF_DEVICE_ID): cv.string, } ) SERVICE_PAUSE_WATERING_SCHEMA = SERVICE_SCHEMA.extend( { - vol.Required(CONF_SECONDS): cv.positive_int, + probatio.Required(CONF_SECONDS): cv.positive_int, } ) SERVICE_PUSH_FLOW_METER_DATA_SCHEMA = SERVICE_SCHEMA.extend( { - vol.Required(CONF_VALUE): cv.positive_float, - vol.Optional(CONF_UNIT_OF_MEASUREMENT): vol.All( - cv.string, vol.In(CV_FLOW_METER_VALID_UNITS) + probatio.Required(CONF_VALUE): cv.positive_float, + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): probatio.All( + cv.string, probatio.In(CV_FLOW_METER_VALID_UNITS) ), } ) SERVICE_PUSH_WEATHER_DATA_SCHEMA = SERVICE_SCHEMA.extend( { - vol.Optional(CONF_TIMESTAMP): cv.positive_float, - vol.Optional(CONF_MINTEMP): CV_WX_DATA_VALID_TEMP_RANGE, - vol.Optional(CONF_MAXTEMP): CV_WX_DATA_VALID_TEMP_RANGE, - vol.Optional(CONF_TEMPERATURE): CV_WX_DATA_VALID_TEMP_RANGE, - vol.Optional(CONF_WIND): CV_WX_DATA_VALID_WIND_SPEED, - vol.Optional(CONF_SOLARRAD): CV_WX_DATA_VALID_SOLARRAD, - vol.Optional(CONF_QPF): CV_WX_DATA_VALID_RAIN_RANGE, - vol.Optional(CONF_RAIN): CV_WX_DATA_VALID_RAIN_RANGE, - vol.Optional(CONF_ET): CV_WX_DATA_VALID_RAIN_RANGE, - vol.Optional(CONF_MINRH): CV_WX_DATA_VALID_PERCENTAGE, - vol.Optional(CONF_MAXRH): CV_WX_DATA_VALID_PERCENTAGE, - vol.Optional(CONF_CONDITION): cv.string, - vol.Optional(CONF_PRESSURE): CV_WX_DATA_VALID_PRESSURE, - vol.Optional(CONF_DEWPOINT): CV_WX_DATA_VALID_TEMP_RANGE, + probatio.Optional(CONF_TIMESTAMP): cv.positive_float, + probatio.Optional(CONF_MINTEMP): CV_WX_DATA_VALID_TEMP_RANGE, + probatio.Optional(CONF_MAXTEMP): CV_WX_DATA_VALID_TEMP_RANGE, + probatio.Optional(CONF_TEMPERATURE): CV_WX_DATA_VALID_TEMP_RANGE, + probatio.Optional(CONF_WIND): CV_WX_DATA_VALID_WIND_SPEED, + probatio.Optional(CONF_SOLARRAD): CV_WX_DATA_VALID_SOLARRAD, + probatio.Optional(CONF_QPF): CV_WX_DATA_VALID_RAIN_RANGE, + probatio.Optional(CONF_RAIN): CV_WX_DATA_VALID_RAIN_RANGE, + probatio.Optional(CONF_ET): CV_WX_DATA_VALID_RAIN_RANGE, + probatio.Optional(CONF_MINRH): CV_WX_DATA_VALID_PERCENTAGE, + probatio.Optional(CONF_MAXRH): CV_WX_DATA_VALID_PERCENTAGE, + probatio.Optional(CONF_CONDITION): cv.string, + probatio.Optional(CONF_PRESSURE): CV_WX_DATA_VALID_PRESSURE, + probatio.Optional(CONF_DEWPOINT): CV_WX_DATA_VALID_TEMP_RANGE, } ) SERVICE_RESTRICT_WATERING_SCHEMA = SERVICE_SCHEMA.extend( { - vol.Required(CONF_DURATION): cv.time_period, + probatio.Required(CONF_DURATION): cv.time_period, } ) diff --git a/homeassistant/components/rainmachine/switch.py b/homeassistant/components/rainmachine/switch.py index 6fdc654b6603c..c3787e7b8082a 100644 --- a/homeassistant/components/rainmachine/switch.py +++ b/homeassistant/components/rainmachine/switch.py @@ -6,8 +6,8 @@ from datetime import datetime from typing import Any, Concatenate, override +import probatio from regenmaschine.errors import RainMachineError -import voluptuous as vol from homeassistant.components.switch import SwitchEntity, SwitchEntityDescription from homeassistant.config_entries import ConfigEntry @@ -183,7 +183,7 @@ async def async_setup_entry( ( "start_zone", { - vol.Optional( + probatio.Optional( CONF_DEFAULT_ZONE_RUN_TIME, default=DEFAULT_ZONE_RUN ): cv.positive_int }, diff --git a/homeassistant/components/random/binary_sensor.py b/homeassistant/components/random/binary_sensor.py index 9e5eecf0b68e5..9f9ab76709db0 100644 --- a/homeassistant/components/random/binary_sensor.py +++ b/homeassistant/components/random/binary_sensor.py @@ -4,7 +4,7 @@ from random import getrandbits from typing import Any -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import ( DEVICE_CLASSES_SCHEMA, @@ -25,8 +25,8 @@ PLATFORM_SCHEMA = BINARY_SENSOR_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, } ) diff --git a/homeassistant/components/random/config_flow.py b/homeassistant/components/random/config_flow.py index 0b57aa1f03ee1..ee289359b3267 100644 --- a/homeassistant/components/random/config_flow.py +++ b/homeassistant/components/random/config_flow.py @@ -4,7 +4,7 @@ from enum import StrEnum from typing import Any, cast, override -import voluptuous as vol +import probatio from homeassistant.components.sensor import DEVICE_CLASS_UNITS from homeassistant.const import ( @@ -41,27 +41,27 @@ class _FlowType(StrEnum): OPTION = "option" -def _generate_schema(domain: str, flow_type: _FlowType) -> vol.Schema: +def _generate_schema(domain: str, flow_type: _FlowType) -> probatio.Schema: """Generate schema.""" - schema: dict[vol.Marker, Any] = {} + schema: dict[probatio.Marker, Any] = {} if flow_type == _FlowType.CONFIG: - schema[vol.Required(CONF_NAME)] = TextSelector() + schema[probatio.Required(CONF_NAME)] = TextSelector() if domain == Platform.BINARY_SENSOR: - schema[vol.Optional(CONF_DEVICE_CLASS)] = DeviceClassSelector( + schema[probatio.Optional(CONF_DEVICE_CLASS)] = DeviceClassSelector( DeviceClassSelectorConfig(domain=Platform.BINARY_SENSOR) ) if domain == Platform.SENSOR: schema.update( { - vol.Optional(CONF_MINIMUM, default=DEFAULT_MIN): cv.positive_int, - vol.Optional(CONF_MAXIMUM, default=DEFAULT_MAX): cv.positive_int, - vol.Optional(CONF_DEVICE_CLASS): DeviceClassSelector( + probatio.Optional(CONF_MINIMUM, default=DEFAULT_MIN): cv.positive_int, + probatio.Optional(CONF_MAXIMUM, default=DEFAULT_MAX): cv.positive_int, + probatio.Optional(CONF_DEVICE_CLASS): DeviceClassSelector( DeviceClassSelectorConfig(domain=Platform.NUMBER) ), - vol.Optional(CONF_UNIT_OF_MEASUREMENT): SelectSelector( + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): SelectSelector( SelectSelectorConfig( options=[ str(unit) @@ -78,7 +78,7 @@ def _generate_schema(domain: str, flow_type: _FlowType) -> vol.Schema: } ) - return vol.Schema(schema) + return probatio.Schema(schema) async def choose_options_step(options: dict[str, Any]) -> str: @@ -106,7 +106,7 @@ def _validate_unit(options: dict[str, Any]) -> None: else: units_string = f"one of {', '.join(sorted_units)}" - raise vol.Invalid( + raise probatio.Invalid( f"'{unit}' is not a valid unit for device class '{device_class}'; " f"expected {units_string}" ) diff --git a/homeassistant/components/random/sensor.py b/homeassistant/components/random/sensor.py index e70a69060e5b3..06486080c3cb9 100644 --- a/homeassistant/components/random/sensor.py +++ b/homeassistant/components/random/sensor.py @@ -4,7 +4,7 @@ from random import randrange from typing import Any -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -36,10 +36,10 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_MAXIMUM, default=DEFAULT_MAX): cv.positive_int, - vol.Optional(CONF_MINIMUM, default=DEFAULT_MIN): cv.positive_int, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, + probatio.Optional(CONF_MAXIMUM, default=DEFAULT_MAX): cv.positive_int, + probatio.Optional(CONF_MINIMUM, default=DEFAULT_MIN): cv.positive_int, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, } ) diff --git a/homeassistant/components/rapt_ble/config_flow.py b/homeassistant/components/rapt_ble/config_flow.py index 9313d5a6b644d..fc3d772024ad4 100644 --- a/homeassistant/components/rapt_ble/config_flow.py +++ b/homeassistant/components/rapt_ble/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from rapt_ble import RAPTPillBluetoothDeviceData as DeviceData -import voluptuous as vol from homeassistant.components import bluetooth from homeassistant.components.bluetooth import ( @@ -90,7 +90,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_ADDRESS): vol.In(self._discovered_devices)} + data_schema=probatio.Schema( + {probatio.Required(CONF_ADDRESS): probatio.In(self._discovered_devices)} ), ) diff --git a/homeassistant/components/raspyrfm/switch.py b/homeassistant/components/raspyrfm/switch.py index ff8b5f8e51a56..113fe9b6b5e80 100644 --- a/homeassistant/components/raspyrfm/switch.py +++ b/homeassistant/components/raspyrfm/switch.py @@ -2,6 +2,7 @@ from typing import Any, override +import probatio from raspyrfm_client import RaspyRFMClient from raspyrfm_client.device_implementations.controlunit.actions import Action from raspyrfm_client.device_implementations.controlunit.controlunit_constants import ( @@ -11,7 +12,6 @@ gateway_constants as _gw, ) from raspyrfm_client.device_implementations.manufacturer_constants import Manufacturer -import voluptuous as vol from homeassistant.components.switch import ( PLATFORM_SCHEMA as SWITCH_PLATFORM_SCHEMA, @@ -41,22 +41,24 @@ # define configuration parameters PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, - vol.Optional(CONF_PORT): cv.port, - vol.Optional(CONF_GATEWAY_MANUFACTURER): cv.string, - vol.Optional(CONF_GATEWAY_MODEL): cv.string, - vol.Required(CONF_SWITCHES): vol.Schema( + probatio.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, + probatio.Optional(CONF_PORT): cv.port, + probatio.Optional(CONF_GATEWAY_MANUFACTURER): cv.string, + probatio.Optional(CONF_GATEWAY_MODEL): cv.string, + probatio.Required(CONF_SWITCHES): probatio.Schema( [ { - vol.Optional(CONF_NAME, default=DEVICE_DEFAULT_NAME): cv.string, - vol.Required(CONF_CONTROLUNIT_MANUFACTURER): cv.string, - vol.Required(CONF_CONTROLUNIT_MODEL): cv.string, - vol.Required(CONF_CHANNEL_CONFIG): {cv.string: cv.match_all}, + probatio.Optional( + CONF_NAME, default=DEVICE_DEFAULT_NAME + ): cv.string, + probatio.Required(CONF_CONTROLUNIT_MANUFACTURER): cv.string, + probatio.Required(CONF_CONTROLUNIT_MODEL): cv.string, + probatio.Required(CONF_CHANNEL_CONFIG): {cv.string: cv.match_all}, } ] ), }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/rdw/config_flow.py b/homeassistant/components/rdw/config_flow.py index 8e5fe6155aa42..6fc909667d546 100644 --- a/homeassistant/components/rdw/config_flow.py +++ b/homeassistant/components/rdw/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from vehicle import RDW, RDWError, RDWUnknownLicensePlateError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.helpers.aiohttp_client import async_get_clientsession @@ -46,9 +46,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_LICENSE_PLATE): str, + probatio.Required(CONF_LICENSE_PLATE): str, } ), errors=errors, diff --git a/homeassistant/components/recollect_waste/config_flow.py b/homeassistant/components/recollect_waste/config_flow.py index 07b1903e5ff41..97c5b56769db0 100644 --- a/homeassistant/components/recollect_waste/config_flow.py +++ b/homeassistant/components/recollect_waste/config_flow.py @@ -4,7 +4,7 @@ from aiorecollect.client import Client from aiorecollect.errors import RecollectError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, OptionsFlow from homeassistant.const import CONF_FRIENDLY_NAME @@ -14,8 +14,8 @@ from .const import CONF_PLACE_ID, CONF_SERVICE_ID, DOMAIN, LOGGER from .coordinator import RecollectWasteConfigEntry -DATA_SCHEMA = vol.Schema( - {vol.Required(CONF_PLACE_ID): str, vol.Required(CONF_SERVICE_ID): str} +DATA_SCHEMA = probatio.Schema( + {probatio.Required(CONF_PLACE_ID): str, probatio.Required(CONF_SERVICE_ID): str} ) @@ -84,9 +84,9 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_FRIENDLY_NAME, default=self.config_entry.options.get(CONF_FRIENDLY_NAME), ): bool diff --git a/homeassistant/components/recorder/__init__.py b/homeassistant/components/recorder/__init__.py index 0968f1fd54906..3723b260a6e5e 100644 --- a/homeassistant/components/recorder/__init__.py +++ b/homeassistant/components/recorder/__init__.py @@ -3,7 +3,7 @@ import logging from typing import Any -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_EXCLUDE, @@ -70,11 +70,11 @@ EXCLUDE_SCHEMA = INCLUDE_EXCLUDE_FILTER_SCHEMA_INNER.extend( - {vol.Optional(CONF_EVENT_TYPES): vol.All(cv.ensure_list, [cv.string])} + {probatio.Optional(CONF_EVENT_TYPES): probatio.All(cv.ensure_list, [cv.string])} ) FILTER_SCHEMA = INCLUDE_EXCLUDE_BASE_FILTER_SCHEMA.extend( - {vol.Optional(CONF_EXCLUDE, default=EXCLUDE_SCHEMA({})): EXCLUDE_SCHEMA} + {probatio.Optional(CONF_EXCLUDE, default=EXCLUDE_SCHEMA({})): EXCLUDE_SCHEMA} ) @@ -88,42 +88,44 @@ def validate_db_url(db_url: str) -> Any: db_url == SQLITE_URL_PREFIX or (db_url.startswith(SQLITE_URL_PREFIX) and ":memory:" in db_url) ) and not ALLOW_IN_MEMORY_DB: - raise vol.Invalid("In-memory SQLite database is not supported") + raise probatio.Invalid("In-memory SQLite database is not supported") return db_url -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Optional(DOMAIN, default=dict): vol.All( + probatio.Optional(DOMAIN, default=dict): probatio.All( cv.deprecated(CONF_PURGE_INTERVAL), cv.deprecated(CONF_DB_INTEGRITY_CHECK), FILTER_SCHEMA.extend( { - vol.Optional(CONF_AUTO_PURGE, default=True): cv.boolean, - vol.Optional(CONF_AUTO_REPACK, default=True): cv.boolean, - vol.Optional(CONF_PURGE_KEEP_DAYS, default=10): vol.All( - vol.Coerce(int), vol.Range(min=1) + probatio.Optional(CONF_AUTO_PURGE, default=True): cv.boolean, + probatio.Optional(CONF_AUTO_REPACK, default=True): cv.boolean, + probatio.Optional(CONF_PURGE_KEEP_DAYS, default=10): probatio.All( + probatio.Coerce(int), probatio.Range(min=1) ), - vol.Optional(CONF_PURGE_INTERVAL, default=1): cv.positive_int, - vol.Optional(CONF_DB_URL): vol.All(cv.string, validate_db_url), - vol.Optional( + probatio.Optional(CONF_PURGE_INTERVAL, default=1): cv.positive_int, + probatio.Optional(CONF_DB_URL): probatio.All( + cv.string, validate_db_url + ), + probatio.Optional( CONF_COMMIT_INTERVAL, default=DEFAULT_COMMIT_INTERVAL ): cv.positive_int, - vol.Optional( + probatio.Optional( CONF_DB_MAX_RETRIES, default=DEFAULT_DB_MAX_RETRIES ): cv.positive_int, - vol.Optional( + probatio.Optional( CONF_DB_RETRY_WAIT, default=DEFAULT_DB_RETRY_WAIT ): cv.positive_int, - vol.Optional( + probatio.Optional( CONF_DB_INTEGRITY_CHECK, default=DEFAULT_DB_INTEGRITY_CHECK ): cv.boolean, } ), ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/recorder/basic_websocket_api.py b/homeassistant/components/recorder/basic_websocket_api.py index eff2fdfe9edbe..d279bb240a6c0 100644 --- a/homeassistant/components/recorder/basic_websocket_api.py +++ b/homeassistant/components/recorder/basic_websocket_api.py @@ -2,7 +2,7 @@ from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.core import HomeAssistant, callback @@ -20,7 +20,7 @@ def async_setup(hass: HomeAssistant) -> None: @websocket_api.websocket_command( { - vol.Required("type"): "recorder/info", + probatio.Required("type"): "recorder/info", } ) @websocket_api.async_response diff --git a/homeassistant/components/recorder/entity_options.py b/homeassistant/components/recorder/entity_options.py index 924de8ab91b93..93e80cdb8ae80 100644 --- a/homeassistant/components/recorder/entity_options.py +++ b/homeassistant/components/recorder/entity_options.py @@ -4,7 +4,7 @@ from enum import StrEnum from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.core import HomeAssistant, callback @@ -50,8 +50,8 @@ def to_json(self) -> dict[str, Any]: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "recorder/entity_options/get", - vol.Required("entity_id"): cv.strict_entity_id, + probatio.Required("type"): "recorder/entity_options/get", + probatio.Required("entity_id"): cv.strict_entity_id, } ) @callback diff --git a/homeassistant/components/recorder/services.py b/homeassistant/components/recorder/services.py index 1b89968f1cf96..eada293ab2788 100644 --- a/homeassistant/components/recorder/services.py +++ b/homeassistant/components/recorder/services.py @@ -3,7 +3,7 @@ from datetime import timedelta from typing import cast -import voluptuous as vol +import probatio from homeassistant.const import ATTR_ENTITY_ID from homeassistant.core import ( @@ -33,56 +33,67 @@ SERVICE_DISABLE = "disable" SERVICE_GET_STATISTICS = "get_statistics" -SERVICE_PURGE_SCHEMA = vol.Schema( +SERVICE_PURGE_SCHEMA = probatio.Schema( { - vol.Optional(ATTR_KEEP_DAYS): cv.positive_int, - vol.Optional(ATTR_REPACK, default=False): cv.boolean, - vol.Optional(ATTR_APPLY_FILTER, default=False): cv.boolean, + probatio.Optional(ATTR_KEEP_DAYS): cv.positive_int, + probatio.Optional(ATTR_REPACK, default=False): cv.boolean, + probatio.Optional(ATTR_APPLY_FILTER, default=False): cv.boolean, } ) ATTR_DOMAINS = "domains" ATTR_ENTITY_GLOBS = "entity_globs" -SERVICE_PURGE_ENTITIES_SCHEMA = vol.All( - vol.Schema( +SERVICE_PURGE_ENTITIES_SCHEMA = probatio.All( + probatio.Schema( { - vol.Optional(ATTR_ENTITY_ID, default=[]): cv.entity_ids, - vol.Optional(ATTR_DOMAINS, default=[]): vol.All( + probatio.Optional(ATTR_ENTITY_ID, default=[]): cv.entity_ids, + probatio.Optional(ATTR_DOMAINS, default=[]): probatio.All( cv.ensure_list, [cv.string] ), - vol.Optional(ATTR_ENTITY_GLOBS, default=[]): vol.All( + probatio.Optional(ATTR_ENTITY_GLOBS, default=[]): probatio.All( cv.ensure_list, [cv.string] ), - vol.Optional(ATTR_KEEP_DAYS, default=0): cv.positive_int, + probatio.Optional(ATTR_KEEP_DAYS, default=0): cv.positive_int, } ), - vol.Any( - vol.Schema({vol.Required(ATTR_ENTITY_ID): vol.IsTrue()}, extra=vol.ALLOW_EXTRA), - vol.Schema({vol.Required(ATTR_DOMAINS): vol.IsTrue()}, extra=vol.ALLOW_EXTRA), - vol.Schema( - {vol.Required(ATTR_ENTITY_GLOBS): vol.IsTrue()}, extra=vol.ALLOW_EXTRA + probatio.Any( + probatio.Schema( + {probatio.Required(ATTR_ENTITY_ID): probatio.IsTrue()}, + extra=probatio.ALLOW_EXTRA, + ), + probatio.Schema( + {probatio.Required(ATTR_DOMAINS): probatio.IsTrue()}, + extra=probatio.ALLOW_EXTRA, + ), + probatio.Schema( + {probatio.Required(ATTR_ENTITY_GLOBS): probatio.IsTrue()}, + extra=probatio.ALLOW_EXTRA, ), msg="At least one of entity_id, domains, or entity_globs must have a value", ), ) -SERVICE_ENABLE_SCHEMA = vol.Schema({}) -SERVICE_DISABLE_SCHEMA = vol.Schema({}) +SERVICE_ENABLE_SCHEMA = probatio.Schema({}) +SERVICE_DISABLE_SCHEMA = probatio.Schema({}) -SERVICE_GET_STATISTICS_SCHEMA = vol.Schema( +SERVICE_GET_STATISTICS_SCHEMA = probatio.Schema( { - vol.Required("start_time"): cv.datetime, - vol.Optional("end_time"): cv.datetime, - vol.Required("statistic_ids"): vol.All(cv.ensure_list, [cv.string]), - vol.Required("period"): vol.In( + probatio.Required("start_time"): cv.datetime, + probatio.Optional("end_time"): cv.datetime, + probatio.Required("statistic_ids"): probatio.All(cv.ensure_list, [cv.string]), + probatio.Required("period"): probatio.In( ["5minute", "hour", "day", "week", "month", "year"] ), - vol.Required("types"): vol.All( + probatio.Required("types"): probatio.All( cv.ensure_list, - [vol.In(["change", "last_reset", "max", "mean", "min", "state", "sum"])], + [ + probatio.In( + ["change", "last_reset", "max", "mean", "min", "state", "sum"] + ) + ], ), - vol.Optional("units"): vol.Schema({cv.string: cv.string}), + probatio.Optional("units"): probatio.Schema({cv.string: cv.string}), } ) diff --git a/homeassistant/components/recorder/statistics.py b/homeassistant/components/recorder/statistics.py index 1f7f41837f26e..5fd0138e2bc18 100644 --- a/homeassistant/components/recorder/statistics.py +++ b/homeassistant/components/recorder/statistics.py @@ -13,6 +13,7 @@ from time import time as time_time from typing import TYPE_CHECKING, Any, Literal, Required, TypedDict, cast +import probatio from sqlalchemy import ( Label, Select, @@ -28,7 +29,6 @@ from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.orm.session import Session from sqlalchemy.sql.lambdas import StatementLambdaElement -import voluptuous as vol from homeassistant.const import EntityStateAttribute from homeassistant.core import HomeAssistant, callback, valid_entity_id @@ -473,7 +473,7 @@ def validate_statistic_id(value: str) -> str: if valid_statistic_id(value): return value - raise vol.Invalid(f"Statistics ID {value} is an invalid statistic ID") + raise probatio.Invalid(f"Statistics ID {value} is an invalid statistic ID") @dataclasses.dataclass @@ -685,7 +685,7 @@ def _get_first_id_stmt(start: datetime) -> StatementLambdaElement: return lambda_stmt(lambda: select(StatisticsRuns.run_id).filter_by(start=start)) -CUSTOM_EQUIVALENT_UNITS_SCHEMA = vol.Schema({str: {vol.Any(str, None): str}}) +CUSTOM_EQUIVALENT_UNITS_SCHEMA = probatio.Schema({str: {probatio.Any(str, None): str}}) # Keep track of domains for which a warning about failure # to collect custom units has been logged _warn_custom_units_error: set[str] = set() @@ -727,7 +727,7 @@ def _get_custom_equivalent_units( platform_custom_equivalent_units ) custom_equivalent_units_per_entity |= validated_data - except vol.Invalid as inv: + except probatio.Invalid as inv: if domain not in _warn_custom_units_error: _warn_custom_units_error.add(domain) _LOGGER.warning( diff --git a/homeassistant/components/recorder/util.py b/homeassistant/components/recorder/util.py index 2f0e4dee68b9f..fed4bda884104 100644 --- a/homeassistant/components/recorder/util.py +++ b/homeassistant/components/recorder/util.py @@ -16,6 +16,7 @@ AwesomeVersionStrategy, ) import ciso8601 +import probatio from sqlalchemy import inspect, text from sqlalchemy.engine import Result, Row from sqlalchemy.engine.interfaces import DBAPIConnection @@ -23,7 +24,6 @@ from sqlalchemy.orm.query import Query from sqlalchemy.orm.session import Session from sqlalchemy.sql.lambdas import StatementLambdaElement -import voluptuous as vol from homeassistant.const import WEEKDAYS from homeassistant.core import HomeAssistant, callback @@ -943,25 +943,31 @@ def is_second_sunday(date_time: datetime) -> bool: return bool(second_sunday(date_time.year, date_time.month).day == date_time.day) -PERIOD_SCHEMA = vol.Schema( +PERIOD_SCHEMA = probatio.Schema( { - vol.Exclusive("calendar", "period"): vol.Schema( + probatio.Exclusive("calendar", "period"): probatio.Schema( { - vol.Required("period"): vol.Any("hour", "day", "week", "month", "year"), - vol.Optional("offset"): int, - vol.Optional("first_weekday"): vol.Any(*WEEKDAYS), + probatio.Required("period"): probatio.Any( + "hour", "day", "week", "month", "year" + ), + probatio.Optional("offset"): int, + probatio.Optional("first_weekday"): probatio.Any(*WEEKDAYS), } ), - vol.Exclusive("fixed_period", "period"): vol.Schema( + probatio.Exclusive("fixed_period", "period"): probatio.Schema( { - vol.Optional("start_time"): vol.All(cv.datetime, dt_util.as_utc), - vol.Optional("end_time"): vol.All(cv.datetime, dt_util.as_utc), + probatio.Optional("start_time"): probatio.All( + cv.datetime, dt_util.as_utc + ), + probatio.Optional("end_time"): probatio.All( + cv.datetime, dt_util.as_utc + ), } ), - vol.Exclusive("rolling_window", "period"): vol.Schema( + probatio.Exclusive("rolling_window", "period"): probatio.Schema( { - vol.Required("duration"): cv.time_period_dict, - vol.Optional("offset"): cv.time_period_dict, + probatio.Required("duration"): cv.time_period_dict, + probatio.Optional("offset"): cv.time_period_dict, } ), } diff --git a/homeassistant/components/recorder/websocket_api.py b/homeassistant/components/recorder/websocket_api.py index 4e69d2f5a574f..5c1faadc6dbf0 100644 --- a/homeassistant/components/recorder/websocket_api.py +++ b/homeassistant/components/recorder/websocket_api.py @@ -5,7 +5,7 @@ import logging from typing import Any, Literal, cast -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.components.websocket_api import messages @@ -70,55 +70,73 @@ CLEAR_STATISTICS_TIME_OUT = 10 UPDATE_STATISTICS_METADATA_TIME_OUT = 10 -UNIT_SCHEMA = vol.Schema( +UNIT_SCHEMA = probatio.Schema( { - vol.Optional("apparent_power"): vol.In(ApparentPowerConverter.VALID_UNITS), - vol.Optional("area"): vol.In(AreaConverter.VALID_UNITS), - vol.Optional("blood_glucose_concentration"): vol.In( + probatio.Optional("apparent_power"): probatio.In( + ApparentPowerConverter.VALID_UNITS + ), + probatio.Optional("area"): probatio.In(AreaConverter.VALID_UNITS), + probatio.Optional("blood_glucose_concentration"): probatio.In( BloodGlucoseConcentrationConverter.VALID_UNITS ), - vol.Optional("carbon_monoxide"): vol.In( + probatio.Optional("carbon_monoxide"): probatio.In( CarbonMonoxideConcentrationConverter.VALID_UNITS ), - vol.Optional("concentration"): vol.In( + probatio.Optional("concentration"): probatio.In( MassVolumeConcentrationConverter.VALID_UNITS ), - vol.Optional("conductivity"): vol.In(ConductivityConverter.VALID_UNITS), - vol.Optional("data_rate"): vol.In(DataRateConverter.VALID_UNITS), - vol.Optional("distance"): vol.In(DistanceConverter.VALID_UNITS), - vol.Optional("duration"): vol.In(DurationConverter.VALID_UNITS), - vol.Optional("electric_current"): vol.In(ElectricCurrentConverter.VALID_UNITS), - vol.Optional("energy"): vol.In(EnergyConverter.VALID_UNITS), - vol.Optional("energy_distance"): vol.In(EnergyDistanceConverter.VALID_UNITS), - vol.Optional("frequency"): vol.In(FrequencyConverter.VALID_UNITS), - vol.Optional("information"): vol.In(InformationConverter.VALID_UNITS), - vol.Optional("mass"): vol.In(MassConverter.VALID_UNITS), - vol.Optional("nitrogen_dioxide"): vol.In( + probatio.Optional("conductivity"): probatio.In( + ConductivityConverter.VALID_UNITS + ), + probatio.Optional("data_rate"): probatio.In(DataRateConverter.VALID_UNITS), + probatio.Optional("distance"): probatio.In(DistanceConverter.VALID_UNITS), + probatio.Optional("duration"): probatio.In(DurationConverter.VALID_UNITS), + probatio.Optional("electric_current"): probatio.In( + ElectricCurrentConverter.VALID_UNITS + ), + probatio.Optional("energy"): probatio.In(EnergyConverter.VALID_UNITS), + probatio.Optional("energy_distance"): probatio.In( + EnergyDistanceConverter.VALID_UNITS + ), + probatio.Optional("frequency"): probatio.In(FrequencyConverter.VALID_UNITS), + probatio.Optional("information"): probatio.In(InformationConverter.VALID_UNITS), + probatio.Optional("mass"): probatio.In(MassConverter.VALID_UNITS), + probatio.Optional("nitrogen_dioxide"): probatio.In( NitrogenDioxideConcentrationConverter.VALID_UNITS ), - vol.Optional("nitrogen_monoxide"): vol.In( + probatio.Optional("nitrogen_monoxide"): probatio.In( NitrogenMonoxideConcentrationConverter.VALID_UNITS ), - vol.Optional("ozone"): vol.In(OzoneConcentrationConverter.VALID_UNITS), - vol.Optional("power"): vol.In(PowerConverter.VALID_UNITS), - vol.Optional("pressure"): vol.In(PressureConverter.VALID_UNITS), - vol.Optional("radiation_concentration"): vol.In( + probatio.Optional("ozone"): probatio.In( + OzoneConcentrationConverter.VALID_UNITS + ), + probatio.Optional("power"): probatio.In(PowerConverter.VALID_UNITS), + probatio.Optional("pressure"): probatio.In(PressureConverter.VALID_UNITS), + probatio.Optional("radiation_concentration"): probatio.In( RadiationConcentrationConverter.VALID_UNITS ), - vol.Optional("reactive_energy"): vol.In(ReactiveEnergyConverter.VALID_UNITS), - vol.Optional("reactive_power"): vol.In(ReactivePowerConverter.VALID_UNITS), - vol.Optional("speed"): vol.In(SpeedConverter.VALID_UNITS), - vol.Optional("sulphur_dioxide"): vol.In( + probatio.Optional("reactive_energy"): probatio.In( + ReactiveEnergyConverter.VALID_UNITS + ), + probatio.Optional("reactive_power"): probatio.In( + ReactivePowerConverter.VALID_UNITS + ), + probatio.Optional("speed"): probatio.In(SpeedConverter.VALID_UNITS), + probatio.Optional("sulphur_dioxide"): probatio.In( SulphurDioxideConcentrationConverter.VALID_UNITS ), - vol.Optional("temperature"): vol.In(TemperatureConverter.VALID_UNITS), - vol.Optional("temperature_delta"): vol.In( + probatio.Optional("temperature"): probatio.In(TemperatureConverter.VALID_UNITS), + probatio.Optional("temperature_delta"): probatio.In( TemperatureDeltaConverter.VALID_UNITS ), - vol.Optional("unitless"): vol.In(UnitlessRatioConverter.VALID_UNITS), - vol.Optional("voltage"): vol.In(ElectricPotentialConverter.VALID_UNITS), - vol.Optional("volume"): vol.In(VolumeConverter.VALID_UNITS), - vol.Optional("volume_flow_rate"): vol.In(VolumeFlowRateConverter.VALID_UNITS), + probatio.Optional("unitless"): probatio.In(UnitlessRatioConverter.VALID_UNITS), + probatio.Optional("voltage"): probatio.In( + ElectricPotentialConverter.VALID_UNITS + ), + probatio.Optional("volume"): probatio.In(VolumeConverter.VALID_UNITS), + probatio.Optional("volume_flow_rate"): probatio.In( + VolumeFlowRateConverter.VALID_UNITS + ), } ) @@ -161,12 +179,12 @@ def _ws_get_statistic_during_period( @websocket_api.websocket_command( { - vol.Required("type"): "recorder/statistic_during_period", - vol.Required("statistic_id"): str, - vol.Optional("types"): vol.All( - [vol.Any("max", "mean", "min", "change")], vol.Coerce(set) + probatio.Required("type"): "recorder/statistic_during_period", + probatio.Required("statistic_id"): str, + probatio.Optional("types"): probatio.All( + [probatio.Any("max", "mean", "min", "change")], probatio.Coerce(set) ), - vol.Optional("units"): UNIT_SCHEMA, + probatio.Optional("units"): UNIT_SCHEMA, **PERIOD_SCHEMA.schema, } ) @@ -267,17 +285,21 @@ async def ws_handle_get_statistics_during_period( @websocket_api.websocket_command( { - vol.Required("type"): "recorder/statistics_during_period", - vol.Required("start_time"): str, - vol.Optional("end_time"): str, - vol.Required("statistic_ids"): vol.All([str], vol.Length(min=1)), - vol.Required("period"): vol.Any( + probatio.Required("type"): "recorder/statistics_during_period", + probatio.Required("start_time"): str, + probatio.Optional("end_time"): str, + probatio.Required("statistic_ids"): probatio.All([str], probatio.Length(min=1)), + probatio.Required("period"): probatio.Any( "5minute", "hour", "day", "week", "month", "year" ), - vol.Optional("units"): UNIT_SCHEMA, - vol.Optional("types"): vol.All( - [vol.Any("change", "last_reset", "max", "mean", "min", "state", "sum")], - vol.Coerce(set), + probatio.Optional("units"): UNIT_SCHEMA, + probatio.Optional("types"): probatio.All( + [ + probatio.Any( + "change", "last_reset", "max", "mean", "min", "state", "sum" + ) + ], + probatio.Coerce(set), ), } ) @@ -319,8 +341,8 @@ async def ws_handle_list_statistic_ids( @websocket_api.websocket_command( { - vol.Required("type"): "recorder/list_statistic_ids", - vol.Optional("statistic_type"): vol.Any("sum", "mean"), + probatio.Required("type"): "recorder/list_statistic_ids", + probatio.Optional("statistic_type"): probatio.Any("sum", "mean"), } ) @websocket_api.async_response @@ -333,7 +355,7 @@ async def ws_list_statistic_ids( @websocket_api.websocket_command( { - vol.Required("type"): "recorder/validate_statistics", + probatio.Required("type"): "recorder/validate_statistics", } ) @websocket_api.async_response @@ -351,7 +373,7 @@ async def ws_validate_statistics( @websocket_api.websocket_command( { - vol.Required("type"): "recorder/update_statistics_issues", + probatio.Required("type"): "recorder/update_statistics_issues", } ) @websocket_api.async_response @@ -370,8 +392,8 @@ async def ws_update_statistics_issues( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "recorder/clear_statistics", - vol.Required("statistic_ids"): [str], + probatio.Required("type"): "recorder/clear_statistics", + probatio.Required("statistic_ids"): [str], } ) @websocket_api.async_response @@ -405,8 +427,8 @@ def clear_statistics_done() -> None: @websocket_api.websocket_command( { - vol.Required("type"): "recorder/get_statistics_metadata", - vol.Optional("statistic_ids"): [str], + probatio.Required("type"): "recorder/get_statistics_metadata", + probatio.Optional("statistic_ids"): [str], } ) @websocket_api.async_response @@ -423,10 +445,10 @@ async def ws_get_statistics_metadata( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "recorder/update_statistics_metadata", - vol.Required("statistic_id"): str, - vol.Optional("unit_class"): vol.Any(str, None), - vol.Required("unit_of_measurement"): vol.Any(str, None), + probatio.Required("type"): "recorder/update_statistics_metadata", + probatio.Required("statistic_id"): str, + probatio.Optional("unit_class"): probatio.Any(str, None), + probatio.Required("unit_of_measurement"): probatio.Any(str, None), } ) @websocket_api.async_response @@ -474,10 +496,10 @@ def update_statistics_metadata_done() -> None: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "recorder/change_statistics_unit", - vol.Required("statistic_id"): str, - vol.Required("new_unit_of_measurement"): vol.Any(str, None), - vol.Required("old_unit_of_measurement"): vol.Any(str, None), + probatio.Required("type"): "recorder/change_statistics_unit", + probatio.Required("statistic_id"): str, + probatio.Required("new_unit_of_measurement"): probatio.Any(str, None), + probatio.Required("old_unit_of_measurement"): probatio.Any(str, None), } ) @websocket_api.async_response @@ -500,11 +522,11 @@ async def ws_change_statistics_unit( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "recorder/adjust_sum_statistics", - vol.Required("statistic_id"): str, - vol.Required("start_time"): str, - vol.Required("adjustment"): vol.Any(int, float), - vol.Required("adjustment_unit_of_measurement"): vol.Any(str, None), + probatio.Required("type"): "recorder/adjust_sum_statistics", + probatio.Required("statistic_id"): str, + probatio.Required("start_time"): str, + probatio.Required("adjustment"): probatio.Any(int, float), + probatio.Required("adjustment_unit_of_measurement"): probatio.Any(str, None), } ) @websocket_api.async_response @@ -566,29 +588,29 @@ def valid_units( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "recorder/import_statistics", - vol.Required("metadata"): { - vol.Optional("has_mean"): bool, - vol.Optional("mean_type"): vol.All( - vol.In(StatisticMeanType.__members__.values()), - vol.Coerce(StatisticMeanType), + probatio.Required("type"): "recorder/import_statistics", + probatio.Required("metadata"): { + probatio.Optional("has_mean"): bool, + probatio.Optional("mean_type"): probatio.All( + probatio.In(StatisticMeanType.__members__.values()), + probatio.Coerce(StatisticMeanType), ), - vol.Required("has_sum"): bool, - vol.Required("name"): vol.Any(str, None), - vol.Required("source"): str, - vol.Required("statistic_id"): str, - vol.Optional("unit_class"): vol.Any(str, None), - vol.Required("unit_of_measurement"): vol.Any(str, None), + probatio.Required("has_sum"): bool, + probatio.Required("name"): probatio.Any(str, None), + probatio.Required("source"): str, + probatio.Required("statistic_id"): str, + probatio.Optional("unit_class"): probatio.Any(str, None), + probatio.Required("unit_of_measurement"): probatio.Any(str, None), }, - vol.Required("stats"): [ + probatio.Required("stats"): [ { - vol.Required("start"): cv.datetime, - vol.Optional("mean"): vol.Any(int, float), - vol.Optional("min"): vol.Any(int, float), - vol.Optional("max"): vol.Any(int, float), - vol.Optional("last_reset"): vol.Any(cv.datetime, None), - vol.Optional("state"): vol.Any(int, float), - vol.Optional("sum"): vol.Any(int, float), + probatio.Required("start"): cv.datetime, + probatio.Optional("mean"): probatio.Any(int, float), + probatio.Optional("min"): probatio.Any(int, float), + probatio.Optional("max"): probatio.Any(int, float), + probatio.Optional("last_reset"): probatio.Any(cv.datetime, None), + probatio.Optional("state"): probatio.Any(int, float), + probatio.Optional("sum"): probatio.Any(int, float), } ], } diff --git a/homeassistant/components/recswitch/switch.py b/homeassistant/components/recswitch/switch.py index 43a3d038178af..fd9ad5d6b375f 100644 --- a/homeassistant/components/recswitch/switch.py +++ b/homeassistant/components/recswitch/switch.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from pyrecswitch import RSNetwork, RSNetworkError -import voluptuous as vol from homeassistant.components.switch import ( PLATFORM_SCHEMA as SWITCH_PLATFORM_SCHEMA, @@ -24,9 +24,9 @@ PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_MAC): vol.All(cv.string, vol.Upper), - vol.Optional(CONF_NAME): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_MAC): probatio.All(cv.string, probatio.Upper), + probatio.Optional(CONF_NAME): cv.string, } ) diff --git a/homeassistant/components/reddit/sensor.py b/homeassistant/components/reddit/sensor.py index 56d37e3d36326..e216186ed26d1 100644 --- a/homeassistant/components/reddit/sensor.py +++ b/homeassistant/components/reddit/sensor.py @@ -5,7 +5,7 @@ from typing import Any, override import praw -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -48,15 +48,15 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_CLIENT_ID): cv.string, - vol.Required(CONF_CLIENT_SECRET): cv.string, - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Required(CONF_SUBREDDITS): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(CONF_SORT_BY, default="hot"): vol.All( - cv.string, vol.In(LIST_TYPES) + probatio.Required(CONF_CLIENT_ID): cv.string, + probatio.Required(CONF_CLIENT_SECRET): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_SUBREDDITS): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(CONF_SORT_BY, default="hot"): probatio.All( + cv.string, probatio.In(LIST_TYPES) ), - vol.Optional(CONF_MAXIMUM, default=10): cv.positive_int, + probatio.Optional(CONF_MAXIMUM, default=10): cv.positive_int, } ) diff --git a/homeassistant/components/redgtech/config_flow.py b/homeassistant/components/redgtech/config_flow.py index ec614bbf4730c..b0628941d42fc 100644 --- a/homeassistant/components/redgtech/config_flow.py +++ b/homeassistant/components/redgtech/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from redgtech_api.api import RedgtechAPI, RedgtechAuthError, RedgtechConnectionError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_EMAIL, CONF_PASSWORD @@ -53,10 +53,10 @@ async def async_step_user( return self.async_show_form( step_id="user", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_EMAIL): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_EMAIL): str, + probatio.Required(CONF_PASSWORD): str, } ), user_input, diff --git a/homeassistant/components/rehlko/config_flow.py b/homeassistant/components/rehlko/config_flow.py index 72dd69fcf9fb9..4698e90e7e1b4 100644 --- a/homeassistant/components/rehlko/config_flow.py +++ b/homeassistant/components/rehlko/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from aiokem import AioKem, AuthenticationError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_EMAIL, CONF_PASSWORD @@ -39,10 +39,10 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_EMAIL): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_EMAIL): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, @@ -97,6 +97,6 @@ async def async_step_reauth_confirm( return self.async_show_form( description_placeholders=description_placeholders, step_id="reauth_confirm", - data_schema=vol.Schema({vol.Required(CONF_PASSWORD): str}), + data_schema=probatio.Schema({probatio.Required(CONF_PASSWORD): str}), errors=errors, ) diff --git a/homeassistant/components/rejseplanen/config_flow.py b/homeassistant/components/rejseplanen/config_flow.py index b4c76ac8d4012..c7c2db1ea5a42 100644 --- a/homeassistant/components/rejseplanen/config_flow.py +++ b/homeassistant/components/rejseplanen/config_flow.py @@ -2,13 +2,13 @@ from typing import Any, override +import probatio from py_rejseplan.api.departures import DeparturesAPIClient as Rejseplanen from py_rejseplan.dataclasses.transport_mappings import DEPARTURE_TYPE_TO_CLASS from py_rejseplan.exceptions import ( APIError as RejseplanenAPIError, ConnectionError as RejseplanenConnectionError, ) -import voluptuous as vol from homeassistant.config_entries import ( ConfigEntry, @@ -40,27 +40,27 @@ DOMAIN, ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_KEY, default=""): str, + probatio.Required(CONF_API_KEY, default=""): str, } ) -CONFIG_STOP_SCHEMA = vol.Schema( +CONFIG_STOP_SCHEMA = probatio.Schema( { - vol.Required(CONF_STOP_ID): NumberSelector( + probatio.Required(CONF_STOP_ID): NumberSelector( NumberSelectorConfig( mode=NumberSelectorMode.BOX, min=1, max=999999999, step=1 ), ), - vol.Optional(CONF_NAME, default=DEFAULT_STOP_NAME): str, # pylint: disable=home-assistant-config-flow-name-field - vol.Optional(CONF_DIRECTION, default=[]): TextSelector( + probatio.Optional(CONF_NAME, default=DEFAULT_STOP_NAME): str, # pylint: disable=home-assistant-config-flow-name-field + probatio.Optional(CONF_DIRECTION, default=[]): TextSelector( TextSelectorConfig( type=TextSelectorType.TEXT, multiple=True, ) ), - vol.Optional( + probatio.Optional( CONF_DEPARTURE_TYPE, default=[], ): SelectSelector( diff --git a/homeassistant/components/rejseplanen/sensor.py b/homeassistant/components/rejseplanen/sensor.py index 50e5907474133..cee1f26c166ae 100644 --- a/homeassistant/components/rejseplanen/sensor.py +++ b/homeassistant/components/rejseplanen/sensor.py @@ -11,8 +11,8 @@ from typing import override import zoneinfo +import probatio from py_rejseplan.dataclasses.departure import Departure -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -52,11 +52,13 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_AUTHENTICATION): cv.string, - vol.Required(CONF_STOP_ID): vol.All(cv.ensure_list, [cv.positive_int]), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_DEPARTURE_TYPE, default=[]): vol.All( - cv.ensure_list, [vol.In([*BUS_TYPES, *TRAIN_TYPES, *METRO_TYPES])] + probatio.Required(CONF_AUTHENTICATION): cv.string, + probatio.Required(CONF_STOP_ID): probatio.All( + cv.ensure_list, [cv.positive_int] + ), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_DEPARTURE_TYPE, default=[]): probatio.All( + cv.ensure_list, [probatio.In([*BUS_TYPES, *TRAIN_TYPES, *METRO_TYPES])] ), } ) diff --git a/homeassistant/components/remember_the_milk/__init__.py b/homeassistant/components/remember_the_milk/__init__.py index 853ee43a634d4..57533a6083188 100644 --- a/homeassistant/components/remember_the_milk/__init__.py +++ b/homeassistant/components/remember_the_milk/__init__.py @@ -4,7 +4,7 @@ from typing import Any from aiortm import AioRTMClient, AioRTMError, Auth, AuthError -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_IMPORT from homeassistant.const import ( @@ -35,26 +35,26 @@ PLATFORMS = [Platform.TODO] -RTM_SCHEMA = vol.Schema( +RTM_SCHEMA = probatio.Schema( { - vol.Required(CONF_NAME): cv.string, - vol.Required(CONF_API_KEY): cv.string, - vol.Required(CONF_SHARED_SECRET): cv.string, + probatio.Required(CONF_NAME): cv.string, + probatio.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_SHARED_SECRET): cv.string, } ) -CONFIG_SCHEMA = vol.Schema( - {DOMAIN: vol.All(cv.ensure_list, [RTM_SCHEMA])}, extra=vol.ALLOW_EXTRA +CONFIG_SCHEMA = probatio.Schema( + {DOMAIN: probatio.All(cv.ensure_list, [RTM_SCHEMA])}, extra=probatio.ALLOW_EXTRA ) SERVICE_CREATE_TASK = "create_task" SERVICE_COMPLETE_TASK = "complete_task" -SERVICE_SCHEMA_CREATE_TASK = vol.Schema( - {vol.Required(CONF_NAME): cv.string, vol.Optional(CONF_ID): cv.string} +SERVICE_SCHEMA_CREATE_TASK = probatio.Schema( + {probatio.Required(CONF_NAME): cv.string, probatio.Optional(CONF_ID): cv.string} ) -SERVICE_SCHEMA_COMPLETE_TASK = vol.Schema({vol.Required(CONF_ID): cv.string}) +SERVICE_SCHEMA_COMPLETE_TASK = probatio.Schema({probatio.Required(CONF_ID): cv.string}) DATA_COMPONENT = "component" DATA_STORAGE = "storage" diff --git a/homeassistant/components/remember_the_milk/config_flow.py b/homeassistant/components/remember_the_milk/config_flow.py index 61e4ac9cdd3d8..c28955cc1c122 100644 --- a/homeassistant/components/remember_the_milk/config_flow.py +++ b/homeassistant/components/remember_the_milk/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from aiortm import AioRTMClient, AioRTMError, Auth, AuthError -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -29,12 +29,12 @@ TOKEN_TIMEOUT_SEC = 30 -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_KEY): TextSelector( + probatio.Required(CONF_API_KEY): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), - vol.Required(CONF_SHARED_SECRET): TextSelector( + probatio.Required(CONF_SHARED_SECRET): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } @@ -186,7 +186,7 @@ async def async_step_reauth_confirm( if user_input is None: return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema({}), + data_schema=probatio.Schema({}), ) return await self.async_step_user() @@ -263,7 +263,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_NAME): TextSelector()}), + data_schema=probatio.Schema({probatio.Required(CONF_NAME): TextSelector()}), errors=errors, ) @@ -299,7 +299,7 @@ async def async_step_reconfigure( return self.async_show_form( step_id="reconfigure", data_schema=self.add_suggested_values_to_schema( - vol.Schema({vol.Required(CONF_NAME): TextSelector()}), + probatio.Schema({probatio.Required(CONF_NAME): TextSelector()}), {CONF_NAME: subentry.title}, ), errors=errors, diff --git a/homeassistant/components/remote/__init__.py b/homeassistant/components/remote/__init__.py index 097385327be30..3eee6c020820f 100644 --- a/homeassistant/components/remote/__init__.py +++ b/homeassistant/components/remote/__init__.py @@ -7,8 +7,8 @@ import logging from typing import Any, Final, final, override +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( @@ -68,7 +68,7 @@ class RemoteEntityFeature(IntFlag): REMOTE_SERVICE_ACTIVITY_SCHEMA = cv.make_entity_service_schema( - {vol.Optional(ATTR_ACTIVITY): cv.string} + {probatio.Optional(ATTR_ACTIVITY): cv.string} ) @@ -99,13 +99,15 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: component.async_register_entity_service( SERVICE_SEND_COMMAND, { - vol.Required(ATTR_COMMAND): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(ATTR_DEVICE): cv.string, - vol.Optional( + probatio.Required(ATTR_COMMAND): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(ATTR_DEVICE): cv.string, + probatio.Optional( ATTR_NUM_REPEATS, default=DEFAULT_NUM_REPEATS ): cv.positive_int, - vol.Optional(ATTR_DELAY_SECS): vol.Coerce(float), - vol.Optional(ATTR_HOLD_SECS, default=DEFAULT_HOLD_SECS): vol.Coerce(float), + probatio.Optional(ATTR_DELAY_SECS): probatio.Coerce(float), + probatio.Optional( + ATTR_HOLD_SECS, default=DEFAULT_HOLD_SECS + ): probatio.Coerce(float), }, "async_send_command", ) @@ -113,11 +115,11 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: component.async_register_entity_service( SERVICE_LEARN_COMMAND, { - vol.Optional(ATTR_DEVICE): cv.string, - vol.Optional(ATTR_COMMAND): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(ATTR_COMMAND_TYPE): cv.string, - vol.Optional(ATTR_ALTERNATIVE): cv.boolean, - vol.Optional(ATTR_TIMEOUT): cv.positive_int, + probatio.Optional(ATTR_DEVICE): cv.string, + probatio.Optional(ATTR_COMMAND): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(ATTR_COMMAND_TYPE): cv.string, + probatio.Optional(ATTR_ALTERNATIVE): cv.boolean, + probatio.Optional(ATTR_TIMEOUT): cv.positive_int, }, "async_learn_command", ) @@ -125,8 +127,8 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: component.async_register_entity_service( SERVICE_DELETE_COMMAND, { - vol.Required(ATTR_COMMAND): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(ATTR_DEVICE): cv.string, + probatio.Required(ATTR_COMMAND): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(ATTR_DEVICE): cv.string, }, "async_delete_command", ) diff --git a/homeassistant/components/remote/device_action.py b/homeassistant/components/remote/device_action.py index 274663f7928e6..74cbeeb15eb2c 100644 --- a/homeassistant/components/remote/device_action.py +++ b/homeassistant/components/remote/device_action.py @@ -1,6 +1,6 @@ """Provides device actions for remotes.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import ( async_validate_entity_schema, @@ -14,7 +14,9 @@ # mypy: disallow-any-generics -_ACTION_SCHEMA = toggle_entity.ACTION_SCHEMA.extend({vol.Required(CONF_DOMAIN): DOMAIN}) +_ACTION_SCHEMA = toggle_entity.ACTION_SCHEMA.extend( + {probatio.Required(CONF_DOMAIN): DOMAIN} +) async def async_validate_action_config( diff --git a/homeassistant/components/remote/device_condition.py b/homeassistant/components/remote/device_condition.py index 70a5f87b5efeb..4fd8992b81d4e 100644 --- a/homeassistant/components/remote/device_condition.py +++ b/homeassistant/components/remote/device_condition.py @@ -1,6 +1,6 @@ """Provides device conditions for remotes.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import toggle_entity from homeassistant.const import CONF_DOMAIN @@ -13,7 +13,7 @@ # mypy: disallow-any-generics CONDITION_SCHEMA = toggle_entity.CONDITION_SCHEMA.extend( - {vol.Required(CONF_DOMAIN): DOMAIN} + {probatio.Required(CONF_DOMAIN): DOMAIN} ) @@ -34,6 +34,6 @@ async def async_get_conditions( async def async_get_condition_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List condition capabilities.""" return await toggle_entity.async_get_condition_capabilities(hass, config) diff --git a/homeassistant/components/remote/device_trigger.py b/homeassistant/components/remote/device_trigger.py index 15306dd81cad2..47cb64fd75328 100644 --- a/homeassistant/components/remote/device_trigger.py +++ b/homeassistant/components/remote/device_trigger.py @@ -1,6 +1,6 @@ """Provides device triggers for remotes.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import toggle_entity from homeassistant.const import CONF_DOMAIN @@ -10,9 +10,11 @@ from . import DOMAIN -TRIGGER_SCHEMA = vol.All( +TRIGGER_SCHEMA = probatio.All( toggle_entity.TRIGGER_SCHEMA, - vol.Schema({vol.Required(CONF_DOMAIN): DOMAIN}, extra=vol.ALLOW_EXTRA), + probatio.Schema( + {probatio.Required(CONF_DOMAIN): DOMAIN}, extra=probatio.ALLOW_EXTRA + ), ) @@ -35,6 +37,6 @@ async def async_get_triggers( async def async_get_trigger_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List trigger capabilities.""" return await toggle_entity.async_get_trigger_capabilities(hass, config) diff --git a/homeassistant/components/remote_calendar/config_flow.py b/homeassistant/components/remote_calendar/config_flow.py index 43826076f19a6..0bb5a86ecab3b 100644 --- a/homeassistant/components/remote_calendar/config_flow.py +++ b/homeassistant/components/remote_calendar/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from httpx import HTTPError, InvalidURL, TimeoutException -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_URL, CONF_USERNAME, CONF_VERIFY_SSL @@ -17,18 +17,18 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_CALENDAR_NAME): str, - vol.Required(CONF_URL): str, - vol.Required(CONF_VERIFY_SSL, default=True): bool, + probatio.Required(CONF_CALENDAR_NAME): str, + probatio.Required(CONF_URL): str, + probatio.Required(CONF_VERIFY_SSL, default=True): bool, } ) -STEP_AUTH_DATA_SCHEMA = vol.Schema( +STEP_AUTH_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/remote_rpi_gpio/binary_sensor.py b/homeassistant/components/remote_rpi_gpio/binary_sensor.py index 3aed636785b92..11f6664f221f8 100644 --- a/homeassistant/components/remote_rpi_gpio/binary_sensor.py +++ b/homeassistant/components/remote_rpi_gpio/binary_sensor.py @@ -3,8 +3,8 @@ from typing import override from gpiozero import DigitalInputDevice +import probatio import requests -import voluptuous as vol from homeassistant.components.binary_sensor import ( PLATFORM_SCHEMA as BINARY_SENSOR_PLATFORM_SCHEMA, @@ -29,15 +29,15 @@ CONF_PORTS = "ports" -_SENSORS_SCHEMA = vol.Schema({cv.positive_int: cv.string}) +_SENSORS_SCHEMA = probatio.Schema({cv.positive_int: cv.string}) PLATFORM_SCHEMA = BINARY_SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_PORTS): _SENSORS_SCHEMA, - vol.Optional(CONF_INVERT_LOGIC, default=DEFAULT_INVERT_LOGIC): cv.boolean, - vol.Optional(CONF_BOUNCETIME, default=DEFAULT_BOUNCETIME): cv.positive_int, - vol.Optional(CONF_PULL_MODE, default=DEFAULT_PULL_MODE): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_PORTS): _SENSORS_SCHEMA, + probatio.Optional(CONF_INVERT_LOGIC, default=DEFAULT_INVERT_LOGIC): cv.boolean, + probatio.Optional(CONF_BOUNCETIME, default=DEFAULT_BOUNCETIME): cv.positive_int, + probatio.Optional(CONF_PULL_MODE, default=DEFAULT_PULL_MODE): cv.string, } ) diff --git a/homeassistant/components/remote_rpi_gpio/switch.py b/homeassistant/components/remote_rpi_gpio/switch.py index 59632b19f2da4..da434ffb8972f 100644 --- a/homeassistant/components/remote_rpi_gpio/switch.py +++ b/homeassistant/components/remote_rpi_gpio/switch.py @@ -3,7 +3,7 @@ from typing import Any, override from gpiozero import LED -import voluptuous as vol +import probatio from homeassistant.components.switch import ( PLATFORM_SCHEMA as SWITCH_PLATFORM_SCHEMA, @@ -19,13 +19,13 @@ CONF_PORTS = "ports" -_SENSORS_SCHEMA = vol.Schema({cv.positive_int: cv.string}) +_SENSORS_SCHEMA = probatio.Schema({cv.positive_int: cv.string}) PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_PORTS): _SENSORS_SCHEMA, - vol.Optional(CONF_INVERT_LOGIC, default=DEFAULT_INVERT_LOGIC): cv.boolean, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_PORTS): _SENSORS_SCHEMA, + probatio.Optional(CONF_INVERT_LOGIC, default=DEFAULT_INVERT_LOGIC): cv.boolean, } ) diff --git a/homeassistant/components/renault/config_flow.py b/homeassistant/components/renault/config_flow.py index 9ec294602aee9..f20e9c99237df 100644 --- a/homeassistant/components/renault/config_flow.py +++ b/homeassistant/components/renault/config_flow.py @@ -5,9 +5,9 @@ from typing import TYPE_CHECKING, Any, override import aiohttp +import probatio from renault_api.const import AVAILABLE_LOCALES from renault_api.gigya.exceptions import GigyaException -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_RECONFIGURE, @@ -20,14 +20,18 @@ _LOGGER = logging.getLogger(__name__) -USER_SCHEMA = vol.Schema( +USER_SCHEMA = probatio.Schema( { - vol.Required(RenaultConfigurationKeys.LOCALE): vol.In(AVAILABLE_LOCALES.keys()), - vol.Required(RenaultConfigurationKeys.USERNAME): str, - vol.Required(RenaultConfigurationKeys.PASSWORD): str, + probatio.Required(RenaultConfigurationKeys.LOCALE): probatio.In( + AVAILABLE_LOCALES.keys() + ), + probatio.Required(RenaultConfigurationKeys.USERNAME): str, + probatio.Required(RenaultConfigurationKeys.PASSWORD): str, } ) -REAUTH_SCHEMA = vol.Schema({vol.Required(RenaultConfigurationKeys.PASSWORD): str}) +REAUTH_SCHEMA = probatio.Schema( + {probatio.Required(RenaultConfigurationKeys.PASSWORD): str} +) class RenaultFlowHandler(ConfigFlow, domain=DOMAIN): @@ -119,11 +123,11 @@ async def async_step_kamereon( return self.async_show_form( step_id="kamereon", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(RenaultConfigurationKeys.KAMEREON_ACCOUNT_ID): vol.In( - accounts - ) + probatio.Required( + RenaultConfigurationKeys.KAMEREON_ACCOUNT_ID + ): probatio.In(accounts) } ), ) diff --git a/homeassistant/components/renault/services.py b/homeassistant/components/renault/services.py index 14c11a7250bbf..9fd43d0c432d0 100644 --- a/homeassistant/components/renault/services.py +++ b/homeassistant/components/renault/services.py @@ -5,7 +5,7 @@ import logging from typing import TYPE_CHECKING, Any -import voluptuous as vol +import probatio from homeassistant.core import HomeAssistant, ServiceCall, callback from homeassistant.exceptions import ServiceValidationError @@ -30,73 +30,99 @@ class RenaultServiceArgument(StrEnum): WHEN = "when" -SERVICE_VEHICLE_SCHEMA = vol.Schema( +SERVICE_VEHICLE_SCHEMA = probatio.Schema( { - vol.Required(RenaultServiceArgument.VEHICLE.value): cv.string, + probatio.Required(RenaultServiceArgument.VEHICLE.value): cv.string, } ) SERVICE_AC_START_SCHEMA = SERVICE_VEHICLE_SCHEMA.extend( { - vol.Required(RenaultServiceArgument.TEMPERATURE.value): cv.positive_float, - vol.Optional(RenaultServiceArgument.WHEN.value): cv.datetime, + probatio.Required(RenaultServiceArgument.TEMPERATURE.value): cv.positive_float, + probatio.Optional(RenaultServiceArgument.WHEN.value): cv.datetime, } ) SERVICE_CHARGE_START_SCHEMA = SERVICE_VEHICLE_SCHEMA.extend( { - vol.Optional(RenaultServiceArgument.WHEN.value): cv.datetime, + probatio.Optional(RenaultServiceArgument.WHEN.value): cv.datetime, } ) -SERVICE_CHARGE_SET_SCHEDULE_DAY_SCHEMA = vol.Schema( +SERVICE_CHARGE_SET_SCHEDULE_DAY_SCHEMA = probatio.Schema( { - vol.Required("startTime"): cv.string, - vol.Required("duration"): cv.positive_int, + probatio.Required("startTime"): cv.string, + probatio.Required("duration"): cv.positive_int, } ) -SERVICE_CHARGE_SET_SCHEDULE_SCHEMA = vol.Schema( +SERVICE_CHARGE_SET_SCHEDULE_SCHEMA = probatio.Schema( { - vol.Required("id"): cv.positive_int, - vol.Optional("activated"): cv.boolean, - vol.Optional("monday"): vol.Any(None, SERVICE_CHARGE_SET_SCHEDULE_DAY_SCHEMA), - vol.Optional("tuesday"): vol.Any(None, SERVICE_CHARGE_SET_SCHEDULE_DAY_SCHEMA), - vol.Optional("wednesday"): vol.Any( + probatio.Required("id"): cv.positive_int, + probatio.Optional("activated"): cv.boolean, + probatio.Optional("monday"): probatio.Any( + None, SERVICE_CHARGE_SET_SCHEDULE_DAY_SCHEMA + ), + probatio.Optional("tuesday"): probatio.Any( + None, SERVICE_CHARGE_SET_SCHEDULE_DAY_SCHEMA + ), + probatio.Optional("wednesday"): probatio.Any( + None, SERVICE_CHARGE_SET_SCHEDULE_DAY_SCHEMA + ), + probatio.Optional("thursday"): probatio.Any( + None, SERVICE_CHARGE_SET_SCHEDULE_DAY_SCHEMA + ), + probatio.Optional("friday"): probatio.Any( + None, SERVICE_CHARGE_SET_SCHEDULE_DAY_SCHEMA + ), + probatio.Optional("saturday"): probatio.Any( + None, SERVICE_CHARGE_SET_SCHEDULE_DAY_SCHEMA + ), + probatio.Optional("sunday"): probatio.Any( None, SERVICE_CHARGE_SET_SCHEDULE_DAY_SCHEMA ), - vol.Optional("thursday"): vol.Any(None, SERVICE_CHARGE_SET_SCHEDULE_DAY_SCHEMA), - vol.Optional("friday"): vol.Any(None, SERVICE_CHARGE_SET_SCHEDULE_DAY_SCHEMA), - vol.Optional("saturday"): vol.Any(None, SERVICE_CHARGE_SET_SCHEDULE_DAY_SCHEMA), - vol.Optional("sunday"): vol.Any(None, SERVICE_CHARGE_SET_SCHEDULE_DAY_SCHEMA), } ) SERVICE_CHARGE_SET_SCHEDULES_SCHEMA = SERVICE_VEHICLE_SCHEMA.extend( { - vol.Required(RenaultServiceArgument.SCHEDULES.value): vol.All( + probatio.Required(RenaultServiceArgument.SCHEDULES.value): probatio.All( cv.ensure_list, [SERVICE_CHARGE_SET_SCHEDULE_SCHEMA] ), } ) -SERVICE_AC_SET_SCHEDULE_DAY_SCHEMA = vol.Schema( +SERVICE_AC_SET_SCHEDULE_DAY_SCHEMA = probatio.Schema( { - vol.Required("readyAtTime"): cv.string, + probatio.Required("readyAtTime"): cv.string, } ) -SERVICE_AC_SET_SCHEDULE_SCHEMA = vol.Schema( +SERVICE_AC_SET_SCHEDULE_SCHEMA = probatio.Schema( { - vol.Required("id"): cv.positive_int, - vol.Optional("activated"): cv.boolean, - vol.Optional("monday"): vol.Any(None, SERVICE_AC_SET_SCHEDULE_DAY_SCHEMA), - vol.Optional("tuesday"): vol.Any(None, SERVICE_AC_SET_SCHEDULE_DAY_SCHEMA), - vol.Optional("wednesday"): vol.Any(None, SERVICE_AC_SET_SCHEDULE_DAY_SCHEMA), - vol.Optional("thursday"): vol.Any(None, SERVICE_AC_SET_SCHEDULE_DAY_SCHEMA), - vol.Optional("friday"): vol.Any(None, SERVICE_AC_SET_SCHEDULE_DAY_SCHEMA), - vol.Optional("saturday"): vol.Any(None, SERVICE_AC_SET_SCHEDULE_DAY_SCHEMA), - vol.Optional("sunday"): vol.Any(None, SERVICE_AC_SET_SCHEDULE_DAY_SCHEMA), + probatio.Required("id"): cv.positive_int, + probatio.Optional("activated"): cv.boolean, + probatio.Optional("monday"): probatio.Any( + None, SERVICE_AC_SET_SCHEDULE_DAY_SCHEMA + ), + probatio.Optional("tuesday"): probatio.Any( + None, SERVICE_AC_SET_SCHEDULE_DAY_SCHEMA + ), + probatio.Optional("wednesday"): probatio.Any( + None, SERVICE_AC_SET_SCHEDULE_DAY_SCHEMA + ), + probatio.Optional("thursday"): probatio.Any( + None, SERVICE_AC_SET_SCHEDULE_DAY_SCHEMA + ), + probatio.Optional("friday"): probatio.Any( + None, SERVICE_AC_SET_SCHEDULE_DAY_SCHEMA + ), + probatio.Optional("saturday"): probatio.Any( + None, SERVICE_AC_SET_SCHEDULE_DAY_SCHEMA + ), + probatio.Optional("sunday"): probatio.Any( + None, SERVICE_AC_SET_SCHEDULE_DAY_SCHEMA + ), } ) SERVICE_AC_SET_SCHEDULES_SCHEMA = SERVICE_VEHICLE_SCHEMA.extend( { - vol.Required(RenaultServiceArgument.SCHEDULES.value): vol.All( + probatio.Required(RenaultServiceArgument.SCHEDULES.value): probatio.All( cv.ensure_list, [SERVICE_AC_SET_SCHEDULE_SCHEMA] ), } diff --git a/homeassistant/components/renson/config_flow.py b/homeassistant/components/renson/config_flow.py index e2e44e7fcadae..2efcddc7057ba 100644 --- a/homeassistant/components/renson/config_flow.py +++ b/homeassistant/components/renson/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from renson_endura_delta import renson -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST @@ -15,9 +15,9 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, + probatio.Required(CONF_HOST): str, } ) diff --git a/homeassistant/components/renson/fan.py b/homeassistant/components/renson/fan.py index 4253552b3cea8..5afb7ea76381a 100644 --- a/homeassistant/components/renson/fan.py +++ b/homeassistant/components/renson/fan.py @@ -4,6 +4,7 @@ import math from typing import Any, override +import probatio from renson_endura_delta.field_enum import ( BREEZE_LEVEL_FIELD, BREEZE_TEMPERATURE_FIELD, @@ -11,7 +12,6 @@ DataType, ) from renson_endura_delta.renson import Level, RensonVentilation -import voluptuous as vol from homeassistant.components.fan import FanEntity, FanEntityFeature from homeassistant.core import HomeAssistant, callback @@ -48,30 +48,32 @@ } SET_TIMER_LEVEL_SCHEMA: VolDictType = { - vol.Required("timer_level"): vol.In( + probatio.Required("timer_level"): probatio.In( ["level1", "level2", "level3", "level4", "holiday", "breeze"] ), - vol.Required("minutes"): cv.positive_int, + probatio.Required("minutes"): cv.positive_int, } SET_BREEZE_SCHEMA: VolDictType = { - vol.Required("breeze_level"): vol.In(["level1", "level2", "level3", "level4"]), - vol.Required("temperature"): cv.positive_int, - vol.Required("activate"): bool, + probatio.Required("breeze_level"): probatio.In( + ["level1", "level2", "level3", "level4"] + ), + probatio.Required("temperature"): cv.positive_int, + probatio.Required("activate"): bool, } SET_POLLUTION_SETTINGS_SCHEMA: VolDictType = { - vol.Required("day_pollution_level"): vol.In( + probatio.Required("day_pollution_level"): probatio.In( ["level1", "level2", "level3", "level4"] ), - vol.Required("night_pollution_level"): vol.In( + probatio.Required("night_pollution_level"): probatio.In( ["level1", "level2", "level3", "level4"] ), - vol.Optional("humidity_control", default=True): bool, - vol.Optional("airquality_control", default=True): bool, - vol.Optional("co2_control", default=True): bool, - vol.Optional("co2_threshold", default=600): cv.positive_int, - vol.Optional("co2_hysteresis", default=100): cv.positive_int, + probatio.Optional("humidity_control", default=True): bool, + probatio.Optional("airquality_control", default=True): bool, + probatio.Optional("co2_control", default=True): bool, + probatio.Optional("co2_threshold", default=600): cv.positive_int, + probatio.Optional("co2_hysteresis", default=100): cv.positive_int, } diff --git a/homeassistant/components/reolink/config_flow.py b/homeassistant/components/reolink/config_flow.py index 2fbb53bd9103d..36b0795959900 100644 --- a/homeassistant/components/reolink/config_flow.py +++ b/homeassistant/components/reolink/config_flow.py @@ -5,6 +5,7 @@ import logging from typing import Any, override +import probatio from reolink_aio.api import ALLOWED_SPECIAL_CHARS from reolink_aio.baichuan import DEFAULT_BC_PORT from reolink_aio.exceptions import ( @@ -14,7 +15,6 @@ LoginPrivacyModeError, ReolinkError, ) -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -73,9 +73,9 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_PROTOCOL, default=self.config_entry.options[CONF_PROTOCOL], ): selector.SelectSelector( @@ -341,24 +341,24 @@ async def async_step_user( options=DEFAULT_OPTIONS, ) - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_USERNAME, default=self._username): str, - vol.Required(CONF_PASSWORD, default=self._password): str, + probatio.Required(CONF_USERNAME, default=self._username): str, + probatio.Required(CONF_PASSWORD, default=self._password): str, } ) if self._host is None or self.source == SOURCE_RECONFIGURE or errors: data_schema = data_schema.extend( { - vol.Required(CONF_HOST, default=self._host): str, + probatio.Required(CONF_HOST, default=self._host): str, } ) if errors: data_schema = data_schema.extend( { - vol.Optional(CONF_PORT): cv.port, - vol.Required(CONF_USE_HTTPS, default=False): bool, - vol.Required(CONF_BC_PORT, default=DEFAULT_BC_PORT): cv.port, + probatio.Optional(CONF_PORT): cv.port, + probatio.Required(CONF_USE_HTTPS, default=False): bool, + probatio.Required(CONF_BC_PORT, default=DEFAULT_BC_PORT): cv.port, } ) diff --git a/homeassistant/components/reolink/services.py b/homeassistant/components/reolink/services.py index da42ff3aef509..1328d363a07dd 100644 --- a/homeassistant/components/reolink/services.py +++ b/homeassistant/components/reolink/services.py @@ -1,8 +1,8 @@ """Reolink additional services.""" +import probatio from reolink_aio.api import Chime from reolink_aio.enums import ChimeToneEnum -import voluptuous as vol from homeassistant.components.button import DOMAIN as BUTTON_DOMAIN from homeassistant.const import ATTR_DEVICE_ID @@ -52,10 +52,10 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, "play_chime", _async_play_chime, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): list[str], - vol.Required(ATTR_RINGTONE): vol.In( + probatio.Required(ATTR_DEVICE_ID): list[str], + probatio.Required(ATTR_RINGTONE): probatio.In( [method.name for method in ChimeToneEnum][1:] ), } @@ -66,7 +66,7 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, SERVICE_PTZ_MOVE, entity_domain=BUTTON_DOMAIN, - schema={vol.Required(ATTR_SPEED): cv.positive_int}, + schema={probatio.Required(ATTR_SPEED): cv.positive_int}, func="async_ptz_move", required_features=[SUPPORT_PTZ_SPEED], ) diff --git a/homeassistant/components/repairs/issue_handler.py b/homeassistant/components/repairs/issue_handler.py index d33fc9d5204f8..aa8690ec90f75 100644 --- a/homeassistant/components/repairs/issue_handler.py +++ b/homeassistant/components/repairs/issue_handler.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant import data_entry_flow from homeassistant.core import HomeAssistant, callback @@ -37,7 +37,7 @@ async def async_step_confirm( return self.async_show_form( step_id="confirm", - data_schema=vol.Schema({}), + data_schema=probatio.Schema({}), description_placeholders=description_placeholders, ) diff --git a/homeassistant/components/repairs/websocket_api.py b/homeassistant/components/repairs/websocket_api.py index 9fe08f68ff097..92d476a8f9854 100644 --- a/homeassistant/components/repairs/websocket_api.py +++ b/homeassistant/components/repairs/websocket_api.py @@ -5,7 +5,7 @@ from typing import Any, override from aiohttp import web -import voluptuous as vol +import probatio from homeassistant import data_entry_flow from homeassistant.auth.permissions.const import POLICY_EDIT @@ -39,9 +39,9 @@ def async_setup(hass: HomeAssistant) -> None: @callback @websocket_api.websocket_command( { - vol.Required("type"): "repairs/get_issue_data", - vol.Required("domain"): str, - vol.Required("issue_id"): str, + probatio.Required("type"): "repairs/get_issue_data", + probatio.Required("domain"): str, + probatio.Required("issue_id"): str, } ) def ws_get_issue_data( @@ -62,10 +62,10 @@ def ws_get_issue_data( @callback @websocket_api.websocket_command( { - vol.Required("type"): "repairs/ignore_issue", - vol.Required("domain"): str, - vol.Required("issue_id"): str, - vol.Required("ignore"): bool, + probatio.Required("type"): "repairs/ignore_issue", + probatio.Required("domain"): str, + probatio.Required("issue_id"): str, + probatio.Required("ignore"): bool, } ) def ws_ignore_issue( @@ -79,7 +79,7 @@ def ws_ignore_issue( @websocket_api.websocket_command( { - vol.Required("type"): "repairs/list_issues", + probatio.Required("type"): "repairs/list_issues", } ) @callback @@ -130,12 +130,12 @@ class RepairsFlowIndexView(FlowManagerIndexView[RepairsFlowManager, RepairsFlowR @require_admin(permission=POLICY_EDIT) @RequestDataValidator( - vol.Schema( + probatio.Schema( { - vol.Required("handler"): str, - vol.Required("issue_id"): str, + probatio.Required("handler"): str, + probatio.Required("issue_id"): str, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) ) @override diff --git a/homeassistant/components/repetier/__init__.py b/homeassistant/components/repetier/__init__.py index 875b724e1ebb3..891dca6384803 100644 --- a/homeassistant/components/repetier/__init__.py +++ b/homeassistant/components/repetier/__init__.py @@ -4,8 +4,8 @@ from datetime import timedelta import logging +import probatio import pyrepetierng as pyrepetier -import voluptuous as vol from homeassistant.components.sensor import SensorDeviceClass, SensorEntityDescription from homeassistant.const import ( @@ -119,7 +119,7 @@ class APIMethods: def has_all_unique_names(value): """Validate that printers have an unique name.""" names = [util_slugify(printer[CONF_NAME]) for printer in value] - vol.Schema(vol.Unique())(names) + probatio.Schema(probatio.Unique())(names) return value @@ -186,34 +186,34 @@ class RepetierSensorEntityDescription( ), } -SENSOR_SCHEMA = vol.Schema( +SENSOR_SCHEMA = probatio.Schema( { - vol.Optional(CONF_MONITORED_CONDITIONS, default=list(SENSOR_TYPES)): vol.All( - cv.ensure_list, [vol.In(SENSOR_TYPES)] - ), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional( + CONF_MONITORED_CONDITIONS, default=list(SENSOR_TYPES) + ): probatio.All(cv.ensure_list, [probatio.In(SENSOR_TYPES)]), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.All( + DOMAIN: probatio.All( cv.ensure_list, [ - vol.Schema( + probatio.Schema( { - vol.Required(CONF_API_KEY): cv.string, - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_PORT, default=3344): cv.port, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_SENSORS, default={}): SENSOR_SCHEMA, + probatio.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_PORT, default=3344): cv.port, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_SENSORS, default={}): SENSOR_SCHEMA, } ) ], has_all_unique_names, ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/rest/__init__.py b/homeassistant/components/rest/__init__.py index af64d496c6ce1..65ea0b913fb6e 100644 --- a/homeassistant/components/rest/__init__.py +++ b/homeassistant/components/rest/__init__.py @@ -8,7 +8,7 @@ from typing import Any import aiohttp -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import DOMAIN as BINARY_SENSOR_DOMAIN from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN @@ -85,7 +85,7 @@ async def reload_service_handler(service: ServiceCall) -> None: await _async_process_config(hass, conf) hass.services.async_register( - DOMAIN, SERVICE_RELOAD, reload_service_handler, schema=vol.Schema({}) + DOMAIN, SERVICE_RELOAD, reload_service_handler, schema=probatio.Schema({}) ) return await _async_process_config(hass, config) diff --git a/homeassistant/components/rest/binary_sensor.py b/homeassistant/components/rest/binary_sensor.py index c6318ceb2814b..70d397d5ac3c1 100644 --- a/homeassistant/components/rest/binary_sensor.py +++ b/homeassistant/components/rest/binary_sensor.py @@ -4,7 +4,7 @@ from typing import override from xml.parsers.expat import ExpatError -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import ( DOMAIN as BINARY_SENSOR_DOMAIN, @@ -38,7 +38,7 @@ _LOGGER = logging.getLogger(__name__) -PLATFORM_SCHEMA = vol.All( +PLATFORM_SCHEMA = probatio.All( BINARY_SENSOR_PLATFORM_SCHEMA.extend({**RESOURCE_SCHEMA, **BINARY_SENSOR_SCHEMA}), cv.has_at_least_one_key(CONF_RESOURCE, CONF_RESOURCE_TEMPLATE), ) diff --git a/homeassistant/components/rest/notify.py b/homeassistant/components/rest/notify.py index 738b04f7195f4..edafb527ba370 100644 --- a/homeassistant/components/rest/notify.py +++ b/homeassistant/components/rest/notify.py @@ -5,7 +5,7 @@ from typing import Any, override import httpx -import voluptuous as vol +import probatio from homeassistant.components.notify import ( ATTR_MESSAGE, @@ -45,26 +45,26 @@ PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_RESOURCE): cv.url, - vol.Optional( + probatio.Required(CONF_RESOURCE): cv.url, + probatio.Optional( CONF_MESSAGE_PARAMETER_NAME, default=DEFAULT_MESSAGE_PARAM_NAME ): cv.string, - vol.Optional(CONF_METHOD, default=DEFAULT_METHOD): vol.In( + probatio.Optional(CONF_METHOD, default=DEFAULT_METHOD): probatio.In( ["POST", "GET", "POST_JSON"] ), - vol.Optional(CONF_HEADERS): vol.Schema({cv.string: cv.string}), - vol.Optional(CONF_PARAMS): vol.Schema({cv.string: cv.string}), - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_TARGET_PARAMETER_NAME): cv.string, - vol.Optional(CONF_TITLE_PARAMETER_NAME): cv.string, - vol.Optional(CONF_DATA): vol.All(dict, cv.template_complex), - vol.Optional(CONF_DATA_TEMPLATE): vol.All(dict, cv.template_complex), - vol.Optional(CONF_AUTHENTICATION): vol.In( + probatio.Optional(CONF_HEADERS): probatio.Schema({cv.string: cv.string}), + probatio.Optional(CONF_PARAMS): probatio.Schema({cv.string: cv.string}), + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_TARGET_PARAMETER_NAME): cv.string, + probatio.Optional(CONF_TITLE_PARAMETER_NAME): cv.string, + probatio.Optional(CONF_DATA): probatio.All(dict, cv.template_complex), + probatio.Optional(CONF_DATA_TEMPLATE): probatio.All(dict, cv.template_complex), + probatio.Optional(CONF_AUTHENTICATION): probatio.In( [HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION] ), - vol.Optional(CONF_PASSWORD): cv.string, - vol.Optional(CONF_USERNAME): cv.string, - vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, + probatio.Optional(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_USERNAME): cv.string, + probatio.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, } ) diff --git a/homeassistant/components/rest/schema.py b/homeassistant/components/rest/schema.py index bddad18586e0d..fa2d5dcc1a80c 100644 --- a/homeassistant/components/rest/schema.py +++ b/homeassistant/components/rest/schema.py @@ -1,6 +1,6 @@ """The rest component schemas.""" -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import ( DEVICE_CLASSES_SCHEMA as BINARY_SENSOR_DEVICE_CLASSES_SCHEMA, @@ -52,69 +52,69 @@ from .data import DEFAULT_TIMEOUT RESOURCE_SCHEMA = { - vol.Exclusive(CONF_RESOURCE, CONF_RESOURCE): cv.url, - vol.Exclusive(CONF_RESOURCE_TEMPLATE, CONF_RESOURCE): cv.template, - vol.Optional(CONF_AUTHENTICATION): vol.In( + probatio.Exclusive(CONF_RESOURCE, CONF_RESOURCE): cv.url, + probatio.Exclusive(CONF_RESOURCE_TEMPLATE, CONF_RESOURCE): cv.template, + probatio.Optional(CONF_AUTHENTICATION): probatio.In( [HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION] ), - vol.Optional(CONF_HEADERS): vol.Schema({cv.string: cv.template}), - vol.Optional(CONF_PARAMS): vol.Schema({cv.string: cv.template}), - vol.Optional(CONF_METHOD, default=DEFAULT_METHOD): vol.In(METHODS), - vol.Optional(CONF_USERNAME): cv.string, - vol.Optional(CONF_PASSWORD): cv.string, - vol.Exclusive(CONF_PAYLOAD, CONF_PAYLOAD): cv.string, - vol.Exclusive(CONF_PAYLOAD_TEMPLATE, CONF_PAYLOAD): cv.template, - vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, - vol.Optional( + probatio.Optional(CONF_HEADERS): probatio.Schema({cv.string: cv.template}), + probatio.Optional(CONF_PARAMS): probatio.Schema({cv.string: cv.template}), + probatio.Optional(CONF_METHOD, default=DEFAULT_METHOD): probatio.In(METHODS), + probatio.Optional(CONF_USERNAME): cv.string, + probatio.Optional(CONF_PASSWORD): cv.string, + probatio.Exclusive(CONF_PAYLOAD, CONF_PAYLOAD): cv.string, + probatio.Exclusive(CONF_PAYLOAD_TEMPLATE, CONF_PAYLOAD): cv.template, + probatio.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, + probatio.Optional( CONF_SSL_CIPHER_LIST, default=DEFAULT_SSL_CIPHER_LIST, - ): vol.In([e.value for e in SSLCipherList]), - vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, - vol.Optional(CONF_ENCODING, default=DEFAULT_ENCODING): cv.string, + ): probatio.In([e.value for e in SSLCipherList]), + probatio.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, + probatio.Optional(CONF_ENCODING, default=DEFAULT_ENCODING): cv.string, } SENSOR_SCHEMA = { **TEMPLATE_SENSOR_BASE_SCHEMA.schema, - vol.Optional(CONF_JSON_ATTRS, default=[]): cv.ensure_list_csv, - vol.Optional(CONF_JSON_ATTRS_PATH): cv.string, - vol.Optional(CONF_VALUE_TEMPLATE): vol.All( + probatio.Optional(CONF_JSON_ATTRS, default=[]): cv.ensure_list_csv, + probatio.Optional(CONF_JSON_ATTRS_PATH): cv.string, + probatio.Optional(CONF_VALUE_TEMPLATE): probatio.All( cv.template, ValueTemplate.from_template ), - vol.Optional(CONF_FORCE_UPDATE, default=DEFAULT_FORCE_UPDATE): cv.boolean, - vol.Optional(CONF_AVAILABILITY): cv.template, + probatio.Optional(CONF_FORCE_UPDATE, default=DEFAULT_FORCE_UPDATE): cv.boolean, + probatio.Optional(CONF_AVAILABILITY): cv.template, } BINARY_SENSOR_SCHEMA = { **TEMPLATE_ENTITY_BASE_SCHEMA.schema, - vol.Optional(CONF_DEVICE_CLASS): BINARY_SENSOR_DEVICE_CLASSES_SCHEMA, - vol.Optional(CONF_VALUE_TEMPLATE): vol.All( + probatio.Optional(CONF_DEVICE_CLASS): BINARY_SENSOR_DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_VALUE_TEMPLATE): probatio.All( cv.template, ValueTemplate.from_template ), - vol.Optional(CONF_FORCE_UPDATE, default=DEFAULT_FORCE_UPDATE): cv.boolean, - vol.Optional(CONF_AVAILABILITY): cv.template, + probatio.Optional(CONF_FORCE_UPDATE, default=DEFAULT_FORCE_UPDATE): cv.boolean, + probatio.Optional(CONF_AVAILABILITY): cv.template, } -COMBINED_SCHEMA = vol.Schema( +COMBINED_SCHEMA = probatio.Schema( { - vol.Optional(CONF_SCAN_INTERVAL): cv.time_period, + probatio.Optional(CONF_SCAN_INTERVAL): cv.time_period, **RESOURCE_SCHEMA, - vol.Optional(SENSOR_DOMAIN): vol.All( - cv.ensure_list, [vol.Schema(SENSOR_SCHEMA)] + probatio.Optional(SENSOR_DOMAIN): probatio.All( + cv.ensure_list, [probatio.Schema(SENSOR_SCHEMA)] ), - vol.Optional(BINARY_SENSOR_DOMAIN): vol.All( - cv.ensure_list, [vol.Schema(BINARY_SENSOR_SCHEMA)] + probatio.Optional(BINARY_SENSOR_DOMAIN): probatio.All( + cv.ensure_list, [probatio.Schema(BINARY_SENSOR_SCHEMA)] ), } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.All( + DOMAIN: probatio.All( cv.ensure_list, cv.remove_falsy, [COMBINED_SCHEMA], ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/rest/sensor.py b/homeassistant/components/rest/sensor.py index 08df21466e8be..6bf308e01c5f7 100644 --- a/homeassistant/components/rest/sensor.py +++ b/homeassistant/components/rest/sensor.py @@ -4,7 +4,7 @@ from typing import Any, override from xml.parsers.expat import ExpatError -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( DOMAIN as SENSOR_DOMAIN, @@ -38,7 +38,7 @@ _LOGGER = logging.getLogger(__name__) -PLATFORM_SCHEMA = vol.All( +PLATFORM_SCHEMA = probatio.All( SENSOR_PLATFORM_SCHEMA.extend({**RESOURCE_SCHEMA, **SENSOR_SCHEMA}), cv.has_at_least_one_key(CONF_RESOURCE, CONF_RESOURCE_TEMPLATE), ) diff --git a/homeassistant/components/rest/switch.py b/homeassistant/components/rest/switch.py index fe03f3eab368a..fe10c6d1904a4 100644 --- a/homeassistant/components/rest/switch.py +++ b/homeassistant/components/rest/switch.py @@ -5,7 +5,7 @@ from typing import Any, override import httpx -import voluptuous as vol +import probatio from homeassistant.components.switch import ( DEVICE_CLASSES_SCHEMA, @@ -68,24 +68,24 @@ PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( { **TEMPLATE_ENTITY_BASE_SCHEMA.schema, - vol.Required(CONF_RESOURCE): cv.url, - vol.Optional(CONF_STATE_RESOURCE): cv.url, - vol.Optional(CONF_HEADERS): {cv.string: cv.template}, - vol.Optional(CONF_PARAMS): {cv.string: cv.template}, - vol.Optional(CONF_BODY_OFF, default=DEFAULT_BODY_OFF): cv.template, - vol.Optional(CONF_BODY_ON, default=DEFAULT_BODY_ON): cv.template, - vol.Optional(CONF_IS_ON_TEMPLATE): vol.All( + probatio.Required(CONF_RESOURCE): cv.url, + probatio.Optional(CONF_STATE_RESOURCE): cv.url, + probatio.Optional(CONF_HEADERS): {cv.string: cv.template}, + probatio.Optional(CONF_PARAMS): {cv.string: cv.template}, + probatio.Optional(CONF_BODY_OFF, default=DEFAULT_BODY_OFF): cv.template, + probatio.Optional(CONF_BODY_ON, default=DEFAULT_BODY_ON): cv.template, + probatio.Optional(CONF_IS_ON_TEMPLATE): probatio.All( cv.template, ValueTemplate.from_template ), - vol.Optional(CONF_METHOD, default=DEFAULT_METHOD): vol.All( - vol.Lower, vol.In(SUPPORT_REST_METHODS) + probatio.Optional(CONF_METHOD, default=DEFAULT_METHOD): probatio.All( + probatio.Lower, probatio.In(SUPPORT_REST_METHODS) ), - vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, - vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, - vol.Inclusive(CONF_USERNAME, "authentication"): cv.string, - vol.Inclusive(CONF_PASSWORD, "authentication"): cv.string, - vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, - vol.Optional(CONF_AVAILABILITY): cv.template, + probatio.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, + probatio.Inclusive(CONF_USERNAME, "authentication"): cv.string, + probatio.Inclusive(CONF_PASSWORD, "authentication"): cv.string, + probatio.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, + probatio.Optional(CONF_AVAILABILITY): cv.template, } ) diff --git a/homeassistant/components/rest_command/__init__.py b/homeassistant/components/rest_command/__init__.py index 586a3519d8086..aaa1b2986e193 100644 --- a/homeassistant/components/rest_command/__init__.py +++ b/homeassistant/components/rest_command/__init__.py @@ -8,7 +8,7 @@ import aiohttp from aiohttp import hdrs from multidict import CIMultiDict -import voluptuous as vol +import probatio from yarl import URL from homeassistant.const import ( @@ -53,32 +53,32 @@ CONF_INSECURE_CIPHER = "insecure_cipher" CONF_SKIP_URL_ENCODING = "skip_url_encoding" -COMMAND_SCHEMA = vol.Schema( +COMMAND_SCHEMA = probatio.Schema( { - vol.Required(CONF_URL): cv.template, - vol.Optional(CONF_METHOD, default=DEFAULT_METHOD): vol.All( - vol.Lower, vol.In(SUPPORT_REST_METHODS) + probatio.Required(CONF_URL): cv.template, + probatio.Optional(CONF_METHOD, default=DEFAULT_METHOD): probatio.All( + probatio.Lower, probatio.In(SUPPORT_REST_METHODS) ), - vol.Optional(CONF_HEADERS): vol.Schema({cv.string: cv.template}), - vol.Optional(CONF_AUTHENTICATION): vol.In( + probatio.Optional(CONF_HEADERS): probatio.Schema({cv.string: cv.template}), + probatio.Optional(CONF_AUTHENTICATION): probatio.In( [HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION] ), # A colon cannot be encoded into basic credentials, RFC 7617#section-2 - vol.Inclusive(CONF_USERNAME, "authentication"): vol.All( - cv.string, vol.Match(r"^[^:]*$") + probatio.Inclusive(CONF_USERNAME, "authentication"): probatio.All( + cv.string, probatio.Match(r"^[^:]*$") ), - vol.Inclusive(CONF_PASSWORD, "authentication"): cv.string, - vol.Optional(CONF_PAYLOAD): cv.template, - vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): vol.Coerce(int), - vol.Optional(CONF_CONTENT_TYPE): cv.string, - vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, - vol.Optional(CONF_INSECURE_CIPHER, default=False): cv.boolean, - vol.Optional(CONF_SKIP_URL_ENCODING, default=False): cv.boolean, + probatio.Inclusive(CONF_PASSWORD, "authentication"): cv.string, + probatio.Optional(CONF_PAYLOAD): cv.template, + probatio.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): probatio.Coerce(int), + probatio.Optional(CONF_CONTENT_TYPE): cv.string, + probatio.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, + probatio.Optional(CONF_INSECURE_CIPHER, default=False): cv.boolean, + probatio.Optional(CONF_SKIP_URL_ENCODING, default=False): cv.boolean, } ) -CONFIG_SCHEMA = vol.Schema( - {DOMAIN: cv.schema_with_slug_keys(COMMAND_SCHEMA)}, extra=vol.ALLOW_EXTRA +CONFIG_SCHEMA = probatio.Schema( + {DOMAIN: cv.schema_with_slug_keys(COMMAND_SCHEMA)}, extra=probatio.ALLOW_EXTRA ) @@ -284,7 +284,7 @@ async def async_service_handler(service: ServiceCall) -> ServiceResponse: async_register_rest_command(name, command_config) hass.services.async_register( - DOMAIN, SERVICE_RELOAD, reload_service_handler, schema=vol.Schema({}) + DOMAIN, SERVICE_RELOAD, reload_service_handler, schema=probatio.Schema({}) ) return True diff --git a/homeassistant/components/rflink/__init__.py b/homeassistant/components/rflink/__init__.py index 03e8889f98133..ad16c9b3193a5 100644 --- a/homeassistant/components/rflink/__init__.py +++ b/homeassistant/components/rflink/__init__.py @@ -4,9 +4,9 @@ from collections import defaultdict import logging +import probatio from rflink.protocol import create_rflink_connection from serial import SerialException -import voluptuous as vol from homeassistant.const import ( CONF_COMMAND, @@ -72,60 +72,63 @@ SIGNAL_EVENT = "rflink_event" -BINARY_SENSOR_PS = vol.Schema( +BINARY_SENSOR_PS = probatio.Schema( BINARY_SENSOR_PLATFORM, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -COVER_PS = vol.Schema( +COVER_PS = probatio.Schema( COVER_PLATFORM, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -LIGHT_PS = vol.Schema( +LIGHT_PS = probatio.Schema( LIGHT_PLATFORM, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -SENSOR_PS = vol.Schema( +SENSOR_PS = probatio.Schema( SENSOR_PLATFORM, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -SWITCH_PS = vol.Schema( +SWITCH_PS = probatio.Schema( SWITCH_PLATFORM, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_PORT): vol.Any(cv.port, cv.string), - vol.Optional(CONF_HOST): cv.string, - vol.Optional(CONF_WAIT_FOR_ACK, default=True): cv.boolean, - vol.Optional( + probatio.Required(CONF_PORT): probatio.Any(cv.port, cv.string), + probatio.Optional(CONF_HOST): cv.string, + probatio.Optional(CONF_WAIT_FOR_ACK, default=True): cv.boolean, + probatio.Optional( CONF_KEEPALIVE_IDLE, default=DEFAULT_TCP_KEEPALIVE_IDLE_TIMER ): int, - vol.Optional( + probatio.Optional( CONF_RECONNECT_INTERVAL, default=DEFAULT_RECONNECT_INTERVAL ): int, - vol.Optional(CONF_IGNORE_DEVICES, default=[]): vol.All( + probatio.Optional(CONF_IGNORE_DEVICES, default=[]): probatio.All( cv.ensure_list, [cv.string] ), - vol.Optional(Platform.BINARY_SENSOR.value): BINARY_SENSOR_PS, - vol.Optional(Platform.COVER.value): COVER_PS, - vol.Optional(Platform.LIGHT.value): LIGHT_PS, - vol.Optional(Platform.SENSOR.value): SENSOR_PS, - vol.Optional(Platform.SWITCH.value): SWITCH_PS, + probatio.Optional(Platform.BINARY_SENSOR.value): BINARY_SENSOR_PS, + probatio.Optional(Platform.COVER.value): COVER_PS, + probatio.Optional(Platform.LIGHT.value): LIGHT_PS, + probatio.Optional(Platform.SENSOR.value): SENSOR_PS, + probatio.Optional(Platform.SWITCH.value): SWITCH_PS, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -SEND_COMMAND_SCHEMA = vol.Schema( - {vol.Required(CONF_DEVICE_ID): cv.string, vol.Required(CONF_COMMAND): cv.string} +SEND_COMMAND_SCHEMA = probatio.Schema( + { + probatio.Required(CONF_DEVICE_ID): cv.string, + probatio.Required(CONF_COMMAND): cv.string, + } ) ALLOWED_PLATFORMS = [ diff --git a/homeassistant/components/rflink/binary_sensor.py b/homeassistant/components/rflink/binary_sensor.py index 6b6fff84336ca..eaf4fd8aabb20 100644 --- a/homeassistant/components/rflink/binary_sensor.py +++ b/homeassistant/components/rflink/binary_sensor.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import ( DEVICE_CLASSES_SCHEMA, @@ -32,16 +32,16 @@ DEFAULT_FORCE_UPDATE = False RFLINK_PLATFORM = { - vol.Optional(CONF_DEVICES, default={}): { - cv.string: vol.Schema( + probatio.Optional(CONF_DEVICES, default={}): { + cv.string: probatio.Schema( { - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, - vol.Optional( + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, + probatio.Optional( CONF_FORCE_UPDATE, default=DEFAULT_FORCE_UPDATE ): cv.boolean, - vol.Optional(CONF_OFF_DELAY): cv.positive_int, - vol.Optional(CONF_ALIASES, default=[]): vol.All( + probatio.Optional(CONF_OFF_DELAY): cv.positive_int, + probatio.Optional(CONF_ALIASES, default=[]): probatio.All( cv.ensure_list, [cv.string] ), } @@ -51,7 +51,7 @@ PLATFORM_SCHEMA = BINARY_SENSOR_PLATFORM_SCHEMA.extend( RFLINK_PLATFORM, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/rflink/const.py b/homeassistant/components/rflink/const.py index 279a4a7c859b3..74d29665ac507 100644 --- a/homeassistant/components/rflink/const.py +++ b/homeassistant/components/rflink/const.py @@ -1,6 +1,6 @@ """Support for Rflink devices.""" -import voluptuous as vol +import probatio from homeassistant.helpers import config_validation as cv @@ -30,11 +30,11 @@ TMP_ENTITY = "tmp.{}" -DEVICE_DEFAULTS_SCHEMA = vol.Schema( +DEVICE_DEFAULTS_SCHEMA = probatio.Schema( { - vol.Optional(CONF_FIRE_EVENT, default=False): cv.boolean, - vol.Optional( + probatio.Optional(CONF_FIRE_EVENT, default=False): cv.boolean, + probatio.Optional( CONF_SIGNAL_REPETITIONS, default=DEFAULT_SIGNAL_REPETITIONS - ): vol.Coerce(int), + ): probatio.Coerce(int), } ) diff --git a/homeassistant/components/rflink/cover.py b/homeassistant/components/rflink/cover.py index b998ac8cb94b2..3c46b82c26191 100644 --- a/homeassistant/components/rflink/cover.py +++ b/homeassistant/components/rflink/cover.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.cover import ( DOMAIN as PLATFORM_DOMAIN, @@ -39,26 +39,28 @@ TYPE_INVERTED = "inverted" RFLINK_PLATFORM = { - vol.Optional( + probatio.Optional( CONF_DEVICE_DEFAULTS, default=DEVICE_DEFAULTS_SCHEMA({}) ): DEVICE_DEFAULTS_SCHEMA, - vol.Optional(CONF_DEVICES, default={}): vol.Schema( + probatio.Optional(CONF_DEVICES, default={}): probatio.Schema( { cv.string: { - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_TYPE): vol.Any(TYPE_STANDARD, TYPE_INVERTED), - vol.Optional(CONF_ALIASES, default=[]): vol.All( + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_TYPE): probatio.Any( + TYPE_STANDARD, TYPE_INVERTED + ), + probatio.Optional(CONF_ALIASES, default=[]): probatio.All( cv.ensure_list, [cv.string] ), - vol.Optional(CONF_GROUP_ALIASES, default=[]): vol.All( + probatio.Optional(CONF_GROUP_ALIASES, default=[]): probatio.All( cv.ensure_list, [cv.string] ), - vol.Optional(CONF_NOGROUP_ALIASES, default=[]): vol.All( + probatio.Optional(CONF_NOGROUP_ALIASES, default=[]): probatio.All( cv.ensure_list, [cv.string] ), - vol.Optional(CONF_FIRE_EVENT, default=False): cv.boolean, - vol.Optional(CONF_SIGNAL_REPETITIONS): vol.Coerce(int), - vol.Optional(CONF_GROUP, default=True): cv.boolean, + probatio.Optional(CONF_FIRE_EVENT, default=False): cv.boolean, + probatio.Optional(CONF_SIGNAL_REPETITIONS): probatio.Coerce(int), + probatio.Optional(CONF_GROUP, default=True): cv.boolean, } } ), @@ -66,7 +68,7 @@ PLATFORM_SCHEMA = COVER_PLATFORM_SCHEMA.extend( RFLINK_PLATFORM, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/rflink/light.py b/homeassistant/components/rflink/light.py index dd15a21e5bcc6..8b27d832aa4b4 100644 --- a/homeassistant/components/rflink/light.py +++ b/homeassistant/components/rflink/light.py @@ -4,7 +4,7 @@ import re from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.light import ( ATTR_BRIGHTNESS, @@ -51,29 +51,29 @@ TYPE_TOGGLE = "toggle" RFLINK_PLATFORM = { - vol.Optional( + probatio.Optional( CONF_DEVICE_DEFAULTS, default=DEVICE_DEFAULTS_SCHEMA({}) ): DEVICE_DEFAULTS_SCHEMA, - vol.Optional(CONF_AUTOMATIC_ADD, default=True): cv.boolean, - vol.Optional(CONF_DEVICES, default={}): { - cv.string: vol.Schema( + probatio.Optional(CONF_AUTOMATIC_ADD, default=True): cv.boolean, + probatio.Optional(CONF_DEVICES, default={}): { + cv.string: probatio.Schema( { - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_TYPE): vol.Any( + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_TYPE): probatio.Any( TYPE_DIMMABLE, TYPE_SWITCHABLE, TYPE_HYBRID, TYPE_TOGGLE ), - vol.Optional(CONF_ALIASES, default=[]): vol.All( + probatio.Optional(CONF_ALIASES, default=[]): probatio.All( cv.ensure_list, [cv.string] ), - vol.Optional(CONF_GROUP_ALIASES, default=[]): vol.All( + probatio.Optional(CONF_GROUP_ALIASES, default=[]): probatio.All( cv.ensure_list, [cv.string] ), - vol.Optional(CONF_NOGROUP_ALIASES, default=[]): vol.All( + probatio.Optional(CONF_NOGROUP_ALIASES, default=[]): probatio.All( cv.ensure_list, [cv.string] ), - vol.Optional(CONF_FIRE_EVENT): cv.boolean, - vol.Optional(CONF_SIGNAL_REPETITIONS): vol.Coerce(int), - vol.Optional(CONF_GROUP, default=True): cv.boolean, + probatio.Optional(CONF_FIRE_EVENT): cv.boolean, + probatio.Optional(CONF_SIGNAL_REPETITIONS): probatio.Coerce(int), + probatio.Optional(CONF_GROUP, default=True): cv.boolean, } ) }, @@ -81,7 +81,7 @@ PLATFORM_SCHEMA = LIGHT_PLATFORM_SCHEMA.extend( RFLINK_PLATFORM, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/rflink/sensor.py b/homeassistant/components/rflink/sensor.py index 761b462ad2eca..6936bc6dc3777 100644 --- a/homeassistant/components/rflink/sensor.py +++ b/homeassistant/components/rflink/sensor.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from rflink.parser import PACKET_FIELDS, UNITS -import voluptuous as vol from homeassistant.components.sensor import ( DOMAIN as PLATFORM_DOMAIN, @@ -268,14 +268,14 @@ SENSOR_TYPES_DICT = {desc.key: desc for desc in SENSOR_TYPES} RFLINK_PLATFORM = { - vol.Optional(CONF_AUTOMATIC_ADD, default=True): cv.boolean, - vol.Optional(CONF_DEVICES, default={}): { - cv.string: vol.Schema( + probatio.Optional(CONF_AUTOMATIC_ADD, default=True): cv.boolean, + probatio.Optional(CONF_DEVICES, default={}): { + cv.string: probatio.Schema( { - vol.Optional(CONF_NAME): cv.string, - vol.Required(CONF_SENSOR_TYPE): cv.string, - vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, - vol.Optional(CONF_ALIASES, default=[]): vol.All( + probatio.Optional(CONF_NAME): cv.string, + probatio.Required(CONF_SENSOR_TYPE): cv.string, + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, + probatio.Optional(CONF_ALIASES, default=[]): probatio.All( cv.ensure_list, [cv.string] ), } @@ -285,7 +285,7 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( RFLINK_PLATFORM, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/rflink/switch.py b/homeassistant/components/rflink/switch.py index af175cdc387ff..c5b300d07e9e1 100644 --- a/homeassistant/components/rflink/switch.py +++ b/homeassistant/components/rflink/switch.py @@ -1,6 +1,6 @@ """Support for Rflink switches.""" -import voluptuous as vol +import probatio from homeassistant.components.switch import ( DOMAIN as PLATFORM_DOMAIN, @@ -29,25 +29,25 @@ PARALLEL_UPDATES = 0 RFLINK_PLATFORM = { - vol.Optional( + probatio.Optional( CONF_DEVICE_DEFAULTS, default=DEVICE_DEFAULTS_SCHEMA({}) ): DEVICE_DEFAULTS_SCHEMA, - vol.Optional(CONF_DEVICES, default={}): { - cv.string: vol.Schema( + probatio.Optional(CONF_DEVICES, default={}): { + cv.string: probatio.Schema( { - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_ALIASES, default=[]): vol.All( + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_ALIASES, default=[]): probatio.All( cv.ensure_list, [cv.string] ), - vol.Optional(CONF_GROUP_ALIASES, default=[]): vol.All( + probatio.Optional(CONF_GROUP_ALIASES, default=[]): probatio.All( cv.ensure_list, [cv.string] ), - vol.Optional(CONF_NOGROUP_ALIASES, default=[]): vol.All( + probatio.Optional(CONF_NOGROUP_ALIASES, default=[]): probatio.All( cv.ensure_list, [cv.string] ), - vol.Optional(CONF_FIRE_EVENT): cv.boolean, - vol.Optional(CONF_SIGNAL_REPETITIONS): vol.Coerce(int), - vol.Optional(CONF_GROUP, default=True): cv.boolean, + probatio.Optional(CONF_FIRE_EVENT): cv.boolean, + probatio.Optional(CONF_SIGNAL_REPETITIONS): probatio.Coerce(int), + probatio.Optional(CONF_GROUP, default=True): cv.boolean, } ) }, @@ -55,7 +55,7 @@ PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( RFLINK_PLATFORM, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/rfxtrx/config_flow.py b/homeassistant/components/rfxtrx/config_flow.py index 1db9f148f90d4..4df2444e33959 100644 --- a/homeassistant/components/rfxtrx/config_flow.py +++ b/homeassistant/components/rfxtrx/config_flow.py @@ -6,8 +6,8 @@ import itertools from typing import Any, TypedDict, cast, override +import probatio import RFXtrx as rfxtrxmod -import voluptuous as vol from homeassistant.components import usb from homeassistant.config_entries import ( @@ -153,20 +153,22 @@ async def async_step_prompt_options( } options = { - vol.Optional( + probatio.Optional( CONF_AUTOMATIC_ADD, default=self.config_entry.data[CONF_AUTOMATIC_ADD], ): bool, - vol.Optional( + probatio.Optional( CONF_PROTOCOLS, default=self.config_entry.data.get(CONF_PROTOCOLS) or [], ): cv.multi_select(RECV_MODES), - vol.Optional(CONF_EVENT_CODE): str, - vol.Optional(CONF_DEVICE): vol.In(configure_devices), + probatio.Optional(CONF_EVENT_CODE): str, + probatio.Optional(CONF_DEVICE): probatio.In(configure_devices), } return self.async_show_form( - step_id="prompt_options", data_schema=vol.Schema(options), errors=errors + step_id="prompt_options", + data_schema=probatio.Schema(options), + errors=errors, ) async def async_step_set_device_options( @@ -242,14 +244,14 @@ async def async_step_set_device_options( off_delay_schema: VolDictType if device_data.get(CONF_OFF_DELAY): off_delay_schema = { - vol.Optional( + probatio.Optional( CONF_OFF_DELAY, description={"suggested_value": device_data[CONF_OFF_DELAY]}, ): int, } else: off_delay_schema = { - vol.Optional(CONF_OFF_DELAY): int, + probatio.Optional(CONF_OFF_DELAY): int, } data_schema.update(off_delay_schema) @@ -259,14 +261,14 @@ async def async_step_set_device_options( ): data_schema.update( { - vol.Optional( + probatio.Optional( CONF_DATA_BITS, default=device_data.get(CONF_DATA_BITS, 0) ): int, - vol.Optional( + probatio.Optional( CONF_COMMAND_ON, default=hex(device_data.get(CONF_COMMAND_ON, 0)), ): str, - vol.Optional( + probatio.Optional( CONF_COMMAND_OFF, default=hex(device_data.get(CONF_COMMAND_OFF, 0)), ): str, @@ -276,12 +278,12 @@ async def async_step_set_device_options( if isinstance(self._selected_device_object.device, rfxtrxmod.RfyDevice): data_schema.update( { - vol.Optional( + probatio.Optional( CONF_VENETIAN_BLIND_MODE, default=device_data.get( CONF_VENETIAN_BLIND_MODE, CONST_VENETIAN_BLIND_MODE_DEFAULT ), - ): vol.In( + ): probatio.In( [ CONST_VENETIAN_BLIND_MODE_DEFAULT, CONST_VENETIAN_BLIND_MODE_US, @@ -299,13 +301,15 @@ async def async_step_set_device_options( if replace_devices: data_schema.update( { - vol.Optional(CONF_REPLACE_DEVICE): vol.In(replace_devices), + probatio.Optional(CONF_REPLACE_DEVICE): probatio.In( + replace_devices + ), } ) return self.async_show_form( step_id="set_device_options", - data_schema=vol.Schema(data_schema), + data_schema=probatio.Schema(data_schema), errors=errors, ) @@ -514,7 +518,9 @@ async def async_step_user( list_of_types = ["Serial", "Network"] - schema = vol.Schema({vol.Required(CONF_TYPE): vol.In(list_of_types)}) + schema = probatio.Schema( + {probatio.Required(CONF_TYPE): probatio.In(list_of_types)} + ) return self.async_show_form(step_id="user", data_schema=schema, errors=errors) async def async_step_setup_network( @@ -535,8 +541,8 @@ async def async_step_setup_network( if not errors: return self.async_create_entry(title="RFXTRX", data=data) - schema = vol.Schema( - {vol.Required(CONF_HOST): str, vol.Required(CONF_PORT): int} + schema = probatio.Schema( + {probatio.Required(CONF_HOST): str, probatio.Required(CONF_PORT): int} ) return self.async_show_form( step_id="setup_network", @@ -575,7 +581,9 @@ async def async_step_setup_serial( ) list_of_ports[CONF_MANUAL_PATH] = CONF_MANUAL_PATH - schema = vol.Schema({vol.Required(CONF_DEVICE): vol.In(list_of_ports)}) + schema = probatio.Schema( + {probatio.Required(CONF_DEVICE): probatio.In(list_of_ports)} + ) return self.async_show_form( step_id="setup_serial", data_schema=schema, @@ -598,7 +606,7 @@ async def async_step_setup_serial_manual_path( if not errors: return self.async_create_entry(title="RFXTRX", data=data) - schema = vol.Schema({vol.Required(CONF_DEVICE): str}) + schema = probatio.Schema({probatio.Required(CONF_DEVICE): str}) return self.async_show_form( step_id="setup_serial_manual_path", data_schema=schema, diff --git a/homeassistant/components/rfxtrx/device_action.py b/homeassistant/components/rfxtrx/device_action.py index a3625b350df00..d893bccc8f3aa 100644 --- a/homeassistant/components/rfxtrx/device_action.py +++ b/homeassistant/components/rfxtrx/device_action.py @@ -2,7 +2,7 @@ from collections.abc import Callable -import voluptuous as vol +import probatio from homeassistant.components.device_automation import InvalidDeviceAutomationConfig from homeassistant.const import CONF_DEVICE_ID, CONF_DOMAIN, CONF_TYPE @@ -31,8 +31,8 @@ ACTION_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): vol.In(ACTION_TYPES), - vol.Required(CONF_SUBTYPE): str, + probatio.Required(CONF_TYPE): probatio.In(ACTION_TYPES), + probatio.Required(CONF_SUBTYPE): str, } ) diff --git a/homeassistant/components/rfxtrx/device_trigger.py b/homeassistant/components/rfxtrx/device_trigger.py index db1ab78552315..1c645e1526fac 100644 --- a/homeassistant/components/rfxtrx/device_trigger.py +++ b/homeassistant/components/rfxtrx/device_trigger.py @@ -1,6 +1,6 @@ """Provides device automations for RFXCOM RFXtrx.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import ( DEVICE_TRIGGER_BASE_SCHEMA, @@ -37,8 +37,8 @@ ] TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): vol.In(TRIGGER_TYPES), - vol.Required(CONF_SUBTYPE): str, + probatio.Required(CONF_TYPE): probatio.In(TRIGGER_TYPES), + probatio.Required(CONF_SUBTYPE): str, } ) diff --git a/homeassistant/components/rfxtrx/services.py b/homeassistant/components/rfxtrx/services.py index 896b6b8ffd81d..63d1f8ee54c60 100644 --- a/homeassistant/components/rfxtrx/services.py +++ b/homeassistant/components/rfxtrx/services.py @@ -3,7 +3,7 @@ from typing import Any -import voluptuous as vol +import probatio from homeassistant.core import HomeAssistant, ServiceCall, callback from homeassistant.exceptions import HomeAssistantError @@ -17,12 +17,12 @@ def _bytearray_string(data: Any) -> bytearray: try: return bytearray.fromhex(val) except ValueError as err: - raise vol.Invalid( + raise probatio.Invalid( "Data must be a hex string with multiple of two characters" ) from err -SERVICE_SEND_SCHEMA = vol.Schema({ATTR_EVENT: _bytearray_string}) +SERVICE_SEND_SCHEMA = probatio.Schema({ATTR_EVENT: _bytearray_string}) @callback diff --git a/homeassistant/components/rhasspy/config_flow.py b/homeassistant/components/rhasspy/config_flow.py index cc2d6e7442ef9..eaa7f364be497 100644 --- a/homeassistant/components/rhasspy/config_flow.py +++ b/homeassistant/components/rhasspy/config_flow.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -20,6 +20,6 @@ async def async_step_user( ) -> ConfigFlowResult: """Handle the initial step.""" if user_input is None: - return self.async_show_form(step_id="user", data_schema=vol.Schema({})) + return self.async_show_form(step_id="user", data_schema=probatio.Schema({})) return self.async_create_entry(title="Rhasspy", data={}) diff --git a/homeassistant/components/ridwell/config_flow.py b/homeassistant/components/ridwell/config_flow.py index ad1ba6f2bf242..02aab758856a1 100644 --- a/homeassistant/components/ridwell/config_flow.py +++ b/homeassistant/components/ridwell/config_flow.py @@ -5,7 +5,7 @@ from aioridwell import async_get_client from aioridwell.errors import InvalidCredentialsError, RidwellError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -19,22 +19,22 @@ from .const import CALENDAR_TITLE_OPTIONS, CONF_CALENDAR_TITLE, DOMAIN, LOGGER from .coordinator import RidwellConfigEntry -STEP_REAUTH_CONFIRM_DATA_SCHEMA = vol.Schema( +STEP_REAUTH_CONFIRM_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, } ) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, } ) -OPTIONS_SCHEMA = vol.Schema( +OPTIONS_SCHEMA = probatio.Schema( { - vol.Optional(CONF_CALENDAR_TITLE): selector.SelectSelector( + probatio.Optional(CONF_CALENDAR_TITLE): selector.SelectSelector( selector.SelectSelectorConfig( options=CALENDAR_TITLE_OPTIONS, multiple=False, @@ -62,7 +62,7 @@ def __init__(self) -> None: self._username: str | None = None async def _async_validate( - self, error_step_id: str, error_schema: vol.Schema + self, error_step_id: str, error_schema: probatio.Schema ) -> ConfigFlowResult: """Validate input credentials and proceed accordingly.""" errors = {} diff --git a/homeassistant/components/ring/config_flow.py b/homeassistant/components/ring/config_flow.py index 396e39f9b22cb..0a4089d597a47 100644 --- a/homeassistant/components/ring/config_flow.py +++ b/homeassistant/components/ring/config_flow.py @@ -5,8 +5,8 @@ from typing import Any, override import uuid +import probatio from ring_doorbell import Auth, AuthenticationError, Requires2FAError -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -32,12 +32,12 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( - {vol.Required(CONF_USERNAME): str, vol.Required(CONF_PASSWORD): str} +STEP_USER_DATA_SCHEMA = probatio.Schema( + {probatio.Required(CONF_USERNAME): str, probatio.Required(CONF_PASSWORD): str} ) -STEP_REAUTH_DATA_SCHEMA = vol.Schema({vol.Required(CONF_PASSWORD): str}) +STEP_REAUTH_DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_PASSWORD): str}) -STEP_RECONFIGURE_DATA_SCHEMA = vol.Schema({vol.Required(CONF_PASSWORD): str}) +STEP_RECONFIGURE_DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_PASSWORD): str}) UNKNOWN_RING_ACCOUNT = "unknown_ring_account" @@ -152,7 +152,7 @@ async def async_step_2fa( return self.async_show_form( step_id="2fa", - data_schema=vol.Schema({vol.Required(CONF_2FA): str}), + data_schema=probatio.Schema({probatio.Required(CONF_2FA): str}), ) async def async_step_reauth( diff --git a/homeassistant/components/ripple/sensor.py b/homeassistant/components/ripple/sensor.py index 64897e9c27d02..9740311c1aef7 100644 --- a/homeassistant/components/ripple/sensor.py +++ b/homeassistant/components/ripple/sensor.py @@ -3,8 +3,8 @@ from datetime import timedelta from typing import override +import probatio from pyripple import get_balance -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -22,8 +22,8 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ADDRESS): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_ADDRESS): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/risco/config_flow.py b/homeassistant/components/risco/config_flow.py index c807cb32cdf8f..a2d72ee581494 100644 --- a/homeassistant/components/risco/config_flow.py +++ b/homeassistant/components/risco/config_flow.py @@ -4,8 +4,8 @@ import logging from typing import Any, override +import probatio from pyrisco import CannotConnectError, RiscoCloud, RiscoLocal, UnauthorizedError -import voluptuous as vol from homeassistant.components.alarm_control_panel import AlarmControlPanelState from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, OptionsFlow @@ -42,18 +42,18 @@ _LOGGER = logging.getLogger(__name__) -CLOUD_SCHEMA = vol.Schema( +CLOUD_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Required(CONF_PIN): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PIN): str, } ) -LOCAL_SCHEMA = vol.Schema( +LOCAL_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=1000): int, - vol.Required(CONF_PIN): str, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=1000): int, + probatio.Required(CONF_PIN): str, } ) HA_STATES = [ @@ -220,28 +220,28 @@ def __init__(self, config_entry: RiscoConfigEntry) -> None: """Initialize.""" self._data = {**DEFAULT_OPTIONS, **config_entry.options} - def _options_schema(self) -> vol.Schema: + def _options_schema(self) -> probatio.Schema: self._data = {**DEFAULT_ADVANCED_OPTIONS, **self._data} - return vol.Schema( + return probatio.Schema( { - vol.Required( + probatio.Required( CONF_CODE_ARM_REQUIRED, default=self._data[CONF_CODE_ARM_REQUIRED] ): bool, - vol.Required( + probatio.Required( CONF_CODE_DISARM_REQUIRED, default=self._data[CONF_CODE_DISARM_REQUIRED], ): bool, - vol.Required(CONF_MORE_OPTIONS): section( - vol.Schema( + probatio.Required(CONF_MORE_OPTIONS): section( + probatio.Schema( { # Polling interval is user-configurable, # which is no longer allowed # pylint: disable-next=home-assistant-config-flow-polling-field - vol.Required( + probatio.Required( CONF_SCAN_INTERVAL, default=self._data[CONF_SCAN_INTERVAL], ): int, - vol.Required( + probatio.Required( CONF_CONCURRENCY, default=self._data[CONF_CONCURRENCY], ): int, @@ -273,11 +273,11 @@ async def async_step_risco_to_ha( return await self.async_step_ha_to_risco() risco_to_ha = self._data[CONF_RISCO_STATES_TO_HA] - options = vol.Schema( + options = probatio.Schema( { - vol.Required(risco_state, default=risco_to_ha[risco_state]): vol.In( - HA_STATES - ) + probatio.Required( + risco_state, default=risco_to_ha[risco_state] + ): probatio.In(HA_STATES) for risco_state in RISCO_STATES } ) @@ -308,8 +308,8 @@ async def async_step_ha_to_risco( current = self._data[CONF_HA_STATES_TO_RISCO].get(ha_state) if current not in values: current = values[0] - options[vol.Required(ha_state, default=current)] = vol.In(values) + options[probatio.Required(ha_state, default=current)] = probatio.In(values) return self.async_show_form( - step_id="ha_to_risco", data_schema=vol.Schema(options) + step_id="ha_to_risco", data_schema=probatio.Schema(options) ) diff --git a/homeassistant/components/risco/services.py b/homeassistant/components/risco/services.py index dc369d61e65c2..f77f7c0ba3004 100644 --- a/homeassistant/components/risco/services.py +++ b/homeassistant/components/risco/services.py @@ -1,6 +1,6 @@ """Services for Risco integration.""" -import voluptuous as vol +import probatio from homeassistant.const import ATTR_CONFIG_ENTRY_ID, ATTR_TIME from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -38,10 +38,10 @@ async def _set_time(service_call: ServiceCall) -> None: hass.services.async_register( domain=DOMAIN, service=SERVICE_SET_TIME, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): cv.string, - vol.Optional(ATTR_TIME): cv.datetime, + probatio.Required(ATTR_CONFIG_ENTRY_ID): cv.string, + probatio.Optional(ATTR_TIME): cv.datetime, } ), service_func=_set_time, diff --git a/homeassistant/components/rituals_perfume_genie/config_flow.py b/homeassistant/components/rituals_perfume_genie/config_flow.py index 99fb99ab727ca..f3bfa00cf9f50 100644 --- a/homeassistant/components/rituals_perfume_genie/config_flow.py +++ b/homeassistant/components/rituals_perfume_genie/config_flow.py @@ -4,8 +4,8 @@ from typing import TYPE_CHECKING, Any, override from aiohttp import ClientError +import probatio from pyrituals import Account, AuthenticationException -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_EMAIL, CONF_PASSWORD @@ -13,10 +13,10 @@ from .const import DOMAIN -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_EMAIL): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_EMAIL): str, + probatio.Required(CONF_PASSWORD): str, } ) @@ -101,9 +101,9 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ), reauth_entry.data, diff --git a/homeassistant/components/rmvtransport/sensor.py b/homeassistant/components/rmvtransport/sensor.py index 3ae8a7cbde7bf..33c2012638f4c 100644 --- a/homeassistant/components/rmvtransport/sensor.py +++ b/homeassistant/components/rmvtransport/sensor.py @@ -5,12 +5,12 @@ import logging from typing import Any, override +import probatio from RMVtransport import RMVtransport from RMVtransport.rmvtransport import ( RMVtransportApiConnectionError, RMVtransportDataError, ) -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -59,25 +59,25 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_NEXT_DEPARTURE): [ + probatio.Required(CONF_NEXT_DEPARTURE): [ { - vol.Required(CONF_STATION): cv.string, - vol.Optional(CONF_DESTINATIONS, default=[]): vol.All( + probatio.Required(CONF_STATION): cv.string, + probatio.Optional(CONF_DESTINATIONS, default=[]): probatio.All( cv.ensure_list, [cv.string] ), - vol.Optional(CONF_DIRECTION): cv.string, - vol.Optional(CONF_LINES, default=[]): vol.All( + probatio.Optional(CONF_DIRECTION): cv.string, + probatio.Optional(CONF_LINES, default=[]): probatio.All( cv.ensure_list, [cv.positive_int, cv.string] ), - vol.Optional(CONF_PRODUCTS, default=VALID_PRODUCTS): vol.All( - cv.ensure_list, [vol.In(VALID_PRODUCTS)] + probatio.Optional(CONF_PRODUCTS, default=VALID_PRODUCTS): probatio.All( + cv.ensure_list, [probatio.In(VALID_PRODUCTS)] ), - vol.Optional(CONF_TIME_OFFSET, default=0): cv.positive_int, - vol.Optional(CONF_MAX_JOURNEYS, default=5): cv.positive_int, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_TIME_OFFSET, default=0): cv.positive_int, + probatio.Optional(CONF_MAX_JOURNEYS, default=5): cv.positive_int, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ], - vol.Optional(CONF_TIMEOUT, default=10): cv.positive_int, + probatio.Optional(CONF_TIMEOUT, default=10): cv.positive_int, } ) diff --git a/homeassistant/components/roborock/config_flow.py b/homeassistant/components/roborock/config_flow.py index 4932f644e6000..15212beb50025 100644 --- a/homeassistant/components/roborock/config_flow.py +++ b/homeassistant/components/roborock/config_flow.py @@ -6,6 +6,7 @@ from typing import Any, override from urllib.parse import urlparse +import probatio from roborock.data import UserData from roborock.exceptions import ( RoborockAccountDoesNotExist, @@ -16,7 +17,6 @@ RoborockUrlException, ) from roborock.web_api import RoborockApiClient -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -97,10 +97,10 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_REGION, default=REGION_AUTO): SelectSelector( + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_REGION, default=REGION_AUTO): SelectSelector( SelectSelectorConfig( options=REGION_OPTIONS, mode=SelectSelectorMode.DROPDOWN, @@ -135,9 +135,9 @@ async def async_step_custom_url( return self.async_show_form( step_id="custom_url", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_ROBOROCK_SERVER_URL, default=( user_input[CONF_ROBOROCK_SERVER_URL] @@ -207,7 +207,7 @@ async def async_step_code( return self.async_show_form( step_id="code", - data_schema=vol.Schema({vol.Required(CONF_ENTRY_CODE): str}), + data_schema=probatio.Schema({probatio.Required(CONF_ENTRY_CODE): str}), errors=errors, ) @@ -302,7 +302,7 @@ async def async_step_drawables( data_schema = {} for drawable, default_value in DEFAULT_DRAWABLES.items(): data_schema[ - vol.Required( + probatio.Required( drawable.value, default=self.config_entry.options.get(DRAWABLES, {}).get( drawable, default_value @@ -310,24 +310,24 @@ async def async_step_drawables( ) ] = bool data_schema[ - vol.Required( + probatio.Required( CONF_SHOW_BACKGROUND, default=self.config_entry.options.get(CONF_SHOW_BACKGROUND, False), ) ] = bool data_schema[ - vol.Required( + probatio.Required( CONF_SHOW_ROOMS, default=self.config_entry.options.get(CONF_SHOW_ROOMS, True), ) ] = bool data_schema[ - vol.Required( + probatio.Required( CONF_SHOW_WALLS, default=self.config_entry.options.get(CONF_SHOW_WALLS, True), ) ] = bool return self.async_show_form( step_id=DRAWABLES, - data_schema=vol.Schema(data_schema), + data_schema=probatio.Schema(data_schema), ) diff --git a/homeassistant/components/roborock/services.py b/homeassistant/components/roborock/services.py index 35eebd2b4006d..1a66c09703bb7 100644 --- a/homeassistant/components/roborock/services.py +++ b/homeassistant/components/roborock/services.py @@ -1,6 +1,6 @@ """Roborock services.""" -import voluptuous as vol +import probatio from homeassistant.components.vacuum import DOMAIN as VACUUM_DOMAIN from homeassistant.core import HomeAssistant, SupportsResponse, callback @@ -45,8 +45,8 @@ def async_setup_services(hass: HomeAssistant) -> None: entity_domain=VACUUM_DOMAIN, schema=cv.make_entity_service_schema( { - vol.Required("x"): vol.Coerce(int), - vol.Required("y"): vol.Coerce(int), + probatio.Required("x"): probatio.Coerce(int), + probatio.Required("y"): probatio.Coerce(int), }, ), func="async_set_vacuum_goto_position", @@ -60,12 +60,12 @@ def async_setup_services(hass: HomeAssistant) -> None: entity_domain=VACUUM_DOMAIN, schema=cv.make_entity_service_schema( { - vol.Required("x1"): vol.Coerce(int), - vol.Required("y1"): vol.Coerce(int), - vol.Required("x2"): vol.Coerce(int), - vol.Required("y2"): vol.Coerce(int), - vol.Required("repeats"): vol.All( - vol.Coerce(int), vol.Range(min=0, max=2) + probatio.Required("x1"): probatio.Coerce(int), + probatio.Required("y1"): probatio.Coerce(int), + probatio.Required("x2"): probatio.Coerce(int), + probatio.Required("y2"): probatio.Coerce(int), + probatio.Required("repeats"): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=2) ), }, ), diff --git a/homeassistant/components/rocketchat/notify.py b/homeassistant/components/rocketchat/notify.py index 8b461423a3f88..b2c10466c2481 100644 --- a/homeassistant/components/rocketchat/notify.py +++ b/homeassistant/components/rocketchat/notify.py @@ -4,12 +4,12 @@ import logging from typing import Any, override +import probatio from rocketchat_API.APIExceptions.RocketExceptions import ( RocketAuthenticationException, RocketConnectionException, ) from rocketchat_API.rocketchat import RocketChat -import voluptuous as vol from homeassistant.components.notify import ( ATTR_DATA, @@ -25,10 +25,10 @@ PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_URL): vol.Url(), - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Required(CONF_ROOM): cv.string, + probatio.Required(CONF_URL): probatio.Url(), + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_ROOM): cv.string, } ) diff --git a/homeassistant/components/roku/config_flow.py b/homeassistant/components/roku/config_flow.py index 884edd6f15ec4..b45522fe3619a 100644 --- a/homeassistant/components/roku/config_flow.py +++ b/homeassistant/components/roku/config_flow.py @@ -4,8 +4,8 @@ from typing import Any, override from urllib.parse import urlparse +import probatio from rokuecp import Roku, RokuError -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_RECONFIGURE, @@ -26,7 +26,7 @@ from .const import CONF_PLAY_MEDIA_APP_ID, DEFAULT_PLAY_MEDIA_APP_ID, DOMAIN from .coordinator import RokuConfigEntry -DATA_SCHEMA = vol.Schema({vol.Required(CONF_HOST): str}) +DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_HOST): str}) ERROR_CANNOT_CONNECT = "cannot_connect" ERROR_UNKNOWN = "unknown" @@ -216,9 +216,9 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_PLAY_MEDIA_APP_ID, default=self.config_entry.options.get( CONF_PLAY_MEDIA_APP_ID, DEFAULT_PLAY_MEDIA_APP_ID diff --git a/homeassistant/components/roku/services.py b/homeassistant/components/roku/services.py index 15f6d97c28b83..5ee318b780f55 100644 --- a/homeassistant/components/roku/services.py +++ b/homeassistant/components/roku/services.py @@ -1,6 +1,6 @@ """Support for the Roku media player.""" -import voluptuous as vol +import probatio from homeassistant.components.media_player import DOMAIN as MEDIA_PLAYER_DOMAIN from homeassistant.core import HomeAssistant, callback @@ -13,7 +13,7 @@ SERVICE_SEARCH = "search" -SEARCH_SCHEMA: VolDictType = {vol.Required(ATTR_KEYWORD): str} +SEARCH_SCHEMA: VolDictType = {probatio.Required(ATTR_KEYWORD): str} @callback diff --git a/homeassistant/components/romy/config_flow.py b/homeassistant/components/romy/config_flow.py index 66051c4e5f46b..1b6735c7e62ae 100644 --- a/homeassistant/components/romy/config_flow.py +++ b/homeassistant/components/romy/config_flow.py @@ -2,8 +2,8 @@ from typing import override +import probatio import romy -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PASSWORD @@ -50,9 +50,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST): cv.string, + probatio.Required(CONF_HOST): cv.string, }, ), errors=errors, @@ -78,8 +78,12 @@ async def async_step_password( return self.async_show_form( step_id="password", - data_schema=vol.Schema( - {vol.Required(CONF_PASSWORD): vol.All(cv.string, vol.Length(8))}, + data_schema=probatio.Schema( + { + probatio.Required(CONF_PASSWORD): probatio.All( + cv.string, probatio.Length(8) + ) + }, ), errors=errors, ) diff --git a/homeassistant/components/roomba/config_flow.py b/homeassistant/components/roomba/config_flow.py index 2837c966e9ec2..36b1ce335fe14 100644 --- a/homeassistant/components/roomba/config_flow.py +++ b/homeassistant/components/roomba/config_flow.py @@ -4,10 +4,10 @@ from functools import partial from typing import Any, override +import probatio from roombapy import RoombaFactory, RoombaInfo from roombapy.discovery import RoombaDiscovery from roombapy.getpassword import RoombaPassword -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, OptionsFlow from homeassistant.const import CONF_DELAY, CONF_HOST, CONF_NAME, CONF_PASSWORD @@ -210,7 +210,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Optional("host"): vol.In(hosts)}), + data_schema=probatio.Schema( + {probatio.Optional("host"): probatio.In(hosts)} + ), ) async def async_step_manual( @@ -221,8 +223,8 @@ async def async_step_manual( return self.async_show_form( step_id="manual", description_placeholders={AUTH_HELP_URL_KEY: AUTH_HELP_URL_VALUE}, - data_schema=vol.Schema( - {vol.Required(CONF_HOST, default=self.host): str} + data_schema=probatio.Schema( + {probatio.Required(CONF_HOST, default=self.host): str} ), ) @@ -304,7 +306,7 @@ async def async_step_link_manual( return self.async_show_form( step_id="link_manual", description_placeholders={AUTH_HELP_URL_KEY: AUTH_HELP_URL_VALUE}, - data_schema=vol.Schema({vol.Required(CONF_PASSWORD): str}), + data_schema=probatio.Schema({probatio.Required(CONF_PASSWORD): str}), errors=errors, ) @@ -322,13 +324,13 @@ async def async_step_init( options = self.config_entry.options return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_CONTINUOUS, default=options.get(CONF_CONTINUOUS, DEFAULT_CONTINUOUS), ): bool, - vol.Optional( + probatio.Optional( CONF_DELAY, default=options.get(CONF_DELAY, DEFAULT_DELAY), ): int, diff --git a/homeassistant/components/roon/config_flow.py b/homeassistant/components/roon/config_flow.py index 5f3ac74b6a46d..773b45c77d2be 100644 --- a/homeassistant/components/roon/config_flow.py +++ b/homeassistant/components/roon/config_flow.py @@ -4,8 +4,8 @@ import logging from typing import Any, override +import probatio from roonapi import RoonApi, RoonDiscovery -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY, CONF_HOST, CONF_PORT @@ -24,10 +24,10 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required("host"): cv.string, - vol.Required("port", default=9330): cv.port, + probatio.Required("host"): cv.string, + probatio.Required("port", default=9330): cv.port, } ) diff --git a/homeassistant/components/roon/services.py b/homeassistant/components/roon/services.py index 885e99d504019..9b60e0dbd667f 100644 --- a/homeassistant/components/roon/services.py +++ b/homeassistant/components/roon/services.py @@ -1,6 +1,6 @@ """MediaPlayer platform for Roon integration.""" -import voluptuous as vol +import probatio from homeassistant.components.media_player import DOMAIN as MEDIA_PLAYER_DOMAIN from homeassistant.core import HomeAssistant, callback @@ -21,6 +21,6 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, SERVICE_TRANSFER, entity_domain=MEDIA_PLAYER_DOMAIN, - schema={vol.Required(ATTR_TRANSFER): cv.entity_id}, + schema={probatio.Required(ATTR_TRANSFER): cv.entity_id}, func="async_transfer", ) diff --git a/homeassistant/components/route53/__init__.py b/homeassistant/components/route53/__init__.py index 68d5eb736a4ff..42a761050379d 100644 --- a/homeassistant/components/route53/__init__.py +++ b/homeassistant/components/route53/__init__.py @@ -5,8 +5,8 @@ import logging import boto3 +import probatio import requests -import voluptuous as vol from homeassistant.const import CONF_DOMAIN, CONF_TTL, CONF_ZONE from homeassistant.core import HomeAssistant, ServiceCall @@ -25,20 +25,22 @@ INTERVAL = timedelta(minutes=60) DEFAULT_TTL = 300 -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_ACCESS_KEY_ID): cv.string, - vol.Required(CONF_DOMAIN): cv.string, - vol.Required(CONF_RECORDS): vol.All(cv.ensure_list, [cv.string]), - vol.Required(CONF_SECRET_ACCESS_KEY): cv.string, - vol.Required(CONF_ZONE): cv.string, - vol.Optional(CONF_TTL, default=DEFAULT_TTL): cv.positive_int, + probatio.Required(CONF_ACCESS_KEY_ID): cv.string, + probatio.Required(CONF_DOMAIN): cv.string, + probatio.Required(CONF_RECORDS): probatio.All( + cv.ensure_list, [cv.string] + ), + probatio.Required(CONF_SECRET_ACCESS_KEY): cv.string, + probatio.Required(CONF_ZONE): cv.string, + probatio.Optional(CONF_TTL, default=DEFAULT_TTL): cv.positive_int, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/route_b_smart_meter/config_flow.py b/homeassistant/components/route_b_smart_meter/config_flow.py index 238781eb026b9..327c554b72932 100644 --- a/homeassistant/components/route_b_smart_meter/config_flow.py +++ b/homeassistant/components/route_b_smart_meter/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from momonga import Momonga, MomongaSkJoinFailure, MomongaSkScanFailure -import voluptuous as vol +import probatio from homeassistant.components.usb import ( USBDevice, @@ -99,9 +99,11 @@ async def async_step_user( ) return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_DEVICE, default=discovered_device_id): vol.In( + probatio.Required( + CONF_DEVICE, default=discovered_device_id + ): probatio.In( {discovered_device_id: discovered_device_name} if discovered_device_id and discovered_device_name else { @@ -109,8 +111,8 @@ async def async_step_user( for name, device in device_options.items() } ), - vol.Required(CONF_ID): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_ID): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, diff --git a/homeassistant/components/rova/config_flow.py b/homeassistant/components/rova/config_flow.py index e6c4c2668a19b..5d62ae900b28b 100644 --- a/homeassistant/components/rova/config_flow.py +++ b/homeassistant/components/rova/config_flow.py @@ -2,9 +2,9 @@ from typing import Any, override +import probatio from requests.exceptions import ConnectTimeout, HTTPError from rova.rova import Rova -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -49,11 +49,11 @@ async def async_step_user( return self.async_show_form( step_id="user", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_ZIP_CODE): str, - vol.Required(CONF_HOUSE_NUMBER): str, - vol.Optional(CONF_HOUSE_NUMBER_SUFFIX, default=""): str, + probatio.Required(CONF_ZIP_CODE): str, + probatio.Required(CONF_HOUSE_NUMBER): str, + probatio.Optional(CONF_HOUSE_NUMBER_SUFFIX, default=""): str, } ), user_input, diff --git a/homeassistant/components/rss_feed_template/__init__.py b/homeassistant/components/rss_feed_template/__init__.py index 67c283fef5f90..64cb79f143cb2 100644 --- a/homeassistant/components/rss_feed_template/__init__.py +++ b/homeassistant/components/rss_feed_template/__init__.py @@ -3,7 +3,7 @@ from html import escape from aiohttp import web -import voluptuous as vol +import probatio from homeassistant.components.http import HomeAssistantView from homeassistant.core import HomeAssistant @@ -14,20 +14,22 @@ CONTENT_TYPE_XML = "text/xml" DOMAIN = "rss_feed_template" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - cv.match_all: vol.Schema( + cv.match_all: probatio.Schema( { - vol.Optional("requires_api_password", default=True): cv.boolean, - vol.Optional("title"): cv.template, - vol.Required("items"): vol.All( + probatio.Optional( + "requires_api_password", default=True + ): cv.boolean, + probatio.Optional("title"): cv.template, + probatio.Required("items"): probatio.All( cv.ensure_list, [ { - vol.Optional("title"): cv.template, - vol.Optional("description"): cv.template, + probatio.Optional("title"): cv.template, + probatio.Optional("description"): cv.template, } ], ), @@ -36,7 +38,7 @@ } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/rtorrent/sensor.py b/homeassistant/components/rtorrent/sensor.py index 8a7d046071856..1de1306107d4a 100644 --- a/homeassistant/components/rtorrent/sensor.py +++ b/homeassistant/components/rtorrent/sensor.py @@ -4,7 +4,7 @@ from typing import cast import xmlrpc.client -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -85,10 +85,10 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_URL): cv.url, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_MONITORED_VARIABLES, default=SENSOR_KEYS): vol.All( - cv.ensure_list, [vol.In(SENSOR_KEYS)] + probatio.Required(CONF_URL): cv.url, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_MONITORED_VARIABLES, default=SENSOR_KEYS): probatio.All( + cv.ensure_list, [probatio.In(SENSOR_KEYS)] ), } ) diff --git a/homeassistant/components/ruckus_unleashed/config_flow.py b/homeassistant/components/ruckus_unleashed/config_flow.py index b36974808b035..14a0f500fac29 100644 --- a/homeassistant/components/ruckus_unleashed/config_flow.py +++ b/homeassistant/components/ruckus_unleashed/config_flow.py @@ -7,7 +7,7 @@ from aioruckus import AjaxSession, SystemStat from aioruckus.exceptions import AuthenticationError, SchemaError -import voluptuous as vol +import probatio from homeassistant.components.device_tracker import DOMAIN as DEVICE_TRACKER_DOMAIN from homeassistant.config_entries import ( @@ -36,11 +36,11 @@ _LOGGER = logging.getLogger(__package__) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) @@ -170,9 +170,9 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_MAC_FILTER, default=current_filter, ): cv.multi_select( diff --git a/homeassistant/components/russound_rio/config_flow.py b/homeassistant/components/russound_rio/config_flow.py index d322c9d68c3f0..375802772e24d 100644 --- a/homeassistant/components/russound_rio/config_flow.py +++ b/homeassistant/components/russound_rio/config_flow.py @@ -10,7 +10,7 @@ RussoundSerialConnectionHandler, ) from aiorussound.rio import Controller, RussoundRIOClient -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_RECONFIGURE, @@ -40,9 +40,9 @@ TYPE_TCP, ) -TRANSPORT_SCHEMA = vol.Schema( +TRANSPORT_SCHEMA = probatio.Schema( { - vol.Required(CONF_TYPE, default=TYPE_TCP): SelectSelector( + probatio.Required(CONF_TYPE, default=TYPE_TCP): SelectSelector( SelectSelectorConfig( options=[TYPE_TCP, TYPE_SERIAL], translation_key="connection_type", @@ -51,26 +51,26 @@ } ) -TCP_SCHEMA = vol.Schema( +TCP_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, } ) -SERIAL_SCHEMA = vol.Schema( +SERIAL_SCHEMA = probatio.Schema( { - vol.Required(CONF_DEVICE): SerialPortSelector(), - vol.Optional(CONF_BAUDRATE, default=DEFAULT_BAUDRATE): vol.All( - vol.Coerce(int), - vol.Range(min=1), + probatio.Required(CONF_DEVICE): SerialPortSelector(), + probatio.Optional(CONF_BAUDRATE, default=DEFAULT_BAUDRATE): probatio.All( + probatio.Coerce(int), + probatio.Range(min=1), ), } ) -OPTIONS_SCHEMA = vol.Schema( +OPTIONS_SCHEMA = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_ZONE_SOURCE_EXCLUSION, default=True, ): bool, diff --git a/homeassistant/components/russound_rnet/media_player.py b/homeassistant/components/russound_rnet/media_player.py index 8cc28de81e7b5..d0b014fd91db6 100644 --- a/homeassistant/components/russound_rnet/media_player.py +++ b/homeassistant/components/russound_rnet/media_player.py @@ -10,7 +10,7 @@ from aiorussound import RussoundTcpConnectionHandler from aiorussound.exceptions import CommandError from aiorussound.rnet.client import RussoundRNETClient -import voluptuous as vol +import probatio from homeassistant.components.media_player import ( PLATFORM_SCHEMA as MEDIA_PLAYER_PLATFORM_SCHEMA, @@ -43,17 +43,17 @@ OSError, ) -ZONE_SCHEMA = vol.Schema({vol.Required(CONF_NAME): cv.string}) +ZONE_SCHEMA = probatio.Schema({probatio.Required(CONF_NAME): cv.string}) -SOURCE_SCHEMA = vol.Schema({vol.Required(CONF_NAME): cv.string}) +SOURCE_SCHEMA = probatio.Schema({probatio.Required(CONF_NAME): cv.string}) PLATFORM_SCHEMA = MEDIA_PLAYER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_NAME): cv.string, - vol.Required(CONF_PORT): cv.port, - vol.Required(CONF_ZONES): vol.Schema({cv.positive_int: ZONE_SCHEMA}), - vol.Required(CONF_SOURCES): vol.All(cv.ensure_list, [SOURCE_SCHEMA]), + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_NAME): cv.string, + probatio.Required(CONF_PORT): cv.port, + probatio.Required(CONF_ZONES): probatio.Schema({cv.positive_int: ZONE_SCHEMA}), + probatio.Required(CONF_SOURCES): probatio.All(cv.ensure_list, [SOURCE_SCHEMA]), } ) diff --git a/homeassistant/components/ruuvi_gateway/schemata.py b/homeassistant/components/ruuvi_gateway/schemata.py index 5a7d7bb2fb711..0272da2b8931b 100644 --- a/homeassistant/components/ruuvi_gateway/schemata.py +++ b/homeassistant/components/ruuvi_gateway/schemata.py @@ -1,17 +1,17 @@ """Schemata for ruuvi_gateway.""" -import voluptuous as vol +import probatio from homeassistant.const import CONF_HOST, CONF_TOKEN -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_TOKEN): str, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_TOKEN): str, } ) -def get_config_schema_with_default_host(host: str) -> vol.Schema: +def get_config_schema_with_default_host(host: str) -> probatio.Schema: """Return a config schema with a default host.""" - return CONFIG_SCHEMA.extend({vol.Required(CONF_HOST, default=host): str}) + return CONFIG_SCHEMA.extend({probatio.Required(CONF_HOST, default=host): str}) diff --git a/homeassistant/components/ruuvitag_ble/config_flow.py b/homeassistant/components/ruuvitag_ble/config_flow.py index dca31657dcb03..25776da7a8819 100644 --- a/homeassistant/components/ruuvitag_ble/config_flow.py +++ b/homeassistant/components/ruuvitag_ble/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from ruuvitag_ble import RuuvitagBluetoothDeviceData -import voluptuous as vol from homeassistant.components import bluetooth from homeassistant.components.bluetooth import ( @@ -90,7 +90,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_ADDRESS): vol.In(self._discovered_devices)} + data_schema=probatio.Schema( + {probatio.Required(CONF_ADDRESS): probatio.In(self._discovered_devices)} ), ) diff --git a/homeassistant/components/rympro/config_flow.py b/homeassistant/components/rympro/config_flow.py index f67e3ca1151b2..21d951b356463 100644 --- a/homeassistant/components/rympro/config_flow.py +++ b/homeassistant/components/rympro/config_flow.py @@ -4,8 +4,8 @@ import logging from typing import Any, override +import probatio from pyrympro import CannotConnectError, RymPro, UnauthorizedError -import voluptuous as vol from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_EMAIL, CONF_PASSWORD, CONF_TOKEN, CONF_UNIQUE_ID @@ -16,10 +16,10 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_EMAIL): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_EMAIL): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/sabnzbd/config_flow.py b/homeassistant/components/sabnzbd/config_flow.py index f319e59a3436e..b2f7e9b98de75 100644 --- a/homeassistant/components/sabnzbd/config_flow.py +++ b/homeassistant/components/sabnzbd/config_flow.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio import yarl from homeassistant.config_entries import ( @@ -24,14 +24,14 @@ _LOGGER = logging.getLogger(__name__) -USER_SCHEMA = vol.Schema( +USER_SCHEMA = probatio.Schema( { - vol.Required(CONF_URL): TextSelector( + probatio.Required(CONF_URL): TextSelector( TextSelectorConfig( type=TextSelectorType.URL, ) ), - vol.Required(CONF_API_KEY): TextSelector( + probatio.Required(CONF_API_KEY): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, ) diff --git a/homeassistant/components/saj/config_flow.py b/homeassistant/components/saj/config_flow.py index 6f1b1569eec74..db94efe28f1eb 100644 --- a/homeassistant/components/saj/config_flow.py +++ b/homeassistant/components/saj/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import TYPE_CHECKING, Any, override +import probatio import pysaj -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -178,16 +178,16 @@ async def async_step_user( errors=errors or None, ) - def _schema_user(self) -> vol.Schema: + def _schema_user(self) -> probatio.Schema: """Define the schema for the user step.""" - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Optional(CONF_TYPE, default=CONNECTION_TYPES[0]): vol.In( + probatio.Required(CONF_HOST): str, + probatio.Optional(CONF_TYPE, default=CONNECTION_TYPES[0]): probatio.In( CONNECTION_TYPES ), - vol.Optional(CONF_USERNAME, default=""): str, - vol.Optional(CONF_PASSWORD, default=""): str, + probatio.Optional(CONF_USERNAME, default=""): str, + probatio.Optional(CONF_PASSWORD, default=""): str, } ) @@ -235,11 +235,11 @@ async def async_step_device_credentials( errors=errors or None, ) - def _schema_device_credentials(self) -> vol.Schema: + def _schema_device_credentials(self) -> probatio.Schema: """Define the schema for the device credentials step.""" - return vol.Schema( + return probatio.Schema( { - vol.Optional(CONF_USERNAME, default=self._pending_username): str, - vol.Optional(CONF_PASSWORD, default=self._pending_password): str, + probatio.Optional(CONF_USERNAME, default=self._pending_username): str, + probatio.Optional(CONF_PASSWORD, default=self._pending_password): str, } ) diff --git a/homeassistant/components/saj/sensor.py b/homeassistant/components/saj/sensor.py index e7d26f8942d41..cfdd5c14d2851 100644 --- a/homeassistant/components/saj/sensor.py +++ b/homeassistant/components/saj/sensor.py @@ -2,8 +2,8 @@ from typing import override +import probatio import pysaj -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -48,11 +48,13 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_TYPE, default=CONNECTION_TYPES[0]): vol.In(CONNECTION_TYPES), - vol.Inclusive(CONF_USERNAME, "credentials"): cv.string, - vol.Inclusive(CONF_PASSWORD, "credentials"): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_TYPE, default=CONNECTION_TYPES[0]): probatio.In( + CONNECTION_TYPES + ), + probatio.Inclusive(CONF_USERNAME, "credentials"): cv.string, + probatio.Inclusive(CONF_PASSWORD, "credentials"): cv.string, } ) diff --git a/homeassistant/components/samsung_exlink/config_flow.py b/homeassistant/components/samsung_exlink/config_flow.py index a184f3c67a906..fec04048e712f 100644 --- a/homeassistant/components/samsung_exlink/config_flow.py +++ b/homeassistant/components/samsung_exlink/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from samsung_exlink import MODELS, SamsungTV, SamsungTVError, TVModel -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_DEVICE, CONF_MODEL @@ -17,10 +17,10 @@ from .const import DOMAIN, LOGGER -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_DEVICE): SerialPortSelector(), - vol.Optional(CONF_MODEL): SelectSelector( + probatio.Required(CONF_DEVICE): SerialPortSelector(), + probatio.Optional(CONF_MODEL): SelectSelector( SelectSelectorConfig( options=[ SelectOptionDict(value=key, label=model.name) diff --git a/homeassistant/components/samsung_infrared/config_flow.py b/homeassistant/components/samsung_infrared/config_flow.py index 471354b05de72..93a5b1cf5d39a 100644 --- a/homeassistant/components/samsung_infrared/config_flow.py +++ b/homeassistant/components/samsung_infrared/config_flow.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.infrared import ( DOMAIN as INFRARED_DOMAIN, @@ -67,9 +67,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_DEVICE_TYPE): SelectSelector( + probatio.Required(CONF_DEVICE_TYPE): SelectSelector( SelectSelectorConfig( options=[ device_type.value for device_type in SamsungDeviceType @@ -78,7 +78,7 @@ async def async_step_user( mode=SelectSelectorMode.DROPDOWN, ) ), - vol.Required(CONF_INFRARED_EMITTER_ENTITY_ID): EntitySelector( + probatio.Required(CONF_INFRARED_EMITTER_ENTITY_ID): EntitySelector( EntitySelectorConfig( domain=INFRARED_DOMAIN, include_entities=emitter_entity_ids, diff --git a/homeassistant/components/samsungtv/config_flow.py b/homeassistant/components/samsungtv/config_flow.py index e330772d3da2b..32b764d249f23 100644 --- a/homeassistant/components/samsungtv/config_flow.py +++ b/homeassistant/components/samsungtv/config_flow.py @@ -7,8 +7,8 @@ from urllib.parse import urlparse import getmac +import probatio from samsungtvws.encrypted.authenticator import SamsungTVEncryptedWSAsyncAuthenticator -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_RECONFIGURE, @@ -60,7 +60,7 @@ UPNP_SVC_RENDERING_CONTROL, ) -DATA_SCHEMA = vol.Schema({vol.Required(CONF_HOST): str}) +DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_HOST): str}) def _strip_uuid(udn: str) -> str: @@ -333,7 +333,7 @@ async def async_step_pairing( step_id="pairing", errors=errors, description_placeholders={"device": self._title}, - data_schema=vol.Schema({}), + data_schema=probatio.Schema({}), ) async def async_step_encrypted_pairing( @@ -365,7 +365,7 @@ async def async_step_encrypted_pairing( step_id="encrypted_pairing", errors=errors, description_placeholders={"device": self._title}, - data_schema=vol.Schema({vol.Required(CONF_PIN): str}), + data_schema=probatio.Schema({probatio.Required(CONF_PIN): str}), ) @callback @@ -651,5 +651,5 @@ async def async_step_reauth_confirm_encrypted( step_id="reauth_confirm_encrypted", errors=errors, description_placeholders={"device": reauth_entry.title}, - data_schema=vol.Schema({vol.Required(CONF_PIN): str}), + data_schema=probatio.Schema({probatio.Required(CONF_PIN): str}), ) diff --git a/homeassistant/components/samsungtv/device_trigger.py b/homeassistant/components/samsungtv/device_trigger.py index 253469900a0b4..5a9568755d59d 100644 --- a/homeassistant/components/samsungtv/device_trigger.py +++ b/homeassistant/components/samsungtv/device_trigger.py @@ -1,6 +1,6 @@ """Provides device automations for control of Samsung TV.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import ( DEVICE_TRIGGER_BASE_SCHEMA, @@ -26,7 +26,7 @@ TRIGGER_TYPES = {TURN_ON_PLATFORM_TYPE} TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): vol.In(TRIGGER_TYPES), + probatio.Required(CONF_TYPE): probatio.In(TRIGGER_TYPES), } ) diff --git a/homeassistant/components/samsungtv/media_player.py b/homeassistant/components/samsungtv/media_player.py index 1d3fc5705825f..26d6925ad3b64 100644 --- a/homeassistant/components/samsungtv/media_player.py +++ b/homeassistant/components/samsungtv/media_player.py @@ -17,7 +17,7 @@ ) from async_upnp_client.profiles.dlna import DmrDevice from async_upnp_client.utils import async_get_local_ip -import voluptuous as vol +import probatio from homeassistant.components.media_player import ( MediaPlayerDeviceClass, @@ -380,7 +380,7 @@ async def async_play_media( # media_id should only be a channel number try: cv.positive_int(media_id) - except vol.Invalid as err: + except probatio.Invalid as err: LOGGER.error("Media ID must be positive integer") raise HomeAssistantError( translation_domain=DOMAIN, diff --git a/homeassistant/components/samsungtv/triggers/turn_on.py b/homeassistant/components/samsungtv/triggers/turn_on.py index 5cc5b386646e0..ca00e8cb59422 100644 --- a/homeassistant/components/samsungtv/triggers/turn_on.py +++ b/homeassistant/components/samsungtv/triggers/turn_on.py @@ -1,6 +1,6 @@ """Samsung TV device turn on trigger.""" -import voluptuous as vol +import probatio from homeassistant.const import ( ATTR_DEVICE_ID, @@ -30,12 +30,14 @@ TRIGGER_TYPE_TURN_ON = "turn_on" -TRIGGER_SCHEMA = vol.All( +TRIGGER_SCHEMA = probatio.All( cv.TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_PLATFORM): PLATFORM_TYPE, - vol.Optional(ATTR_DEVICE_ID): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(ATTR_ENTITY_ID): cv.entity_ids, + probatio.Required(CONF_PLATFORM): PLATFORM_TYPE, + probatio.Optional(ATTR_DEVICE_ID): probatio.All( + cv.ensure_list, [cv.string] + ), + probatio.Optional(ATTR_ENTITY_ID): cv.entity_ids, }, ), cv.has_at_least_one_key(ATTR_ENTITY_ID, ATTR_DEVICE_ID), diff --git a/homeassistant/components/sanix/config_flow.py b/homeassistant/components/sanix/config_flow.py index 06464e73915a6..024e772be9bf5 100644 --- a/homeassistant/components/sanix/config_flow.py +++ b/homeassistant/components/sanix/config_flow.py @@ -3,9 +3,9 @@ import logging from typing import Any, override +import probatio from sanix import Sanix from sanix.exceptions import SanixException, SanixInvalidAuthException -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_TOKEN @@ -15,10 +15,10 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_SERIAL_NUMBER): str, - vol.Required(CONF_TOKEN): str, + probatio.Required(CONF_SERIAL_NUMBER): str, + probatio.Required(CONF_TOKEN): str, } ) diff --git a/homeassistant/components/satel_integra/config_flow.py b/homeassistant/components/satel_integra/config_flow.py index 657e62f69e5b5..7565765d3b741 100644 --- a/homeassistant/components/satel_integra/config_flow.py +++ b/homeassistant/components/satel_integra/config_flow.py @@ -4,13 +4,13 @@ import logging from typing import Any, override +import probatio from satel_integra import AsyncSatel from satel_integra.exceptions import ( SatelConnectFailedError, SatelConnectionInitializationError, SatelPanelBusyError, ) -import voluptuous as vol from homeassistant.components.binary_sensor import BinarySensorDeviceClass from homeassistant.config_entries import ( @@ -47,29 +47,31 @@ _LOGGER = logging.getLogger(__package__) -CONNECTION_SCHEMA = vol.Schema( +CONNECTION_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_ENCRYPTION_KEY): selector.TextSelector( + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_ENCRYPTION_KEY): selector.TextSelector( selector.TextSelectorConfig(type=selector.TextSelectorType.PASSWORD) ), } ) -CODE_SCHEMA = vol.Schema( +CODE_SCHEMA = probatio.Schema( { - vol.Optional(CONF_CODE): cv.string, + probatio.Optional(CONF_CODE): cv.string, } ) ARM_HOME_MODE_OPTIONS = ["1", "2", "3"] -PARTITION_SCHEMA = vol.Schema( +PARTITION_SCHEMA = probatio.Schema( { - vol.Required(CONF_NAME): cv.string, - vol.Required(CONF_ARM_HOME_MODE, default=DEFAULT_CONF_ARM_HOME_MODE): vol.All( - vol.Coerce(str), + probatio.Required(CONF_NAME): cv.string, + probatio.Required( + CONF_ARM_HOME_MODE, default=DEFAULT_CONF_ARM_HOME_MODE + ): probatio.All( + probatio.Coerce(str), selector.SelectSelector( selector.SelectSelectorConfig( options=ARM_HOME_MODE_OPTIONS, @@ -77,15 +79,15 @@ translation_key="arm_home_mode", ) ), - vol.Coerce(int), + probatio.Coerce(int), ), } ) -ZONE_AND_OUTPUT_SCHEMA = vol.Schema( +ZONE_AND_OUTPUT_SCHEMA = probatio.Schema( { - vol.Required(CONF_NAME): cv.string, - vol.Required( + probatio.Required(CONF_NAME): cv.string, + probatio.Required( CONF_ZONE_TYPE, default=BinarySensorDeviceClass.MOTION ): selector.DeviceClassSelector( selector.DeviceClassSelectorConfig(domain=Platform.BINARY_SENSOR), @@ -95,14 +97,14 @@ ZONE_SCHEMA = ZONE_AND_OUTPUT_SCHEMA.extend( { - vol.Required(CONF_ENABLE_TEMPERATURE_SENSOR, default=False): ( + probatio.Required(CONF_ENABLE_TEMPERATURE_SENSOR, default=False): ( selector.BooleanSelector() ), } ) -SWITCHABLE_OUTPUT_SCHEMA = vol.Schema({vol.Required(CONF_NAME): cv.string}) +SWITCHABLE_OUTPUT_SCHEMA = probatio.Schema({probatio.Required(CONF_NAME): cv.string}) async def _async_validate_zone_temperature_sensor( @@ -330,10 +332,10 @@ async def async_step_user( return self.async_show_form( step_id="user", errors=errors, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PARTITION_NUMBER): vol.All( - vol.Coerce(int), vol.Range(min=1) + probatio.Required(CONF_PARTITION_NUMBER): probatio.All( + probatio.Coerce(int), probatio.Range(min=1) ), } ).extend(PARTITION_SCHEMA.schema), @@ -404,10 +406,10 @@ async def async_step_user( step_id="user", errors=errors, data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_ZONE_NUMBER): vol.All( - vol.Coerce(int), vol.Range(min=1) + probatio.Required(CONF_ZONE_NUMBER): probatio.All( + probatio.Coerce(int), probatio.Range(min=1) ), } ).extend(ZONE_SCHEMA.schema), @@ -488,10 +490,10 @@ async def async_step_user( return self.async_show_form( step_id="user", errors=errors, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_OUTPUT_NUMBER): vol.All( - vol.Coerce(int), vol.Range(min=1) + probatio.Required(CONF_OUTPUT_NUMBER): probatio.All( + probatio.Coerce(int), probatio.Range(min=1) ), } ).extend(ZONE_AND_OUTPUT_SCHEMA.schema), @@ -557,10 +559,10 @@ async def async_step_user( return self.async_show_form( step_id="user", errors=errors, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_SWITCHABLE_OUTPUT_NUMBER): vol.All( - vol.Coerce(int), vol.Range(min=1) + probatio.Required(CONF_SWITCHABLE_OUTPUT_NUMBER): probatio.All( + probatio.Coerce(int), probatio.Range(min=1) ), } ).extend(SWITCHABLE_OUTPUT_SCHEMA.schema), diff --git a/homeassistant/components/saunum/config_flow.py b/homeassistant/components/saunum/config_flow.py index 9db4f7b05fe08..507bf2c9eef88 100644 --- a/homeassistant/components/saunum/config_flow.py +++ b/homeassistant/components/saunum/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from pysaunum import SaunumClient, SaunumException -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_USER, @@ -29,9 +29,9 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): cv.string, + probatio.Required(CONF_HOST): cv.string, } ) @@ -119,21 +119,21 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( OPT_PRESET_NAME_TYPE_1, default=self.config_entry.options.get( OPT_PRESET_NAME_TYPE_1, DEFAULT_PRESET_NAME_TYPE_1 ), ): cv.string, - vol.Optional( + probatio.Optional( OPT_PRESET_NAME_TYPE_2, default=self.config_entry.options.get( OPT_PRESET_NAME_TYPE_2, DEFAULT_PRESET_NAME_TYPE_2 ), ): cv.string, - vol.Optional( + probatio.Optional( OPT_PRESET_NAME_TYPE_3, default=self.config_entry.options.get( OPT_PRESET_NAME_TYPE_3, DEFAULT_PRESET_NAME_TYPE_3 diff --git a/homeassistant/components/saunum/services.py b/homeassistant/components/saunum/services.py index 9992ec2363862..56fdbd987bc1f 100644 --- a/homeassistant/components/saunum/services.py +++ b/homeassistant/components/saunum/services.py @@ -2,6 +2,7 @@ from datetime import timedelta +import probatio from pysaunum import ( DEFAULT_DURATION, DEFAULT_FAN_DURATION, @@ -11,7 +12,6 @@ MAX_TEMPERATURE, MIN_TEMPERATURE, ) -import voluptuous as vol from homeassistant.components.climate import DOMAIN as CLIMATE_DOMAIN from homeassistant.core import HomeAssistant, callback @@ -35,23 +35,26 @@ def async_setup_services(hass: HomeAssistant) -> None: SERVICE_START_SESSION, entity_domain=CLIMATE_DOMAIN, schema={ - vol.Optional( + probatio.Optional( ATTR_DURATION, default=timedelta(minutes=DEFAULT_DURATION) - ): vol.All( + ): probatio.All( cv.time_period, - vol.Range( + probatio.Range( min=timedelta(minutes=1), max=timedelta(minutes=MAX_DURATION), ), ), - vol.Optional(ATTR_TARGET_TEMPERATURE, default=DEFAULT_TEMPERATURE): vol.All( - cv.positive_int, vol.Range(min=MIN_TEMPERATURE, max=MAX_TEMPERATURE) + probatio.Optional( + ATTR_TARGET_TEMPERATURE, default=DEFAULT_TEMPERATURE + ): probatio.All( + cv.positive_int, + probatio.Range(min=MIN_TEMPERATURE, max=MAX_TEMPERATURE), ), - vol.Optional( + probatio.Optional( ATTR_FAN_DURATION, default=timedelta(minutes=DEFAULT_FAN_DURATION) - ): vol.All( + ): probatio.All( cv.time_period, - vol.Range( + probatio.Range( min=timedelta(minutes=1), max=timedelta(minutes=MAX_FAN_DURATION), ), diff --git a/homeassistant/components/scene/__init__.py b/homeassistant/components/scene/__init__.py index 90a4a53664616..9c27f5b690768 100644 --- a/homeassistant/components/scene/__init__.py +++ b/homeassistant/components/scene/__init__.py @@ -5,7 +5,7 @@ import logging from typing import Any, Final, final, override -import voluptuous as vol +import probatio from homeassistant.components.light import ATTR_TRANSITION from homeassistant.config_entries import ConfigEntry @@ -39,7 +39,7 @@ def _platform_validator(config: dict[str, Any]) -> dict[str, Any]: f"homeassistant.components.{platform_name}.scene" ) except ImportError: - raise vol.Invalid("Invalid platform specified") from None + raise probatio.Invalid("Invalid platform specified") from None if not hasattr(platform, "PLATFORM_SCHEMA"): return config @@ -47,13 +47,15 @@ def _platform_validator(config: dict[str, Any]) -> dict[str, Any]: return platform.PLATFORM_SCHEMA(config) # type: ignore[no-any-return] -PLATFORM_SCHEMA = vol.Schema( - vol.All( +PLATFORM_SCHEMA = probatio.Schema( + probatio.All( _hass_domain_validator, - vol.Schema({vol.Required(CONF_PLATFORM): str}, extra=vol.ALLOW_EXTRA), + probatio.Schema( + {probatio.Required(CONF_PLATFORM): str}, extra=probatio.ALLOW_EXTRA + ), _platform_validator, ), - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) # mypy: disallow-any-generics @@ -75,7 +77,11 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: ) component.async_register_entity_service( SERVICE_TURN_ON, - {ATTR_TRANSITION: vol.All(vol.Coerce(float), vol.Clamp(min=0, max=6553))}, + { + ATTR_TRANSITION: probatio.All( + probatio.Coerce(float), probatio.Clamp(min=0, max=6553) + ) + }, "_async_activate", ) diff --git a/homeassistant/components/schedule/__init__.py b/homeassistant/components/schedule/__init__.py index 77a4a3aa50500..a70d845696e95 100644 --- a/homeassistant/components/schedule/__init__.py +++ b/homeassistant/components/schedule/__init__.py @@ -5,7 +5,7 @@ import itertools from typing import Any, Literal, override -import voluptuous as vol +import probatio from homeassistant.const import ( # noqa: F401 ATTR_EDITABLE, @@ -75,14 +75,14 @@ def valid_schedule(schedule: list[dict[str, str]]) -> list[dict[str, str]]: previous_to = None for time_range in schedule: if time_range[CONF_FROM] >= time_range[CONF_TO]: - raise vol.Invalid( + raise probatio.Invalid( f"Invalid time range, from {time_range[CONF_FROM]} is after" f" {time_range[CONF_TO]}" ) # Check if the from time of the event is after the to time of the previous event if previous_to is not None and previous_to > time_range[CONF_FROM]: - raise vol.Invalid("Overlapping times found in schedule") + raise probatio.Invalid("Overlapping times found in schedule") previous_to = time_range[CONF_TO] @@ -110,57 +110,57 @@ def serialize_to_time(value: Any) -> Any: """Convert time.max to 24:00:00.""" if value == time.max: return "24:00:00" - return vol.Coerce(str)(value) + return probatio.Coerce(str)(value) BASE_SCHEMA: VolDictType = { - vol.Required(CONF_NAME): vol.All(str, vol.Length(min=1)), - vol.Optional(CONF_ICON): cv.icon, + probatio.Required(CONF_NAME): probatio.All(str, probatio.Length(min=1)), + probatio.Optional(CONF_ICON): cv.icon, } # Extra data that the user can set on each time range -CUSTOM_DATA_SCHEMA = vol.Schema({str: vol.Any(bool, str, int, float)}) +CUSTOM_DATA_SCHEMA = probatio.Schema({str: probatio.Any(bool, str, int, float)}) TIME_RANGE_SCHEMA: VolDictType = { - vol.Required(CONF_FROM): cv.time, - vol.Required(CONF_TO): deserialize_to_time, - vol.Optional(CONF_DATA): CUSTOM_DATA_SCHEMA, + probatio.Required(CONF_FROM): cv.time, + probatio.Required(CONF_TO): deserialize_to_time, + probatio.Optional(CONF_DATA): CUSTOM_DATA_SCHEMA, } # Serialize time in validated config -STORAGE_TIME_RANGE_SCHEMA = vol.Schema( +STORAGE_TIME_RANGE_SCHEMA = probatio.Schema( { - vol.Required(CONF_FROM): vol.Coerce(str), - vol.Required(CONF_TO): serialize_to_time, - vol.Optional(CONF_DATA): CUSTOM_DATA_SCHEMA, + probatio.Required(CONF_FROM): probatio.Coerce(str), + probatio.Required(CONF_TO): serialize_to_time, + probatio.Optional(CONF_DATA): CUSTOM_DATA_SCHEMA, } ) SCHEDULE_SCHEMA: VolDictType = { - vol.Optional(day, default=[]): vol.All( + probatio.Optional(day, default=[]): probatio.All( cv.ensure_list, [TIME_RANGE_SCHEMA], valid_schedule ) for day in CONF_ALL_DAYS } STORAGE_SCHEDULE_SCHEMA: VolDictType = { - vol.Optional(day, default=[]): vol.All( + probatio.Optional(day, default=[]): probatio.All( cv.ensure_list, [TIME_RANGE_SCHEMA], valid_schedule, [STORAGE_TIME_RANGE_SCHEMA] ) for day in CONF_ALL_DAYS } # Validate YAML config -CONFIG_SCHEMA = vol.Schema( - {DOMAIN: cv.schema_with_slug_keys(vol.All(BASE_SCHEMA | SCHEDULE_SCHEMA))}, - extra=vol.ALLOW_EXTRA, +CONFIG_SCHEMA = probatio.Schema( + {DOMAIN: cv.schema_with_slug_keys(probatio.All(BASE_SCHEMA | SCHEDULE_SCHEMA))}, + extra=probatio.ALLOW_EXTRA, ) # Validate storage config -STORAGE_SCHEMA = vol.Schema( - {vol.Required(CONF_ID): cv.string} | BASE_SCHEMA | STORAGE_SCHEDULE_SCHEMA +STORAGE_SCHEMA = probatio.Schema( + {probatio.Required(CONF_ID): cv.string} | BASE_SCHEMA | STORAGE_SCHEDULE_SCHEMA ) # Validate + transform entity config -ENTITY_SCHEMA = vol.Schema( - {vol.Required(CONF_ID): cv.string} | BASE_SCHEMA | SCHEDULE_SCHEMA +ENTITY_SCHEMA = probatio.Schema( + {probatio.Required(CONF_ID): cv.string} | BASE_SCHEMA | SCHEDULE_SCHEMA ) @@ -225,7 +225,7 @@ async def reload_service_handler(service_call: ServiceCall) -> None: class ScheduleStorageCollection(DictStorageCollection): """Schedules stored in storage.""" - SCHEMA = vol.Schema(BASE_SCHEMA | STORAGE_SCHEDULE_SCHEMA) + SCHEMA = probatio.Schema(BASE_SCHEMA | STORAGE_SCHEDULE_SCHEMA) @override async def _process_create_data(self, data: dict) -> dict: diff --git a/homeassistant/components/schlage/__init__.py b/homeassistant/components/schlage/__init__.py index 37e74eea532b6..c715fe7950f9a 100644 --- a/homeassistant/components/schlage/__init__.py +++ b/homeassistant/components/schlage/__init__.py @@ -1,8 +1,8 @@ """The Schlage integration.""" +import probatio from pycognito.exceptions import WarrantException import pyschlage -import voluptuous as vol from homeassistant.components.lock import DOMAIN as LOCK_DOMAIN from homeassistant.const import CONF_PASSWORD, CONF_USERNAME, Platform @@ -33,9 +33,11 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: SERVICE_ADD_CODE, entity_domain=LOCK_DOMAIN, schema={ - vol.Required("name"): cv.string, - vol.Required("code"): vol.All(cv.string, cv.matches_regex(r"^\d{4,8}$")), - vol.Optional("notify_on_use", default=True): cv.boolean, + probatio.Required("name"): cv.string, + probatio.Required("code"): probatio.All( + cv.string, cv.matches_regex(r"^\d{4,8}$") + ), + probatio.Optional("notify_on_use", default=True): cv.boolean, }, func=SERVICE_ADD_CODE, ) @@ -46,7 +48,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: SERVICE_DELETE_CODE, entity_domain=LOCK_DOMAIN, schema={ - vol.Required("name"): cv.string, + probatio.Required("name"): cv.string, }, func=SERVICE_DELETE_CODE, ) diff --git a/homeassistant/components/schlage/config_flow.py b/homeassistant/components/schlage/config_flow.py index 039daa32e821f..e8bbc490f7c10 100644 --- a/homeassistant/components/schlage/config_flow.py +++ b/homeassistant/components/schlage/config_flow.py @@ -3,19 +3,19 @@ from collections.abc import Mapping from typing import Any, override +import probatio import pyschlage from pyschlage.exceptions import NotAuthorizedError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME from .const import DOMAIN, LOGGER -STEP_USER_DATA_SCHEMA = vol.Schema( - {vol.Required(CONF_USERNAME): str, vol.Required(CONF_PASSWORD): str} +STEP_USER_DATA_SCHEMA = probatio.Schema( + {probatio.Required(CONF_USERNAME): str, probatio.Required(CONF_PASSWORD): str} ) -STEP_REAUTH_DATA_SCHEMA = vol.Schema({vol.Required(CONF_PASSWORD): str}) +STEP_REAUTH_DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_PASSWORD): str}) class SchlageConfigFlow(ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/components/schluter/__init__.py b/homeassistant/components/schluter/__init__.py index f7a8b631a051d..4c54dae00f0a2 100644 --- a/homeassistant/components/schluter/__init__.py +++ b/homeassistant/components/schluter/__init__.py @@ -2,10 +2,10 @@ import logging +import probatio from requests import RequestException, Session from schluter.api import Api from schluter.authenticator import AuthenticationState, Authenticator -import voluptuous as vol from homeassistant.const import CONF_PASSWORD, CONF_USERNAME, Platform from homeassistant.core import HomeAssistant @@ -20,16 +20,16 @@ SCHLUTER_CONFIG_FILE = ".schluter.conf" API_TIMEOUT = 10 -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Required(DOMAIN): vol.Schema( + probatio.Required(DOMAIN): probatio.Schema( { - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/schluter/climate.py b/homeassistant/components/schluter/climate.py index ff17a872ba680..5b3388c44cbcd 100644 --- a/homeassistant/components/schluter/climate.py +++ b/homeassistant/components/schluter/climate.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from requests import RequestException -import voluptuous as vol from homeassistant.components.climate import ( PLATFORM_SCHEMA as CLIMATE_PLATFORM_SCHEMA, @@ -28,7 +28,11 @@ _LOGGER = logging.getLogger(__name__) PLATFORM_SCHEMA = CLIMATE_PLATFORM_SCHEMA.extend( - {vol.Optional(CONF_SCAN_INTERVAL): vol.All(vol.Coerce(int), vol.Range(min=1))} + { + probatio.Optional(CONF_SCAN_INTERVAL): probatio.All( + probatio.Coerce(int), probatio.Range(min=1) + ) + } ) diff --git a/homeassistant/components/scorpiontrack/config_flow.py b/homeassistant/components/scorpiontrack/config_flow.py index f680177219f3c..fe32ce43b017a 100644 --- a/homeassistant/components/scorpiontrack/config_flow.py +++ b/homeassistant/components/scorpiontrack/config_flow.py @@ -3,6 +3,7 @@ import logging from typing import Any, override +import probatio from pyscorpiontrack import ( ScorpionTrackClient, ScorpionTrackConnectionError, @@ -10,7 +11,6 @@ ScorpionTrackShare, ScorpionTrackShareUnavailableError, ) -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.core import HomeAssistant @@ -87,6 +87,6 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_SHARE_TOKEN): str}), + data_schema=probatio.Schema({probatio.Required(CONF_SHARE_TOKEN): str}), errors=errors, ) diff --git a/homeassistant/components/scrape/__init__.py b/homeassistant/components/scrape/__init__.py index 4accb581987ae..0591e182961c6 100644 --- a/homeassistant/components/scrape/__init__.py +++ b/homeassistant/components/scrape/__init__.py @@ -8,7 +8,7 @@ from types import MappingProxyType from typing import Any -import voluptuous as vol +import probatio from homeassistant.components.rest import RESOURCE_SCHEMA, create_rest_data_from_config from homeassistant.components.sensor import CONF_STATE_CLASS, DOMAIN as SENSOR_DOMAIN @@ -59,32 +59,32 @@ _LOGGER = logging.getLogger(__name__) -SENSOR_SCHEMA = vol.Schema( +SENSOR_SCHEMA = probatio.Schema( { **TEMPLATE_SENSOR_BASE_SCHEMA.schema, - vol.Optional(CONF_AVAILABILITY): cv.template, - vol.Optional(CONF_ATTRIBUTE): cv.string, - vol.Optional(CONF_INDEX, default=0): cv.positive_int, - vol.Required(CONF_SELECT): cv.string, - vol.Optional(CONF_VALUE_TEMPLATE): vol.All( + probatio.Optional(CONF_AVAILABILITY): cv.template, + probatio.Optional(CONF_ATTRIBUTE): cv.string, + probatio.Optional(CONF_INDEX, default=0): cv.positive_int, + probatio.Required(CONF_SELECT): cv.string, + probatio.Optional(CONF_VALUE_TEMPLATE): probatio.All( cv.template, ValueTemplate.from_template ), } ) -COMBINED_SCHEMA = vol.Schema( +COMBINED_SCHEMA = probatio.Schema( { - vol.Optional(CONF_SCAN_INTERVAL): cv.time_period, + probatio.Optional(CONF_SCAN_INTERVAL): cv.time_period, **RESOURCE_SCHEMA, - vol.Optional(SENSOR_DOMAIN): vol.All( - cv.ensure_list, [vol.Schema(SENSOR_SCHEMA)] + probatio.Optional(SENSOR_DOMAIN): probatio.All( + cv.ensure_list, [probatio.Schema(SENSOR_SCHEMA)] ), } ) -CONFIG_SCHEMA = vol.Schema( - {vol.Optional(DOMAIN): vol.All(cv.ensure_list, [COMBINED_SCHEMA])}, - extra=vol.ALLOW_EXTRA, +CONFIG_SCHEMA = probatio.Schema( + {probatio.Optional(DOMAIN): probatio.All(cv.ensure_list, [COMBINED_SCHEMA])}, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/scrape/config_flow.py b/homeassistant/components/scrape/config_flow.py index 567e012348532..332be51434aa9 100644 --- a/homeassistant/components/scrape/config_flow.py +++ b/homeassistant/components/scrape/config_flow.py @@ -4,7 +4,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant import data_entry_flow from homeassistant.components.rest import create_rest_data_from_config @@ -82,19 +82,19 @@ _LOGGER = logging.getLogger(__name__) -RESOURCE_SETUP = vol.Schema( +RESOURCE_SETUP = probatio.Schema( { - vol.Required(CONF_RESOURCE): TextSelector( + probatio.Required(CONF_RESOURCE): TextSelector( TextSelectorConfig(type=TextSelectorType.URL) ), - vol.Optional(CONF_METHOD, default=DEFAULT_METHOD): SelectSelector( + probatio.Optional(CONF_METHOD, default=DEFAULT_METHOD): SelectSelector( SelectSelectorConfig(options=METHODS, mode=SelectSelectorMode.DROPDOWN) ), - vol.Optional(CONF_PAYLOAD): ObjectSelector(), - vol.Required(CONF_AUTH): data_entry_flow.section( - vol.Schema( + probatio.Optional(CONF_PAYLOAD): ObjectSelector(), + probatio.Required(CONF_AUTH): data_entry_flow.section( + probatio.Schema( { - vol.Optional(CONF_AUTHENTICATION): SelectSelector( + probatio.Optional(CONF_AUTHENTICATION): SelectSelector( SelectSelectorConfig( options=[ HTTP_BASIC_AUTHENTICATION, @@ -103,12 +103,12 @@ mode=SelectSelectorMode.DROPDOWN, ) ), - vol.Optional(CONF_USERNAME): TextSelector( + probatio.Optional(CONF_USERNAME): TextSelector( TextSelectorConfig( type=TextSelectorType.TEXT, autocomplete="username" ) ), - vol.Optional(CONF_PASSWORD): TextSelector( + probatio.Optional(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", @@ -118,17 +118,19 @@ ), data_entry_flow.SectionConfig(collapsed=True), ), - vol.Required(CONF_ADDITIONAL): data_entry_flow.section( - vol.Schema( + probatio.Required(CONF_ADDITIONAL): data_entry_flow.section( + probatio.Schema( { - vol.Optional(CONF_HEADERS): ObjectSelector(), - vol.Optional( + probatio.Optional(CONF_HEADERS): ObjectSelector(), + probatio.Optional( CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL ): BooleanSelector(), - vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): NumberSelector( + probatio.Optional( + CONF_TIMEOUT, default=DEFAULT_TIMEOUT + ): NumberSelector( NumberSelectorConfig(min=0, step=1, mode=NumberSelectorMode.BOX) ), - vol.Optional( + probatio.Optional( CONF_ENCODING, default=DEFAULT_ENCODING ): TextSelector(), } @@ -138,26 +140,26 @@ } ) -SENSOR_SETTINGS = vol.Schema( +SENSOR_SETTINGS = probatio.Schema( { - vol.Required(CONF_SELECT): TextSelector(), - vol.Optional(CONF_INDEX, default=0): vol.All( + probatio.Required(CONF_SELECT): TextSelector(), + probatio.Optional(CONF_INDEX, default=0): probatio.All( NumberSelector( NumberSelectorConfig(min=0, step=1, mode=NumberSelectorMode.BOX) ), - vol.Coerce(int), + probatio.Coerce(int), ), - vol.Required(CONF_ADDITIONAL): data_entry_flow.section( - vol.Schema( + probatio.Required(CONF_ADDITIONAL): data_entry_flow.section( + probatio.Schema( { - vol.Optional(CONF_ATTRIBUTE): TextSelector(), - vol.Optional(CONF_VALUE_TEMPLATE): TemplateSelector(), - vol.Optional(CONF_AVAILABILITY): TemplateSelector(), - vol.Optional(CONF_DEVICE_CLASS): DeviceClassSelector( + probatio.Optional(CONF_ATTRIBUTE): TextSelector(), + probatio.Optional(CONF_VALUE_TEMPLATE): TemplateSelector(), + probatio.Optional(CONF_AVAILABILITY): TemplateSelector(), + probatio.Optional(CONF_DEVICE_CLASS): DeviceClassSelector( DeviceClassSelectorConfig(domain=Platform.SENSOR) ), - vol.Optional(CONF_STATE_CLASS): StateClassSelector(), - vol.Optional(CONF_UNIT_OF_MEASUREMENT): SelectSelector( + probatio.Optional(CONF_STATE_CLASS): StateClassSelector(), + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): SelectSelector( SelectSelectorConfig( options=[cls.value for cls in UnitOfTemperature], custom_value=True, @@ -172,10 +174,10 @@ ), } ) -SENSOR_SETUP = vol.Schema( +SENSOR_SETUP = probatio.Schema( # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - {vol.Optional(CONF_NAME, default=DEFAULT_NAME): TextSelector()} + {probatio.Optional(CONF_NAME, default=DEFAULT_NAME): TextSelector()} ).extend(SENSOR_SETTINGS.schema) diff --git a/homeassistant/components/scrape/sensor.py b/homeassistant/components/scrape/sensor.py index 8680da97a74bf..7dc2d094d7da6 100644 --- a/homeassistant/components/scrape/sensor.py +++ b/homeassistant/components/scrape/sensor.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.sensor import CONF_STATE_CLASS, DOMAIN as SENSOR_DOMAIN from homeassistant.const import ( @@ -115,8 +115,8 @@ async def async_setup_entry( sensor[CONF_UNIQUE_ID] = subentry.subentry_id sensor[CONF_NAME] = subentry.title - sensor_config: ConfigType = vol.Schema( - TEMPLATE_SENSOR_BASE_SCHEMA.schema, extra=vol.ALLOW_EXTRA + sensor_config: ConfigType = probatio.Schema( + TEMPLATE_SENSOR_BASE_SCHEMA.schema, extra=probatio.ALLOW_EXTRA )(sensor) value_string: str | None = sensor_config.get(CONF_VALUE_TEMPLATE) diff --git a/homeassistant/components/screenlogic/config_flow.py b/homeassistant/components/screenlogic/config_flow.py index 1eef577737801..06cf9f9e846ca 100644 --- a/homeassistant/components/screenlogic/config_flow.py +++ b/homeassistant/components/screenlogic/config_flow.py @@ -3,10 +3,10 @@ import logging from typing import Any, override +import probatio from screenlogicpy import ScreenLogicError, discovery from screenlogicpy.const.common import SL_GATEWAY_IP, SL_GATEWAY_NAME, SL_GATEWAY_PORT from screenlogicpy.requests import login -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_IP_ADDRESS, CONF_PORT @@ -119,9 +119,9 @@ async def async_step_gateway_select(self, user_input=None) -> ConfigFlowResult: return self.async_show_form( step_id="gateway_select", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(GATEWAY_SELECT_KEY): vol.In( + probatio.Required(GATEWAY_SELECT_KEY): probatio.In( { **unconfigured_gateways, GATEWAY_MANUAL_ENTRY: ( @@ -163,10 +163,10 @@ async def async_step_gateway_entry(self, user_input=None) -> ConfigFlowResult: return self.async_show_form( step_id="gateway_entry", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_IP_ADDRESS, default=ip_address): str, - vol.Required(CONF_PORT, default=port): int, + probatio.Required(CONF_IP_ADDRESS, default=ip_address): str, + probatio.Required(CONF_PORT, default=port): int, } ), errors=errors, diff --git a/homeassistant/components/screenlogic/services.py b/homeassistant/components/screenlogic/services.py index a99b6c308896b..0934fcd178c4b 100644 --- a/homeassistant/components/screenlogic/services.py +++ b/homeassistant/components/screenlogic/services.py @@ -3,9 +3,9 @@ import logging from typing import cast +import probatio from screenlogicpy import ScreenLogicError from screenlogicpy.device_const.system import EQUIPMENT_FLAG -import voluptuous as vol from homeassistant.core import HomeAssistant, ServiceCall, callback from homeassistant.exceptions import HomeAssistantError, ServiceValidationError @@ -28,9 +28,9 @@ _LOGGER = logging.getLogger(__name__) -BASE_SERVICE_SCHEMA = vol.Schema( +BASE_SERVICE_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY): selector.ConfigEntrySelector( + probatio.Required(ATTR_CONFIG_ENTRY): selector.ConfigEntrySelector( { "integration": DOMAIN, } @@ -40,14 +40,14 @@ SET_COLOR_MODE_SCHEMA = BASE_SERVICE_SCHEMA.extend( { - vol.Required(ATTR_COLOR_MODE): vol.In(SUPPORTED_COLOR_MODES), + probatio.Required(ATTR_COLOR_MODE): probatio.In(SUPPORTED_COLOR_MODES), } ) TURN_ON_SUPER_CHLOR_SCHEMA = BASE_SERVICE_SCHEMA.extend( { - vol.Optional(ATTR_RUNTIME, default=24): vol.All( - vol.Coerce(int), vol.Clamp(min=MIN_RUNTIME, max=MAX_RUNTIME) + probatio.Optional(ATTR_RUNTIME, default=24): probatio.All( + probatio.Coerce(int), probatio.Clamp(min=MIN_RUNTIME, max=MAX_RUNTIME) ), } ) diff --git a/homeassistant/components/script/__init__.py b/homeassistant/components/script/__init__.py index 30f9a4c75a6ec..0dc69a9f983ea 100644 --- a/homeassistant/components/script/__init__.py +++ b/homeassistant/components/script/__init__.py @@ -6,8 +6,8 @@ import logging from typing import TYPE_CHECKING, Any, cast, override +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.components import websocket_api from homeassistant.components.blueprint import CONF_USE_BLUEPRINT @@ -77,11 +77,11 @@ from .helpers import async_get_blueprints from .trace import trace_script -SCRIPT_SERVICE_SCHEMA = vol.Schema(dict) +SCRIPT_SERVICE_SCHEMA = probatio.Schema(dict) SCRIPT_TURN_ONOFF_SCHEMA = make_entity_service_schema( - {vol.Optional(ATTR_VARIABLES): {str: cv.match_all}} + {probatio.Optional(ATTR_VARIABLES): {str: cv.match_all}} ) -RELOAD_SERVICE_SCHEMA = vol.Schema({}) +RELOAD_SERVICE_SCHEMA = probatio.Schema({}) def is_on(hass: HomeAssistant, entity_id: str) -> bool: diff --git a/homeassistant/components/script/config.py b/homeassistant/components/script/config.py index cb49979dcbbdf..f54fbead9ef55 100644 --- a/homeassistant/components/script/config.py +++ b/homeassistant/components/script/config.py @@ -5,8 +5,8 @@ from enum import StrEnum from typing import Any -import voluptuous as vol -from voluptuous.humanize import humanize_error +import probatio +from probatio.humanize import humanize_error from homeassistant.components.blueprint import ( BlueprintException, @@ -53,12 +53,12 @@ PACKAGE_MERGE_HINT = "dict" -_MINIMAL_SCRIPT_ENTITY_SCHEMA = vol.Schema( +_MINIMAL_SCRIPT_ENTITY_SCHEMA = probatio.Schema( { CONF_ALIAS: cv.string, - vol.Optional(CONF_DESCRIPTION): cv.string, + probatio.Optional(CONF_DESCRIPTION): cv.string, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) _INVALID_OBJECT_IDS = { @@ -68,9 +68,9 @@ SERVICE_TOGGLE, } -_SCRIPT_OBJECT_ID_SCHEMA = vol.All( +_SCRIPT_OBJECT_ID_SCHEMA = probatio.All( cv.slug, - vol.NotIn( + probatio.NotIn( _INVALID_OBJECT_IDS, ( "A script's object_id must not be one of " @@ -81,21 +81,21 @@ SCRIPT_ENTITY_SCHEMA = make_script_schema( { - vol.Optional(CONF_ALIAS): cv.string, - vol.Optional(CONF_TRACE, default={}): TRACE_CONFIG_SCHEMA, - vol.Optional(CONF_ICON): cv.icon, - vol.Required(CONF_SEQUENCE): cv.SCRIPT_SCHEMA, - vol.Optional(CONF_DESCRIPTION, default=""): cv.string, - vol.Optional(CONF_VARIABLES): cv.SCRIPT_VARIABLES_SCHEMA, - vol.Optional(CONF_FIELDS, default={}): { + probatio.Optional(CONF_ALIAS): cv.string, + probatio.Optional(CONF_TRACE, default={}): TRACE_CONFIG_SCHEMA, + probatio.Optional(CONF_ICON): cv.icon, + probatio.Required(CONF_SEQUENCE): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_DESCRIPTION, default=""): cv.string, + probatio.Optional(CONF_VARIABLES): cv.SCRIPT_VARIABLES_SCHEMA, + probatio.Optional(CONF_FIELDS, default={}): { cv.string: { - vol.Optional(CONF_ADVANCED, default=False): cv.boolean, - vol.Optional(CONF_DEFAULT): cv.match_all, - vol.Optional(CONF_DESCRIPTION): cv.string, - vol.Optional(CONF_EXAMPLE): cv.string, - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_REQUIRED, default=False): cv.boolean, - vol.Optional(CONF_SELECTOR): validate_selector, + probatio.Optional(CONF_ADVANCED, default=False): cv.boolean, + probatio.Optional(CONF_DEFAULT): cv.match_all, + probatio.Optional(CONF_DESCRIPTION): cv.string, + probatio.Optional(CONF_EXAMPLE): cv.string, + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_REQUIRED, default=False): cv.boolean, + probatio.Optional(CONF_SELECTOR): validate_selector, } }, }, @@ -118,8 +118,8 @@ async def _async_validate_config_item( raw_config = dict(config) def _humanize(err: Exception, data: Any) -> str: - """Humanize vol.Invalid, stringify other exceptions.""" - if isinstance(err, vol.Invalid): + """Humanize probatio.Invalid, stringify other exceptions.""" + if isinstance(err, probatio.Invalid): return humanize_error(data, err) return str(err) @@ -216,12 +216,12 @@ def _minimal_config( try: _SCRIPT_OBJECT_ID_SCHEMA(object_id) - except vol.Invalid as err: + except probatio.Invalid as err: _log_invalid_script(err, script_name, "has invalid object id", object_id) raise try: validated_config = SCRIPT_ENTITY_SCHEMA(config) - except vol.Invalid as err: + except probatio.Invalid as err: _log_invalid_script(err, script_name, "could not be validated", config) if raise_on_errors: raise @@ -236,7 +236,7 @@ def _minimal_config( hass, validated_config[CONF_SEQUENCE] ) except ( - vol.Invalid, + probatio.Invalid, HomeAssistantError, ) as err: _log_invalid_script( @@ -278,7 +278,7 @@ async def _try_async_validate_config_item( """Validate config item.""" try: return await _async_validate_config_item(hass, object_id, config, False, True) - except vol.Invalid, HomeAssistantError: + except probatio.Invalid, HomeAssistantError: return None diff --git a/homeassistant/components/search/__init__.py b/homeassistant/components/search/__init__.py index 0580793b8003e..0d8c6bfde765b 100644 --- a/homeassistant/components/search/__init__.py +++ b/homeassistant/components/search/__init__.py @@ -6,7 +6,7 @@ import logging from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import automation, group, person, script, websocket_api from homeassistant.components.group import DOMAIN as GROUP_DOMAIN @@ -60,9 +60,9 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: @websocket_api.websocket_command( { - vol.Required("type"): "search/related", - vol.Required("item_type"): vol.Coerce(ItemType), - vol.Required("item_id"): str, + probatio.Required("type"): "search/related", + probatio.Required("item_type"): probatio.Coerce(ItemType), + probatio.Required("item_id"): str, } ) @callback diff --git a/homeassistant/components/season/config_flow.py b/homeassistant/components/season/config_flow.py index a8135e7901c82..a42603413e383 100644 --- a/homeassistant/components/season/config_flow.py +++ b/homeassistant/components/season/config_flow.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_TYPE @@ -35,9 +35,11 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_TYPE, default=TYPE_ASTRONOMICAL): SelectSelector( + probatio.Required( + CONF_TYPE, default=TYPE_ASTRONOMICAL + ): SelectSelector( SelectSelectorConfig( translation_key="season_type", mode=SelectSelectorMode.LIST, diff --git a/homeassistant/components/select/__init__.py b/homeassistant/components/select/__init__.py index 2e7e796b245ae..28f58a2a9948e 100644 --- a/homeassistant/components/select/__init__.py +++ b/homeassistant/components/select/__init__.py @@ -4,8 +4,8 @@ import logging from typing import Any, final, override +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.config_entries import ConfigEntry from homeassistant.const import ATTR_OPTION, SERVICE_SELECT_OPTION @@ -79,19 +79,19 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: component.async_register_entity_service( SERVICE_SELECT_NEXT, - {vol.Optional(ATTR_CYCLE, default=True): bool}, + {probatio.Optional(ATTR_CYCLE, default=True): bool}, SelectEntity.async_next.__name__, ) component.async_register_entity_service( SERVICE_SELECT_OPTION, - {vol.Required(ATTR_OPTION): cv.string}, + {probatio.Required(ATTR_OPTION): cv.string}, SelectEntity.async_handle_select_option.__name__, ) component.async_register_entity_service( SERVICE_SELECT_PREVIOUS, - {vol.Optional(ATTR_CYCLE, default=True): bool}, + {probatio.Optional(ATTR_CYCLE, default=True): bool}, SelectEntity.async_previous.__name__, ) diff --git a/homeassistant/components/select/condition.py b/homeassistant/components/select/condition.py index 1d176b517f11b..4224221c84ff7 100644 --- a/homeassistant/components/select/condition.py +++ b/homeassistant/components/select/condition.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING -import voluptuous as vol +import probatio from homeassistant.components.input_select import DOMAIN as INPUT_SELECT_DOMAIN from homeassistant.const import CONF_OPTIONS @@ -20,9 +20,9 @@ IS_OPTION_SELECTED_SCHEMA = ENTITY_STATE_CONDITION_SCHEMA_ANY_ALL.extend( { - vol.Required(CONF_OPTIONS): { - vol.Required(CONF_OPTION): vol.All( - cv.ensure_list, vol.Length(min=1), [str] + probatio.Required(CONF_OPTIONS): { + probatio.Required(CONF_OPTION): probatio.All( + cv.ensure_list, probatio.Length(min=1), [str] ), }, } diff --git a/homeassistant/components/select/device_action.py b/homeassistant/components/select/device_action.py index 07b472a04ae2c..9aa1289948450 100644 --- a/homeassistant/components/select/device_action.py +++ b/homeassistant/components/select/device_action.py @@ -2,7 +2,7 @@ from contextlib import suppress -import voluptuous as vol +import probatio from homeassistant.components.device_automation import ( async_get_entity_registry_entry_or_raise, @@ -35,38 +35,38 @@ SelectEntityCapabilityAttribute, ) -_ACTION_SCHEMA = vol.Any( +_ACTION_SCHEMA = probatio.Any( cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): SERVICE_SELECT_FIRST, - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): SERVICE_SELECT_FIRST, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, } ), cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): SERVICE_SELECT_LAST, - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): SERVICE_SELECT_LAST, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, } ), cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): SERVICE_SELECT_NEXT, - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Optional(CONF_CYCLE, default=True): cv.boolean, + probatio.Required(CONF_TYPE): SERVICE_SELECT_NEXT, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Optional(CONF_CYCLE, default=True): cv.boolean, } ), cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): SERVICE_SELECT_PREVIOUS, - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Optional(CONF_CYCLE, default=True): cv.boolean, + probatio.Required(CONF_TYPE): SERVICE_SELECT_PREVIOUS, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Optional(CONF_CYCLE, default=True): cv.boolean, } ), cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): SERVICE_SELECT_OPTION, - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_OPTION): cv.string, + probatio.Required(CONF_TYPE): SERVICE_SELECT_OPTION, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_OPTION): cv.string, } ), ) @@ -127,12 +127,12 @@ async def async_call_action_from_config( async def async_get_action_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List action capabilities.""" if config[CONF_TYPE] in {SERVICE_SELECT_NEXT, SERVICE_SELECT_PREVIOUS}: return { - "extra_fields": vol.Schema( - {vol.Optional(CONF_CYCLE, default=True): cv.boolean} + "extra_fields": probatio.Schema( + {probatio.Optional(CONF_CYCLE, default=True): cv.boolean} ) } @@ -149,7 +149,9 @@ async def async_get_action_capabilities( or [] ) return { - "extra_fields": vol.Schema({vol.Required(CONF_OPTION): vol.In(options)}) + "extra_fields": probatio.Schema( + {probatio.Required(CONF_OPTION): probatio.In(options)} + ) } return {} diff --git a/homeassistant/components/select/device_condition.py b/homeassistant/components/select/device_condition.py index ca2474e69c288..0ff373c8fdfe5 100644 --- a/homeassistant/components/select/device_condition.py +++ b/homeassistant/components/select/device_condition.py @@ -1,6 +1,6 @@ """Provide the device conditions for Select.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import ( async_get_entity_registry_entry_or_raise, @@ -32,10 +32,10 @@ CONDITION_SCHEMA = DEVICE_CONDITION_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In(CONDITION_TYPES), - vol.Required(CONF_OPTION): str, - vol.Optional(CONF_FOR): cv.positive_time_period_dict, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In(CONDITION_TYPES), + probatio.Required(CONF_OPTION): str, + probatio.Optional(CONF_FOR): cv.positive_time_period_dict, } ) @@ -79,7 +79,7 @@ def test_is_state(hass: HomeAssistant, variables: TemplateVarsType) -> bool: async def async_get_condition_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List condition capabilities.""" try: @@ -94,10 +94,10 @@ async def async_get_condition_capabilities( options = [] return { - "extra_fields": vol.Schema( + "extra_fields": probatio.Schema( { - vol.Required(CONF_OPTION): vol.In(options), - vol.Optional(CONF_FOR): cv.positive_time_period_dict, + probatio.Required(CONF_OPTION): probatio.In(options), + probatio.Optional(CONF_FOR): cv.positive_time_period_dict, } ) } diff --git a/homeassistant/components/select/device_trigger.py b/homeassistant/components/select/device_trigger.py index 8663d127931fa..c86d12383f38d 100644 --- a/homeassistant/components/select/device_trigger.py +++ b/homeassistant/components/select/device_trigger.py @@ -1,6 +1,6 @@ """Provides device triggers for Select.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import ( DEVICE_TRIGGER_BASE_SCHEMA, @@ -33,11 +33,11 @@ TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In(TRIGGER_TYPES), - vol.Optional(CONF_TO): vol.Any(vol.Coerce(str)), - vol.Optional(CONF_FROM): vol.Any(vol.Coerce(str)), - vol.Optional(CONF_FOR): cv.positive_time_period_dict, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In(TRIGGER_TYPES), + probatio.Optional(CONF_TO): probatio.Any(probatio.Coerce(str)), + probatio.Optional(CONF_FROM): probatio.Any(probatio.Coerce(str)), + probatio.Optional(CONF_FOR): cv.positive_time_period_dict, } ) @@ -89,7 +89,7 @@ async def async_attach_trigger( async def async_get_trigger_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List trigger capabilities.""" try: @@ -104,11 +104,11 @@ async def async_get_trigger_capabilities( options = [] return { - "extra_fields": vol.Schema( + "extra_fields": probatio.Schema( { - vol.Optional(CONF_FROM): vol.In(options), - vol.Optional(CONF_TO): vol.In(options), - vol.Optional(CONF_FOR): cv.positive_time_period_dict, + probatio.Optional(CONF_FROM): probatio.In(options), + probatio.Optional(CONF_TO): probatio.In(options), + probatio.Optional(CONF_FOR): cv.positive_time_period_dict, } ) } diff --git a/homeassistant/components/sendgrid/notify.py b/homeassistant/components/sendgrid/notify.py index 90cbe12af1df6..cd5d45c7b735f 100644 --- a/homeassistant/components/sendgrid/notify.py +++ b/homeassistant/components/sendgrid/notify.py @@ -4,8 +4,8 @@ import logging from typing import Any, override +import probatio from sendgrid import SendGridAPIClient -import voluptuous as vol from homeassistant.components.notify import ( ATTR_TITLE, @@ -31,10 +31,10 @@ PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_API_KEY): cv.string, - vol.Required(CONF_SENDER): vol.Email(), - vol.Required(CONF_RECIPIENT): vol.Email(), - vol.Optional(CONF_SENDER_NAME, default=DEFAULT_SENDER_NAME): cv.string, + probatio.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_SENDER): probatio.Email(), + probatio.Required(CONF_RECIPIENT): probatio.Email(), + probatio.Optional(CONF_SENDER_NAME, default=DEFAULT_SENDER_NAME): cv.string, } ) diff --git a/homeassistant/components/sense/config_flow.py b/homeassistant/components/sense/config_flow.py index 4de1c028d7ed1..59dab89eeb729 100644 --- a/homeassistant/components/sense/config_flow.py +++ b/homeassistant/components/sense/config_flow.py @@ -5,12 +5,12 @@ import logging from typing import Any, override +import probatio from sense_energy import ( ASyncSenseable, SenseAuthenticationException, SenseMFARequiredException, ) -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_CODE, CONF_EMAIL, CONF_PASSWORD, CONF_TIMEOUT @@ -20,11 +20,11 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_EMAIL): str, - vol.Required(CONF_PASSWORD): str, - vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): vol.Coerce(int), + probatio.Required(CONF_EMAIL): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): probatio.Coerce(int), } ) @@ -118,7 +118,9 @@ async def async_step_validation( return self.async_show_form( step_id="validation", - data_schema=vol.Schema({vol.Required(CONF_CODE): vol.All(str, vol.Strip)}), + data_schema=probatio.Schema( + {probatio.Required(CONF_CODE): probatio.All(str, probatio.Strip)} + ), errors=errors, ) @@ -154,7 +156,7 @@ async def async_step_reauth_validate( return self.async_show_form( step_id="reauth_validate", - data_schema=vol.Schema({vol.Required(CONF_PASSWORD): str}), + data_schema=probatio.Schema({probatio.Required(CONF_PASSWORD): str}), errors=errors, description_placeholders={ CONF_EMAIL: self._auth_data[CONF_EMAIL], diff --git a/homeassistant/components/sensibo/config_flow.py b/homeassistant/components/sensibo/config_flow.py index ede60ba229ee2..2599a7503978e 100644 --- a/homeassistant/components/sensibo/config_flow.py +++ b/homeassistant/components/sensibo/config_flow.py @@ -3,8 +3,8 @@ from collections.abc import Mapping from typing import Any, override +import probatio from pysensibo.exceptions import AuthenticationError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY @@ -14,9 +14,9 @@ from .const import DOMAIN from .util import NoDevicesError, NoUsernameError, async_validate_api -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_KEY): TextSelector(), + probatio.Required(CONF_API_KEY): TextSelector(), } ) diff --git a/homeassistant/components/sensibo/services.py b/homeassistant/components/sensibo/services.py index aecb1c45f924b..c0a7aa903e558 100644 --- a/homeassistant/components/sensibo/services.py +++ b/homeassistant/components/sensibo/services.py @@ -1,6 +1,6 @@ """Sensibo services.""" -import voluptuous as vol +import probatio from homeassistant.components.climate import ( ATTR_FAN_MODE, @@ -50,7 +50,7 @@ def async_setup_services(hass: HomeAssistant) -> None: SERVICE_ASSUME_STATE, entity_domain=CLIMATE_DOMAIN, schema={ - vol.Required(ATTR_STATE): vol.In(["on", "off"]), + probatio.Required(ATTR_STATE): probatio.In(["on", "off"]), }, func="async_assume_state", ) @@ -60,7 +60,7 @@ def async_setup_services(hass: HomeAssistant) -> None: SERVICE_ENABLE_TIMER, entity_domain=CLIMATE_DOMAIN, schema={ - vol.Required(ATTR_MINUTES): cv.positive_int, + probatio.Required(ATTR_MINUTES): cv.positive_int, }, func="async_enable_timer", ) @@ -70,11 +70,11 @@ def async_setup_services(hass: HomeAssistant) -> None: SERVICE_ENABLE_PURE_BOOST, entity_domain=CLIMATE_DOMAIN, schema={ - vol.Required(ATTR_AC_INTEGRATION): bool, - vol.Required(ATTR_GEO_INTEGRATION): bool, - vol.Required(ATTR_INDOOR_INTEGRATION): bool, - vol.Required(ATTR_OUTDOOR_INTEGRATION): bool, - vol.Required(ATTR_SENSITIVITY): vol.In(["normal", "sensitive"]), + probatio.Required(ATTR_AC_INTEGRATION): bool, + probatio.Required(ATTR_GEO_INTEGRATION): bool, + probatio.Required(ATTR_INDOOR_INTEGRATION): bool, + probatio.Required(ATTR_OUTDOOR_INTEGRATION): bool, + probatio.Required(ATTR_SENSITIVITY): probatio.In(["normal", "sensitive"]), }, func="async_enable_pure_boost", ) @@ -84,14 +84,14 @@ def async_setup_services(hass: HomeAssistant) -> None: SERVICE_FULL_STATE, entity_domain=CLIMATE_DOMAIN, schema={ - vol.Required(ATTR_MODE): vol.In( + probatio.Required(ATTR_MODE): probatio.In( ["cool", "heat", "fan", "auto", "dry", "off"] ), - vol.Optional(ATTR_TARGET_TEMPERATURE): int, - vol.Optional(ATTR_FAN_MODE): str, - vol.Optional(ATTR_SWING_MODE): str, - vol.Optional(ATTR_HORIZONTAL_SWING_MODE): str, - vol.Optional(ATTR_LIGHT): vol.In(["on", "off", "dim"]), + probatio.Optional(ATTR_TARGET_TEMPERATURE): int, + probatio.Optional(ATTR_FAN_MODE): str, + probatio.Optional(ATTR_SWING_MODE): str, + probatio.Optional(ATTR_HORIZONTAL_SWING_MODE): str, + probatio.Optional(ATTR_LIGHT): probatio.In(["on", "off", "dim"]), }, func="async_full_ac_state", ) @@ -101,11 +101,11 @@ def async_setup_services(hass: HomeAssistant) -> None: SERVICE_ENABLE_CLIMATE_REACT, entity_domain=CLIMATE_DOMAIN, schema={ - vol.Required(ATTR_HIGH_TEMPERATURE_THRESHOLD): vol.Coerce(float), - vol.Required(ATTR_HIGH_TEMPERATURE_STATE): dict, - vol.Required(ATTR_LOW_TEMPERATURE_THRESHOLD): vol.Coerce(float), - vol.Required(ATTR_LOW_TEMPERATURE_STATE): dict, - vol.Required(ATTR_SMART_TYPE): vol.In( + probatio.Required(ATTR_HIGH_TEMPERATURE_THRESHOLD): probatio.Coerce(float), + probatio.Required(ATTR_HIGH_TEMPERATURE_STATE): dict, + probatio.Required(ATTR_LOW_TEMPERATURE_THRESHOLD): probatio.Coerce(float), + probatio.Required(ATTR_LOW_TEMPERATURE_STATE): dict, + probatio.Required(ATTR_SMART_TYPE): probatio.In( ["temperature", "feelslike", "humidity"] ), }, @@ -116,7 +116,7 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, SERVICE_GET_DEVICE_CAPABILITIES, entity_domain=CLIMATE_DOMAIN, - schema={vol.Required(ATTR_HVAC_MODE): vol.Coerce(HVACMode)}, + schema={probatio.Required(ATTR_HVAC_MODE): probatio.Coerce(HVACMode)}, func="async_get_device_capabilities", supports_response=SupportsResponse.ONLY, ) diff --git a/homeassistant/components/sensirion_ble/config_flow.py b/homeassistant/components/sensirion_ble/config_flow.py index 9ec001f3bfe33..2dc8954369d2d 100644 --- a/homeassistant/components/sensirion_ble/config_flow.py +++ b/homeassistant/components/sensirion_ble/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from sensirion_ble import SensirionBluetoothDeviceData -import voluptuous as vol from homeassistant.components import bluetooth from homeassistant.components.bluetooth import ( @@ -90,7 +90,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_ADDRESS): vol.In(self._discovered_devices)} + data_schema=probatio.Schema( + {probatio.Required(CONF_ADDRESS): probatio.In(self._discovered_devices)} ), ) diff --git a/homeassistant/components/sensor/const.py b/homeassistant/components/sensor/const.py index c09a4c465dfbc..9f396e99d4fca 100644 --- a/homeassistant/components/sensor/const.py +++ b/homeassistant/components/sensor/const.py @@ -3,7 +3,7 @@ from enum import StrEnum from typing import Final -import voluptuous as vol +import probatio from homeassistant.const import ( DEGREE, @@ -560,7 +560,9 @@ class SensorDeviceClass(StrEnum): SensorDeviceClass.UPTIME, } -DEVICE_CLASSES_SCHEMA: Final = vol.All(vol.Lower, vol.Coerce(SensorDeviceClass)) +DEVICE_CLASSES_SCHEMA: Final = probatio.All( + probatio.Lower, probatio.Coerce(SensorDeviceClass) +) # DEVICE_CLASSES is deprecated as of 2021.12 # use the SensorDeviceClass enum instead. @@ -590,7 +592,9 @@ class SensorStateClass(StrEnum): For example: an amount of consumed gas""" -STATE_CLASSES_SCHEMA: Final = vol.All(vol.Lower, vol.Coerce(SensorStateClass)) +STATE_CLASSES_SCHEMA: Final = probatio.All( + probatio.Lower, probatio.Coerce(SensorStateClass) +) STATE_CLASSES: Final[list[str]] = [cls.value for cls in SensorStateClass] diff --git a/homeassistant/components/sensor/device_condition.py b/homeassistant/components/sensor/device_condition.py index 0b3de1377ccf3..f90f7b40ef459 100644 --- a/homeassistant/components/sensor/device_condition.py +++ b/homeassistant/components/sensor/device_condition.py @@ -1,6 +1,6 @@ """Provides device conditions for sensors.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import ( InvalidDeviceAutomationConfig, @@ -159,11 +159,11 @@ DEVICE_CLASS_NONE: [{CONF_TYPE: CONF_IS_VALUE}], } -CONDITION_SCHEMA = vol.All( +CONDITION_SCHEMA = probatio.All( cv.DEVICE_CONDITION_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In( + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In( [ CONF_IS_ABSOLUTE_HUMIDITY, CONF_IS_APPARENT_POWER, @@ -224,8 +224,8 @@ CONF_IS_VALUE, ] ), - vol.Optional(CONF_BELOW): vol.Any(vol.Coerce(float)), - vol.Optional(CONF_ABOVE): vol.Any(vol.Coerce(float)), + probatio.Optional(CONF_BELOW): probatio.Any(probatio.Coerce(float)), + probatio.Optional(CONF_ABOVE): probatio.Any(probatio.Coerce(float)), } ), cv.has_at_least_one_key(CONF_BELOW, CONF_ABOVE), @@ -295,7 +295,7 @@ def async_condition_from_config( async def async_get_condition_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List condition capabilities.""" try: @@ -310,14 +310,14 @@ async def async_get_condition_capabilities( ) return { - "extra_fields": vol.Schema( + "extra_fields": probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_ABOVE, description={"suffix": unit_of_measurement} - ): vol.Coerce(float), - vol.Optional( + ): probatio.Coerce(float), + probatio.Optional( CONF_BELOW, description={"suffix": unit_of_measurement} - ): vol.Coerce(float), + ): probatio.Coerce(float), } ) } diff --git a/homeassistant/components/sensor/device_trigger.py b/homeassistant/components/sensor/device_trigger.py index f3dbfa6b01611..78a1bc8d8e0b7 100644 --- a/homeassistant/components/sensor/device_trigger.py +++ b/homeassistant/components/sensor/device_trigger.py @@ -1,6 +1,6 @@ """Provides device triggers for sensors.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import ( DEVICE_TRIGGER_BASE_SCHEMA, @@ -161,11 +161,11 @@ } -TRIGGER_SCHEMA = vol.All( +TRIGGER_SCHEMA = probatio.All( DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In( + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In( [ CONF_ABSOLUTE_HUMIDITY, CONF_APPARENT_POWER, @@ -226,9 +226,9 @@ CONF_VALUE, ] ), - vol.Optional(CONF_BELOW): vol.Any(vol.Coerce(float)), - vol.Optional(CONF_ABOVE): vol.Any(vol.Coerce(float)), - vol.Optional(CONF_FOR): cv.positive_time_period_dict, + probatio.Optional(CONF_BELOW): probatio.Any(probatio.Coerce(float)), + probatio.Optional(CONF_ABOVE): probatio.Any(probatio.Coerce(float)), + probatio.Optional(CONF_FOR): cv.positive_time_period_dict, } ), cv.has_at_least_one_key(CONF_BELOW, CONF_ABOVE), @@ -304,7 +304,7 @@ async def async_get_triggers( async def async_get_trigger_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List trigger capabilities.""" try: @@ -319,15 +319,15 @@ async def async_get_trigger_capabilities( ) return { - "extra_fields": vol.Schema( + "extra_fields": probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_ABOVE, description={"suffix": unit_of_measurement} - ): vol.Coerce(float), - vol.Optional( + ): probatio.Coerce(float), + probatio.Optional( CONF_BELOW, description={"suffix": unit_of_measurement} - ): vol.Coerce(float), - vol.Optional(CONF_FOR): cv.positive_time_period_dict, + ): probatio.Coerce(float), + probatio.Optional(CONF_FOR): cv.positive_time_period_dict, } ) } diff --git a/homeassistant/components/sensor/websocket_api.py b/homeassistant/components/sensor/websocket_api.py index c9a68e3b4107b..3665d7d7200b7 100644 --- a/homeassistant/components/sensor/websocket_api.py +++ b/homeassistant/components/sensor/websocket_api.py @@ -2,7 +2,7 @@ from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.core import HomeAssistant, callback @@ -27,8 +27,8 @@ def async_setup(hass: HomeAssistant) -> None: @callback @websocket_api.websocket_command( { - vol.Required("type"): "sensor/device_class_convertible_units", - vol.Required("device_class"): str, + probatio.Required("type"): "sensor/device_class_convertible_units", + probatio.Required("device_class"): str, } ) def ws_device_class_units( @@ -48,7 +48,7 @@ def ws_device_class_units( @callback @websocket_api.websocket_command( { - vol.Required("type"): "sensor/numeric_device_classes", + probatio.Required("type"): "sensor/numeric_device_classes", } ) def ws_numeric_device_classes( diff --git a/homeassistant/components/sensorpro/config_flow.py b/homeassistant/components/sensorpro/config_flow.py index b7aae143c5ffd..84df73b36e2d2 100644 --- a/homeassistant/components/sensorpro/config_flow.py +++ b/homeassistant/components/sensorpro/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from sensorpro_ble import SensorProBluetoothDeviceData as DeviceData -import voluptuous as vol from homeassistant.components.bluetooth import ( BluetoothServiceInfoBleak, @@ -88,7 +88,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_ADDRESS): vol.In(self._discovered_devices)} + data_schema=probatio.Schema( + {probatio.Required(CONF_ADDRESS): probatio.In(self._discovered_devices)} ), ) diff --git a/homeassistant/components/sensorpush/config_flow.py b/homeassistant/components/sensorpush/config_flow.py index 641ca81eef1fd..5b3d7f73bf62b 100644 --- a/homeassistant/components/sensorpush/config_flow.py +++ b/homeassistant/components/sensorpush/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from sensorpush_ble import SensorPushBluetoothDeviceData as DeviceData -import voluptuous as vol from homeassistant.components.bluetooth import ( BluetoothServiceInfoBleak, @@ -88,7 +88,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_ADDRESS): vol.In(self._discovered_devices)} + data_schema=probatio.Schema( + {probatio.Required(CONF_ADDRESS): probatio.In(self._discovered_devices)} ), ) diff --git a/homeassistant/components/sensorpush_cloud/config_flow.py b/homeassistant/components/sensorpush_cloud/config_flow.py index f0a07f0472432..295f470532159 100644 --- a/homeassistant/components/sensorpush_cloud/config_flow.py +++ b/homeassistant/components/sensorpush_cloud/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from sensorpush_ha import SensorPushCloudApi, SensorPushCloudAuthError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_EMAIL, CONF_PASSWORD @@ -44,14 +44,14 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_EMAIL): TextSelector( + probatio.Required(CONF_EMAIL): TextSelector( TextSelectorConfig( type=TextSelectorType.EMAIL, autocomplete="username" ) ), - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", diff --git a/homeassistant/components/sensoterra/config_flow.py b/homeassistant/components/sensoterra/config_flow.py index 5d0ae61ecb1ea..43d2e45c28866 100644 --- a/homeassistant/components/sensoterra/config_flow.py +++ b/homeassistant/components/sensoterra/config_flow.py @@ -4,12 +4,12 @@ from typing import Any, override from jwt import DecodeError, decode +import probatio from sensoterra.customerapi import ( CustomerApi, InvalidAuth as StInvalidAuth, Timeout as StTimeout, ) -import voluptuous as vol from homeassistant.config_entries import SOURCE_USER, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_EMAIL, CONF_PASSWORD, CONF_TOKEN @@ -22,12 +22,12 @@ from .const import DOMAIN, LOGGER, TOKEN_EXPIRATION_DAYS -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_EMAIL): TextSelector( + probatio.Required(CONF_EMAIL): TextSelector( TextSelectorConfig(type=TextSelectorType.EMAIL, autocomplete="email") ), - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } diff --git a/homeassistant/components/sentry/config_flow.py b/homeassistant/components/sentry/config_flow.py index e284866c066a5..662fc25cd4446 100644 --- a/homeassistant/components/sentry/config_flow.py +++ b/homeassistant/components/sentry/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from sentry_sdk.utils import BadDsn, Dsn -import voluptuous as vol from homeassistant.config_entries import ( ConfigEntry, @@ -33,7 +33,7 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema({vol.Required(CONF_DSN): str}) +DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_DSN): str}) class SentryConfigFlow(ConfigFlow, domain=DOMAIN): @@ -90,52 +90,54 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_LOGGING_EVENT_LEVEL, default=self.config_entry.options.get( CONF_LOGGING_EVENT_LEVEL, DEFAULT_LOGGING_EVENT_LEVEL ), - ): vol.In(LOGGING_LEVELS), - vol.Optional( + ): probatio.In(LOGGING_LEVELS), + probatio.Optional( CONF_LOGGING_LEVEL, default=self.config_entry.options.get( CONF_LOGGING_LEVEL, DEFAULT_LOGGING_LEVEL ), - ): vol.In(LOGGING_LEVELS), - vol.Optional( + ): probatio.In(LOGGING_LEVELS), + probatio.Optional( CONF_ENVIRONMENT, default=self.config_entry.options.get(CONF_ENVIRONMENT), ): str, - vol.Optional( + probatio.Optional( CONF_EVENT_HANDLED, default=self.config_entry.options.get( CONF_EVENT_HANDLED, False ), ): bool, - vol.Optional( + probatio.Optional( CONF_EVENT_CUSTOM_COMPONENTS, default=self.config_entry.options.get( CONF_EVENT_CUSTOM_COMPONENTS, False ), ): bool, - vol.Optional( + probatio.Optional( CONF_EVENT_THIRD_PARTY_PACKAGES, default=self.config_entry.options.get( CONF_EVENT_THIRD_PARTY_PACKAGES, False ), ): bool, - vol.Optional( + probatio.Optional( CONF_TRACING, default=self.config_entry.options.get(CONF_TRACING, False), ): bool, - vol.Optional( + probatio.Optional( CONF_TRACING_SAMPLE_RATE, default=self.config_entry.options.get( CONF_TRACING_SAMPLE_RATE, DEFAULT_TRACING_SAMPLE_RATE ), - ): vol.All(vol.Coerce(float), vol.Range(min=0.0, max=1.0)), + ): probatio.All( + probatio.Coerce(float), probatio.Range(min=0.0, max=1.0) + ), } ), ) diff --git a/homeassistant/components/serial/sensor.py b/homeassistant/components/serial/sensor.py index eda863729fbf2..b3425643cef26 100644 --- a/homeassistant/components/serial/sensor.py +++ b/homeassistant/components/serial/sensor.py @@ -6,8 +6,8 @@ import logging from typing import override +import probatio from serialx import Parity, SerialException, StopBits, open_serial_connection -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -42,12 +42,14 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_SERIAL_PORT): cv.string, - vol.Optional(CONF_BAUDRATE, default=DEFAULT_BAUDRATE): cv.positive_int, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, - vol.Optional(CONF_BYTESIZE, default=DEFAULT_BYTESIZE): vol.In([5, 6, 7, 8]), - vol.Optional(CONF_PARITY, default=DEFAULT_PARITY): vol.In( + probatio.Required(CONF_SERIAL_PORT): cv.string, + probatio.Optional(CONF_BAUDRATE, default=DEFAULT_BAUDRATE): cv.positive_int, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_BYTESIZE, default=DEFAULT_BYTESIZE): probatio.In( + [5, 6, 7, 8] + ), + probatio.Optional(CONF_PARITY, default=DEFAULT_PARITY): probatio.In( [ Parity.NONE, Parity.EVEN, @@ -56,16 +58,16 @@ Parity.SPACE, ] ), - vol.Optional(CONF_STOPBITS, default=DEFAULT_STOPBITS): vol.In( + probatio.Optional(CONF_STOPBITS, default=DEFAULT_STOPBITS): probatio.In( [ StopBits.ONE, StopBits.ONE_POINT_FIVE, StopBits.TWO, ] ), - vol.Optional(CONF_XONXOFF, default=DEFAULT_XONXOFF): cv.boolean, - vol.Optional(CONF_RTSCTS, default=DEFAULT_RTSCTS): cv.boolean, - vol.Optional(CONF_DSRDTR, default=DEFAULT_DSRDTR): cv.boolean, + probatio.Optional(CONF_XONXOFF, default=DEFAULT_XONXOFF): cv.boolean, + probatio.Optional(CONF_RTSCTS, default=DEFAULT_RTSCTS): cv.boolean, + probatio.Optional(CONF_DSRDTR, default=DEFAULT_DSRDTR): cv.boolean, } ) diff --git a/homeassistant/components/serial_pm/sensor.py b/homeassistant/components/serial_pm/sensor.py index e7658cb394ba6..22d608137c6c1 100644 --- a/homeassistant/components/serial_pm/sensor.py +++ b/homeassistant/components/serial_pm/sensor.py @@ -4,7 +4,7 @@ from typing import override from pmsensor import serial_pm as pm -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -23,9 +23,9 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_BRAND): cv.string, - vol.Required(CONF_SERIAL_DEVICE): cv.string, - vol.Optional(CONF_NAME): cv.string, + probatio.Required(CONF_BRAND): cv.string, + probatio.Required(CONF_SERIAL_DEVICE): cv.string, + probatio.Optional(CONF_NAME): cv.string, } ) diff --git a/homeassistant/components/sesame/lock.py b/homeassistant/components/sesame/lock.py index c150f6c71ab57..f0c410fedce06 100644 --- a/homeassistant/components/sesame/lock.py +++ b/homeassistant/components/sesame/lock.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio import pysesame2 -import voluptuous as vol from homeassistant.components.lock import ( PLATFORM_SCHEMA as LOCK_PLATFORM_SCHEMA, @@ -17,7 +17,9 @@ ATTR_SERIAL_NO = "serial" -PLATFORM_SCHEMA = LOCK_PLATFORM_SCHEMA.extend({vol.Required(CONF_API_KEY): cv.string}) +PLATFORM_SCHEMA = LOCK_PLATFORM_SCHEMA.extend( + {probatio.Required(CONF_API_KEY): cv.string} +) def setup_platform( diff --git a/homeassistant/components/seven_segments/image_processing.py b/homeassistant/components/seven_segments/image_processing.py index 71ea3cda74586..58433d55bf2c1 100644 --- a/homeassistant/components/seven_segments/image_processing.py +++ b/homeassistant/components/seven_segments/image_processing.py @@ -7,7 +7,7 @@ from typing import override from PIL import Image -import voluptuous as vol +import probatio from homeassistant.components.image_processing import ( PLATFORM_SCHEMA as IMAGE_PROCESSING_PLATFORM_SCHEMA, @@ -36,15 +36,15 @@ PLATFORM_SCHEMA = IMAGE_PROCESSING_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_EXTRA_ARGUMENTS, default=""): cv.string, - vol.Optional(CONF_DIGITS): cv.positive_int, - vol.Optional(CONF_HEIGHT, default=0): cv.positive_int, - vol.Optional(CONF_SSOCR_BIN, default=DEFAULT_BINARY): cv.string, - vol.Optional(CONF_THRESHOLD, default=0): cv.positive_int, - vol.Optional(CONF_ROTATE, default=0): cv.positive_int, - vol.Optional(CONF_WIDTH, default=0): cv.positive_int, - vol.Optional(CONF_X_POS, default=0): cv.string, - vol.Optional(CONF_Y_POS, default=0): cv.positive_int, + probatio.Optional(CONF_EXTRA_ARGUMENTS, default=""): cv.string, + probatio.Optional(CONF_DIGITS): cv.positive_int, + probatio.Optional(CONF_HEIGHT, default=0): cv.positive_int, + probatio.Optional(CONF_SSOCR_BIN, default=DEFAULT_BINARY): cv.string, + probatio.Optional(CONF_THRESHOLD, default=0): cv.positive_int, + probatio.Optional(CONF_ROTATE, default=0): cv.positive_int, + probatio.Optional(CONF_WIDTH, default=0): cv.positive_int, + probatio.Optional(CONF_X_POS, default=0): cv.string, + probatio.Optional(CONF_Y_POS, default=0): cv.positive_int, } ) diff --git a/homeassistant/components/seventeentrack/config_flow.py b/homeassistant/components/seventeentrack/config_flow.py index 222ec63938803..eb4a02781449c 100644 --- a/homeassistant/components/seventeentrack/config_flow.py +++ b/homeassistant/components/seventeentrack/config_flow.py @@ -3,9 +3,9 @@ import logging from typing import Any, override +import probatio from pyseventeentrack import Client as SeventeenTrackClient from pyseventeentrack.errors import SeventeenTrackError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -26,21 +26,21 @@ from .coordinator import SeventeenTrackConfigEntry CONF_SHOW = { - vol.Optional(CONF_SHOW_ARCHIVED, default=DEFAULT_SHOW_ARCHIVED): bool, - vol.Optional(CONF_SHOW_DELIVERED, default=DEFAULT_SHOW_DELIVERED): bool, + probatio.Optional(CONF_SHOW_ARCHIVED, default=DEFAULT_SHOW_ARCHIVED): bool, + probatio.Optional(CONF_SHOW_DELIVERED, default=DEFAULT_SHOW_DELIVERED): bool, } _LOGGER = logging.getLogger(__name__) -OPTIONS_SCHEMA = vol.Schema(CONF_SHOW) +OPTIONS_SCHEMA = probatio.Schema(CONF_SHOW) OPTIONS_FLOW = { "init": SchemaFlowFormStep(OPTIONS_SCHEMA), } -USER_SCHEMA = vol.Schema( +USER_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/seventeentrack/services.py b/homeassistant/components/seventeentrack/services.py index e0cc390967862..ca1cca61b3ff5 100644 --- a/homeassistant/components/seventeentrack/services.py +++ b/homeassistant/components/seventeentrack/services.py @@ -2,8 +2,8 @@ from typing import Any, Final +import probatio from pyseventeentrack.package import PACKAGE_STATUS_MAP, Package -import voluptuous as vol from homeassistant.const import ATTR_CONFIG_ENTRY_ID, ATTR_FRIENDLY_NAME, ATTR_LOCATION from homeassistant.core import ( @@ -35,10 +35,10 @@ ) from .coordinator import SeventeenTrackConfigEntry -SERVICE_GET_PACKAGES_SCHEMA: Final = vol.Schema( +SERVICE_GET_PACKAGES_SCHEMA: Final = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): cv.string, - vol.Optional(ATTR_PACKAGE_STATE): selector.SelectSelector( + probatio.Required(ATTR_CONFIG_ENTRY_ID): cv.string, + probatio.Optional(ATTR_PACKAGE_STATE): selector.SelectSelector( selector.SelectSelectorConfig( multiple=True, options=[ @@ -52,18 +52,18 @@ } ) -SERVICE_ADD_PACKAGE_SCHEMA: Final = vol.Schema( +SERVICE_ADD_PACKAGE_SCHEMA: Final = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): cv.string, - vol.Required(ATTR_PACKAGE_TRACKING_NUMBER): cv.string, - vol.Required(ATTR_PACKAGE_FRIENDLY_NAME): cv.string, + probatio.Required(ATTR_CONFIG_ENTRY_ID): cv.string, + probatio.Required(ATTR_PACKAGE_TRACKING_NUMBER): cv.string, + probatio.Required(ATTR_PACKAGE_FRIENDLY_NAME): cv.string, } ) -SERVICE_ARCHIVE_PACKAGE_SCHEMA: Final = vol.Schema( +SERVICE_ARCHIVE_PACKAGE_SCHEMA: Final = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): cv.string, - vol.Required(ATTR_PACKAGE_TRACKING_NUMBER): cv.string, + probatio.Required(ATTR_CONFIG_ENTRY_ID): cv.string, + probatio.Required(ATTR_PACKAGE_TRACKING_NUMBER): cv.string, } ) diff --git a/homeassistant/components/sfr_box/config_flow.py b/homeassistant/components/sfr_box/config_flow.py index b696768695013..79e4f17f6a9a1 100644 --- a/homeassistant/components/sfr_box/config_flow.py +++ b/homeassistant/components/sfr_box/config_flow.py @@ -4,9 +4,9 @@ import logging from typing import TYPE_CHECKING, Any, override +import probatio from sfrbox_api.bridge import SFRBox from sfrbox_api.exceptions import SFRBoxAuthenticationError, SFRBoxError -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -22,15 +22,17 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST, default=DEFAULT_HOST): selector.TextSelector(), + probatio.Required(CONF_HOST, default=DEFAULT_HOST): selector.TextSelector(), } ) -AUTH_SCHEMA = vol.Schema( +AUTH_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME, default=DEFAULT_USERNAME): selector.TextSelector(), - vol.Required(CONF_PASSWORD): selector.TextSelector( + probatio.Required( + CONF_USERNAME, default=DEFAULT_USERNAME + ): selector.TextSelector(), + probatio.Required(CONF_PASSWORD): selector.TextSelector( selector.TextSelectorConfig(type=selector.TextSelectorType.PASSWORD) ), } diff --git a/homeassistant/components/sftp_storage/config_flow.py b/homeassistant/components/sftp_storage/config_flow.py index 80158b976699d..59a61dbac1375 100644 --- a/homeassistant/components/sftp_storage/config_flow.py +++ b/homeassistant/components/sftp_storage/config_flow.py @@ -8,7 +8,7 @@ from asyncssh import KeyImportError, SSHClientConnectionOptions, connect from asyncssh.misc import PermissionDenied from asyncssh.sftp import SFTPNoSuchFile, SFTPPermissionDenied -import voluptuous as vol +import probatio from homeassistant.components.file_upload import process_uploaded_file from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -34,18 +34,18 @@ LOGGER, ) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=22): int, - vol.Required(CONF_USERNAME): str, - vol.Optional(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=22): int, + probatio.Required(CONF_USERNAME): str, + probatio.Optional(CONF_PASSWORD): TextSelector( config=TextSelectorConfig(type=TextSelectorType.PASSWORD) ), - vol.Optional(CONF_PRIVATE_KEY_FILE): FileSelector( + probatio.Optional(CONF_PRIVATE_KEY_FILE): FileSelector( FileSelectorConfig(accept="*") ), - vol.Required(CONF_BACKUP_LOCATION): str, + probatio.Required(CONF_BACKUP_LOCATION): str, } ) diff --git a/homeassistant/components/sharkiq/config_flow.py b/homeassistant/components/sharkiq/config_flow.py index 7f64e01308090..7a4707153cdda 100644 --- a/homeassistant/components/sharkiq/config_flow.py +++ b/homeassistant/components/sharkiq/config_flow.py @@ -5,8 +5,8 @@ from typing import Any, override import aiohttp +import probatio from sharkiq import SharkIqAuthError, get_ayla_api -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_REGION, CONF_USERNAME @@ -23,11 +23,11 @@ SHARKIQ_REGION_OPTIONS, ) -SHARKIQ_SCHEMA = vol.Schema( +SHARKIQ_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Required( + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Required( CONF_REGION, default=SHARKIQ_REGION_DEFAULT ): selector.SelectSelector( selector.SelectSelectorConfig( diff --git a/homeassistant/components/sharkiq/services.py b/homeassistant/components/sharkiq/services.py index df9578e33a6dc..f9a00ccb031ae 100644 --- a/homeassistant/components/sharkiq/services.py +++ b/homeassistant/components/sharkiq/services.py @@ -1,6 +1,6 @@ """Shark IQ services.""" -import voluptuous as vol +import probatio from homeassistant.components.vacuum import DOMAIN as VACUUM_DOMAIN from homeassistant.core import HomeAssistant, callback @@ -22,8 +22,8 @@ def async_setup_services(hass: HomeAssistant) -> None: SERVICE_CLEAN_ROOM, entity_domain=VACUUM_DOMAIN, schema={ - vol.Required(ATTR_ROOMS): vol.All( - cv.ensure_list, vol.Length(min=1), [cv.string] + probatio.Required(ATTR_ROOMS): probatio.All( + cv.ensure_list, probatio.Length(min=1), [cv.string] ), }, func="async_clean_room", diff --git a/homeassistant/components/shell_command/__init__.py b/homeassistant/components/shell_command/__init__.py index 61863489ce847..0f57d22b35c95 100644 --- a/homeassistant/components/shell_command/__init__.py +++ b/homeassistant/components/shell_command/__init__.py @@ -7,7 +7,7 @@ import shlex from typing import Any -import voluptuous as vol +import probatio import homeassistant.config as conf_util from homeassistant.const import SERVICE_RELOAD @@ -33,8 +33,8 @@ _LOGGER = logging.getLogger(__name__) -CONFIG_SCHEMA = vol.Schema( - {DOMAIN: cv.schema_with_slug_keys(cv.string)}, extra=vol.ALLOW_EXTRA +CONFIG_SCHEMA = probatio.Schema( + {DOMAIN: cv.schema_with_slug_keys(cv.string)}, extra=probatio.ALLOW_EXTRA ) @@ -196,7 +196,7 @@ async def reload_service_handler(service_call: ServiceCall) -> None: try: new_conf = CONFIG_SCHEMA(raw_config).get(DOMAIN, {}) - except vol.Invalid as err: + except probatio.Invalid as err: _LOGGER.error("Invalid shell_command configuration: %s", err) return diff --git a/homeassistant/components/shelly/__init__.py b/homeassistant/components/shelly/__init__.py index 52aef5522ac41..78c8d616dd449 100644 --- a/homeassistant/components/shelly/__init__.py +++ b/homeassistant/components/shelly/__init__.py @@ -15,7 +15,7 @@ RpcCallError, ) from aioshelly.rpc_device import RpcDevice, bluetooth_mac_from_primary_mac -import voluptuous as vol +import probatio from homeassistant.components.bluetooth import async_remove_scanner from homeassistant.const import ( @@ -112,12 +112,14 @@ Platform.UPDATE, ] -COAP_SCHEMA: Final = vol.Schema( +COAP_SCHEMA: Final = probatio.Schema( { - vol.Optional(CONF_COAP_PORT, default=DEFAULT_COAP_PORT): cv.port, + probatio.Optional(CONF_COAP_PORT, default=DEFAULT_COAP_PORT): cv.port, } ) -CONFIG_SCHEMA: Final = vol.Schema({DOMAIN: COAP_SCHEMA}, extra=vol.ALLOW_EXTRA) +CONFIG_SCHEMA: Final = probatio.Schema( + {DOMAIN: COAP_SCHEMA}, extra=probatio.ALLOW_EXTRA +) # Max time to wait at startup for a BLE proxy to register its scanner. STARTUP_SCANNER_WAIT: Final = 3.0 diff --git a/homeassistant/components/shelly/config_flow.py b/homeassistant/components/shelly/config_flow.py index 9ebc4499fa2c6..df713ecf28659 100644 --- a/homeassistant/components/shelly/config_flow.py +++ b/homeassistant/components/shelly/config_flow.py @@ -31,7 +31,7 @@ from aioshelly.rpc_device.models import ShellyWiFiNetwork from aioshelly.zeroconf import async_discover_devices, async_lookup_device_by_name from bleak.backends.device import BLEDevice -import voluptuous as vol +import probatio from zeroconf import IPVersion from homeassistant.components import zeroconf @@ -99,11 +99,11 @@ mac_address_from_name, ) -CONFIG_SCHEMA: Final = vol.Schema( +CONFIG_SCHEMA: Final = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=DEFAULT_HTTP_PORT): vol.Coerce(int), - vol.Optional(CONF_VERIFY_SSL, default=False): bool, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=DEFAULT_HTTP_PORT): probatio.Coerce(int), + probatio.Optional(CONF_VERIFY_SSL, default=False): bool, } ) @@ -549,9 +549,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_DEVICE): SelectSelector( + probatio.Required(CONF_DEVICE): SelectSelector( SelectSelectorConfig( options=device_options, translation_key=CONF_DEVICE, @@ -643,22 +643,22 @@ async def async_step_credentials( if get_info_gen(self.info) in RPC_GENERATIONS: schema = { - vol.Required( + probatio.Required( CONF_PASSWORD, default=user_input.get(CONF_PASSWORD, "") ): str, } else: schema = { - vol.Required( + probatio.Required( CONF_USERNAME, default=user_input.get(CONF_USERNAME, "") ): str, - vol.Required( + probatio.Required( CONF_PASSWORD, default=user_input.get(CONF_PASSWORD, "") ): str, } return self.async_show_form( - step_id="credentials", data_schema=vol.Schema(schema), errors=errors + step_id="credentials", data_schema=probatio.Schema(schema), errors=errors ) @callback @@ -794,10 +794,10 @@ async def async_step_bluetooth_confirm( return self.async_show_form( step_id="bluetooth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional("disable_ap", default=True): bool, - vol.Optional("disable_ble_rpc", default=True): bool, + probatio.Optional("disable_ap", default=True): bool, + probatio.Optional("disable_ble_rpc", default=True): bool, } ), description_placeholders={ @@ -846,16 +846,16 @@ async def async_step_wifi_scan( return self.async_show_form( step_id="wifi_scan", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_SSID): SelectSelector( + probatio.Required(CONF_SSID): SelectSelector( SelectSelectorConfig( options=ssid_options, mode=SelectSelectorMode.DROPDOWN, custom_value=True, ) ), - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ), suggested_values, @@ -1284,15 +1284,15 @@ async def async_step_reauth_confirm( if get_device_entry_gen(reauth_entry) in BLOCK_GENERATIONS: schema = { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } else: - schema = {vol.Required(CONF_PASSWORD): str} + schema = {probatio.Required(CONF_PASSWORD): str} return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema(schema), + data_schema=probatio.Schema(schema), errors=errors, ) @@ -1337,11 +1337,13 @@ async def async_step_reconfigure( return self.async_show_form( step_id="reconfigure", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST, default=self.host): str, - vol.Required(CONF_PORT, default=self.port): vol.Coerce(int), - vol.Optional(CONF_VERIFY_SSL, default=self.verify_ssl): bool, + probatio.Required(CONF_HOST, default=self.host): str, + probatio.Required(CONF_PORT, default=self.port): probatio.Coerce( + int + ), + probatio.Optional(CONF_VERIFY_SSL, default=self.verify_ssl): bool, } ), description_placeholders={"device_name": reconfigure_entry.title}, @@ -1406,9 +1408,9 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_BLE_SCANNER_MODE, default=self.config_entry.options.get( CONF_BLE_SCANNER_MODE, BLEScannerMode.DISABLED diff --git a/homeassistant/components/shelly/device_trigger.py b/homeassistant/components/shelly/device_trigger.py index 2f2a2c0009aab..ee61e881d8198 100644 --- a/homeassistant/components/shelly/device_trigger.py +++ b/homeassistant/components/shelly/device_trigger.py @@ -2,7 +2,7 @@ from typing import Final -import voluptuous as vol +import probatio from homeassistant.components.device_automation import ( DEVICE_TRIGGER_BASE_SCHEMA, @@ -44,10 +44,10 @@ TRIGGER_SCHEMA: Final = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): vol.In( + probatio.Required(CONF_TYPE): probatio.In( RPC_INPUTS_EVENTS_TYPES | BLOCK_INPUTS_EVENTS_TYPES ), - vol.Required(CONF_SUBTYPE): vol.In(INPUTS_EVENTS_SUBTYPES), + probatio.Required(CONF_SUBTYPE): probatio.In(INPUTS_EVENTS_SUBTYPES), } ) diff --git a/homeassistant/components/shelly/repairs.py b/homeassistant/components/shelly/repairs.py index 462820da23b34..678123ca87771 100644 --- a/homeassistant/components/shelly/repairs.py +++ b/homeassistant/components/shelly/repairs.py @@ -7,7 +7,7 @@ from aioshelly.exceptions import DeviceConnectionError, RpcCallError from aioshelly.rpc_device import RpcDevice from awesomeversion import AwesomeVersion -import voluptuous as vol +import probatio from homeassistant.components.repairs import ( ConfirmRepairFlow, @@ -327,7 +327,7 @@ async def async_step_confirm( return self.async_show_form( step_id="confirm", - data_schema=vol.Schema({}), + data_schema=probatio.Schema({}), description_placeholders=description_placeholders, ) diff --git a/homeassistant/components/shelly/services.py b/homeassistant/components/shelly/services.py index 652a3363ad4f1..6a804ca9e04d0 100644 --- a/homeassistant/components/shelly/services.py +++ b/homeassistant/components/shelly/services.py @@ -4,7 +4,7 @@ from aioshelly.const import RPC_GENERATIONS from aioshelly.exceptions import DeviceConnectionError, RpcCallError -import voluptuous as vol +import probatio from homeassistant.const import ATTR_DEVICE_ID from homeassistant.core import ( @@ -25,17 +25,19 @@ SERVICE_GET_KVS_VALUE = "get_kvs_value" SERVICE_SET_KVS_VALUE = "set_kvs_value" -SERVICE_GET_KVS_VALUE_SCHEMA = vol.Schema( +SERVICE_GET_KVS_VALUE_SCHEMA = probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): cv.string, - vol.Required(ATTR_KEY): str, + probatio.Required(ATTR_DEVICE_ID): cv.string, + probatio.Required(ATTR_KEY): str, } ) -SERVICE_SET_KVS_VALUE_SCHEMA = vol.Schema( +SERVICE_SET_KVS_VALUE_SCHEMA = probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): cv.string, - vol.Required(ATTR_KEY): str, - vol.Required(ATTR_VALUE): vol.Any(str, int, float, bool, dict, list, None), + probatio.Required(ATTR_DEVICE_ID): cv.string, + probatio.Required(ATTR_KEY): str, + probatio.Required(ATTR_VALUE): probatio.Any( + str, int, float, bool, dict, list, None + ), } ) diff --git a/homeassistant/components/shodan/sensor.py b/homeassistant/components/shodan/sensor.py index b475bc016aa37..59af7e922d21f 100644 --- a/homeassistant/components/shodan/sensor.py +++ b/homeassistant/components/shodan/sensor.py @@ -3,8 +3,8 @@ from datetime import timedelta import logging +import probatio import shodan -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -26,9 +26,9 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_API_KEY): cv.string, - vol.Required(CONF_QUERY): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_QUERY): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/shopping_list/__init__.py b/homeassistant/components/shopping_list/__init__.py index 3af5617983741..0392f907ecac2 100644 --- a/homeassistant/components/shopping_list/__init__.py +++ b/homeassistant/components/shopping_list/__init__.py @@ -5,7 +5,7 @@ from typing import Any from aiohttp import web -import voluptuous as vol +import probatio from homeassistant import config_entries from homeassistant.components import http, websocket_api @@ -28,7 +28,7 @@ _LOGGER = logging.getLogger(__name__) -CONFIG_SCHEMA = vol.Schema({DOMAIN: {}}, extra=vol.ALLOW_EXTRA) +CONFIG_SCHEMA = probatio.Schema({DOMAIN: {}}, extra=probatio.ALLOW_EXTRA) async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: @@ -115,7 +115,7 @@ async def post(self, request: web.Request, item_id: str) -> web.Response: return self.json(item) except NoMatchingShoppingListItem: return self.json_message("Item not found", HTTPStatus.NOT_FOUND) - except vol.Invalid: + except probatio.Invalid: return self.json_message("Item not found", HTTPStatus.BAD_REQUEST) @@ -125,7 +125,7 @@ class CreateShoppingListItemView(http.HomeAssistantView): url = "/api/shopping_list/item" name = "api:shopping_list:item" - @RequestDataValidator(vol.Schema({vol.Required("name"): str})) + @RequestDataValidator(probatio.Schema({probatio.Required("name"): str})) async def post(self, request: web.Request, data: dict[str, str]) -> web.Response: """Create a new shopping list item.""" shopping_data = _get_shopping_data(request.app[http.KEY_HASS]) @@ -147,7 +147,7 @@ async def post(self, request: web.Request) -> web.Response: @callback -@websocket_api.websocket_command({vol.Required("type"): "shopping_list/items"}) +@websocket_api.websocket_command({probatio.Required("type"): "shopping_list/items"}) def websocket_handle_items( hass: HomeAssistant, connection: websocket_api.ActiveConnection, @@ -160,7 +160,10 @@ def websocket_handle_items( @websocket_api.websocket_command( - {vol.Required("type"): "shopping_list/items/add", vol.Required("name"): str} + { + probatio.Required("type"): "shopping_list/items/add", + probatio.Required("name"): str, + } ) @websocket_api.async_response async def websocket_handle_add( @@ -176,7 +179,10 @@ async def websocket_handle_add( @websocket_api.websocket_command( - {vol.Required("type"): "shopping_list/items/remove", vol.Required("item_id"): str} + { + probatio.Required("type"): "shopping_list/items/remove", + probatio.Required("item_id"): str, + } ) @websocket_api.async_response async def websocket_handle_remove( @@ -204,10 +210,10 @@ async def websocket_handle_remove( @websocket_api.websocket_command( { - vol.Required("type"): "shopping_list/items/update", - vol.Required("item_id"): str, - vol.Optional("name"): str, - vol.Optional("complete"): bool, + probatio.Required("type"): "shopping_list/items/update", + probatio.Required("item_id"): str, + probatio.Optional("name"): str, + probatio.Optional("complete"): bool, } ) @websocket_api.async_response @@ -235,7 +241,9 @@ async def websocket_handle_update( connection.send_message(websocket_api.result_message(msg_id, item)) -@websocket_api.websocket_command({vol.Required("type"): "shopping_list/items/clear"}) +@websocket_api.websocket_command( + {probatio.Required("type"): "shopping_list/items/clear"} +) @websocket_api.async_response async def websocket_handle_clear( hass: HomeAssistant, @@ -250,8 +258,8 @@ async def websocket_handle_clear( @websocket_api.websocket_command( { - vol.Required("type"): "shopping_list/items/reorder", - vol.Required("item_ids"): [str], + probatio.Required("type"): "shopping_list/items/reorder", + probatio.Required("item_ids"): [str], } ) @websocket_api.async_response @@ -272,7 +280,7 @@ async def websocket_handle_reorder( "One or more item id(s) not found.", ) return - except vol.Invalid as err: + except probatio.Invalid as err: connection.send_error(msg_id, websocket_api.ERR_INVALID_FORMAT, f"{err}") return diff --git a/homeassistant/components/shopping_list/common.py b/homeassistant/components/shopping_list/common.py index cdd7faf423836..d3aa8889759f1 100644 --- a/homeassistant/components/shopping_list/common.py +++ b/homeassistant/components/shopping_list/common.py @@ -5,7 +5,7 @@ from typing import Any, cast import uuid -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigEntry from homeassistant.const import ATTR_NAME @@ -20,7 +20,7 @@ ATTR_COMPLETE = "complete" -ITEM_UPDATE_SCHEMA = vol.Schema({ATTR_COMPLETE: bool, ATTR_NAME: str}) +ITEM_UPDATE_SCHEMA = probatio.Schema({ATTR_COMPLETE: bool, ATTR_NAME: str}) PERSISTENCE = ".shopping_list.json" @@ -188,7 +188,7 @@ async def async_reorder( # All the unchecked items must be passed in the item_ids array, # so all items left in the mapping should be checked items. if value["complete"] is False: - raise vol.Invalid( + raise probatio.Invalid( "The item ids array doesn't contain all the unchecked shopping list" " items." ) diff --git a/homeassistant/components/shopping_list/services.py b/homeassistant/components/shopping_list/services.py index 5224bce10bdd5..afe566d8cc081 100644 --- a/homeassistant/components/shopping_list/services.py +++ b/homeassistant/components/shopping_list/services.py @@ -2,7 +2,7 @@ import logging -import voluptuous as vol +import probatio from homeassistant.const import ATTR_NAME from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -25,10 +25,10 @@ _LOGGER = logging.getLogger(__name__) -SERVICE_ITEM_SCHEMA = vol.Schema({vol.Required(ATTR_NAME): cv.string}) -SERVICE_LIST_SCHEMA = vol.Schema({}) -SERVICE_SORT_SCHEMA = vol.Schema( - {vol.Optional(ATTR_REVERSE, default=DEFAULT_REVERSE): bool} +SERVICE_ITEM_SCHEMA = probatio.Schema({probatio.Required(ATTR_NAME): cv.string}) +SERVICE_LIST_SCHEMA = probatio.Schema({}) +SERVICE_SORT_SCHEMA = probatio.Schema( + {probatio.Optional(ATTR_REVERSE, default=DEFAULT_REVERSE): bool} ) diff --git a/homeassistant/components/sia/config_flow.py b/homeassistant/components/sia/config_flow.py index dfd9f9bfd8b43..381ee9a8aefb6 100644 --- a/homeassistant/components/sia/config_flow.py +++ b/homeassistant/components/sia/config_flow.py @@ -5,6 +5,7 @@ import logging from typing import Any, override +import probatio from pysiaalarm import ( InvalidAccountFormatError, InvalidAccountLengthError, @@ -12,7 +13,6 @@ InvalidKeyLengthError, SIAAccount, ) -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, OptionsFlow from homeassistant.const import CONF_PORT, CONF_PROTOCOL @@ -33,25 +33,25 @@ _LOGGER = logging.getLogger(__name__) -HUB_SCHEMA = vol.Schema( +HUB_SCHEMA = probatio.Schema( { - vol.Required(CONF_PORT): int, - vol.Optional(CONF_PROTOCOL, default="TCP"): vol.In(["TCP", "UDP"]), - vol.Required(CONF_ACCOUNT): str, - vol.Optional(CONF_ENCRYPTION_KEY): str, - vol.Required(CONF_PING_INTERVAL, default=1): int, - vol.Required(CONF_ZONES, default=1): int, - vol.Optional(CONF_ADDITIONAL_ACCOUNTS, default=False): bool, + probatio.Required(CONF_PORT): int, + probatio.Optional(CONF_PROTOCOL, default="TCP"): probatio.In(["TCP", "UDP"]), + probatio.Required(CONF_ACCOUNT): str, + probatio.Optional(CONF_ENCRYPTION_KEY): str, + probatio.Required(CONF_PING_INTERVAL, default=1): int, + probatio.Required(CONF_ZONES, default=1): int, + probatio.Optional(CONF_ADDITIONAL_ACCOUNTS, default=False): bool, } ) -ACCOUNT_SCHEMA = vol.Schema( +ACCOUNT_SCHEMA = probatio.Schema( { - vol.Required(CONF_ACCOUNT): str, - vol.Optional(CONF_ENCRYPTION_KEY): str, - vol.Required(CONF_PING_INTERVAL, default=1): int, - vol.Required(CONF_ZONES, default=1): int, - vol.Optional(CONF_ADDITIONAL_ACCOUNTS, default=False): bool, + probatio.Required(CONF_ACCOUNT): str, + probatio.Optional(CONF_ENCRYPTION_KEY): str, + probatio.Required(CONF_PING_INTERVAL, default=1): int, + probatio.Required(CONF_ZONES, default=1): int, + probatio.Optional(CONF_ADDITIONAL_ACCOUNTS, default=False): bool, } ) @@ -203,13 +203,13 @@ async def async_step_options( return self.async_show_form( step_id="options", description_placeholders={"account": account}, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_ZONES, default=self.options[CONF_ACCOUNTS][account][CONF_ZONES], ): int, - vol.Optional( + probatio.Optional( CONF_IGNORE_TIMESTAMPS, default=self.options[CONF_ACCOUNTS][account][ CONF_IGNORE_TIMESTAMPS diff --git a/homeassistant/components/sigfox/sensor.py b/homeassistant/components/sigfox/sensor.py index c34726530573e..d4854c6ca6494 100644 --- a/homeassistant/components/sigfox/sensor.py +++ b/homeassistant/components/sigfox/sensor.py @@ -7,8 +7,8 @@ from typing import Any from urllib.parse import urljoin +import probatio import requests -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -30,9 +30,9 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_API_LOGIN): cv.string, - vol.Required(CONF_API_PASSWORD): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_API_LOGIN): cv.string, + probatio.Required(CONF_API_PASSWORD): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/sighthound/image_processing.py b/homeassistant/components/sighthound/image_processing.py index 7c630dcb233ca..ea360cc258daf 100644 --- a/homeassistant/components/sighthound/image_processing.py +++ b/homeassistant/components/sighthound/image_processing.py @@ -6,8 +6,8 @@ from typing import TYPE_CHECKING, Any, override from PIL import Image, ImageDraw, UnidentifiedImageError +import probatio import simplehound.core as hound -import voluptuous as vol from homeassistant.components.image_processing import ( PLATFORM_SCHEMA as IMAGE_PROCESSING_PLATFORM_SCHEMA, @@ -42,10 +42,10 @@ PLATFORM_SCHEMA = IMAGE_PROCESSING_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_API_KEY): cv.string, - vol.Optional(CONF_ACCOUNT_TYPE, default=DEV): vol.In([DEV, PROD]), - vol.Optional(CONF_SAVE_FILE_FOLDER): cv.isdir, - vol.Optional(CONF_SAVE_TIMESTAMPTED_FILE, default=False): cv.boolean, + probatio.Required(CONF_API_KEY): cv.string, + probatio.Optional(CONF_ACCOUNT_TYPE, default=DEV): probatio.In([DEV, PROD]), + probatio.Optional(CONF_SAVE_FILE_FOLDER): cv.isdir, + probatio.Optional(CONF_SAVE_TIMESTAMPTED_FILE, default=False): cv.boolean, } ) diff --git a/homeassistant/components/signal_messenger/notify.py b/homeassistant/components/signal_messenger/notify.py index ee8543a822a62..0bf9a90ae9b42 100644 --- a/homeassistant/components/signal_messenger/notify.py +++ b/homeassistant/components/signal_messenger/notify.py @@ -3,9 +3,9 @@ import logging from typing import Any, override +import probatio from pysignalclirestapi import SignalCliRestApi, SignalCliRestApiError import requests -import voluptuous as vol from homeassistant.components.notify import ( ATTR_DATA, @@ -30,26 +30,32 @@ TEXTMODE_OPTIONS = ["normal", "styled"] -DATA_FILENAMES_SCHEMA = vol.Schema( +DATA_FILENAMES_SCHEMA = probatio.Schema( { - vol.Required(ATTR_FILENAMES): [cv.string], - vol.Optional(ATTR_TEXTMODE, default="normal"): vol.In(TEXTMODE_OPTIONS), + probatio.Required(ATTR_FILENAMES): [cv.string], + probatio.Optional(ATTR_TEXTMODE, default="normal"): probatio.In( + TEXTMODE_OPTIONS + ), } ) -DATA_URLS_SCHEMA = vol.Schema( +DATA_URLS_SCHEMA = probatio.Schema( { - vol.Required(ATTR_URLS): [cv.url], - vol.Optional(ATTR_VERIFY_SSL, default=True): cv.boolean, - vol.Optional(ATTR_TEXTMODE, default="normal"): vol.In(TEXTMODE_OPTIONS), + probatio.Required(ATTR_URLS): [cv.url], + probatio.Optional(ATTR_VERIFY_SSL, default=True): cv.boolean, + probatio.Optional(ATTR_TEXTMODE, default="normal"): probatio.In( + TEXTMODE_OPTIONS + ), } ) -DATA_SCHEMA = vol.Any( +DATA_SCHEMA = probatio.Any( None, - vol.Schema( + probatio.Schema( { - vol.Optional(ATTR_TEXTMODE, default="normal"): vol.In(TEXTMODE_OPTIONS), + probatio.Optional(ATTR_TEXTMODE, default="normal"): probatio.In( + TEXTMODE_OPTIONS + ), } ), DATA_FILENAMES_SCHEMA, @@ -58,9 +64,9 @@ PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_SENDER_NR): cv.string, - vol.Required(CONF_SIGNAL_CLI_REST_API): cv.string, - vol.Required(CONF_RECP_NR): vol.All(cv.ensure_list, [cv.string]), + probatio.Required(CONF_SENDER_NR): cv.string, + probatio.Required(CONF_SIGNAL_CLI_REST_API): cv.string, + probatio.Required(CONF_RECP_NR): probatio.All(cv.ensure_list, [cv.string]), } ) @@ -108,7 +114,7 @@ def send_message(self, message: str = "", **kwargs: Any) -> None: try: data = DATA_SCHEMA(data) - except vol.Invalid as ex: + except probatio.Invalid as ex: _LOGGER.error("Invalid message data: %s", ex) raise @@ -134,7 +140,7 @@ def get_filenames(data: Any) -> list[str] | None: """Extract attachment filenames from data.""" try: data = DATA_FILENAMES_SCHEMA(data) - except vol.Invalid: + except probatio.Invalid: return None return data[ATTR_FILENAMES] @@ -147,7 +153,7 @@ def get_attachments_as_bytes( """Retrieve attachments from URLs defined in data.""" try: data = DATA_URLS_SCHEMA(data) - except vol.Invalid: + except probatio.Invalid: return None urls = data[ATTR_URLS] diff --git a/homeassistant/components/silla_prism/config_flow.py b/homeassistant/components/silla_prism/config_flow.py index 3b793f97aaea2..33778295f1695 100644 --- a/homeassistant/components/silla_prism/config_flow.py +++ b/homeassistant/components/silla_prism/config_flow.py @@ -3,9 +3,9 @@ import asyncio from typing import Any, override +import probatio from pysillaprism import parse_hello, parse_message from pysillaprism.exceptions import PrismParseError -import voluptuous as vol from homeassistant.components.mqtt import ( ReceiveMessage, @@ -44,7 +44,7 @@ async def async_step_user( base_topic = user_input[CONF_BASE_TOPIC].strip().strip("/") try: valid_publish_topic(base_topic) - except vol.Invalid: + except probatio.Invalid: errors[CONF_BASE_TOPIC] = "invalid_base_topic" else: await self.async_set_unique_id(base_topic) @@ -63,9 +63,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_BASE_TOPIC, default=DEFAULT_BASE_TOPIC): str, + probatio.Required(CONF_BASE_TOPIC, default=DEFAULT_BASE_TOPIC): str, } ), errors=errors, diff --git a/homeassistant/components/simplefin/config_flow.py b/homeassistant/components/simplefin/config_flow.py index c1caddeebee9a..47e7735eddaea 100644 --- a/homeassistant/components/simplefin/config_flow.py +++ b/homeassistant/components/simplefin/config_flow.py @@ -2,6 +2,7 @@ from typing import Any, override +import probatio from simplefin4py import SimpleFin from simplefin4py.exceptions import ( SimpleFinAuthError, @@ -10,7 +11,6 @@ SimpleFinInvalidClaimTokenError, SimpleFinPaymentRequiredError, ) -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -67,9 +67,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_ACCESS_URL): str, + probatio.Required(CONF_ACCESS_URL): str, } ), errors=errors, diff --git a/homeassistant/components/simplepush/config_flow.py b/homeassistant/components/simplepush/config_flow.py index 08ac0f9f98a0e..c5f46b0783ac2 100644 --- a/homeassistant/components/simplepush/config_flow.py +++ b/homeassistant/components/simplepush/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from simplepush import UnknownError, send -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_NAME, CONF_PASSWORD @@ -65,14 +65,14 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_DEVICE_KEY): str, + probatio.Required(CONF_DEVICE_KEY): str, # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Required(CONF_NAME, default=DEFAULT_NAME): str, - vol.Inclusive(CONF_PASSWORD, ATTR_ENCRYPTED): str, - vol.Inclusive(CONF_SALT, ATTR_ENCRYPTED): str, + probatio.Required(CONF_NAME, default=DEFAULT_NAME): str, + probatio.Inclusive(CONF_PASSWORD, ATTR_ENCRYPTED): str, + probatio.Inclusive(CONF_SALT, ATTR_ENCRYPTED): str, } ), errors=errors, diff --git a/homeassistant/components/simplisafe/config_flow.py b/homeassistant/components/simplisafe/config_flow.py index ff3c5d0d734f2..770fefe3f0eb0 100644 --- a/homeassistant/components/simplisafe/config_flow.py +++ b/homeassistant/components/simplisafe/config_flow.py @@ -3,6 +3,7 @@ from collections.abc import Mapping from typing import Any, NamedTuple, override +import probatio from simplipy import API from simplipy.errors import InvalidCredentialsError, SimplipyError from simplipy.util.auth import ( @@ -10,7 +11,6 @@ get_auth0_code_verifier, get_auth_url, ) -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, OptionsFlow from homeassistant.const import CONF_CODE, CONF_TOKEN, CONF_URL, CONF_USERNAME @@ -26,9 +26,9 @@ "https://home-assistant.io/integrations/simplisafe#getting-an-authorization-code" ) -STEP_USER_SCHEMA = vol.Schema( +STEP_USER_SCHEMA = probatio.Schema( { - vol.Required(CONF_AUTH_CODE): cv.string, + probatio.Required(CONF_AUTH_CODE): cv.string, } ) @@ -171,9 +171,9 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_CODE, description={ "suggested_value": self.config_entry.options.get(CONF_CODE) diff --git a/homeassistant/components/simplisafe/services.py b/homeassistant/components/simplisafe/services.py index ef898794674a6..185e1e8420876 100644 --- a/homeassistant/components/simplisafe/services.py +++ b/homeassistant/components/simplisafe/services.py @@ -3,6 +3,7 @@ from collections.abc import Callable, Coroutine from typing import TYPE_CHECKING, Any +import probatio from simplipy.errors import SimplipyError from simplipy.system.v3 import ( MAX_ALARM_DURATION, @@ -16,7 +17,6 @@ SystemV3, Volume, ) -import voluptuous as vol from homeassistant.const import ATTR_DEVICE_ID from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -60,54 +60,58 @@ SERVICE_NAME_SET_PIN = "set_pin" SERVICE_NAME_SET_SYSTEM_PROPERTIES = "set_system_properties" -SERVICE_REMOVE_PIN_SCHEMA = vol.Schema( +SERVICE_REMOVE_PIN_SCHEMA = probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): cv.string, - vol.Required(ATTR_PIN_LABEL_OR_VALUE): cv.string, + probatio.Required(ATTR_DEVICE_ID): cv.string, + probatio.Required(ATTR_PIN_LABEL_OR_VALUE): cv.string, } ) -SERVICE_SET_PIN_SCHEMA = vol.Schema( +SERVICE_SET_PIN_SCHEMA = probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): cv.string, - vol.Required(ATTR_PIN_LABEL): cv.string, - vol.Required(ATTR_PIN_VALUE): cv.string, + probatio.Required(ATTR_DEVICE_ID): cv.string, + probatio.Required(ATTR_PIN_LABEL): cv.string, + probatio.Required(ATTR_PIN_VALUE): cv.string, }, ) -SERVICE_SET_SYSTEM_PROPERTIES_SCHEMA = vol.Schema( +SERVICE_SET_SYSTEM_PROPERTIES_SCHEMA = probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): cv.string, - vol.Optional(ATTR_ALARM_DURATION): vol.All( + probatio.Required(ATTR_DEVICE_ID): cv.string, + probatio.Optional(ATTR_ALARM_DURATION): probatio.All( cv.time_period, lambda value: value.total_seconds(), - vol.Range(min=MIN_ALARM_DURATION, max=MAX_ALARM_DURATION), + probatio.Range(min=MIN_ALARM_DURATION, max=MAX_ALARM_DURATION), ), - vol.Optional(ATTR_ALARM_VOLUME): vol.All(vol.In(VOLUME_MAP), VOLUME_MAP.get), - vol.Optional(ATTR_CHIME_VOLUME): vol.All(vol.In(VOLUME_MAP), VOLUME_MAP.get), - vol.Optional(ATTR_ENTRY_DELAY_AWAY): vol.All( + probatio.Optional(ATTR_ALARM_VOLUME): probatio.All( + probatio.In(VOLUME_MAP), VOLUME_MAP.get + ), + probatio.Optional(ATTR_CHIME_VOLUME): probatio.All( + probatio.In(VOLUME_MAP), VOLUME_MAP.get + ), + probatio.Optional(ATTR_ENTRY_DELAY_AWAY): probatio.All( cv.time_period, lambda value: value.total_seconds(), - vol.Range(min=MIN_ENTRY_DELAY_AWAY, max=MAX_ENTRY_DELAY_AWAY), + probatio.Range(min=MIN_ENTRY_DELAY_AWAY, max=MAX_ENTRY_DELAY_AWAY), ), - vol.Optional(ATTR_ENTRY_DELAY_HOME): vol.All( + probatio.Optional(ATTR_ENTRY_DELAY_HOME): probatio.All( cv.time_period, lambda value: value.total_seconds(), - vol.Range(max=MAX_ENTRY_DELAY_HOME), + probatio.Range(max=MAX_ENTRY_DELAY_HOME), ), - vol.Optional(ATTR_EXIT_DELAY_AWAY): vol.All( + probatio.Optional(ATTR_EXIT_DELAY_AWAY): probatio.All( cv.time_period, lambda value: value.total_seconds(), - vol.Range(min=MIN_EXIT_DELAY_AWAY, max=MAX_EXIT_DELAY_AWAY), + probatio.Range(min=MIN_EXIT_DELAY_AWAY, max=MAX_EXIT_DELAY_AWAY), ), - vol.Optional(ATTR_EXIT_DELAY_HOME): vol.All( + probatio.Optional(ATTR_EXIT_DELAY_HOME): probatio.All( cv.time_period, lambda value: value.total_seconds(), - vol.Range(max=MAX_EXIT_DELAY_HOME), + probatio.Range(max=MAX_EXIT_DELAY_HOME), ), - vol.Optional(ATTR_LIGHT): cv.boolean, - vol.Optional(ATTR_VOICE_PROMPT_VOLUME): vol.All( - vol.In(VOLUME_MAP), VOLUME_MAP.get + probatio.Optional(ATTR_LIGHT): cv.boolean, + probatio.Optional(ATTR_VOICE_PROMPT_VOLUME): probatio.All( + probatio.In(VOLUME_MAP), VOLUME_MAP.get ), } ) diff --git a/homeassistant/components/sinch/notify.py b/homeassistant/components/sinch/notify.py index 30ef81ac31c85..eee2da646cf7b 100644 --- a/homeassistant/components/sinch/notify.py +++ b/homeassistant/components/sinch/notify.py @@ -11,7 +11,7 @@ UnauthorizedException, UnexpectedResponseException, ) -import voluptuous as vol +import probatio from homeassistant.components.notify import ( ATTR_DATA, @@ -38,10 +38,10 @@ PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_API_KEY): cv.string, - vol.Required(CONF_SERVICE_PLAN_ID): cv.string, - vol.Optional(CONF_SENDER, default=DEFAULT_SENDER): cv.string, - vol.Optional(CONF_DEFAULT_RECIPIENTS, default=[]): vol.All( + probatio.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_SERVICE_PLAN_ID): cv.string, + probatio.Optional(CONF_SENDER, default=DEFAULT_SENDER): cv.string, + probatio.Optional(CONF_DEFAULT_RECIPIENTS, default=[]): probatio.All( cv.ensure_list, [cv.string] ), } diff --git a/homeassistant/components/siren/__init__.py b/homeassistant/components/siren/__init__.py index 90d105a38864d..9f7be075e243d 100644 --- a/homeassistant/components/siren/__init__.py +++ b/homeassistant/components/siren/__init__.py @@ -4,8 +4,8 @@ import logging from typing import Any, TypedDict, cast, final, override +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.config_entries import ConfigEntry from homeassistant.const import SERVICE_TOGGLE, SERVICE_TURN_OFF, SERVICE_TURN_ON @@ -34,9 +34,9 @@ SCAN_INTERVAL = timedelta(seconds=60) TURN_ON_SCHEMA: VolDictType = { - vol.Optional(ATTR_TONE): vol.Any(vol.Coerce(int), cv.string), - vol.Optional(ATTR_DURATION): cv.positive_int, - vol.Optional(ATTR_VOLUME_LEVEL): cv.small_float, + probatio.Optional(ATTR_TONE): probatio.Any(probatio.Coerce(int), cv.string), + probatio.Optional(ATTR_DURATION): cv.positive_int, + probatio.Optional(ATTR_VOLUME_LEVEL): cv.small_float, } diff --git a/homeassistant/components/sisyphus/__init__.py b/homeassistant/components/sisyphus/__init__.py index 1406826e47100..2f36e8f81a20a 100644 --- a/homeassistant/components/sisyphus/__init__.py +++ b/homeassistant/components/sisyphus/__init__.py @@ -3,8 +3,8 @@ import asyncio import logging +import probatio from sisyphus_control import Table -import voluptuous as vol from homeassistant.const import CONF_HOST, CONF_NAME, EVENT_HOMEASSISTANT_STOP, Platform from homeassistant.core import HomeAssistant @@ -18,16 +18,16 @@ DATA_SISYPHUS = "sisyphus" DOMAIN = "sisyphus" -AUTODETECT_SCHEMA = vol.Schema({}) +AUTODETECT_SCHEMA = probatio.Schema({}) -TABLE_SCHEMA = vol.Schema( - {vol.Required(CONF_NAME): cv.string, vol.Required(CONF_HOST): cv.string} +TABLE_SCHEMA = probatio.Schema( + {probatio.Required(CONF_NAME): cv.string, probatio.Required(CONF_HOST): cv.string} ) -TABLES_SCHEMA = vol.Schema([TABLE_SCHEMA]) +TABLES_SCHEMA = probatio.Schema([TABLE_SCHEMA]) -CONFIG_SCHEMA = vol.Schema( - {DOMAIN: vol.Any(AUTODETECT_SCHEMA, TABLES_SCHEMA)}, extra=vol.ALLOW_EXTRA +CONFIG_SCHEMA = probatio.Schema( + {DOMAIN: probatio.Any(AUTODETECT_SCHEMA, TABLES_SCHEMA)}, extra=probatio.ALLOW_EXTRA ) # Silence these loggers by default. Their INFO level is super chatty and we diff --git a/homeassistant/components/sky_hub/device_tracker.py b/homeassistant/components/sky_hub/device_tracker.py index 84dabf9c155d2..136987c9e2057 100644 --- a/homeassistant/components/sky_hub/device_tracker.py +++ b/homeassistant/components/sky_hub/device_tracker.py @@ -3,8 +3,8 @@ import logging from typing import override +import probatio from pyskyqhub.skyq_hub import SkyQHub -import voluptuous as vol from homeassistant.components.device_tracker import ( DOMAIN as DEVICE_TRACKER_DOMAIN, @@ -20,7 +20,7 @@ _LOGGER = logging.getLogger(__name__) PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( - {vol.Optional(CONF_HOST): cv.string} + {probatio.Optional(CONF_HOST): cv.string} ) diff --git a/homeassistant/components/sky_remote/config_flow.py b/homeassistant/components/sky_remote/config_flow.py index b6c3a1b82fb7b..dcd7cd5294a0f 100644 --- a/homeassistant/components/sky_remote/config_flow.py +++ b/homeassistant/components/sky_remote/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from skyboxremote import RemoteControl, SkyBoxConnectionError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PORT @@ -14,9 +14,9 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): cv.string, + probatio.Required(CONF_HOST): cv.string, } ) diff --git a/homeassistant/components/skybeacon/sensor.py b/homeassistant/components/skybeacon/sensor.py index 0cc65ac2c22d5..91b132795a9c4 100644 --- a/homeassistant/components/skybeacon/sensor.py +++ b/homeassistant/components/skybeacon/sensor.py @@ -5,10 +5,10 @@ from typing import override from uuid import UUID +import probatio from pygatt import BLEAddressType from pygatt.backends import Characteristic, GATTToolBackend from pygatt.exceptions import BLEError, NotConnectedError, NotificationTimeout -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -45,8 +45,8 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_MAC): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_MAC): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/skybell/config_flow.py b/homeassistant/components/skybell/config_flow.py index 77b6503229869..0f25674bfa001 100644 --- a/homeassistant/components/skybell/config_flow.py +++ b/homeassistant/components/skybell/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from aioskybell import Skybell, exceptions -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_EMAIL, CONF_PASSWORD @@ -44,7 +44,7 @@ async def async_step_reauth_confirm( errors["base"] = error return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema({vol.Required(CONF_PASSWORD): str}), + data_schema=probatio.Schema({probatio.Required(CONF_PASSWORD): str}), description_placeholders={CONF_EMAIL: self.reauth_email}, errors=errors, ) @@ -74,10 +74,12 @@ async def async_step_user( user_input = user_input or {} return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_EMAIL, default=user_input.get(CONF_EMAIL)): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required( + CONF_EMAIL, default=user_input.get(CONF_EMAIL) + ): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, diff --git a/homeassistant/components/slack/config_flow.py b/homeassistant/components/slack/config_flow.py index f2a446e7b85ca..1add1d1c3950e 100644 --- a/homeassistant/components/slack/config_flow.py +++ b/homeassistant/components/slack/config_flow.py @@ -3,9 +3,9 @@ import logging from typing import override +import probatio from slack_sdk.errors import SlackApiError from slack_sdk.web.async_client import AsyncSlackResponse, AsyncWebClient -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY, CONF_ICON, CONF_NAME, CONF_USERNAME @@ -15,12 +15,12 @@ _LOGGER = logging.getLogger(__name__) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_KEY): str, - vol.Required(CONF_DEFAULT_CHANNEL): str, - vol.Optional(CONF_ICON): str, - vol.Optional(CONF_USERNAME): str, + probatio.Required(CONF_API_KEY): str, + probatio.Required(CONF_DEFAULT_CHANNEL): str, + probatio.Optional(CONF_ICON): str, + probatio.Optional(CONF_USERNAME): str, } ) diff --git a/homeassistant/components/slack/notify.py b/homeassistant/components/slack/notify.py index f44e0b3a0c86d..5c31f671a8193 100644 --- a/homeassistant/components/slack/notify.py +++ b/homeassistant/components/slack/notify.py @@ -8,9 +8,9 @@ from aiohttp import BasicAuth from aiohttp.client_exceptions import ClientError +import probatio from slack_sdk.errors import SlackApiError from slack_sdk.web.async_client import AsyncWebClient -import voluptuous as vol from homeassistant.components.notify import ( ATTR_DATA, @@ -42,35 +42,35 @@ _LOGGER = logging.getLogger(__name__) -FILE_PATH_SCHEMA = vol.Schema({vol.Required(CONF_PATH): cv.isfile}) +FILE_PATH_SCHEMA = probatio.Schema({probatio.Required(CONF_PATH): cv.isfile}) -FILE_URL_SCHEMA = vol.Schema( +FILE_URL_SCHEMA = probatio.Schema( { - vol.Required(ATTR_URL): cv.url, - vol.Inclusive(ATTR_USERNAME, "credentials"): cv.string, - vol.Inclusive(ATTR_PASSWORD, "credentials"): cv.string, + probatio.Required(ATTR_URL): cv.url, + probatio.Inclusive(ATTR_USERNAME, "credentials"): cv.string, + probatio.Inclusive(ATTR_PASSWORD, "credentials"): cv.string, } ) -DATA_FILE_SCHEMA = vol.Schema( +DATA_FILE_SCHEMA = probatio.Schema( { - vol.Required(ATTR_FILE): vol.Any(FILE_PATH_SCHEMA, FILE_URL_SCHEMA), - vol.Optional(ATTR_THREAD_TS): cv.string, + probatio.Required(ATTR_FILE): probatio.Any(FILE_PATH_SCHEMA, FILE_URL_SCHEMA), + probatio.Optional(ATTR_THREAD_TS): cv.string, } ) -DATA_TEXT_ONLY_SCHEMA = vol.Schema( +DATA_TEXT_ONLY_SCHEMA = probatio.Schema( { - vol.Optional(ATTR_USERNAME): cv.string, - vol.Optional(ATTR_ICON): cv.string, - vol.Optional(ATTR_BLOCKS): list, - vol.Optional(ATTR_BLOCKS_TEMPLATE): list, - vol.Optional(ATTR_THREAD_TS): cv.string, + probatio.Optional(ATTR_USERNAME): cv.string, + probatio.Optional(ATTR_ICON): cv.string, + probatio.Optional(ATTR_BLOCKS): list, + probatio.Optional(ATTR_BLOCKS_TEMPLATE): list, + probatio.Optional(ATTR_THREAD_TS): cv.string, } ) -DATA_SCHEMA = vol.All( - cv.ensure_list, [vol.Any(DATA_FILE_SCHEMA, DATA_TEXT_ONLY_SCHEMA)] +DATA_SCHEMA = probatio.All( + cv.ensure_list, [probatio.Any(DATA_FILE_SCHEMA, DATA_TEXT_ONLY_SCHEMA)] ) @@ -280,7 +280,7 @@ async def async_send_message(self, message: str, **kwargs: Any) -> None: try: DATA_SCHEMA(data) - except vol.Invalid as err: + except probatio.Invalid as err: raise ServiceValidationError( translation_domain=DOMAIN, translation_key="invalid_message_data", diff --git a/homeassistant/components/sleep_as_android/__init__.py b/homeassistant/components/sleep_as_android/__init__.py index 7e57b3f589911..4a9a4eaa7bee3 100644 --- a/homeassistant/components/sleep_as_android/__init__.py +++ b/homeassistant/components/sleep_as_android/__init__.py @@ -3,7 +3,7 @@ from http import HTTPStatus from aiohttp.web import Request, Response -import voluptuous as vol +import probatio from homeassistant.components import webhook from homeassistant.config_entries import ConfigEntry @@ -17,12 +17,12 @@ type SleepAsAndroidConfigEntry = ConfigEntry -WEBHOOK_SCHEMA = vol.Schema( +WEBHOOK_SCHEMA = probatio.Schema( { - vol.Required(ATTR_EVENT): str, - vol.Optional(ATTR_VALUE1): str, - vol.Optional(ATTR_VALUE2): str, - vol.Optional(ATTR_VALUE3): str, + probatio.Required(ATTR_EVENT): str, + probatio.Optional(ATTR_VALUE1): str, + probatio.Optional(ATTR_VALUE2): str, + probatio.Optional(ATTR_VALUE3): str, } ) @@ -34,7 +34,7 @@ async def handle_webhook( try: data = WEBHOOK_SCHEMA(await request.json()) - except vol.MultipleInvalid as error: + except probatio.MultipleInvalid as error: return Response( text=error.error_message, status=HTTPStatus.UNPROCESSABLE_ENTITY ) diff --git a/homeassistant/components/sleepiq/__init__.py b/homeassistant/components/sleepiq/__init__.py index 1e7c5f38eeee2..ef648cd624b6a 100644 --- a/homeassistant/components/sleepiq/__init__.py +++ b/homeassistant/components/sleepiq/__init__.py @@ -10,7 +10,7 @@ SleepIQLoginException, SleepIQTimeoutException, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry from homeassistant.const import CONF_PASSWORD, CONF_USERNAME, PRESSURE, Platform @@ -41,14 +41,14 @@ Platform.SWITCH, ] -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { DOMAIN: { - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, } }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/sleepiq/config_flow.py b/homeassistant/components/sleepiq/config_flow.py index 75d89d71ababc..4e8213a370cf2 100644 --- a/homeassistant/components/sleepiq/config_flow.py +++ b/homeassistant/components/sleepiq/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from asyncsleepiq import AsyncSleepIQ, SleepIQLoginException, SleepIQTimeoutException -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -62,13 +62,13 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_USERNAME, default=user_input.get(CONF_USERNAME), ): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, @@ -100,7 +100,7 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema({vol.Required(CONF_PASSWORD): str}), + data_schema=probatio.Schema({probatio.Required(CONF_PASSWORD): str}), errors=errors, description_placeholders={ CONF_USERNAME: reauth_entry.data[CONF_USERNAME], diff --git a/homeassistant/components/slide/__init__.py b/homeassistant/components/slide/__init__.py index 868a0e82f8994..b35e5f10b1a59 100644 --- a/homeassistant/components/slide/__init__.py +++ b/homeassistant/components/slide/__init__.py @@ -4,7 +4,7 @@ import logging from goslideapi import GoSlideCloud, goslideapi -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_PASSWORD, @@ -35,20 +35,20 @@ DEFAULT_SCAN_INTERVAL = timedelta(seconds=30) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional( + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Optional( CONF_SCAN_INTERVAL, default=DEFAULT_SCAN_INTERVAL ): cv.time_period, - vol.Optional(CONF_INVERT_POSITION, default=False): cv.boolean, + probatio.Optional(CONF_INVERT_POSITION, default=False): cv.boolean, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/slide_local/config_flow.py b/homeassistant/components/slide_local/config_flow.py index 4637ad4b0e86b..9f6cd03965a82 100644 --- a/homeassistant/components/slide_local/config_flow.py +++ b/homeassistant/components/slide_local/config_flow.py @@ -10,7 +10,7 @@ DigestAuthCalcError, GoSlideLocal as SlideLocalApi, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigFlow, @@ -128,10 +128,10 @@ async def async_step_user( return self.async_show_form( step_id="user", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Optional(CONF_PASSWORD): str, + probatio.Required(CONF_HOST): str, + probatio.Optional(CONF_PASSWORD): str, } ), {CONF_HOST: self._host}, @@ -165,9 +165,9 @@ async def async_step_reconfigure( return self.async_show_form( step_id="reconfigure", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_HOST): str, + probatio.Required(CONF_HOST): str, } ), { @@ -250,9 +250,9 @@ async def async_step_init( return self.async_show_form( step_id="init", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_INVERT_POSITION): bool, + probatio.Required(CONF_INVERT_POSITION): bool, } ), {CONF_INVERT_POSITION: self.config_entry.options[CONF_INVERT_POSITION]}, diff --git a/homeassistant/components/sma/config_flow.py b/homeassistant/components/sma/config_flow.py index 0f027e1f902bf..68b9539ff96ce 100644 --- a/homeassistant/components/sma/config_flow.py +++ b/homeassistant/components/sma/config_flow.py @@ -5,13 +5,13 @@ import logging from typing import Any, override +import probatio from pysma import ( SmaAuthenticationException, SmaConnectionException, SmaReadException, SMAWebConnect, ) -import voluptuous as vol from yarl import URL from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -39,15 +39,15 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): TextSelector( + probatio.Required(CONF_HOST): TextSelector( TextSelectorConfig(type=TextSelectorType.URL) ), - vol.Optional(CONF_SSL, default=False): cv.boolean, - vol.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, - vol.Optional(CONF_GROUP, default=GROUPS[0]): vol.In(GROUPS), - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Optional(CONF_SSL, default=False): cv.boolean, + probatio.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, + probatio.Optional(CONF_GROUP, default=GROUPS[0]): probatio.In(GROUPS), + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", @@ -57,12 +57,12 @@ ) -STEP_DISCOVERY_CONFIRM_DATA_SCHEMA = vol.Schema( +STEP_DISCOVERY_CONFIRM_DATA_SCHEMA = probatio.Schema( { - vol.Optional(CONF_SSL, default=False): cv.boolean, - vol.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, - vol.Optional(CONF_GROUP, default=GROUPS[0]): vol.In(GROUPS), - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Optional(CONF_SSL, default=False): cv.boolean, + probatio.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, + probatio.Optional(CONF_GROUP, default=GROUPS[0]): probatio.In(GROUPS), + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", @@ -108,11 +108,11 @@ class SmaConfigFlow(ConfigFlow, domain=DOMAIN): def __init__(self) -> None: """Initialize.""" self._data: dict[str, Any] = { - CONF_HOST: vol.UNDEFINED, + CONF_HOST: probatio.UNDEFINED, CONF_SSL: False, CONF_VERIFY_SSL: True, CONF_GROUP: GROUPS[0], - CONF_PASSWORD: vol.UNDEFINED, + CONF_PASSWORD: probatio.UNDEFINED, } self._discovery_data: dict[str, Any] = {} @@ -243,9 +243,9 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", diff --git a/homeassistant/components/smappee/__init__.py b/homeassistant/components/smappee/__init__.py index 3887a0babfd59..df58754d5e647 100644 --- a/homeassistant/components/smappee/__init__.py +++ b/homeassistant/components/smappee/__init__.py @@ -1,8 +1,8 @@ """The Smappee integration.""" # pylint: disable=home-assistant-use-runtime-data # Uses legacy hass.data[DOMAIN] pattern +import probatio from pysmappee import Smappee, helper, mqtt -import voluptuous as vol from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( @@ -28,16 +28,16 @@ type SmappeeConfigEntry = ConfigEntry[SmappeeBase] -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_CLIENT_ID): cv.string, - vol.Required(CONF_CLIENT_SECRET): cv.string, + probatio.Required(CONF_CLIENT_ID): cv.string, + probatio.Required(CONF_CLIENT_SECRET): cv.string, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/smappee/config_flow.py b/homeassistant/components/smappee/config_flow.py index 67926368bea01..4f74867e79874 100644 --- a/homeassistant/components/smappee/config_flow.py +++ b/homeassistant/components/smappee/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from pysmappee import helper, mqtt -import voluptuous as vol from homeassistant.config_entries import ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_IP_ADDRESS @@ -129,11 +129,11 @@ async def async_step_environment( if user_input is None: return self.async_show_form( step_id="environment", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required("environment", default=ENV_CLOUD): vol.In( - [ENV_CLOUD, ENV_LOCAL] - ) + probatio.Required( + "environment", default=ENV_CLOUD + ): probatio.In([ENV_CLOUD, ENV_LOCAL]) } ), errors={}, @@ -158,7 +158,7 @@ async def async_step_local( if user_input is None: return self.async_show_form( step_id="local", - data_schema=vol.Schema({vol.Required(CONF_HOST): str}), + data_schema=probatio.Schema({probatio.Required(CONF_HOST): str}), errors={}, ) # In a LOCAL setup we still need to resolve the host to serial number diff --git a/homeassistant/components/smarla/config_flow.py b/homeassistant/components/smarla/config_flow.py index 35dab938da61c..e3dba3d64d5dc 100644 --- a/homeassistant/components/smarla/config_flow.py +++ b/homeassistant/components/smarla/config_flow.py @@ -3,19 +3,19 @@ from collections.abc import Mapping from typing import Any, override +import probatio from pysmarlaapi import Connection from pysmarlaapi.connection.exceptions import ( AuthenticationException, ConnectionException, ) -import voluptuous as vol from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_ACCESS_TOKEN from .const import DOMAIN, HOST -STEP_USER_DATA_SCHEMA = vol.Schema({vol.Required(CONF_ACCESS_TOKEN): str}) +STEP_USER_DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_ACCESS_TOKEN): str}) class SmarlaConfigFlow(ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/components/smart_meter_texas/config_flow.py b/homeassistant/components/smart_meter_texas/config_flow.py index f03158d260c72..8c47c52c8e40c 100644 --- a/homeassistant/components/smart_meter_texas/config_flow.py +++ b/homeassistant/components/smart_meter_texas/config_flow.py @@ -4,12 +4,12 @@ from typing import Any, override from aiohttp import ClientError +import probatio from smart_meter_texas import Account, Client from smart_meter_texas.exceptions import ( SmartMeterTexasAPIError, SmartMeterTexasAuthError, ) -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -22,8 +22,8 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( - {vol.Required(CONF_USERNAME): str, vol.Required(CONF_PASSWORD): str} +DATA_SCHEMA = probatio.Schema( + {probatio.Required(CONF_USERNAME): str, probatio.Required(CONF_PASSWORD): str} ) diff --git a/homeassistant/components/smarttub/binary_sensor.py b/homeassistant/components/smarttub/binary_sensor.py index ff99fc66ff491..3ec93fc049fa6 100644 --- a/homeassistant/components/smarttub/binary_sensor.py +++ b/homeassistant/components/smarttub/binary_sensor.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from smarttub import Spa, SpaError, SpaReminder -import voluptuous as vol from homeassistant.components.binary_sensor import ( BinarySensorDeviceClass, @@ -37,13 +37,13 @@ # how many days to snooze the reminder for ATTR_REMINDER_DAYS = "days" RESET_REMINDER_SCHEMA: VolDictType = { - vol.Required(ATTR_REMINDER_DAYS): vol.All( - vol.Coerce(int), vol.Range(min=30, max=365) + probatio.Required(ATTR_REMINDER_DAYS): probatio.All( + probatio.Coerce(int), probatio.Range(min=30, max=365) ) } SNOOZE_REMINDER_SCHEMA: VolDictType = { - vol.Required(ATTR_REMINDER_DAYS): vol.All( - vol.Coerce(int), vol.Range(min=10, max=120) + probatio.Required(ATTR_REMINDER_DAYS): probatio.All( + probatio.Coerce(int), probatio.Range(min=10, max=120) ) } diff --git a/homeassistant/components/smarttub/config_flow.py b/homeassistant/components/smarttub/config_flow.py index 9cdd4cd9cbf70..c159a3aa19877 100644 --- a/homeassistant/components/smarttub/config_flow.py +++ b/homeassistant/components/smarttub/config_flow.py @@ -3,8 +3,8 @@ from collections.abc import Mapping from typing import Any, override +import probatio from smarttub import LoginFailed -import voluptuous as vol from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_EMAIL, CONF_PASSWORD @@ -12,8 +12,8 @@ from .const import DOMAIN from .controller import SmartTubController -DATA_SCHEMA = vol.Schema( - {vol.Required(CONF_EMAIL): str, vol.Required(CONF_PASSWORD): str} +DATA_SCHEMA = probatio.Schema( + {probatio.Required(CONF_EMAIL): str, probatio.Required(CONF_PASSWORD): str} ) @@ -69,13 +69,13 @@ async def async_step_reauth_confirm( """Dialog that informs the user that reauth is required.""" if user_input is None: # same as DATA_SCHEMA but with default email - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required( + probatio.Required( CONF_EMAIL, default=self._get_reauth_entry().data.get(CONF_EMAIL), ): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ) return self.async_show_form( diff --git a/homeassistant/components/smarttub/sensor.py b/homeassistant/components/smarttub/sensor.py index 89f467686fe36..86013a7aa1391 100644 --- a/homeassistant/components/smarttub/sensor.py +++ b/homeassistant/components/smarttub/sensor.py @@ -3,8 +3,8 @@ from enum import Enum from typing import Any, override +import probatio import smarttub -import voluptuous as vol from homeassistant.components.sensor import SensorEntity from homeassistant.const import ATTR_MODE @@ -23,12 +23,16 @@ # the hour of the day at which to start the cycle (0-23) ATTR_START_HOUR = "start_hour" -SET_PRIMARY_FILTRATION_SCHEMA = vol.All( +SET_PRIMARY_FILTRATION_SCHEMA = probatio.All( cv.has_at_least_one_key(ATTR_DURATION, ATTR_START_HOUR), cv.make_entity_service_schema( { - vol.Optional(ATTR_DURATION): vol.All(int, vol.Range(min=1, max=24)), - vol.Optional(ATTR_START_HOUR): vol.All(int, vol.Range(min=0, max=23)), + probatio.Optional(ATTR_DURATION): probatio.All( + int, probatio.Range(min=1, max=24) + ), + probatio.Optional(ATTR_START_HOUR): probatio.All( + int, probatio.Range(min=0, max=23) + ), }, ), ) @@ -36,7 +40,7 @@ PARALLEL_UPDATES = 0 SET_SECONDARY_FILTRATION_SCHEMA: VolDictType = { - vol.Required(ATTR_MODE): vol.In( + probatio.Required(ATTR_MODE): probatio.In( { mode.name.lower() for mode in smarttub.SpaSecondaryFiltrationCycle.SecondaryFiltrationMode diff --git a/homeassistant/components/smarty/config_flow.py b/homeassistant/components/smarty/config_flow.py index 7d23d0b3020fb..7b1ec1e5b38a5 100644 --- a/homeassistant/components/smarty/config_flow.py +++ b/homeassistant/components/smarty/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from pysmarty2 import Smarty -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST @@ -48,6 +48,6 @@ async def async_step_user( errors["base"] = error return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_HOST): str}), + data_schema=probatio.Schema({probatio.Required(CONF_HOST): str}), errors=errors, ) diff --git a/homeassistant/components/smhi/config_flow.py b/homeassistant/components/smhi/config_flow.py index ff47320ce3817..3adf91bb773ad 100644 --- a/homeassistant/components/smhi/config_flow.py +++ b/homeassistant/components/smhi/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from pysmhi import SmhiForecastException, SMHIPointForecast -import voluptuous as vol from homeassistant.components.weather import DOMAIN as WEATHER_DOMAIN from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -69,8 +69,12 @@ async def async_step_user( } return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_LOCATION, default=home_location): LocationSelector()} + data_schema=probatio.Schema( + { + probatio.Required( + CONF_LOCATION, default=home_location + ): LocationSelector() + } ), errors=errors, ) @@ -117,7 +121,7 @@ async def async_step_reconfigure( errors["base"] = "wrong_location" schema = self.add_suggested_values_to_schema( - vol.Schema({vol.Required(CONF_LOCATION): LocationSelector()}), + probatio.Schema({probatio.Required(CONF_LOCATION): LocationSelector()}), reconfigure_entry.data, ) return self.async_show_form( diff --git a/homeassistant/components/smlight/config_flow.py b/homeassistant/components/smlight/config_flow.py index 00cda638dbd54..43832280edbd4 100644 --- a/homeassistant/components/smlight/config_flow.py +++ b/homeassistant/components/smlight/config_flow.py @@ -3,10 +3,10 @@ from collections.abc import Mapping from typing import Any, override +import probatio from pysmlight import Api2 from pysmlight.const import Devices from pysmlight.exceptions import SmlightAuthError, SmlightConnectionError -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_RECONFIGURE, @@ -31,16 +31,16 @@ from .const import CONF_BLE_SCANNER_MODE, DOMAIN, BLEScannerMode from .coordinator import SmConfigEntry -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, + probatio.Required(CONF_HOST): str, } ) -STEP_AUTH_DATA_SCHEMA = vol.Schema( +STEP_AUTH_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) @@ -51,9 +51,9 @@ BLEScannerMode.PASSIVE, ] -BLE_SCANNER_SCHEMA = vol.Schema( +BLE_SCANNER_SCHEMA = probatio.Schema( { - vol.Required(CONF_BLE_SCANNER_MODE): SelectSelector( + probatio.Required(CONF_BLE_SCANNER_MODE): SelectSelector( SelectSelectorConfig( options=BLE_SCANNER_OPTIONS, translation_key=CONF_BLE_SCANNER_MODE, @@ -383,6 +383,6 @@ async def async_step_no_settings( coordinator = self.config_entry.runtime_data.data return self.async_show_form( step_id="no_settings", - data_schema=vol.Schema({}), + data_schema=probatio.Schema({}), description_placeholders={"model": coordinator.data.info.model}, ) diff --git a/homeassistant/components/smlight/services.py b/homeassistant/components/smlight/services.py index 9c7fe0cb6d958..9785caa86dec6 100644 --- a/homeassistant/components/smlight/services.py +++ b/homeassistant/components/smlight/services.py @@ -1,8 +1,8 @@ """SMLIGHT services.""" +import probatio from pysmlight.exceptions import SmlightError from pysmlight.models import BuzzerPayload -import voluptuous as vol from homeassistant.const import ATTR_DEVICE_ID from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -113,17 +113,21 @@ async def async_play_rtttl(call: ServiceCall) -> None: }, ) from err - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(ATTR_DURATION): vol.All( - vol.Coerce(int), vol.In([1, 2, 4, 8, 16, 32]) + probatio.Required(ATTR_DEVICE_ID): probatio.All( + cv.ensure_list, [cv.string] ), - vol.Required(ATTR_OCTAVE): vol.All( - vol.Coerce(int), vol.Range(min=4, max=7) + probatio.Optional(ATTR_DURATION): probatio.All( + probatio.Coerce(int), probatio.In([1, 2, 4, 8, 16, 32]) ), - vol.Optional(ATTR_BPM): vol.All(vol.Coerce(int), vol.In(RTTTL_VALID_BPMS)), - vol.Required(ATTR_NOTES): cv.string, + probatio.Required(ATTR_OCTAVE): probatio.All( + probatio.Coerce(int), probatio.Range(min=4, max=7) + ), + probatio.Optional(ATTR_BPM): probatio.All( + probatio.Coerce(int), probatio.In(RTTTL_VALID_BPMS) + ), + probatio.Required(ATTR_NOTES): cv.string, } ) diff --git a/homeassistant/components/smtp/config_flow.py b/homeassistant/components/smtp/config_flow.py index 7792cada11360..18b2b8986e025 100644 --- a/homeassistant/components/smtp/config_flow.py +++ b/homeassistant/components/smtp/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from aiosmtplib import SMTP, SMTPAuthenticationError, SMTPException, SMTPTimeoutError -import voluptuous as vol +import probatio from homeassistant import data_entry_flow from homeassistant.config_entries import ( @@ -65,9 +65,9 @@ _LOGGER = logging.getLogger(__name__) -OPTIONS_SCHEMA = vol.Schema( +OPTIONS_SCHEMA = probatio.Schema( { - vol.Optional(CONF_TIMEOUT): vol.All( + probatio.Optional(CONF_TIMEOUT): probatio.All( NumberSelector( NumberSelectorConfig( min=1, @@ -77,60 +77,60 @@ mode=NumberSelectorMode.BOX, ) ), - vol.Coerce(int), + probatio.Coerce(int), ), - vol.Optional(CONF_REPLY_TO): TextSelector( + probatio.Optional(CONF_REPLY_TO): TextSelector( TextSelectorConfig( type=TextSelectorType.EMAIL, autocomplete="email", ), ), - vol.Optional(CONF_REPLY_TO_NAME): cv.string, + probatio.Optional(CONF_REPLY_TO_NAME): cv.string, } ) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_SENDER): TextSelector( + probatio.Required(CONF_SENDER): TextSelector( TextSelectorConfig( type=TextSelectorType.EMAIL, autocomplete="email", ), ), - vol.Optional(CONF_SENDER_NAME): cv.string, - vol.Required(CONF_SERVER, default=DEFAULT_HOST): cv.string, - vol.Required(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Required(CONF_ENCRYPTION, default=DEFAULT_ENCRYPTION): SelectSelector( + probatio.Optional(CONF_SENDER_NAME): cv.string, + probatio.Required(CONF_SERVER, default=DEFAULT_HOST): cv.string, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Required(CONF_ENCRYPTION, default=DEFAULT_ENCRYPTION): SelectSelector( SelectSelectorConfig( options=ENCRYPTION_OPTIONS, mode=SelectSelectorMode.DROPDOWN, translation_key="encryption", ) ), - vol.Optional(CONF_USERNAME): TextSelector( + probatio.Optional(CONF_USERNAME): TextSelector( TextSelectorConfig( type=TextSelectorType.TEXT, autocomplete="username", ), ), - vol.Optional(CONF_PASSWORD): TextSelector( + probatio.Optional(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", ), ), - vol.Required(CONF_VERIFY_SSL, default=True): cv.boolean, + probatio.Required(CONF_VERIFY_SSL, default=True): cv.boolean, } ) -STEP_REAUTH_DATA_SCHEMA = vol.Schema( +STEP_REAUTH_DATA_SCHEMA = probatio.Schema( { - vol.Optional(CONF_USERNAME): TextSelector( + probatio.Optional(CONF_USERNAME): TextSelector( TextSelectorConfig( type=TextSelectorType.TEXT, autocomplete="username", ), ), - vol.Optional(CONF_PASSWORD): TextSelector( + probatio.Optional(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", @@ -187,7 +187,7 @@ async def async_step_user( data_schema=self.add_suggested_values_to_schema( data_schema=STEP_USER_DATA_SCHEMA.extend( { - vol.Required(SECTION_OPTIONS): data_entry_flow.section( + probatio.Required(SECTION_OPTIONS): data_entry_flow.section( OPTIONS_SCHEMA, {"collapsed": True}, ), @@ -359,10 +359,10 @@ async def async_step_user( return result return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional(CONF_NAME): cv.string, - vol.Required(CONF_RECIPIENT): TextSelector( + probatio.Optional(CONF_NAME): cv.string, + probatio.Required(CONF_RECIPIENT): TextSelector( TextSelectorConfig( type=TextSelectorType.EMAIL, autocomplete="email", @@ -396,9 +396,9 @@ async def async_step_reconfigure( return self.async_show_form( step_id="reconfigure", data_schema=self.add_suggested_values_to_schema( - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_RECIPIENT): TextSelector( + probatio.Required(CONF_RECIPIENT): TextSelector( TextSelectorConfig( type=TextSelectorType.EMAIL, autocomplete="email", diff --git a/homeassistant/components/smtp/notify.py b/homeassistant/components/smtp/notify.py index 910d3c6a01723..c3d96c0f8fd16 100644 --- a/homeassistant/components/smtp/notify.py +++ b/homeassistant/components/smtp/notify.py @@ -12,7 +12,7 @@ from typing import TYPE_CHECKING, Any, override import aiosmtplib -import voluptuous as vol +import probatio from homeassistant.components.notify import ( ATTR_DATA, @@ -94,19 +94,21 @@ PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_RECIPIENT): vol.All(cv.ensure_list, [vol.Email()]), - vol.Required(CONF_SENDER): vol.Email(), - vol.Optional(CONF_SERVER, default=DEFAULT_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, - vol.Optional(CONF_ENCRYPTION, default=DEFAULT_ENCRYPTION): vol.In( + probatio.Required(CONF_RECIPIENT): probatio.All( + cv.ensure_list, [probatio.Email()] + ), + probatio.Required(CONF_SENDER): probatio.Email(), + probatio.Optional(CONF_SERVER, default=DEFAULT_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, + probatio.Optional(CONF_ENCRYPTION, default=DEFAULT_ENCRYPTION): probatio.In( ENCRYPTION_OPTIONS ), - vol.Optional(CONF_USERNAME): cv.string, - vol.Optional(CONF_PASSWORD): cv.string, - vol.Optional(CONF_SENDER_NAME): cv.string, - vol.Optional(CONF_DEBUG, default=DEFAULT_DEBUG): cv.boolean, - vol.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, + probatio.Optional(CONF_USERNAME): cv.string, + probatio.Optional(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_SENDER_NAME): cv.string, + probatio.Optional(CONF_DEBUG, default=DEFAULT_DEBUG): cv.boolean, + probatio.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, } ) diff --git a/homeassistant/components/smtp/services.py b/homeassistant/components/smtp/services.py index 5b75759765e0d..2a3776764d756 100644 --- a/homeassistant/components/smtp/services.py +++ b/homeassistant/components/smtp/services.py @@ -1,6 +1,6 @@ """Service registration for SMTP integration.""" -import voluptuous as vol +import probatio from homeassistant.components.notify import ( ATTR_MESSAGE, @@ -24,24 +24,24 @@ SERVICE_SEND_MESSAGE_SCHEMA = cv.make_entity_service_schema( { - vol.Optional(ATTR_TITLE): cv.string, - vol.Required(ATTR_MESSAGE): cv.string, - vol.Optional(ATTR_HTML): cv.string, - vol.Optional(ATTR_ATTACHMENTS): vol.All( + probatio.Optional(ATTR_TITLE): cv.string, + probatio.Required(ATTR_MESSAGE): cv.string, + probatio.Optional(ATTR_HTML): cv.string, + probatio.Optional(ATTR_ATTACHMENTS): probatio.All( cv.ensure_list, [ - vol.Schema( + probatio.Schema( { - vol.Required(ATTR_MEDIA_SOURCE): MediaSelector( + probatio.Required(ATTR_MEDIA_SOURCE): MediaSelector( {"accept": ["*"]} ), - vol.Optional(ATTR_FILENAME): cv.string, - vol.Optional(ATTR_CONTENT_ID): cv.string, + probatio.Optional(ATTR_FILENAME): cv.string, + probatio.Optional(ATTR_CONTENT_ID): cv.string, } ) ], ), - vol.Optional(ATTR_PRIORITY): vol.In( + probatio.Optional(ATTR_PRIORITY): probatio.In( ["highest", "high", "normal", "low", "lowest"] ), } diff --git a/homeassistant/components/snapcast/config_flow.py b/homeassistant/components/snapcast/config_flow.py index a1d10484a812d..cf65f2dbb4e73 100644 --- a/homeassistant/components/snapcast/config_flow.py +++ b/homeassistant/components/snapcast/config_flow.py @@ -4,9 +4,9 @@ import socket from typing import override +import probatio import snapcast.control from snapcast.control.server import CONTROL_PORT -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PORT @@ -15,10 +15,10 @@ _LOGGER = logging.getLogger(__name__) -SNAPCAST_SCHEMA = vol.Schema( +SNAPCAST_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=CONTROL_PORT): int, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=CONTROL_PORT): int, } ) diff --git a/homeassistant/components/snapcast/services.py b/homeassistant/components/snapcast/services.py index 89fc4e07d6543..3bf5ad2aad10b 100644 --- a/homeassistant/components/snapcast/services.py +++ b/homeassistant/components/snapcast/services.py @@ -1,6 +1,6 @@ """Support for interacting with Snapcast clients.""" -import voluptuous as vol +import probatio from homeassistant.components.media_player import DOMAIN as MEDIA_PLAYER_DOMAIN from homeassistant.core import HomeAssistant, callback @@ -39,6 +39,6 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, SERVICE_SET_LATENCY, entity_domain=MEDIA_PLAYER_DOMAIN, - schema={vol.Required(ATTR_LATENCY): cv.positive_int}, + schema={probatio.Required(ATTR_LATENCY): cv.positive_int}, func="async_set_latency", ) diff --git a/homeassistant/components/snmp/device_tracker.py b/homeassistant/components/snmp/device_tracker.py index f2cc623c8d0f5..a9d27d14837f6 100644 --- a/homeassistant/components/snmp/device_tracker.py +++ b/homeassistant/components/snmp/device_tracker.py @@ -4,6 +4,7 @@ import logging from typing import TYPE_CHECKING, override +import probatio from pysnmp.error import PySnmpError from pysnmp.hlapi.v3arch.asyncio import ( CommunityData, @@ -13,7 +14,6 @@ bulk_walk_cmd, is_end_of_mib, ) -import voluptuous as vol from homeassistant.components.device_tracker import ( DOMAIN as DEVICE_TRACKER_DOMAIN, @@ -44,11 +44,11 @@ PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_BASEOID): cv.string, - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_COMMUNITY, default=DEFAULT_COMMUNITY): cv.string, - vol.Inclusive(CONF_AUTH_KEY, "keys"): cv.string, - vol.Inclusive(CONF_PRIV_KEY, "keys"): cv.string, + probatio.Required(CONF_BASEOID): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_COMMUNITY, default=DEFAULT_COMMUNITY): cv.string, + probatio.Inclusive(CONF_AUTH_KEY, "keys"): cv.string, + probatio.Inclusive(CONF_PRIV_KEY, "keys"): cv.string, } ) diff --git a/homeassistant/components/snmp/sensor.py b/homeassistant/components/snmp/sensor.py index 192e56c6ffe4b..9b979ec58178b 100644 --- a/homeassistant/components/snmp/sensor.py +++ b/homeassistant/components/snmp/sensor.py @@ -5,6 +5,7 @@ from struct import unpack from typing import override +import probatio from pyasn1.codec.ber import decoder from pysnmp.error import PySnmpError import pysnmp.hlapi.v3arch.asyncio as hlapi @@ -17,7 +18,6 @@ ) from pysnmp.proto.rfc1902 import Opaque from pysnmp.proto.rfc1905 import NoSuchObject -import voluptuous as vol from homeassistant.components.sensor import ( CONF_STATE_CLASS, @@ -88,25 +88,27 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_BASEOID): cv.string, - vol.Optional(CONF_ACCEPT_ERRORS, default=False): cv.boolean, - vol.Optional(CONF_COMMUNITY, default=DEFAULT_COMMUNITY): cv.string, - vol.Optional(CONF_DEFAULT_VALUE): cv.string, - vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_VALUE_TEMPLATE): vol.All( + probatio.Required(CONF_BASEOID): cv.string, + probatio.Optional(CONF_ACCEPT_ERRORS, default=False): cv.boolean, + probatio.Optional(CONF_COMMUNITY, default=DEFAULT_COMMUNITY): cv.string, + probatio.Optional(CONF_DEFAULT_VALUE): cv.string, + probatio.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_VALUE_TEMPLATE): probatio.All( cv.template, ValueTemplate.from_template ), - vol.Optional(CONF_VERSION, default=DEFAULT_VERSION): vol.In(SNMP_VERSIONS), - vol.Optional(CONF_USERNAME): cv.string, - vol.Optional(CONF_AUTH_KEY): cv.string, - vol.Optional(CONF_AUTH_PROTOCOL, default=DEFAULT_AUTH_PROTOCOL): vol.In( - MAP_AUTH_PROTOCOLS - ), - vol.Optional(CONF_PRIV_KEY): cv.string, - vol.Optional(CONF_PRIV_PROTOCOL, default=DEFAULT_PRIV_PROTOCOL): vol.In( - MAP_PRIV_PROTOCOLS + probatio.Optional(CONF_VERSION, default=DEFAULT_VERSION): probatio.In( + SNMP_VERSIONS ), + probatio.Optional(CONF_USERNAME): cv.string, + probatio.Optional(CONF_AUTH_KEY): cv.string, + probatio.Optional( + CONF_AUTH_PROTOCOL, default=DEFAULT_AUTH_PROTOCOL + ): probatio.In(MAP_AUTH_PROTOCOLS), + probatio.Optional(CONF_PRIV_KEY): cv.string, + probatio.Optional( + CONF_PRIV_PROTOCOL, default=DEFAULT_PRIV_PROTOCOL + ): probatio.In(MAP_PRIV_PROTOCOLS), } ).extend(TEMPLATE_SENSOR_BASE_SCHEMA.schema) diff --git a/homeassistant/components/snmp/switch.py b/homeassistant/components/snmp/switch.py index 26e46053602a3..7be1ca607ebaf 100644 --- a/homeassistant/components/snmp/switch.py +++ b/homeassistant/components/snmp/switch.py @@ -3,6 +3,7 @@ import logging from typing import Any, override +import probatio import pysnmp.hlapi.v3arch.asyncio as hlapi from pysnmp.hlapi.v3arch.asyncio import ( CommunityData, @@ -27,7 +28,6 @@ TimeTicks, Unsigned32, ) -import voluptuous as vol from homeassistant.components.switch import ( PLATFORM_SCHEMA as SWITCH_PLATFORM_SCHEMA, @@ -101,27 +101,29 @@ PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_BASEOID): cv.string, - vol.Optional(CONF_COMMAND_OID): cv.string, - vol.Optional(CONF_COMMAND_PAYLOAD_ON): cv.string, - vol.Optional(CONF_COMMAND_PAYLOAD_OFF): cv.string, - vol.Optional(CONF_COMMUNITY, default=DEFAULT_COMMUNITY): cv.string, - vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_PAYLOAD_OFF, default=DEFAULT_PAYLOAD_OFF): cv.string, - vol.Optional(CONF_PAYLOAD_ON, default=DEFAULT_PAYLOAD_ON): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_VERSION, default=DEFAULT_VERSION): vol.In(SNMP_VERSIONS), - vol.Optional(CONF_USERNAME): cv.string, - vol.Optional(CONF_AUTH_KEY): cv.string, - vol.Optional(CONF_AUTH_PROTOCOL, default=DEFAULT_AUTH_PROTOCOL): vol.In( - MAP_AUTH_PROTOCOLS + probatio.Required(CONF_BASEOID): cv.string, + probatio.Optional(CONF_COMMAND_OID): cv.string, + probatio.Optional(CONF_COMMAND_PAYLOAD_ON): cv.string, + probatio.Optional(CONF_COMMAND_PAYLOAD_OFF): cv.string, + probatio.Optional(CONF_COMMUNITY, default=DEFAULT_COMMUNITY): cv.string, + probatio.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_PAYLOAD_OFF, default=DEFAULT_PAYLOAD_OFF): cv.string, + probatio.Optional(CONF_PAYLOAD_ON, default=DEFAULT_PAYLOAD_ON): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_VERSION, default=DEFAULT_VERSION): probatio.In( + SNMP_VERSIONS ), - vol.Optional(CONF_PRIV_KEY): cv.string, - vol.Optional(CONF_PRIV_PROTOCOL, default=DEFAULT_PRIV_PROTOCOL): vol.In( - MAP_PRIV_PROTOCOLS - ), - vol.Optional(CONF_VARTYPE, default=DEFAULT_VARTYPE): cv.string, + probatio.Optional(CONF_USERNAME): cv.string, + probatio.Optional(CONF_AUTH_KEY): cv.string, + probatio.Optional( + CONF_AUTH_PROTOCOL, default=DEFAULT_AUTH_PROTOCOL + ): probatio.In(MAP_AUTH_PROTOCOLS), + probatio.Optional(CONF_PRIV_KEY): cv.string, + probatio.Optional( + CONF_PRIV_PROTOCOL, default=DEFAULT_PRIV_PROTOCOL + ): probatio.In(MAP_PRIV_PROTOCOLS), + probatio.Optional(CONF_VARTYPE, default=DEFAULT_VARTYPE): cv.string, } ) diff --git a/homeassistant/components/snoo/config_flow.py b/homeassistant/components/snoo/config_flow.py index cb5ec30d8519f..d5713e2973078 100644 --- a/homeassistant/components/snoo/config_flow.py +++ b/homeassistant/components/snoo/config_flow.py @@ -4,9 +4,9 @@ from typing import Any, override import jwt +import probatio from python_snoo.exceptions import InvalidSnooAuth, SnooAuthException from python_snoo.snoo import Snoo -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -16,10 +16,10 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/snooz/config_flow.py b/homeassistant/components/snooz/config_flow.py index 4908a13c7038e..ad3d8fb2718a7 100644 --- a/homeassistant/components/snooz/config_flow.py +++ b/homeassistant/components/snooz/config_flow.py @@ -4,8 +4,8 @@ from dataclasses import dataclass from typing import Any, override +import probatio from pysnooz.advertisement import SnoozAdvertisementData -import voluptuous as vol from homeassistant.components import bluetooth from homeassistant.components.bluetooth import ( @@ -116,11 +116,11 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Required(CONF_NAME): vol.In( + probatio.Required(CONF_NAME): probatio.In( [ d.device.display_name for d in self._discovered_devices.values() diff --git a/homeassistant/components/snooz/fan.py b/homeassistant/components/snooz/fan.py index 19db352127968..afcea07795743 100644 --- a/homeassistant/components/snooz/fan.py +++ b/homeassistant/components/snooz/fan.py @@ -4,6 +4,7 @@ from datetime import timedelta from typing import Any, override +import probatio from pysnooz.api import UnknownSnoozState from pysnooz.commands import ( SnoozCommandData, @@ -12,7 +13,6 @@ turn_off, turn_on, ) -import voluptuous as vol from homeassistant.components.fan import ( FanEntity, @@ -49,21 +49,21 @@ async def async_setup_entry( platform.async_register_entity_service( SERVICE_TRANSITION_ON, { - vol.Optional(ATTR_VOLUME): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) - ), - vol.Optional(ATTR_DURATION, default=DEFAULT_TRANSITION_DURATION): vol.All( - vol.Coerce(int), vol.Range(min=1, max=300) + probatio.Optional(ATTR_VOLUME): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) ), + probatio.Optional( + ATTR_DURATION, default=DEFAULT_TRANSITION_DURATION + ): probatio.All(probatio.Coerce(int), probatio.Range(min=1, max=300)), }, "async_transition_on", ) platform.async_register_entity_service( SERVICE_TRANSITION_OFF, { - vol.Optional(ATTR_DURATION, default=DEFAULT_TRANSITION_DURATION): vol.All( - vol.Coerce(int), vol.Range(min=1, max=300) - ), + probatio.Optional( + ATTR_DURATION, default=DEFAULT_TRANSITION_DURATION + ): probatio.All(probatio.Coerce(int), probatio.Range(min=1, max=300)), }, "async_transition_off", ) diff --git a/homeassistant/components/sofar/config_flow.py b/homeassistant/components/sofar/config_flow.py index 446de1a9b46f1..6848859fa1723 100644 --- a/homeassistant/components/sofar/config_flow.py +++ b/homeassistant/components/sofar/config_flow.py @@ -4,8 +4,8 @@ from typing import Any, override from modbus_connection import ModbusError, ModbusTcpParams +import probatio from sofar_modbus.modern.device import SofarInverter -import voluptuous as vol from homeassistant.components.modbus import async_get_temporary_unit from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -23,20 +23,20 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): TextSelector(), - vol.Required(CONF_PORT, default=DEFAULT_PORT): vol.All( + probatio.Required(CONF_HOST): TextSelector(), + probatio.Required(CONF_PORT, default=DEFAULT_PORT): probatio.All( NumberSelector( NumberSelectorConfig(mode=NumberSelectorMode.BOX, min=1, max=65535) ), - vol.Coerce(int), + probatio.Coerce(int), ), - vol.Required(CONF_UNIT_ID, default=DEFAULT_UNIT_ID): vol.All( + probatio.Required(CONF_UNIT_ID, default=DEFAULT_UNIT_ID): probatio.All( NumberSelector( NumberSelectorConfig(mode=NumberSelectorMode.BOX, min=1, max=247) ), - vol.Coerce(int), + probatio.Coerce(int), ), } ) diff --git a/homeassistant/components/sofar/services.py b/homeassistant/components/sofar/services.py index 06282eac6834b..3752f9843cdb3 100644 --- a/homeassistant/components/sofar/services.py +++ b/homeassistant/components/sofar/services.py @@ -3,8 +3,8 @@ from collections.abc import Awaitable from modbus_connection import ModbusError +import probatio from sofar_modbus.modern.enums import FeedinLimitationMode, PassiveModeTimeoutAction -import voluptuous as vol from homeassistant.const import ATTR_CONFIG_ENTRY_ID, ATTR_MODE from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -32,35 +32,39 @@ ATTR_MAX_POWER = "max_power" ATTR_TIMEOUT = "timeout" -_ENTRY_SCHEMA = vol.Schema({vol.Required(ATTR_CONFIG_ENTRY_ID): str}) +_ENTRY_SCHEMA = probatio.Schema({probatio.Required(ATTR_CONFIG_ENTRY_ID): str}) # The selectors in services.yaml only bound the UI, not a scripted call. -_POWER_RANGE = vol.All(int, vol.Range(min=-100000, max=100000)) +_POWER_RANGE = probatio.All(int, probatio.Range(min=-100000, max=100000)) SET_FEED_IN_LIMIT_SCHEMA = _ENTRY_SCHEMA.extend( { - vol.Required(ATTR_MODE): vol.In( + probatio.Required(ATTR_MODE): probatio.In( [mode.name.lower() for mode in FeedinLimitationMode] ), # Kept fractional so the multiple-of-100 check below sees the real # value; cv.positive_int would truncate 3000.9 into a valid 3000. - vol.Required(ATTR_MAX_POWER): vol.All( - vol.Coerce(float), vol.Range(min=0, max=100000) + probatio.Required(ATTR_MAX_POWER): probatio.All( + probatio.Coerce(float), probatio.Range(min=0, max=100000) ), } ) SET_ACTIVE_POWER_LIMIT_SCHEMA = _ENTRY_SCHEMA.extend( { - vol.Required(ATTR_ENABLED): cv.boolean, - vol.Required(ATTR_LIMIT): vol.All(vol.Coerce(float), vol.Range(min=0, max=100)), + probatio.Required(ATTR_ENABLED): cv.boolean, + probatio.Required(ATTR_LIMIT): probatio.All( + probatio.Coerce(float), probatio.Range(min=0, max=100) + ), } ) SET_PASSIVE_MODE_TIMEOUT_SCHEMA = _ENTRY_SCHEMA.extend( { - vol.Required(ATTR_TIMEOUT): vol.All(cv.positive_int, vol.Range(max=65535)), - vol.Required(ATTR_ACTION): vol.In( + probatio.Required(ATTR_TIMEOUT): probatio.All( + cv.positive_int, probatio.Range(max=65535) + ), + probatio.Required(ATTR_ACTION): probatio.In( [action.name.lower() for action in PassiveModeTimeoutAction] ), } @@ -68,9 +72,9 @@ SET_PASSIVE_MODE_POWER_SCHEMA = _ENTRY_SCHEMA.extend( { - vol.Required(ATTR_GRID_POWER): _POWER_RANGE, - vol.Required(ATTR_BATTERY_POWER_MIN): _POWER_RANGE, - vol.Required(ATTR_BATTERY_POWER_MAX): _POWER_RANGE, + probatio.Required(ATTR_GRID_POWER): _POWER_RANGE, + probatio.Required(ATTR_BATTERY_POWER_MIN): _POWER_RANGE, + probatio.Required(ATTR_BATTERY_POWER_MAX): _POWER_RANGE, } ) diff --git a/homeassistant/components/solaredge/config_flow.py b/homeassistant/components/solaredge/config_flow.py index fe4e29ad0a79e..c345cd2163837 100644 --- a/homeassistant/components/solaredge/config_flow.py +++ b/homeassistant/components/solaredge/config_flow.py @@ -5,8 +5,8 @@ from aiohttp import ClientError, ClientResponseError import aiosolaredge +import probatio from solaredge_web import SolarEdgeWeb -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_RECONFIGURE, @@ -157,23 +157,27 @@ async def async_step_user( else: user_input = {} - data_schema_dict: dict[vol.Marker, Any] = {} + data_schema_dict: dict[probatio.Marker, Any] = {} if self.source != SOURCE_RECONFIGURE: data_schema_dict[ # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Required(CONF_NAME, default=user_input.get(CONF_NAME, DEFAULT_NAME)) + probatio.Required( + CONF_NAME, default=user_input.get(CONF_NAME, DEFAULT_NAME) + ) ] = str data_schema_dict[ - vol.Required(CONF_SITE_ID, default=user_input.get(CONF_SITE_ID, "")) + probatio.Required( + CONF_SITE_ID, default=user_input.get(CONF_SITE_ID, "") + ) ] = str data_schema_dict.update( { - vol.Optional(CONF_SECTION_API_AUTH): section( - vol.Schema( + probatio.Optional(CONF_SECTION_API_AUTH): section( + probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_API_KEY, default=user_input.get(CONF_SECTION_API_AUTH, {}).get( CONF_API_KEY, "" @@ -183,17 +187,17 @@ async def async_step_user( ), options={"collapsed": False}, ), - vol.Optional(CONF_SECTION_WEB_AUTH): section( - vol.Schema( + probatio.Optional(CONF_SECTION_WEB_AUTH): section( + probatio.Schema( { - vol.Inclusive( + probatio.Inclusive( CONF_USERNAME, "web_account", default=user_input.get(CONF_SECTION_WEB_AUTH, {}).get( CONF_USERNAME, "" ), ): str, - vol.Inclusive( + probatio.Inclusive( CONF_PASSWORD, "web_account", default=user_input.get(CONF_SECTION_WEB_AUTH, {}).get( @@ -206,7 +210,7 @@ async def async_step_user( ), } ) - data_schema = vol.Schema(data_schema_dict) + data_schema = probatio.Schema(data_schema_dict) step_id = "user" description_placeholders = {} diff --git a/homeassistant/components/solaredge_local/sensor.py b/homeassistant/components/solaredge_local/sensor.py index 343c5d7874080..1e4e5563d74f1 100644 --- a/homeassistant/components/solaredge_local/sensor.py +++ b/homeassistant/components/solaredge_local/sensor.py @@ -7,9 +7,9 @@ import statistics from typing import Any, override +import probatio from requests.exceptions import ConnectTimeout, HTTPError from solaredge_local import SolarEdge -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -194,8 +194,8 @@ class SolarEdgeLocalSensorEntityDescription(SensorEntityDescription): PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_IP_ADDRESS): cv.string, - vol.Optional(CONF_NAME, default="SolarEdge"): cv.string, + probatio.Required(CONF_IP_ADDRESS): cv.string, + probatio.Optional(CONF_NAME, default="SolarEdge"): cv.string, } ) diff --git a/homeassistant/components/solaredge_modbus/config_flow.py b/homeassistant/components/solaredge_modbus/config_flow.py index d9d9c9d3fd46f..0a824e4012400 100644 --- a/homeassistant/components/solaredge_modbus/config_flow.py +++ b/homeassistant/components/solaredge_modbus/config_flow.py @@ -3,8 +3,8 @@ from collections.abc import Mapping from typing import Any, override +import probatio from solaredged import SolarEdge, SolarEdgeConnectionError, SolarEdgeError -import voluptuous as vol from homeassistant.components.modbus import async_get_temporary_unit from homeassistant.config_entries import ( @@ -45,16 +45,16 @@ # Almost every inverter answers on the factory-default device ID, so that # setting is tucked away in a collapsed section. MORE_OPTIONS = { - vol.Required(SECTION_MORE_OPTIONS): section( - vol.Schema( + probatio.Required(SECTION_MORE_OPTIONS): section( + probatio.Schema( { - vol.Required(CONF_UNIT_ID, default=DEFAULT_UNIT_ID): vol.All( + probatio.Required(CONF_UNIT_ID, default=DEFAULT_UNIT_ID): probatio.All( NumberSelector( NumberSelectorConfig( min=1, max=247, step=1, mode=NumberSelectorMode.BOX ) ), - vol.Coerce(int), + probatio.Coerce(int), ), } ), @@ -62,29 +62,29 @@ ) } -STEP_TCP = vol.Schema( +STEP_TCP = probatio.Schema( { - vol.Required(CONF_HOST): TextSelector(), - vol.Required(CONF_PORT, default=DEFAULT_PORT): vol.All( + probatio.Required(CONF_HOST): TextSelector(), + probatio.Required(CONF_PORT, default=DEFAULT_PORT): probatio.All( NumberSelector( NumberSelectorConfig( min=1, max=65535, step=1, mode=NumberSelectorMode.BOX ) ), - vol.Coerce(int), + probatio.Coerce(int), ), **MORE_OPTIONS, } ) -STEP_SERIAL = vol.Schema( +STEP_SERIAL = probatio.Schema( { - vol.Required(CONF_DEVICE): SerialPortSelector(), - vol.Required(CONF_BAUDRATE, default=DEFAULT_BAUDRATE): vol.All( + probatio.Required(CONF_DEVICE): SerialPortSelector(), + probatio.Required(CONF_BAUDRATE, default=DEFAULT_BAUDRATE): probatio.All( NumberSelector( NumberSelectorConfig(min=1, step=1, mode=NumberSelectorMode.BOX) ), - vol.Coerce(int), + probatio.Coerce(int), ), **MORE_OPTIONS, } @@ -233,7 +233,7 @@ async def async_step_serial( async def _async_step_link( self, connection_type: str, - schema: vol.Schema, + schema: probatio.Schema, user_input: dict[str, Any] | None, ) -> ConfigFlowResult: """Ask for the link settings, then probe the inverter behind them.""" diff --git a/homeassistant/components/solarlog/config_flow.py b/homeassistant/components/solarlog/config_flow.py index 9365d75d41366..08c13955b27c3 100644 --- a/homeassistant/components/solarlog/config_flow.py +++ b/homeassistant/components/solarlog/config_flow.py @@ -4,13 +4,13 @@ from typing import Any, override from urllib.parse import ParseResult, urlparse +import probatio from solarlog_cli.solarlog_connector import SolarLogConnector from solarlog_cli.solarlog_exceptions import ( SolarLogAuthenticationError, SolarLogConnectionError, SolarLogError, ) -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_TIMEOUT @@ -94,10 +94,10 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST, default=user_input[CONF_HOST]): str, - vol.Required(CONF_HAS_PWD, default=False): bool, + probatio.Required(CONF_HOST, default=user_input[CONF_HOST]): str, + probatio.Required(CONF_HAS_PWD, default=False): bool, } ), errors=self._errors, @@ -121,9 +121,9 @@ async def async_step_password( return self.async_show_form( step_id="password", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=self._errors, @@ -155,12 +155,12 @@ async def async_step_reconfigure( return self.async_show_form( step_id="reconfigure", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_HAS_PWD, default=reconfigure_entry.data[CONF_HAS_PWD] ): bool, - vol.Optional(CONF_PASSWORD): str, + probatio.Optional(CONF_PASSWORD): str, } ), ) @@ -183,12 +183,12 @@ async def async_step_reauth_confirm( reauth_entry, data_updates=user_input ) - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_HAS_PWD, default=reauth_entry.data[CONF_HAS_PWD] ): bool, - vol.Optional(CONF_PASSWORD): str, + probatio.Optional(CONF_PASSWORD): str, } ) return self.async_show_form( diff --git a/homeassistant/components/solarman/config_flow.py b/homeassistant/components/solarman/config_flow.py index b75f66d6f904b..8230d35f58cd0 100644 --- a/homeassistant/components/solarman/config_flow.py +++ b/homeassistant/components/solarman/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from solarman_opendata.solarman import Solarman -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_DEVICE, CONF_HOST, CONF_MAC, CONF_MODEL, CONF_TYPE @@ -80,9 +80,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST): str, + probatio.Required(CONF_HOST): str, } ), errors=errors, diff --git a/homeassistant/components/solax/config_flow.py b/homeassistant/components/solax/config_flow.py index bd01e5e4a745b..02e847a7470bb 100644 --- a/homeassistant/components/solax/config_flow.py +++ b/homeassistant/components/solax/config_flow.py @@ -4,10 +4,10 @@ import logging from typing import Any, override +import probatio from solax import RealTimeAPI, discover from solax.discovery import DiscoveryError from solax.inverter import Inverter, InverterError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_IP_ADDRESS, CONF_MODEL, CONF_PASSWORD, CONF_PORT @@ -20,11 +20,11 @@ DEFAULT_PORT = 80 DEFAULT_PASSWORD = "" -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_IP_ADDRESS): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_PASSWORD, default=DEFAULT_PASSWORD): cv.string, + probatio.Required(CONF_IP_ADDRESS): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_PASSWORD, default=DEFAULT_PASSWORD): cv.string, } ) @@ -43,11 +43,11 @@ def __init__(self) -> None: self._connection_data: dict[str, Any] = {} self._potential_types: dict[str, Inverter] = {} - def _select_model_schema(self) -> vol.Schema: + def _select_model_schema(self) -> probatio.Schema: """Return the schema listing only the discovered inverters.""" - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_MODEL): selector.SelectSelector( + probatio.Required(CONF_MODEL): selector.SelectSelector( selector.SelectSelectorConfig( options=sorted(self._potential_types), mode=selector.SelectSelectorMode.DROPDOWN, @@ -57,7 +57,12 @@ def _select_model_schema(self) -> vol.Schema: ) async def _async_finalize( - self, model: str, inverter: Inverter, *, step_id: str, data_schema: vol.Schema + self, + model: str, + inverter: Inverter, + *, + step_id: str, + data_schema: probatio.Schema, ) -> ConfigFlowResult: """Fetch the serial number and create the entry, or redisplay on error.""" errors: dict[str, str] = {} diff --git a/homeassistant/components/soma/__init__.py b/homeassistant/components/soma/__init__.py index 0b4cb11ac1310..7117f070e8f84 100644 --- a/homeassistant/components/soma/__init__.py +++ b/homeassistant/components/soma/__init__.py @@ -4,7 +4,7 @@ from typing import Any from api.soma_api import SomaApi -import voluptuous as vol +import probatio from homeassistant import config_entries from homeassistant.config_entries import ConfigEntry @@ -15,16 +15,19 @@ from .const import DOMAIN, HOST, PORT -CONFIG_SCHEMA = vol.Schema( - vol.All( +CONFIG_SCHEMA = probatio.Schema( + probatio.All( cv.deprecated(DOMAIN), { - DOMAIN: vol.Schema( - {vol.Required(CONF_HOST): cv.string, vol.Required(CONF_PORT): cv.string} + DOMAIN: probatio.Schema( + { + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_PORT): cv.string, + } ) }, ), - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/soma/config_flow.py b/homeassistant/components/soma/config_flow.py index 89dcc207a63ad..5806688e77113 100644 --- a/homeassistant/components/soma/config_flow.py +++ b/homeassistant/components/soma/config_flow.py @@ -4,8 +4,8 @@ from typing import Any, override from api.soma_api import SomaApi +import probatio from requests import RequestException -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PORT @@ -32,11 +32,13 @@ async def async_step_user( """Handle a flow start.""" if user_input is None: data = { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, } - return self.async_show_form(step_id="user", data_schema=vol.Schema(data)) + return self.async_show_form( + step_id="user", data_schema=probatio.Schema(data) + ) return await self.async_step_creation(user_input) diff --git a/homeassistant/components/somfy_mylink/config_flow.py b/homeassistant/components/somfy_mylink/config_flow.py index 78a137430761e..491f7d8c3c109 100644 --- a/homeassistant/components/somfy_mylink/config_flow.py +++ b/homeassistant/components/somfy_mylink/config_flow.py @@ -4,8 +4,8 @@ import logging from typing import Any, override +import probatio from pysomfymylink import SomfyMyLink, SomfyMyLinkApiError, SomfyMyLinkConnectionError -import voluptuous as vol from homeassistant.config_entries import ( ConfigEntryState, @@ -103,11 +103,11 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST, default=self.ip_address): str, - vol.Required(CONF_SYSTEM_ID): str, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Required(CONF_HOST, default=self.ip_address): str, + probatio.Required(CONF_SYSTEM_ID): str, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): int, } ), errors=errors, @@ -161,7 +161,9 @@ async def async_step_init( for shade in self.config_entry.runtime_data.shades: cover_dict[shade.target_id] = shade.name - data_schema = vol.Schema({vol.Optional(CONF_TARGET_ID): vol.In(cover_dict)}) + data_schema = probatio.Schema( + {probatio.Optional(CONF_TARGET_ID): probatio.In(cover_dict)} + ) return self.async_show_form(step_id="init", data_schema=data_schema, errors={}) @@ -183,9 +185,9 @@ async def async_step_target_config( return self.async_show_form( step_id="target_config", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_REVERSE, default=reversed_target_ids.get(target_id, False), ): bool diff --git a/homeassistant/components/sonarr/config_flow.py b/homeassistant/components/sonarr/config_flow.py index 24779c5aa8105..523cf656c65b3 100644 --- a/homeassistant/components/sonarr/config_flow.py +++ b/homeassistant/components/sonarr/config_flow.py @@ -7,7 +7,7 @@ from aiopyarr import ArrAuthenticationException, ArrException from aiopyarr.models.host_configuration import PyArrHostConfiguration from aiopyarr.sonarr_client import SonarrClient -import voluptuous as vol +import probatio import yarl from homeassistant.config_entries import ( @@ -139,19 +139,19 @@ async def async_step_user( errors=errors, ) - def _get_user_data_schema(self) -> vol.Schema: + def _get_user_data_schema(self) -> probatio.Schema: """Get the data schema to display user form.""" if self.source == SOURCE_REAUTH: - return vol.Schema({vol.Required(CONF_API_KEY): str}) + return probatio.Schema({probatio.Required(CONF_API_KEY): str}) - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_URL): str, - vol.Required(CONF_API_KEY): str, - vol.Required(CONF_MORE_OPTIONS): section( - vol.Schema( + probatio.Required(CONF_URL): str, + probatio.Required(CONF_API_KEY): str, + probatio.Required(CONF_MORE_OPTIONS): section( + probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL ): bool, } @@ -173,13 +173,13 @@ async def async_step_init( return self.async_create_entry(title="", data=user_input) options = { - vol.Optional( + probatio.Optional( CONF_UPCOMING_DAYS, default=self.config_entry.options.get( CONF_UPCOMING_DAYS, DEFAULT_UPCOMING_DAYS ), ): int, - vol.Optional( + probatio.Optional( CONF_WANTED_MAX_ITEMS, default=self.config_entry.options.get( CONF_WANTED_MAX_ITEMS, DEFAULT_WANTED_MAX_ITEMS @@ -187,4 +187,6 @@ async def async_step_init( ): int, } - return self.async_show_form(step_id="init", data_schema=vol.Schema(options)) + return self.async_show_form( + step_id="init", data_schema=probatio.Schema(options) + ) diff --git a/homeassistant/components/sonarr/services.py b/homeassistant/components/sonarr/services.py index 49e6f259f467e..d3d1e588b5486 100644 --- a/homeassistant/components/sonarr/services.py +++ b/homeassistant/components/sonarr/services.py @@ -5,7 +5,7 @@ from typing import Any, cast from aiopyarr import exceptions -import voluptuous as vol +import probatio from homeassistant.const import CONF_URL from homeassistant.core import HomeAssistant, ServiceCall, SupportsResponse, callback @@ -51,9 +51,9 @@ # Default values - 0 means no limit DEFAULT_MAX_ITEMS = 0 -SERVICE_BASE_SCHEMA = vol.Schema( +SERVICE_BASE_SCHEMA = probatio.Schema( { - vol.Required(ATTR_ENTRY_ID): selector.ConfigEntrySelector( + probatio.Required(ATTR_ENTRY_ID): selector.ConfigEntrySelector( {"integration": DOMAIN} ), } @@ -63,37 +63,43 @@ SERVICE_GET_EPISODES_SCHEMA = SERVICE_BASE_SCHEMA.extend( { - vol.Required(CONF_SERIES_ID): vol.All(vol.Coerce(int), vol.Range(min=1)), - vol.Optional(CONF_SEASON_NUMBER): vol.All(vol.Coerce(int), vol.Range(min=0)), + probatio.Required(CONF_SERIES_ID): probatio.All( + probatio.Coerce(int), probatio.Range(min=1) + ), + probatio.Optional(CONF_SEASON_NUMBER): probatio.All( + probatio.Coerce(int), probatio.Range(min=0) + ), } ) SERVICE_GET_QUEUE_SCHEMA = SERVICE_BASE_SCHEMA.extend( { - vol.Optional(CONF_MAX_ITEMS, default=DEFAULT_MAX_ITEMS): vol.All( - vol.Coerce(int), vol.Range(min=0, max=500) + probatio.Optional(CONF_MAX_ITEMS, default=DEFAULT_MAX_ITEMS): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=500) ), } ) SERVICE_GET_DISKSPACE_SCHEMA = SERVICE_BASE_SCHEMA.extend( { - vol.Optional(CONF_SPACE_UNIT, default=DEFAULT_SPACE_UNIT): vol.In(SPACE_UNITS), + probatio.Optional(CONF_SPACE_UNIT, default=DEFAULT_SPACE_UNIT): probatio.In( + SPACE_UNITS + ), } ) SERVICE_GET_UPCOMING_SCHEMA = SERVICE_BASE_SCHEMA.extend( { - vol.Optional(CONF_DAYS, default=DEFAULT_UPCOMING_DAYS): vol.All( - vol.Coerce(int), vol.Range(min=1, max=30) + probatio.Optional(CONF_DAYS, default=DEFAULT_UPCOMING_DAYS): probatio.All( + probatio.Coerce(int), probatio.Range(min=1, max=30) ), } ) SERVICE_GET_WANTED_SCHEMA = SERVICE_BASE_SCHEMA.extend( { - vol.Optional(CONF_MAX_ITEMS, default=DEFAULT_MAX_ITEMS): vol.All( - vol.Coerce(int), vol.Range(min=0, max=500) + probatio.Optional(CONF_MAX_ITEMS, default=DEFAULT_MAX_ITEMS): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=500) ), } ) diff --git a/homeassistant/components/songpal/__init__.py b/homeassistant/components/songpal/__init__.py index 18f9aae8f1390..7bf1f5a6b6a0c 100644 --- a/homeassistant/components/songpal/__init__.py +++ b/homeassistant/components/songpal/__init__.py @@ -1,6 +1,6 @@ """The songpal component.""" -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry from homeassistant.const import CONF_NAME, Platform @@ -11,13 +11,16 @@ from .const import CONF_ENDPOINT, DOMAIN from .services import async_setup_services -SONGPAL_CONFIG_SCHEMA = vol.Schema( - {vol.Optional(CONF_NAME): cv.string, vol.Required(CONF_ENDPOINT): cv.string} +SONGPAL_CONFIG_SCHEMA = probatio.Schema( + { + probatio.Optional(CONF_NAME): cv.string, + probatio.Required(CONF_ENDPOINT): cv.string, + } ) -CONFIG_SCHEMA = vol.Schema( - {vol.Optional(DOMAIN): vol.All(cv.ensure_list, [SONGPAL_CONFIG_SCHEMA])}, - extra=vol.ALLOW_EXTRA, +CONFIG_SCHEMA = probatio.Schema( + {probatio.Optional(DOMAIN): probatio.All(cv.ensure_list, [SONGPAL_CONFIG_SCHEMA])}, + extra=probatio.ALLOW_EXTRA, ) PLATFORMS = [Platform.MEDIA_PLAYER] diff --git a/homeassistant/components/songpal/config_flow.py b/homeassistant/components/songpal/config_flow.py index eb6a1fe2182e8..d7bfbf3a382c3 100644 --- a/homeassistant/components/songpal/config_flow.py +++ b/homeassistant/components/songpal/config_flow.py @@ -4,8 +4,8 @@ from typing import TYPE_CHECKING, Any, override from urllib.parse import urlparse +import probatio from songpal import Device, SongpalException -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_NAME @@ -47,7 +47,7 @@ async def async_step_user( if user_input is None: return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_ENDPOINT): str}), + data_schema=probatio.Schema({probatio.Required(CONF_ENDPOINT): str}), ) # Validate input @@ -64,9 +64,9 @@ async def async_step_user( _LOGGER.debug("Connection failed: %s", ex) return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_ENDPOINT, default=user_input.get(CONF_ENDPOINT, "") ): str, } diff --git a/homeassistant/components/songpal/services.py b/homeassistant/components/songpal/services.py index 96e42b3925093..fea5f1e5e0daf 100644 --- a/homeassistant/components/songpal/services.py +++ b/homeassistant/components/songpal/services.py @@ -1,6 +1,6 @@ """Support for Songpal-enabled (Sony) media devices.""" -import voluptuous as vol +import probatio from homeassistant.components.media_player import DOMAIN as MEDIA_PLAYER_DOMAIN from homeassistant.core import HomeAssistant, callback @@ -23,8 +23,8 @@ def async_setup_services(hass: HomeAssistant) -> None: SET_SOUND_SETTING, entity_domain=MEDIA_PLAYER_DOMAIN, schema={ - vol.Required(PARAM_NAME): cv.string, - vol.Required(PARAM_VALUE): cv.string, + probatio.Required(PARAM_NAME): cv.string, + probatio.Required(PARAM_VALUE): cv.string, }, func="async_set_sound_setting", ) diff --git a/homeassistant/components/sonos/__init__.py b/homeassistant/components/sonos/__init__.py index e953b4110f434..a33607303844a 100644 --- a/homeassistant/components/sonos/__init__.py +++ b/homeassistant/components/sonos/__init__.py @@ -13,13 +13,13 @@ from urllib.parse import urlparse from aiohttp import ClientError +import probatio from requests.exceptions import HTTPError, Timeout from soco import events_asyncio, zonegroupstate import soco.config as soco_config from soco.core import SoCo, soco_reset from soco.events_base import Event as SonosEvent, SubscriptionBase from soco.exceptions import SoCoException -import voluptuous as vol from homeassistant import config_entries from homeassistant.components import ssdp @@ -79,17 +79,17 @@ def _get_soco_uid(soco: SoCo) -> str: return soco.uid -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - MP_DOMAIN: vol.All( + MP_DOMAIN: probatio.All( cv.deprecated(CONF_INTERFACE_ADDR), - vol.Schema( + probatio.Schema( { - vol.Optional(CONF_ADVERTISE_ADDR): cv.string, - vol.Optional(CONF_INTERFACE_ADDR): cv.string, - vol.Optional(CONF_HOSTS): vol.All( + probatio.Optional(CONF_ADVERTISE_ADDR): cv.string, + probatio.Optional(CONF_INTERFACE_ADDR): cv.string, + probatio.Optional(CONF_HOSTS): probatio.All( cv.ensure_list_csv, [cv.string] ), } @@ -98,7 +98,7 @@ def _get_soco_uid(soco: SoCo) -> str: } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/sonos/services.py b/homeassistant/components/sonos/services.py index b108b2315ad40..29aa4218235ec 100644 --- a/homeassistant/components/sonos/services.py +++ b/homeassistant/components/sonos/services.py @@ -1,6 +1,6 @@ """Support to interface with Sonos players.""" -import voluptuous as vol +import probatio from homeassistant.components.media_player import DOMAIN as MEDIA_PLAYER_DOMAIN from homeassistant.const import ATTR_TIME @@ -53,7 +53,7 @@ async def async_handle_snapshot_restore( DOMAIN, SERVICE_SNAPSHOT, entity_domain=MEDIA_PLAYER_DOMAIN, - schema={vol.Optional(ATTR_WITH_GROUP, default=True): cv.boolean}, + schema={probatio.Optional(ATTR_WITH_GROUP, default=True): cv.boolean}, func=async_handle_snapshot_restore, ) @@ -62,7 +62,7 @@ async def async_handle_snapshot_restore( DOMAIN, SERVICE_RESTORE, entity_domain=MEDIA_PLAYER_DOMAIN, - schema={vol.Optional(ATTR_WITH_GROUP, default=True): cv.boolean}, + schema={probatio.Optional(ATTR_WITH_GROUP, default=True): cv.boolean}, func=async_handle_snapshot_restore, ) @@ -72,8 +72,8 @@ async def async_handle_snapshot_restore( SERVICE_SET_TIMER, entity_domain=MEDIA_PLAYER_DOMAIN, schema={ - vol.Required(ATTR_SLEEP_TIME): vol.All( - vol.Coerce(int), vol.Range(min=0, max=86399) + probatio.Required(ATTR_SLEEP_TIME): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=86399) ) }, func="set_sleep_timer", @@ -94,11 +94,11 @@ async def async_handle_snapshot_restore( SERVICE_UPDATE_ALARM, entity_domain=MEDIA_PLAYER_DOMAIN, schema={ - vol.Required(ATTR_ALARM_ID): cv.positive_int, - vol.Optional(ATTR_TIME): cv.time, - vol.Optional(ATTR_VOLUME): cv.small_float, - vol.Optional(ATTR_ENABLED): cv.boolean, - vol.Optional(ATTR_INCLUDE_LINKED_ZONES): cv.boolean, + probatio.Required(ATTR_ALARM_ID): cv.positive_int, + probatio.Optional(ATTR_TIME): cv.time, + probatio.Optional(ATTR_VOLUME): cv.small_float, + probatio.Optional(ATTR_ENABLED): cv.boolean, + probatio.Optional(ATTR_INCLUDE_LINKED_ZONES): cv.boolean, }, func="set_alarm", ) @@ -108,7 +108,7 @@ async def async_handle_snapshot_restore( DOMAIN, SERVICE_PLAY_QUEUE, entity_domain=MEDIA_PLAYER_DOMAIN, - schema={vol.Optional(ATTR_QUEUE_POSITION): cv.positive_int}, + schema={probatio.Optional(ATTR_QUEUE_POSITION): cv.positive_int}, func="play_queue", ) @@ -117,7 +117,7 @@ async def async_handle_snapshot_restore( DOMAIN, SERVICE_REMOVE_FROM_QUEUE, entity_domain=MEDIA_PLAYER_DOMAIN, - schema={vol.Optional(ATTR_QUEUE_POSITION): cv.positive_int}, + schema={probatio.Optional(ATTR_QUEUE_POSITION): cv.positive_int}, func="remove_from_queue", ) diff --git a/homeassistant/components/sony_projector/switch.py b/homeassistant/components/sony_projector/switch.py index 1e3dbf082ff1f..d3b9c439d7f4b 100644 --- a/homeassistant/components/sony_projector/switch.py +++ b/homeassistant/components/sony_projector/switch.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio import pysdcp -import voluptuous as vol from homeassistant.components.switch import ( PLATFORM_SCHEMA as SWITCH_PLATFORM_SCHEMA, @@ -22,8 +22,8 @@ PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/soundtouch/__init__.py b/homeassistant/components/soundtouch/__init__.py index 4623abc03da24..f9d2cc8a029d6 100644 --- a/homeassistant/components/soundtouch/__init__.py +++ b/homeassistant/components/soundtouch/__init__.py @@ -5,8 +5,8 @@ from libsoundtouch import soundtouch_device from libsoundtouch.device import SoundTouchDevice +import probatio import requests -import voluptuous as vol from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_HOST, Platform @@ -30,23 +30,25 @@ _LOGGER = logging.getLogger(__name__) -SERVICE_PLAY_EVERYWHERE_SCHEMA = vol.Schema({vol.Required("master"): cv.entity_id}) -SERVICE_CREATE_ZONE_SCHEMA = vol.Schema( +SERVICE_PLAY_EVERYWHERE_SCHEMA = probatio.Schema( + {probatio.Required("master"): cv.entity_id} +) +SERVICE_CREATE_ZONE_SCHEMA = probatio.Schema( { - vol.Required("master"): cv.entity_id, - vol.Required("slaves"): cv.entity_ids, + probatio.Required("master"): cv.entity_id, + probatio.Required("slaves"): cv.entity_ids, } ) -SERVICE_ADD_ZONE_SCHEMA = vol.Schema( +SERVICE_ADD_ZONE_SCHEMA = probatio.Schema( { - vol.Required("master"): cv.entity_id, - vol.Required("slaves"): cv.entity_ids, + probatio.Required("master"): cv.entity_id, + probatio.Required("slaves"): cv.entity_ids, } ) -SERVICE_REMOVE_ZONE_SCHEMA = vol.Schema( +SERVICE_REMOVE_ZONE_SCHEMA = probatio.Schema( { - vol.Required("master"): cv.entity_id, - vol.Required("slaves"): cv.entity_ids, + probatio.Required("master"): cv.entity_id, + probatio.Required("slaves"): cv.entity_ids, } ) diff --git a/homeassistant/components/soundtouch/config_flow.py b/homeassistant/components/soundtouch/config_flow.py index 2a1a2b77ceb24..ba31ae52986db 100644 --- a/homeassistant/components/soundtouch/config_flow.py +++ b/homeassistant/components/soundtouch/config_flow.py @@ -3,8 +3,8 @@ from typing import Any, override from libsoundtouch import soundtouch_device +import probatio from requests import RequestException -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST @@ -44,9 +44,9 @@ async def async_step_user( return self.async_show_form( step_id="user", last_step=True, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST): cv.string, + probatio.Required(CONF_HOST): cv.string, } ), errors=errors, diff --git a/homeassistant/components/spaceapi/__init__.py b/homeassistant/components/spaceapi/__init__.py index a05867b8fd7f1..2de04eb962c53 100644 --- a/homeassistant/components/spaceapi/__init__.py +++ b/homeassistant/components/spaceapi/__init__.py @@ -5,7 +5,7 @@ from typing import Any from aiohttp import web -import voluptuous as vol +import probatio from homeassistant import core as ha from homeassistant.components.http import KEY_HASS, HomeAssistantView @@ -114,127 +114,132 @@ URL_API_SPACEAPI = "/api/spaceapi" -LOCATION_SCHEMA = vol.Schema({vol.Optional(CONF_ADDRESS): cv.string}) +LOCATION_SCHEMA = probatio.Schema({probatio.Optional(CONF_ADDRESS): cv.string}) -SPACEFED_SCHEMA = vol.Schema( +SPACEFED_SCHEMA = probatio.Schema( { - vol.Optional(CONF_SPACENET): cv.boolean, - vol.Optional(CONF_SPACESAML): cv.boolean, - vol.Optional(CONF_SPACEPHONE): cv.boolean, + probatio.Optional(CONF_SPACENET): cv.boolean, + probatio.Optional(CONF_SPACESAML): cv.boolean, + probatio.Optional(CONF_SPACEPHONE): cv.boolean, } ) -STREAM_SCHEMA = vol.Schema( +STREAM_SCHEMA = probatio.Schema( { - vol.Optional(CONF_M4): cv.url, - vol.Optional(CONF_MJPEG): cv.url, - vol.Optional(CONF_USTREAM): cv.url, + probatio.Optional(CONF_M4): cv.url, + probatio.Optional(CONF_MJPEG): cv.url, + probatio.Optional(CONF_USTREAM): cv.url, } ) -FEED_SCHEMA = vol.Schema( - {vol.Optional(CONF_FEED_TYPE): cv.string, vol.Required(CONF_FEED_URL): cv.url} +FEED_SCHEMA = probatio.Schema( + { + probatio.Optional(CONF_FEED_TYPE): cv.string, + probatio.Required(CONF_FEED_URL): cv.url, + } ) -FEEDS_SCHEMA = vol.Schema( +FEEDS_SCHEMA = probatio.Schema( { - vol.Optional(CONF_FEED_BLOG): FEED_SCHEMA, - vol.Optional(CONF_FEED_WIKI): FEED_SCHEMA, - vol.Optional(CONF_FEED_CALENDAR): FEED_SCHEMA, - vol.Optional(CONF_FEED_FLICKER): FEED_SCHEMA, + probatio.Optional(CONF_FEED_BLOG): FEED_SCHEMA, + probatio.Optional(CONF_FEED_WIKI): FEED_SCHEMA, + probatio.Optional(CONF_FEED_CALENDAR): FEED_SCHEMA, + probatio.Optional(CONF_FEED_FLICKER): FEED_SCHEMA, } ) -CACHE_SCHEMA = vol.Schema( +CACHE_SCHEMA = probatio.Schema( { - vol.Required(CONF_CACHE_SCHEDULE): cv.matches_regex( + probatio.Required(CONF_CACHE_SCHEDULE): cv.matches_regex( r"(m.02|m.05|m.10|m.15|m.30|h.01|h.02|h.04|h.08|h.12|d.01)" ) } ) -RADIO_SHOW_SCHEMA = vol.Schema( +RADIO_SHOW_SCHEMA = probatio.Schema( { - vol.Required(CONF_RADIO_SHOW_NAME): cv.string, - vol.Required(CONF_RADIO_SHOW_URL): cv.url, - vol.Required(CONF_RADIO_SHOW_TYPE): cv.matches_regex(r"(mp3|ogg)"), - vol.Required(CONF_RADIO_SHOW_START): cv.string, - vol.Required(CONF_RADIO_SHOW_END): cv.string, + probatio.Required(CONF_RADIO_SHOW_NAME): cv.string, + probatio.Required(CONF_RADIO_SHOW_URL): cv.url, + probatio.Required(CONF_RADIO_SHOW_TYPE): cv.matches_regex(r"(mp3|ogg)"), + probatio.Required(CONF_RADIO_SHOW_START): cv.string, + probatio.Required(CONF_RADIO_SHOW_END): cv.string, } ) -KEYMASTER_SCHEMA = vol.Schema( +KEYMASTER_SCHEMA = probatio.Schema( { - vol.Optional(CONF_KEYMASTER_NAME): cv.string, - vol.Optional(CONF_KEYMASTER_IRC_NICK): cv.string, - vol.Optional(CONF_KEYMASTER_PHONE): cv.string, - vol.Optional(CONF_KEYMASTER_EMAIL): cv.string, - vol.Optional(CONF_KEYMASTER_TWITTER): cv.string, + probatio.Optional(CONF_KEYMASTER_NAME): cv.string, + probatio.Optional(CONF_KEYMASTER_IRC_NICK): cv.string, + probatio.Optional(CONF_KEYMASTER_PHONE): cv.string, + probatio.Optional(CONF_KEYMASTER_EMAIL): cv.string, + probatio.Optional(CONF_KEYMASTER_TWITTER): cv.string, } ) -CONTACT_SCHEMA = vol.Schema( +CONTACT_SCHEMA = probatio.Schema( { - vol.Optional(CONF_EMAIL): cv.string, - vol.Optional(CONF_IRC): cv.string, - vol.Optional(CONF_ML): cv.string, - vol.Optional(CONF_PHONE): cv.string, - vol.Optional(CONF_TWITTER): cv.string, - vol.Optional(CONF_SIP): cv.string, - vol.Optional(CONF_FACEBOOK): cv.string, - vol.Optional(CONF_IDENTICA): cv.string, - vol.Optional(CONF_FOURSQUARE): cv.string, - vol.Optional(CONF_JABBER): cv.string, - vol.Optional(CONF_ISSUE_MAIL): cv.string, - vol.Optional(CONF_KEYMASTERS): vol.All( - cv.ensure_list, [KEYMASTER_SCHEMA], vol.Length(min=1) + probatio.Optional(CONF_EMAIL): cv.string, + probatio.Optional(CONF_IRC): cv.string, + probatio.Optional(CONF_ML): cv.string, + probatio.Optional(CONF_PHONE): cv.string, + probatio.Optional(CONF_TWITTER): cv.string, + probatio.Optional(CONF_SIP): cv.string, + probatio.Optional(CONF_FACEBOOK): cv.string, + probatio.Optional(CONF_IDENTICA): cv.string, + probatio.Optional(CONF_FOURSQUARE): cv.string, + probatio.Optional(CONF_JABBER): cv.string, + probatio.Optional(CONF_ISSUE_MAIL): cv.string, + probatio.Optional(CONF_KEYMASTERS): probatio.All( + cv.ensure_list, [KEYMASTER_SCHEMA], probatio.Length(min=1) ), }, required=False, ) -STATE_SCHEMA = vol.Schema( +STATE_SCHEMA = probatio.Schema( { - vol.Required(CONF_ENTITY_ID): cv.entity_id, - vol.Inclusive(CONF_ICON_CLOSED, CONF_ICONS): cv.url, - vol.Inclusive(CONF_ICON_OPEN, CONF_ICONS): cv.url, + probatio.Required(CONF_ENTITY_ID): cv.entity_id, + probatio.Inclusive(CONF_ICON_CLOSED, CONF_ICONS): cv.url, + probatio.Inclusive(CONF_ICON_OPEN, CONF_ICONS): cv.url, }, required=False, ) -SENSOR_SCHEMA = vol.Schema( - {vol.In(SENSOR_TYPES): [cv.entity_id], cv.string: [cv.entity_id]} +SENSOR_SCHEMA = probatio.Schema( + {probatio.In(SENSOR_TYPES): [cv.entity_id], cv.string: [cv.entity_id]} ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_CONTACT): CONTACT_SCHEMA, - vol.Required(CONF_ISSUE_REPORT_CHANNELS): vol.All( - cv.ensure_list, [vol.In(ISSUE_REPORT_CHANNELS)] + probatio.Required(CONF_CONTACT): CONTACT_SCHEMA, + probatio.Required(CONF_ISSUE_REPORT_CHANNELS): probatio.All( + cv.ensure_list, [probatio.In(ISSUE_REPORT_CHANNELS)] + ), + probatio.Optional(CONF_LOCATION): LOCATION_SCHEMA, + probatio.Required(CONF_LOGO): cv.url, + probatio.Required(CONF_SPACE): cv.string, + probatio.Required(CONF_STATE): STATE_SCHEMA, + probatio.Required(CONF_URL): cv.string, + probatio.Optional(CONF_SENSORS): SENSOR_SCHEMA, + probatio.Optional(CONF_SPACEFED): SPACEFED_SCHEMA, + probatio.Optional(CONF_CAM): probatio.All( + cv.ensure_list, [cv.url], probatio.Length(min=1) ), - vol.Optional(CONF_LOCATION): LOCATION_SCHEMA, - vol.Required(CONF_LOGO): cv.url, - vol.Required(CONF_SPACE): cv.string, - vol.Required(CONF_STATE): STATE_SCHEMA, - vol.Required(CONF_URL): cv.string, - vol.Optional(CONF_SENSORS): SENSOR_SCHEMA, - vol.Optional(CONF_SPACEFED): SPACEFED_SCHEMA, - vol.Optional(CONF_CAM): vol.All( - cv.ensure_list, [cv.url], vol.Length(min=1) + probatio.Optional(CONF_STREAM): STREAM_SCHEMA, + probatio.Optional(CONF_FEEDS): FEEDS_SCHEMA, + probatio.Optional(CONF_CACHE): CACHE_SCHEMA, + probatio.Optional(CONF_PROJECTS): probatio.All( + cv.ensure_list, [cv.url] ), - vol.Optional(CONF_STREAM): STREAM_SCHEMA, - vol.Optional(CONF_FEEDS): FEEDS_SCHEMA, - vol.Optional(CONF_CACHE): CACHE_SCHEMA, - vol.Optional(CONF_PROJECTS): vol.All(cv.ensure_list, [cv.url]), - vol.Optional(CONF_RADIO_SHOW): vol.All( + probatio.Optional(CONF_RADIO_SHOW): probatio.All( cv.ensure_list, [RADIO_SHOW_SCHEMA] ), } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/spc/__init__.py b/homeassistant/components/spc/__init__.py index 2fed542e382a1..727ea84e71549 100644 --- a/homeassistant/components/spc/__init__.py +++ b/homeassistant/components/spc/__init__.py @@ -2,10 +2,10 @@ import logging +import probatio from pyspcwebgw import SpcWebGateway from pyspcwebgw.area import Area from pyspcwebgw.zone import Zone -import voluptuous as vol from homeassistant.const import Platform from homeassistant.core import HomeAssistant @@ -24,16 +24,16 @@ SIGNAL_UPDATE_ALARM = "spc_update_alarm_{}" SIGNAL_UPDATE_SENSOR = "spc_update_sensor_{}" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_WS_URL): cv.string, - vol.Required(CONF_API_URL): cv.string, + probatio.Required(CONF_WS_URL): cv.string, + probatio.Required(CONF_API_URL): cv.string, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/specialized_turbo/config_flow.py b/homeassistant/components/specialized_turbo/config_flow.py index bbc16afb2181d..c724823e44427 100644 --- a/homeassistant/components/specialized_turbo/config_flow.py +++ b/homeassistant/components/specialized_turbo/config_flow.py @@ -7,6 +7,7 @@ from bleak.backends.device import BLEDevice from bleak.exc import BleakError from bleak_retry_connector import establish_connection +import probatio from specialized_turbo import ( BikeAdvertisement, BikeInfo, @@ -24,7 +25,6 @@ unwrap_keystore_key, ) from specialized_turbo.cloud import CloudAuthenticationError, SpecializedCloudClient -import voluptuous as vol from homeassistant.components.bluetooth import ( BluetoothServiceInfoBleak, @@ -257,10 +257,10 @@ async def async_step_account( return self.async_show_form( step_id="account", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_EMAIL): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_EMAIL): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, @@ -299,7 +299,7 @@ async def async_step_manual_key( return self.async_show_form( step_id="manual_key", - data_schema=vol.Schema({vol.Required(CONF_WRAPPED_KEY): str}), + data_schema=probatio.Schema({probatio.Required(CONF_WRAPPED_KEY): str}), errors=errors, ) @@ -381,16 +381,16 @@ def _requires_encryption(self) -> bool: and self._advertisement.encryption == ProtocolEncryptionMethod.AES_CTR ) - def _device_schema(self, *, include_address: bool) -> vol.Schema: - fields: dict[vol.Marker, Any] = {} + def _device_schema(self, *, include_address: bool) -> probatio.Schema: + fields: dict[probatio.Marker, Any] = {} if include_address: - fields[vol.Required(CONF_ADDRESS)] = vol.In( + fields[probatio.Required(CONF_ADDRESS)] = probatio.In( { address: f"{info.name or 'Specialized Turbo'} ({address})" for address, info in self._discovered_devices.items() } ) - return vol.Schema(fields) + return probatio.Schema(fields) def _create_or_update_entry( self, diff --git a/homeassistant/components/speedtestdotnet/config_flow.py b/homeassistant/components/speedtestdotnet/config_flow.py index 0b32db20828a8..d93ed0bbdbdae 100644 --- a/homeassistant/components/speedtestdotnet/config_flow.py +++ b/homeassistant/components/speedtestdotnet/config_flow.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigFlow, @@ -78,12 +78,12 @@ async def async_step_init( self._servers = self.config_entry.runtime_data.servers options = { - vol.Optional( + probatio.Optional( CONF_SERVER_NAME, default=self.config_entry.options.get(CONF_SERVER_NAME, DEFAULT_SERVER), - ): vol.In(self._servers.keys()), + ): probatio.In(self._servers.keys()), } return self.async_show_form( - step_id="init", data_schema=vol.Schema(options), errors=errors + step_id="init", data_schema=probatio.Schema(options), errors=errors ) diff --git a/homeassistant/components/splunk/__init__.py b/homeassistant/components/splunk/__init__.py index b373e75443359..29136ba2447e0 100644 --- a/homeassistant/components/splunk/__init__.py +++ b/homeassistant/components/splunk/__init__.py @@ -8,7 +8,7 @@ from aiohttp import ClientConnectionError, ClientResponseError from hass_splunk import SplunkPayloadError, hass_splunk -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry from homeassistant.const import ( @@ -52,21 +52,21 @@ DATA_FILTER: HassKey[EntityFilter] = HassKey(DOMAIN) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Optional(CONF_TOKEN): cv.string, - vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, - vol.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_FILTER, default={}): FILTER_SCHEMA, + probatio.Optional(CONF_TOKEN): cv.string, + probatio.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, + probatio.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_FILTER, default={}): FILTER_SCHEMA, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/splunk/config_flow.py b/homeassistant/components/splunk/config_flow.py index 437b8ad24e6e1..542224ee7dfd8 100644 --- a/homeassistant/components/splunk/config_flow.py +++ b/homeassistant/components/splunk/config_flow.py @@ -6,7 +6,7 @@ from typing import Any, override from hass_splunk import hass_splunk -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -51,14 +51,14 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_TOKEN): str, - vol.Required(CONF_HOST): str, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): int, - vol.Optional(CONF_SSL, default=DEFAULT_SSL): bool, - vol.Optional(CONF_VERIFY_SSL, default=True): bool, - vol.Optional(CONF_NAME): str, + probatio.Required(CONF_TOKEN): str, + probatio.Required(CONF_HOST): str, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Optional(CONF_SSL, default=DEFAULT_SSL): bool, + probatio.Optional(CONF_VERIFY_SSL, default=True): bool, + probatio.Optional(CONF_NAME): str, } ), errors=errors, @@ -104,14 +104,14 @@ async def async_step_reconfigure( return self.async_show_form( step_id="reconfigure", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_TOKEN): str, - vol.Required(CONF_HOST): str, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): int, - vol.Optional(CONF_SSL, default=DEFAULT_SSL): bool, - vol.Optional(CONF_VERIFY_SSL, default=True): bool, - vol.Optional(CONF_NAME): str, + probatio.Required(CONF_TOKEN): str, + probatio.Required(CONF_HOST): str, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Optional(CONF_SSL, default=DEFAULT_SSL): bool, + probatio.Optional(CONF_VERIFY_SSL, default=True): bool, + probatio.Optional(CONF_NAME): str, } ), self._get_reconfigure_entry().data, @@ -146,7 +146,7 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema({vol.Required(CONF_TOKEN): str}), + data_schema=probatio.Schema({probatio.Required(CONF_TOKEN): str}), errors=errors, ) diff --git a/homeassistant/components/sql/__init__.py b/homeassistant/components/sql/__init__.py index e45eb80627053..db2d40dc2d9be 100644 --- a/homeassistant/components/sql/__init__.py +++ b/homeassistant/components/sql/__init__.py @@ -3,7 +3,7 @@ import logging from typing import Any -import voluptuous as vol +import probatio from homeassistant.components.recorder import CONF_DB_URL, get_instance from homeassistant.components.sensor import ( @@ -43,30 +43,30 @@ _LOGGER = logging.getLogger(__name__) -QUERY_SCHEMA = vol.Schema( +QUERY_SCHEMA = probatio.Schema( { - vol.Required(CONF_COLUMN_NAME): cv.string, - vol.Required(CONF_NAME): cv.template, - vol.Required(CONF_QUERY): vol.All( + probatio.Required(CONF_COLUMN_NAME): cv.string, + probatio.Required(CONF_NAME): cv.template, + probatio.Required(CONF_QUERY): probatio.All( cv.template, ValueTemplate.from_template, validate_sql_select ), - vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, - vol.Optional(CONF_VALUE_TEMPLATE): vol.All( + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, + probatio.Optional(CONF_VALUE_TEMPLATE): probatio.All( cv.template, ValueTemplate.from_template ), - vol.Optional(CONF_UNIQUE_ID): cv.string, - vol.Optional(CONF_DB_URL): cv.string, - vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, - vol.Optional(CONF_STATE_CLASS): STATE_CLASSES_SCHEMA, - vol.Optional(CONF_AVAILABILITY): cv.template, - vol.Optional(CONF_ICON): cv.template, - vol.Optional(CONF_PICTURE): cv.template, + probatio.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Optional(CONF_DB_URL): cv.string, + probatio.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_STATE_CLASS): STATE_CLASSES_SCHEMA, + probatio.Optional(CONF_AVAILABILITY): cv.template, + probatio.Optional(CONF_ICON): cv.template, + probatio.Optional(CONF_PICTURE): cv.template, } ) -CONFIG_SCHEMA = vol.Schema( - {vol.Optional(DOMAIN): vol.All(cv.ensure_list, [QUERY_SCHEMA])}, - extra=vol.ALLOW_EXTRA, +CONFIG_SCHEMA = probatio.Schema( + {probatio.Optional(DOMAIN): probatio.All(cv.ensure_list, [QUERY_SCHEMA])}, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/sql/config_flow.py b/homeassistant/components/sql/config_flow.py index ad5e1964ced32..3197b20226702 100644 --- a/homeassistant/components/sql/config_flow.py +++ b/homeassistant/components/sql/config_flow.py @@ -3,11 +3,11 @@ import logging from typing import Any, override +import probatio import sqlalchemy from sqlalchemy.engine import Engine, Result from sqlalchemy.exc import MultipleResultsFound, NoSuchColumnError, SQLAlchemyError from sqlalchemy.orm import Session, scoped_session, sessionmaker -import voluptuous as vol from homeassistant.components.recorder import CONF_DB_URL, get_instance from homeassistant.components.sensor import CONF_STATE_CLASS @@ -43,19 +43,21 @@ _LOGGER = logging.getLogger(__name__) -OPTIONS_SCHEMA: vol.Schema = vol.Schema( +OPTIONS_SCHEMA: probatio.Schema = probatio.Schema( { - vol.Required(CONF_QUERY): selector.TemplateSelector(), - vol.Required(CONF_COLUMN_NAME): selector.TextSelector(), - vol.Required(CONF_ADDITIONAL_OPTIONS): section( - vol.Schema( + probatio.Required(CONF_QUERY): selector.TemplateSelector(), + probatio.Required(CONF_COLUMN_NAME): selector.TextSelector(), + probatio.Required(CONF_ADDITIONAL_OPTIONS): section( + probatio.Schema( { - vol.Optional(CONF_VALUE_TEMPLATE): selector.TemplateSelector(), - vol.Optional(CONF_UNIT_OF_MEASUREMENT): selector.TextSelector(), - vol.Optional(CONF_DEVICE_CLASS): selector.DeviceClassSelector( + probatio.Optional(CONF_VALUE_TEMPLATE): selector.TemplateSelector(), + probatio.Optional( + CONF_UNIT_OF_MEASUREMENT + ): selector.TextSelector(), + probatio.Optional(CONF_DEVICE_CLASS): selector.DeviceClassSelector( selector.DeviceClassSelectorConfig(domain=Platform.SENSOR) ), - vol.Optional(CONF_STATE_CLASS): selector.StateClassSelector(), + probatio.Optional(CONF_STATE_CLASS): selector.StateClassSelector(), } ), {"collapsed": True}, @@ -63,12 +65,14 @@ } ) -CONFIG_SCHEMA: vol.Schema = vol.Schema( +CONFIG_SCHEMA: probatio.Schema = probatio.Schema( { # Approved exemption: user names the SQL query sensor # pylint: disable-next=home-assistant-config-flow-name-field - vol.Required(CONF_NAME, default="Select SQL Query"): selector.TextSelector(), - vol.Optional(CONF_DB_URL): selector.TextSelector(), + probatio.Required( + CONF_NAME, default="Select SQL Query" + ): selector.TextSelector(), + probatio.Optional(CONF_DB_URL): selector.TextSelector(), } ) diff --git a/homeassistant/components/sql/services.py b/homeassistant/components/sql/services.py index 6df6b76609dbe..55d9c64275eff 100644 --- a/homeassistant/components/sql/services.py +++ b/homeassistant/components/sql/services.py @@ -2,10 +2,10 @@ import logging +import probatio from sqlalchemy.engine import Result from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.orm import Session -import voluptuous as vol from homeassistant.components.recorder import CONF_DB_URL, get_instance from homeassistant.core import ( @@ -35,12 +35,12 @@ _LOGGER = logging.getLogger(__name__) SERVICE_QUERY = "query" -SERVICE_QUERY_SCHEMA = vol.Schema( +SERVICE_QUERY_SCHEMA = probatio.Schema( { - vol.Required(CONF_QUERY): vol.All( + probatio.Required(CONF_QUERY): probatio.All( cv.template, ValueTemplate.from_template, validate_sql_select ), - vol.Optional(CONF_DB_URL): cv.string, + probatio.Optional(CONF_DB_URL): cv.string, } ) diff --git a/homeassistant/components/sql/util.py b/homeassistant/components/sql/util.py index 222ce4d196e2f..ce60ce4151929 100644 --- a/homeassistant/components/sql/util.py +++ b/homeassistant/components/sql/util.py @@ -6,6 +6,7 @@ import logging from typing import Any +import probatio import sqlalchemy from sqlalchemy import lambda_stmt from sqlalchemy.exc import SQLAlchemyError @@ -13,7 +14,6 @@ from sqlalchemy.sql.lambdas import StatementLambdaElement from sqlalchemy.util import LRUCache import sqlparse -import voluptuous as vol from homeassistant.components.recorder import SupportedDialect, get_instance from homeassistant.const import EVENT_HOMEASSISTANT_STOP @@ -51,7 +51,7 @@ def validate_sql_select(value: Template) -> Template: assert value.hass check_and_render_sql_query(value.hass, value) except (TemplateError, InvalidSqlQuery) as err: - raise vol.Invalid(str(err)) from err + raise probatio.Invalid(str(err)) from err return value diff --git a/homeassistant/components/squeezebox/config_flow.py b/homeassistant/components/squeezebox/config_flow.py index 1584838a19a1f..142903ac146bd 100644 --- a/homeassistant/components/squeezebox/config_flow.py +++ b/homeassistant/components/squeezebox/config_flow.py @@ -5,8 +5,8 @@ import logging from typing import TYPE_CHECKING, Any, override +import probatio from pysqueezebox import Server, async_discover -import voluptuous as vol from homeassistant.components.media_player import DOMAIN as MP_DOMAIN from homeassistant.config_entries import ( @@ -44,21 +44,21 @@ TIMEOUT = 5 -FULL_EDIT_SCHEMA = vol.Schema( +FULL_EDIT_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, - vol.Optional(CONF_USERNAME): str, - vol.Optional(CONF_PASSWORD): str, - vol.Optional(CONF_HTTPS, default=False): bool, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Optional(CONF_USERNAME): str, + probatio.Optional(CONF_PASSWORD): str, + probatio.Optional(CONF_HTTPS, default=False): bool, } ) -SHORT_EDIT_SCHEMA = vol.Schema( +SHORT_EDIT_SCHEMA = probatio.Schema( { - vol.Optional(CONF_USERNAME): str, - vol.Optional(CONF_PASSWORD): str, - vol.Optional(CONF_HTTPS, default=False): bool, + probatio.Optional(CONF_USERNAME): str, + probatio.Optional(CONF_PASSWORD): str, + probatio.Optional(CONF_HTTPS, default=False): bool, } ) @@ -173,7 +173,9 @@ async def async_step_choose_server( } return self.async_show_form( step_id="choose_server", - data_schema=vol.Schema({vol.Required(CONF_SERVER_LIST): vol.In(_options)}), + data_schema=probatio.Schema( + {probatio.Required(CONF_SERVER_LIST): probatio.In(_options)} + ), ) @override @@ -349,19 +351,19 @@ async def async_step_dhcp( return await self.async_step_user() -OPTIONS_SCHEMA = vol.Schema( +OPTIONS_SCHEMA = probatio.Schema( { - vol.Required(CONF_BROWSE_LIMIT): vol.All( + probatio.Required(CONF_BROWSE_LIMIT): probatio.All( NumberSelector( NumberSelectorConfig(min=1, max=65534, mode=NumberSelectorMode.BOX) ), - vol.Coerce(int), + probatio.Coerce(int), ), - vol.Required(CONF_VOLUME_STEP): vol.All( + probatio.Required(CONF_VOLUME_STEP): probatio.All( NumberSelector( NumberSelectorConfig(min=1, max=20, mode=NumberSelectorMode.SLIDER) ), - vol.Coerce(int), + probatio.Coerce(int), ), } ) diff --git a/homeassistant/components/squeezebox/services.py b/homeassistant/components/squeezebox/services.py index a2386b8ed9328..65a951a2b5c16 100644 --- a/homeassistant/components/squeezebox/services.py +++ b/homeassistant/components/squeezebox/services.py @@ -1,6 +1,6 @@ """Support for interfacing to the SqueezeBox API.""" -import voluptuous as vol +import probatio from homeassistant.components.media_player import DOMAIN as MEDIA_PLAYER_DOMAIN from homeassistant.const import ATTR_COMMAND @@ -24,9 +24,9 @@ def async_setup_services(hass: HomeAssistant) -> None: SERVICE_CALL_METHOD, entity_domain=MEDIA_PLAYER_DOMAIN, schema={ - vol.Required(ATTR_COMMAND): cv.string, - vol.Optional(ATTR_PARAMETERS): vol.All( - cv.ensure_list, vol.Length(min=1), [cv.string] + probatio.Required(ATTR_COMMAND): cv.string, + probatio.Optional(ATTR_PARAMETERS): probatio.All( + cv.ensure_list, probatio.Length(min=1), [cv.string] ), }, func="async_call_method", @@ -37,9 +37,9 @@ def async_setup_services(hass: HomeAssistant) -> None: SERVICE_CALL_QUERY, entity_domain=MEDIA_PLAYER_DOMAIN, schema={ - vol.Required(ATTR_COMMAND): cv.string, - vol.Optional(ATTR_PARAMETERS): vol.All( - cv.ensure_list, vol.Length(min=1), [cv.string] + probatio.Required(ATTR_COMMAND): cv.string, + probatio.Optional(ATTR_PARAMETERS): probatio.All( + cv.ensure_list, probatio.Length(min=1), [cv.string] ), }, func="async_call_query", diff --git a/homeassistant/components/srp_energy/config_flow.py b/homeassistant/components/srp_energy/config_flow.py index c4231d9db827f..40725682db88e 100644 --- a/homeassistant/components/srp_energy/config_flow.py +++ b/homeassistant/components/srp_energy/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from srpenergy.client import SrpEnergyClient -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_RECONFIGURE, @@ -81,21 +81,21 @@ async def async_step_user( return self.async_show_form( step_id="user", data_schema=self.add_suggested_values_to_schema( - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_ID): ( + probatio.Required(CONF_ID): ( str if self.source == SOURCE_USER else self._get_reconfigure_entry().data[CONF_ID] ), # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Required( + probatio.Required( CONF_NAME, default=self.hass.config.location_name ): str, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Optional(CONF_IS_TOU, default=False): bool, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Optional(CONF_IS_TOU, default=False): bool, } ), suggested_values=( diff --git a/homeassistant/components/ssdp/websocket_api.py b/homeassistant/components/ssdp/websocket_api.py index 30e2882562396..b3a55e57c4383 100644 --- a/homeassistant/components/ssdp/websocket_api.py +++ b/homeassistant/components/ssdp/websocket_api.py @@ -3,7 +3,7 @@ from dataclasses import asdict from typing import Any, Final -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.core import HassJob, HomeAssistant, callback @@ -29,7 +29,7 @@ def async_setup(hass: HomeAssistant) -> None: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "ssdp/subscribe_discovery", + probatio.Required("type"): "ssdp/subscribe_discovery", } ) @websocket_api.async_response diff --git a/homeassistant/components/starline/config_flow.py b/homeassistant/components/starline/config_flow.py index f57c76bcfa1bd..f22cd328ad7ed 100644 --- a/homeassistant/components/starline/config_flow.py +++ b/homeassistant/components/starline/config_flow.py @@ -2,8 +2,8 @@ from typing import TYPE_CHECKING, override +import probatio from starline import StarlineAuth -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -107,13 +107,13 @@ def _async_form_auth_app(self, error: str | None = None) -> ConfigFlowResult: return self.async_show_form( step_id="auth_app", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( - CONF_APP_ID, default=self._app_id or vol.UNDEFINED + probatio.Required( + CONF_APP_ID, default=self._app_id or probatio.UNDEFINED ): str, - vol.Required( - CONF_APP_SECRET, default=self._app_secret or vol.UNDEFINED + probatio.Required( + CONF_APP_SECRET, default=self._app_secret or probatio.UNDEFINED ): str, } ), @@ -132,13 +132,13 @@ def _async_form_auth_user(self, error: str | None = None) -> ConfigFlowResult: return self.async_show_form( step_id="auth_user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( - CONF_USERNAME, default=self._username or vol.UNDEFINED + probatio.Required( + CONF_USERNAME, default=self._username or probatio.UNDEFINED ): str, - vol.Required( - CONF_PASSWORD, default=self._password or vol.UNDEFINED + probatio.Required( + CONF_PASSWORD, default=self._password or probatio.UNDEFINED ): str, } ), @@ -154,10 +154,10 @@ def _async_form_auth_mfa(self, error: str | None = None) -> ConfigFlowResult: return self.async_show_form( step_id="auth_mfa", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( - CONF_MFA_CODE, default=self._mfa_code or vol.UNDEFINED + probatio.Required( + CONF_MFA_CODE, default=self._mfa_code or probatio.UNDEFINED ): str } ), @@ -174,10 +174,11 @@ def _async_form_auth_captcha(self, error: str | None = None) -> ConfigFlowResult return self.async_show_form( step_id="auth_captcha", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( - CONF_CAPTCHA_CODE, default=self._captcha_code or vol.UNDEFINED + probatio.Required( + CONF_CAPTCHA_CODE, + default=self._captcha_code or probatio.UNDEFINED, ): str } ), diff --git a/homeassistant/components/starline/services.py b/homeassistant/components/starline/services.py index 2ae893b27927b..46c5d6f1d11de 100644 --- a/homeassistant/components/starline/services.py +++ b/homeassistant/components/starline/services.py @@ -1,6 +1,6 @@ """Services for the StarLine integration.""" -import voluptuous as vol +import probatio from homeassistant.const import CONF_SCAN_INTERVAL from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -13,12 +13,20 @@ SERVICE_UPDATE_STATE, ) -SET_SCAN_INTERVAL_SCHEMA = vol.Schema( - {vol.Required(CONF_SCAN_INTERVAL): vol.All(vol.Coerce(int), vol.Range(min=10))} +SET_SCAN_INTERVAL_SCHEMA = probatio.Schema( + { + probatio.Required(CONF_SCAN_INTERVAL): probatio.All( + probatio.Coerce(int), probatio.Range(min=10) + ) + } ) -SET_SCAN_OBD_INTERVAL_SCHEMA = vol.Schema( - {vol.Required(CONF_SCAN_INTERVAL): vol.All(vol.Coerce(int), vol.Range(min=180))} +SET_SCAN_OBD_INTERVAL_SCHEMA = probatio.Schema( + { + probatio.Required(CONF_SCAN_INTERVAL): probatio.All( + probatio.Coerce(int), probatio.Range(min=180) + ) + } ) diff --git a/homeassistant/components/starlingbank/sensor.py b/homeassistant/components/starlingbank/sensor.py index 1408a3194d7b1..e75f16a8bfaa5 100644 --- a/homeassistant/components/starlingbank/sensor.py +++ b/homeassistant/components/starlingbank/sensor.py @@ -4,9 +4,9 @@ import logging from typing import override +import probatio import requests from starlingbank import StarlingAccount -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -32,19 +32,19 @@ SCAN_INTERVAL = timedelta(seconds=180) -ACCOUNT_SCHEMA = vol.Schema( +ACCOUNT_SCHEMA = probatio.Schema( { - vol.Required(CONF_ACCESS_TOKEN): cv.string, - vol.Optional(CONF_BALANCE_TYPES, default=BALANCE_TYPES): vol.All( - cv.ensure_list, [vol.In(BALANCE_TYPES)] + probatio.Required(CONF_ACCESS_TOKEN): cv.string, + probatio.Optional(CONF_BALANCE_TYPES, default=BALANCE_TYPES): probatio.All( + cv.ensure_list, [probatio.In(BALANCE_TYPES)] ), - vol.Optional(CONF_NAME, default=DEFAULT_ACCOUNT_NAME): cv.string, - vol.Optional(CONF_SANDBOX, default=DEFAULT_SANDBOX): cv.boolean, + probatio.Optional(CONF_NAME, default=DEFAULT_ACCOUNT_NAME): cv.string, + probatio.Optional(CONF_SANDBOX, default=DEFAULT_SANDBOX): cv.boolean, } ) PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_ACCOUNTS): vol.Schema([ACCOUNT_SCHEMA])} + {probatio.Required(CONF_ACCOUNTS): probatio.Schema([ACCOUNT_SCHEMA])} ) diff --git a/homeassistant/components/starlink/config_flow.py b/homeassistant/components/starlink/config_flow.py index 5a229eae21540..c14a3e03b71f0 100644 --- a/homeassistant/components/starlink/config_flow.py +++ b/homeassistant/components/starlink/config_flow.py @@ -2,16 +2,16 @@ from typing import Any, override +import probatio from starlink_grpc import ChannelContext, GrpcError, get_id -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_IP_ADDRESS from .const import DOMAIN -CONFIG_SCHEMA = vol.Schema( - {vol.Required(CONF_IP_ADDRESS, default="192.168.100.1:9200"): str} +CONFIG_SCHEMA = probatio.Schema( + {probatio.Required(CONF_IP_ADDRESS, default="192.168.100.1:9200"): str} ) diff --git a/homeassistant/components/startca/sensor.py b/homeassistant/components/startca/sensor.py index 68a0a245838f2..afab0e2203ab0 100644 --- a/homeassistant/components/startca/sensor.py +++ b/homeassistant/components/startca/sensor.py @@ -7,7 +7,7 @@ from xml.parsers.expat import ExpatError from aiohttp import ClientSession -import voluptuous as vol +import probatio import xmltodict from homeassistant.components.sensor import ( @@ -128,12 +128,12 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_MONITORED_VARIABLES): vol.All( - cv.ensure_list, [vol.In(SENSOR_KEYS)] + probatio.Required(CONF_MONITORED_VARIABLES): probatio.All( + cv.ensure_list, [probatio.In(SENSOR_KEYS)] ), - vol.Required(CONF_API_KEY): cv.string, - vol.Required(CONF_TOTAL_BANDWIDTH): cv.positive_int, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_TOTAL_BANDWIDTH): cv.positive_int, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/statistics/config_flow.py b/homeassistant/components/statistics/config_flow.py index 8d244e1846889..79bdca4e03dbe 100644 --- a/homeassistant/components/statistics/config_flow.py +++ b/homeassistant/components/statistics/config_flow.py @@ -4,7 +4,7 @@ from datetime import timedelta from typing import Any, cast, override -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.components.binary_sensor import DOMAIN as BINARY_SENSOR_DOMAIN @@ -49,7 +49,9 @@ ) -async def get_state_characteristics(handler: SchemaCommonFlowHandler) -> vol.Schema: +async def get_state_characteristics( + handler: SchemaCommonFlowHandler, +) -> probatio.Schema: """Return schema with state characteristics.""" is_binary = ( split_entity_id(handler.options[CONF_ENTITY_ID])[0] == BINARY_SENSOR_DOMAIN @@ -59,9 +61,9 @@ async def get_state_characteristics(handler: SchemaCommonFlowHandler) -> vol.Sch else: options = list(STATS_NUMERIC_SUPPORT) - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_STATE_CHARACTERISTIC): SelectSelector( + probatio.Required(CONF_STATE_CHARACTERISTIC): SelectSelector( SelectSelectorConfig( options=list(options), translation_key=CONF_STATE_CHARACTERISTIC, @@ -94,20 +96,20 @@ async def validate_options( return user_input -DATA_SCHEMA_SETUP = vol.Schema( +DATA_SCHEMA_SETUP = probatio.Schema( { - vol.Required(CONF_NAME, default=DEFAULT_NAME): TextSelector(), - vol.Required(CONF_ENTITY_ID): EntitySelector( + probatio.Required(CONF_NAME, default=DEFAULT_NAME): TextSelector(), + probatio.Required(CONF_ENTITY_ID): EntitySelector( EntitySelectorConfig(domain=[BINARY_SENSOR_DOMAIN, SENSOR_DOMAIN]) ), } ) -DATA_SCHEMA_OPTIONS = vol.Schema( +DATA_SCHEMA_OPTIONS = probatio.Schema( { - vol.Optional(CONF_ENTITY_ID): EntitySelector( + probatio.Optional(CONF_ENTITY_ID): EntitySelector( EntitySelectorConfig(read_only=True) ), - vol.Optional(CONF_STATE_CHARACTERISTIC): SelectSelector( + probatio.Optional(CONF_STATE_CHARACTERISTIC): SelectSelector( SelectSelectorConfig( options=list( set(list(STATS_BINARY_SUPPORT) + list(STATS_NUMERIC_SUPPORT)) @@ -117,17 +119,17 @@ async def validate_options( read_only=True, ) ), - vol.Optional(CONF_SAMPLES_MAX_BUFFER_SIZE): NumberSelector( + probatio.Optional(CONF_SAMPLES_MAX_BUFFER_SIZE): NumberSelector( NumberSelectorConfig(min=1, step=1, mode=NumberSelectorMode.BOX) ), - vol.Optional(CONF_MAX_AGE): DurationSelector( + probatio.Optional(CONF_MAX_AGE): DurationSelector( DurationSelectorConfig(enable_day=False, allow_negative=False) ), - vol.Optional(CONF_KEEP_LAST_SAMPLE, default=False): BooleanSelector(), - vol.Optional(CONF_PERCENTILE, default=50): NumberSelector( + probatio.Optional(CONF_KEEP_LAST_SAMPLE, default=False): BooleanSelector(), + probatio.Optional(CONF_PERCENTILE, default=50): NumberSelector( NumberSelectorConfig(min=1, max=99, step=1, mode=NumberSelectorMode.BOX) ), - vol.Optional(CONF_PRECISION, default=DEFAULT_PRECISION): NumberSelector( + probatio.Optional(CONF_PRECISION, default=DEFAULT_PRECISION): NumberSelector( NumberSelectorConfig(min=0, step=1, mode=NumberSelectorMode.BOX) ), } @@ -179,10 +181,10 @@ async def async_setup_preview(hass: HomeAssistant) -> None: @websocket_api.websocket_command( { - vol.Required("type"): "statistics/start_preview", - vol.Required("flow_id"): str, - vol.Required("flow_type"): vol.Any("config_flow", "options_flow"), - vol.Required("user_input"): dict, + probatio.Required("type"): "statistics/start_preview", + probatio.Required("flow_id"): str, + probatio.Required("flow_type"): probatio.Any("config_flow", "options_flow"), + probatio.Required("user_input"): dict, } ) @websocket_api.async_response diff --git a/homeassistant/components/statistics/sensor.py b/homeassistant/components/statistics/sensor.py index d76b8b3df78c8..4b59ff461fcfa 100644 --- a/homeassistant/components/statistics/sensor.py +++ b/homeassistant/components/statistics/sensor.py @@ -10,7 +10,7 @@ import time from typing import Any, cast, override -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import DOMAIN as BINARY_SENSOR_DOMAIN from homeassistant.components.recorder import get_instance, history @@ -531,7 +531,7 @@ def valid_state_characteristic_configuration(config: dict[str, Any]) -> dict[str if (is_binary and characteristic not in STATS_BINARY_SUPPORT) or ( not is_binary and characteristic not in STATS_NUMERIC_SUPPORT ): - raise vol.ValueInvalid( + raise probatio.ValueInvalid( f"The configured characteristic '{characteristic}' is not supported " "for the configured source sensor" ) @@ -545,7 +545,7 @@ def valid_boundary_configuration(config: dict[str, Any]) -> dict[str, Any]: config.get(CONF_SAMPLES_MAX_BUFFER_SIZE) is None and config.get(CONF_MAX_AGE) is None ): - raise vol.RequiredFieldInvalid( + raise probatio.RequiredFieldInvalid( "The sensor configuration must provide 'max_age' and/or 'sampling_size'" ) return config @@ -555,7 +555,7 @@ def valid_keep_last_sample(config: dict[str, Any]) -> dict[str, Any]: """Validate that if keep_last_sample is set, max_age must also be set.""" if config.get(CONF_KEEP_LAST_SAMPLE) is True and config.get(CONF_MAX_AGE) is None: - raise vol.RequiredFieldInvalid( + raise probatio.RequiredFieldInvalid( "The sensor configuration must provide 'max_age'" " if 'keep_last_sample' is True" ) @@ -564,22 +564,24 @@ def valid_keep_last_sample(config: dict[str, Any]) -> dict[str, Any]: _PLATFORM_SCHEMA_BASE = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_UNIQUE_ID): cv.string, - vol.Required(CONF_STATE_CHARACTERISTIC): cv.string, - vol.Optional(CONF_SAMPLES_MAX_BUFFER_SIZE): vol.All( - vol.Coerce(int), vol.Range(min=1) + probatio.Required(CONF_ENTITY_ID): cv.entity_id, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Required(CONF_STATE_CHARACTERISTIC): cv.string, + probatio.Optional(CONF_SAMPLES_MAX_BUFFER_SIZE): probatio.All( + probatio.Coerce(int), probatio.Range(min=1) ), - vol.Optional(CONF_MAX_AGE): cv.time_period, - vol.Optional(CONF_KEEP_LAST_SAMPLE, default=False): cv.boolean, - vol.Optional(CONF_PRECISION, default=DEFAULT_PRECISION): vol.Coerce(int), - vol.Optional(CONF_PERCENTILE, default=50): vol.All( - vol.Coerce(int), vol.Range(min=1, max=99) + probatio.Optional(CONF_MAX_AGE): cv.time_period, + probatio.Optional(CONF_KEEP_LAST_SAMPLE, default=False): cv.boolean, + probatio.Optional(CONF_PRECISION, default=DEFAULT_PRECISION): probatio.Coerce( + int + ), + probatio.Optional(CONF_PERCENTILE, default=50): probatio.All( + probatio.Coerce(int), probatio.Range(min=1, max=99) ), } ) -PLATFORM_SCHEMA = vol.All( +PLATFORM_SCHEMA = probatio.All( _PLATFORM_SCHEMA_BASE, valid_state_characteristic_configuration, valid_boundary_configuration, diff --git a/homeassistant/components/statsd/__init__.py b/homeassistant/components/statsd/__init__.py index 4e8e5b7f9423e..0f4d4d8b0296e 100644 --- a/homeassistant/components/statsd/__init__.py +++ b/homeassistant/components/statsd/__init__.py @@ -2,8 +2,8 @@ import logging +import probatio import statsd -import voluptuous as vol from homeassistant.const import CONF_HOST, CONF_PORT, CONF_PREFIX, EVENT_STATE_CHANGED from homeassistant.core import HomeAssistant @@ -22,22 +22,22 @@ DEFAULT_RATE = 1 DOMAIN = "statsd" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_HOST, default=DEFAULT_HOST): cv.string, - vol.Optional(CONF_ATTR, default=False): cv.boolean, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_PREFIX, default=DEFAULT_PREFIX): cv.string, - vol.Optional(CONF_RATE, default=DEFAULT_RATE): vol.All( - vol.Coerce(int), vol.Range(min=1) + probatio.Required(CONF_HOST, default=DEFAULT_HOST): cv.string, + probatio.Optional(CONF_ATTR, default=False): cv.boolean, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_PREFIX, default=DEFAULT_PREFIX): cv.string, + probatio.Optional(CONF_RATE, default=DEFAULT_RATE): probatio.All( + probatio.Coerce(int), probatio.Range(min=1) ), - vol.Optional(CONF_VALUE_MAP): dict, + probatio.Optional(CONF_VALUE_MAP): dict, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/steam_online/config_flow.py b/homeassistant/components/steam_online/config_flow.py index b70f56b6b4f60..20a047cf81c9a 100644 --- a/homeassistant/components/steam_online/config_flow.py +++ b/homeassistant/components/steam_online/config_flow.py @@ -5,8 +5,8 @@ import logging from typing import TYPE_CHECKING, Any, override +import probatio import steam.api -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -34,13 +34,13 @@ # To avoid too long request URIs, the amount of ids to request is limited MAX_IDS_TO_REQUEST = 275 -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_KEY): str, - vol.Required(CONF_ACCOUNT): str, + probatio.Required(CONF_API_KEY): str, + probatio.Required(CONF_ACCOUNT): str, } ) -STEP_REAUTH_DATA_SCHEMA = vol.Schema({vol.Required(CONF_API_KEY): str}) +STEP_REAUTH_DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_API_KEY): str}) def validate_input(user_input: dict[str, str]) -> dict[str, str | int]: @@ -267,9 +267,9 @@ def get_accounts() -> list[dict[str, Any]]: return self.async_show_form( step_id="user", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_ACCOUNT): SelectSelector( + probatio.Required(CONF_ACCOUNT): SelectSelector( SelectSelectorConfig(options=options, sort=True) ) } diff --git a/homeassistant/components/steamist/config_flow.py b/homeassistant/components/steamist/config_flow.py index 9bafc13e0302a..49ec9b4c025a9 100644 --- a/homeassistant/components/steamist/config_flow.py +++ b/homeassistant/components/steamist/config_flow.py @@ -5,7 +5,7 @@ from aiosteamist import Steamist from discovery30303 import Device30303, normalize_mac -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigEntryState, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_DEVICE, CONF_HOST, CONF_MODEL, CONF_NAME @@ -157,7 +157,9 @@ async def async_step_pick_device( return self.async_abort(reason="no_devices_found") return self.async_show_form( step_id="pick_device", - data_schema=vol.Schema({vol.Required(CONF_DEVICE): vol.In(devices_name)}), + data_schema=probatio.Schema( + {probatio.Required(CONF_DEVICE): probatio.In(devices_name)} + ), ) @override @@ -189,6 +191,8 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Optional(CONF_HOST, default=""): str}), + data_schema=probatio.Schema( + {probatio.Optional(CONF_HOST, default=""): str} + ), errors=errors, ) diff --git a/homeassistant/components/stiebel_eltron/config_flow.py b/homeassistant/components/stiebel_eltron/config_flow.py index 4e07dc185605c..beaa4587def0d 100644 --- a/homeassistant/components/stiebel_eltron/config_flow.py +++ b/homeassistant/components/stiebel_eltron/config_flow.py @@ -4,8 +4,8 @@ from typing import Any, override from modbus_connection import ModbusTcpParams +import probatio from pystiebeleltron import StiebelEltronModbusError, get_controller_model -import voluptuous as vol from homeassistant.components.modbus import async_get_temporary_unit from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -25,14 +25,14 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): TextSelector(), - vol.Required(CONF_PORT, default=DEFAULT_PORT): vol.All( + probatio.Required(CONF_HOST): TextSelector(), + probatio.Required(CONF_PORT, default=DEFAULT_PORT): probatio.All( NumberSelector( NumberSelectorConfig(min=1, max=65535, mode=NumberSelectorMode.BOX) ), - vol.Coerce(int), + probatio.Coerce(int), ), } ) diff --git a/homeassistant/components/stookwijzer/config_flow.py b/homeassistant/components/stookwijzer/config_flow.py index 27095e508426f..e566b4842b4af 100644 --- a/homeassistant/components/stookwijzer/config_flow.py +++ b/homeassistant/components/stookwijzer/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from stookwijzer import Stookwijzer -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_LATITUDE, CONF_LOCATION, CONF_LONGITUDE @@ -38,9 +38,9 @@ async def async_step_user( return self.async_show_form( step_id="user", errors=errors, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_LOCATION, default={ CONF_LATITUDE: self.hass.config.latitude, diff --git a/homeassistant/components/stookwijzer/services.py b/homeassistant/components/stookwijzer/services.py index 83af0cd20ac2e..cea26f30ec153 100644 --- a/homeassistant/components/stookwijzer/services.py +++ b/homeassistant/components/stookwijzer/services.py @@ -2,7 +2,7 @@ from typing import Required, TypedDict, cast -import voluptuous as vol +import probatio from homeassistant.const import ATTR_CONFIG_ENTRY_ID from homeassistant.core import ( @@ -17,9 +17,9 @@ from .const import DOMAIN, SERVICE_GET_FORECAST from .coordinator import StookwijzerConfigEntry -SERVICE_GET_FORECAST_SCHEMA = vol.Schema( +SERVICE_GET_FORECAST_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): str, + probatio.Required(ATTR_CONFIG_ENTRY_ID): str, } ) diff --git a/homeassistant/components/stream/__init__.py b/homeassistant/components/stream/__init__.py index 6043b53a546a0..5c858324c2ee1 100644 --- a/homeassistant/components/stream/__init__.py +++ b/homeassistant/components/stream/__init__.py @@ -25,7 +25,7 @@ from types import MappingProxyType from typing import TYPE_CHECKING, Any, Final, cast -import voluptuous as vol +import probatio from yarl import URL from homeassistant.const import EVENT_HOMEASSISTANT_STOP, EVENT_LOGGING_CHANGED @@ -153,7 +153,7 @@ def _convert_stream_options( pyav_options: dict[str, str] = {} try: STREAM_OPTIONS_SCHEMA(stream_options) - except vol.Invalid as exc: + except probatio.Invalid as exc: raise HomeAssistantError(f"Invalid stream options: {exc}") from exc if extra_wait_time := stream_options.get(CONF_EXTRA_PART_WAIT_TIME): @@ -213,23 +213,23 @@ def create_stream( return stream -DOMAIN_SCHEMA = vol.Schema( +DOMAIN_SCHEMA = probatio.Schema( { - vol.Optional(CONF_LL_HLS, default=True): cv.boolean, - vol.Optional(CONF_SEGMENT_DURATION, default=6): vol.All( - cv.positive_float, vol.Range(min=2, max=10) + probatio.Optional(CONF_LL_HLS, default=True): cv.boolean, + probatio.Optional(CONF_SEGMENT_DURATION, default=6): probatio.All( + cv.positive_float, probatio.Range(min=2, max=10) ), - vol.Optional(CONF_PART_DURATION, default=1): vol.All( - cv.positive_float, vol.Range(min=0.2, max=1.5) + probatio.Optional(CONF_PART_DURATION, default=1): probatio.All( + cv.positive_float, probatio.Range(min=0.2, max=1.5) ), } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { DOMAIN: DOMAIN_SCHEMA, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) @@ -625,10 +625,10 @@ def _should_retry() -> bool: return True -STREAM_OPTIONS_SCHEMA: Final = vol.Schema( +STREAM_OPTIONS_SCHEMA: Final = probatio.Schema( { - vol.Optional(CONF_RTSP_TRANSPORT): vol.In(RTSP_TRANSPORTS), - vol.Optional(CONF_USE_WALLCLOCK_AS_TIMESTAMPS): bool, - vol.Optional(CONF_EXTRA_PART_WAIT_TIME): cv.positive_float, + probatio.Optional(CONF_RTSP_TRANSPORT): probatio.In(RTSP_TRANSPORTS), + probatio.Optional(CONF_USE_WALLCLOCK_AS_TIMESTAMPS): bool, + probatio.Optional(CONF_EXTRA_PART_WAIT_TIME): cv.positive_float, } ) diff --git a/homeassistant/components/streamlabswater/config_flow.py b/homeassistant/components/streamlabswater/config_flow.py index db160d24ca1ce..27751d3f2b630 100644 --- a/homeassistant/components/streamlabswater/config_flow.py +++ b/homeassistant/components/streamlabswater/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from streamlabswater.streamlabswater import StreamlabsClient -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY @@ -48,9 +48,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_API_KEY): str, + probatio.Required(CONF_API_KEY): str, } ), errors=errors, diff --git a/homeassistant/components/streamlabswater/services.py b/homeassistant/components/streamlabswater/services.py index f015f6365cf70..70f400e954997 100644 --- a/homeassistant/components/streamlabswater/services.py +++ b/homeassistant/components/streamlabswater/services.py @@ -1,6 +1,6 @@ """Services for Streamlabs Water.""" -import voluptuous as vol +import probatio from homeassistant.core import HomeAssistant, ServiceCall, callback from homeassistant.helpers import config_validation as cv, service @@ -15,10 +15,12 @@ CONF_LOCATION_ID = "location_id" -SET_AWAY_MODE_SCHEMA = vol.Schema( +SET_AWAY_MODE_SCHEMA = probatio.Schema( { - vol.Required(ATTR_AWAY_MODE): vol.In([AWAY_MODE_AWAY, AWAY_MODE_HOME]), - vol.Optional(CONF_LOCATION_ID): cv.string, + probatio.Required(ATTR_AWAY_MODE): probatio.In( + [AWAY_MODE_AWAY, AWAY_MODE_HOME] + ), + probatio.Optional(CONF_LOCATION_ID): cv.string, } ) diff --git a/homeassistant/components/stt/__init__.py b/homeassistant/components/stt/__init__.py index 8a98763b31c40..092d00cc80342 100644 --- a/homeassistant/components/stt/__init__.py +++ b/homeassistant/components/stt/__init__.py @@ -13,7 +13,7 @@ HTTPNotFound, HTTPUnsupportedMediaType, ) -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.components.http import KEY_HASS, HomeAssistantView @@ -425,8 +425,8 @@ def _metadata_from_header(request: web.Request) -> SpeechMetadata: @websocket_api.websocket_command( { "type": "stt/engine/list", - vol.Optional("language"): str, - vol.Optional("country"): str, + probatio.Optional("language"): str, + probatio.Optional("country"): str, } ) @callback diff --git a/homeassistant/components/subaru/config_flow.py b/homeassistant/components/subaru/config_flow.py index 7d0041d03f853..33f5cf58b0cf5 100644 --- a/homeassistant/components/subaru/config_flow.py +++ b/homeassistant/components/subaru/config_flow.py @@ -4,6 +4,7 @@ import time from typing import TYPE_CHECKING, Any, override +import probatio from subarulink import ( Controller as SubaruAPI, InvalidCredentials, @@ -11,7 +12,6 @@ SubaruException, ) from subarulink.const import COUNTRY_CAN, COUNTRY_USA -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, OptionsFlow from homeassistant.const import ( @@ -31,7 +31,7 @@ _LOGGER = logging.getLogger(__name__) CONF_CONTACT_METHOD = "contact_method" CONF_VALIDATION_CODE = "validation_code" -PIN_SCHEMA = vol.Schema({vol.Required(CONF_PIN): str}) +PIN_SCHEMA = probatio.Schema({probatio.Required(CONF_PIN): str}) class SubaruConfigFlow(ConfigFlow, domain=DOMAIN): @@ -75,22 +75,22 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_USERNAME, default=user_input.get(CONF_USERNAME) if user_input else "", ): str, - vol.Required( + probatio.Required( CONF_PASSWORD, default=user_input.get(CONF_PASSWORD) if user_input else "", ): str, - vol.Required( + probatio.Required( CONF_COUNTRY, default=user_input.get(CONF_COUNTRY) if user_input else COUNTRY_USA, - ): vol.In([COUNTRY_CAN, COUNTRY_USA]), + ): probatio.In([COUNTRY_CAN, COUNTRY_USA]), } ), errors=error, @@ -149,9 +149,9 @@ async def async_step_two_factor( return await self.async_step_two_factor_validate() return self.async_abort(reason="two_factor_request_failed") - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_CONTACT_METHOD): vol.In( + probatio.Required(CONF_CONTACT_METHOD): probatio.In( list(self.controller.contact_methods.values()) ) } @@ -169,7 +169,7 @@ async def async_step_two_factor_validate( assert self.controller if user_input: try: - vol.Match(r"^[0-9]{6}$")(user_input[CONF_VALIDATION_CODE]) + probatio.Match(r"^[0-9]{6}$")(user_input[CONF_VALIDATION_CODE]) if await self.controller.submit_auth_code( user_input[CONF_VALIDATION_CODE] ): @@ -179,10 +179,10 @@ async def async_step_two_factor_validate( title=self.config_data[CONF_USERNAME], data=self.config_data ) error = {"base": "incorrect_validation_code"} - except vol.Invalid: + except probatio.Invalid: error = {"base": "bad_validation_code_format"} - data_schema = vol.Schema({vol.Required(CONF_VALIDATION_CODE): str}) + data_schema = probatio.Schema({probatio.Required(CONF_VALIDATION_CODE): str}) return self.async_show_form( step_id="two_factor_validate", data_schema=data_schema, errors=error ) @@ -196,9 +196,9 @@ async def async_step_pin( assert self.controller if user_input and self.controller.update_saved_pin(user_input[CONF_PIN]): try: - vol.Match(r"[0-9]{4}")(user_input[CONF_PIN]) + probatio.Match(r"[0-9]{4}")(user_input[CONF_PIN]) await self.controller.test_pin() - except vol.Invalid: + except probatio.Invalid: error = {"base": "bad_pin_format"} except InvalidPIN: error = {"base": "incorrect_pin"} @@ -221,9 +221,9 @@ async def async_step_init( if user_input is not None: return self.async_create_entry(title="", data=user_input) - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required( + probatio.Required( CONF_UPDATE_ENABLED, default=self.config_entry.options.get(CONF_UPDATE_ENABLED, False), ): cv.boolean, diff --git a/homeassistant/components/subaru/services.py b/homeassistant/components/subaru/services.py index 598acef895b2a..566565a95e138 100644 --- a/homeassistant/components/subaru/services.py +++ b/homeassistant/components/subaru/services.py @@ -1,6 +1,6 @@ """Services for the Subaru integration.""" -import voluptuous as vol +import probatio from homeassistant.components.lock import DOMAIN as LOCK_DOMAIN from homeassistant.core import HomeAssistant, callback @@ -17,6 +17,6 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, SERVICE_UNLOCK_SPECIFIC_DOOR, entity_domain=LOCK_DOMAIN, - schema={vol.Required(ATTR_DOOR): vol.In(UNLOCK_VALID_DOORS)}, + schema={probatio.Required(ATTR_DOOR): probatio.In(UNLOCK_VALID_DOORS)}, func="async_unlock_specific_door", ) diff --git a/homeassistant/components/suez_water/config_flow.py b/homeassistant/components/suez_water/config_flow.py index 29c2f2dd75f65..58d9d52e576e8 100644 --- a/homeassistant/components/suez_water/config_flow.py +++ b/homeassistant/components/suez_water/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from pysuez import PySuezError, SuezClient -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -14,11 +14,11 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Optional(CONF_COUNTER_ID): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Optional(CONF_COUNTER_ID): str, } ) diff --git a/homeassistant/components/sun/condition.py b/homeassistant/components/sun/condition.py index 80053d73ae114..69772b8816f0f 100644 --- a/homeassistant/components/sun/condition.py +++ b/homeassistant/components/sun/condition.py @@ -4,7 +4,7 @@ from typing import Any, Final, Literal, Unpack, cast, override import astral.sun -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_ENTITY_ID, @@ -63,16 +63,16 @@ _PERIOD_EVENING = "evening" _PERIODS = (_PERIOD_ANY, _PERIOD_MORNING, _PERIOD_EVENING) -_OPTIONS_SCHEMA_DICT: dict[vol.Marker, Any] = { - vol.Optional("before"): cv.sun_event, - vol.Optional("before_offset"): cv.time_period, - vol.Optional("after"): cv.sun_event, - vol.Optional("after_offset"): cv.time_period, +_OPTIONS_SCHEMA_DICT: dict[probatio.Marker, Any] = { + probatio.Optional("before"): cv.sun_event, + probatio.Optional("before_offset"): cv.time_period, + probatio.Optional("after"): cv.sun_event, + probatio.Optional("after_offset"): cv.time_period, } -_CONDITION_SCHEMA = vol.Schema( +_CONDITION_SCHEMA = probatio.Schema( { - vol.Required(CONF_OPTIONS): vol.All( + probatio.Required(CONF_OPTIONS): probatio.All( _OPTIONS_SCHEMA_DICT, cv.has_at_least_one_key("before", "after"), ) @@ -205,7 +205,9 @@ def _async_check(self, **kwargs: Unpack[ConditionCheckParams]) -> bool: # The sun is a singleton, so these conditions take no target and no options. -_STATE_CONDITION_SCHEMA = vol.Schema({vol.Required(CONF_OPTIONS, default=dict): {}}) +_STATE_CONDITION_SCHEMA = probatio.Schema( + {probatio.Required(CONF_OPTIONS, default=dict): {}} +) # The sun is a singleton, so the elevation condition always targets sun.sun # instead of asking the user to pick an entity. @@ -296,10 +298,12 @@ def _async_check(self, **kwargs: Unpack[ConditionCheckParams]) -> bool: _TWILIGHT_ASTRONOMICAL: (ELEVATION_ASTRONOMICAL, ELEVATION_NAUTICAL), } -_TWILIGHT_CONDITION_SCHEMA = vol.Schema( +_TWILIGHT_CONDITION_SCHEMA = probatio.Schema( { - vol.Required(CONF_OPTIONS, default=dict): { - vol.Optional(CONF_TYPE, default=_TWILIGHT_ANY): vol.In(_TWILIGHT_BANDS), + probatio.Required(CONF_OPTIONS, default=dict): { + probatio.Optional(CONF_TYPE, default=_TWILIGHT_ANY): probatio.In( + _TWILIGHT_BANDS + ), } } ) @@ -348,10 +352,10 @@ class _EveningTwilightCondition(_TwilightCondition): _rising = False -_PERIOD_CONDITION_SCHEMA = vol.Schema( +_PERIOD_CONDITION_SCHEMA = probatio.Schema( { - vol.Required(CONF_OPTIONS, default=dict): { - vol.Optional(CONF_PERIOD, default=_PERIOD_ANY): vol.In(_PERIODS), + probatio.Required(CONF_OPTIONS, default=dict): { + probatio.Optional(CONF_PERIOD, default=_PERIOD_ANY): probatio.In(_PERIODS), } } ) @@ -466,10 +470,10 @@ def _async_check(self, **kwargs: Unpack[ConditionCheckParams]) -> bool: return elevation < ELEVATION_HORIZON -_ELEVATION_CONDITION_SCHEMA = vol.Schema( +_ELEVATION_CONDITION_SCHEMA = probatio.Schema( { - vol.Required(CONF_OPTIONS, default=dict): { - vol.Required("threshold"): NumericThresholdSelector( + probatio.Required(CONF_OPTIONS, default=dict): { + probatio.Required("threshold"): NumericThresholdSelector( NumericThresholdSelectorConfig(mode=NumericThresholdMode.IS) ), } diff --git a/homeassistant/components/sun/trigger.py b/homeassistant/components/sun/trigger.py index 6c0f1765cab39..e31ad18449b17 100644 --- a/homeassistant/components/sun/trigger.py +++ b/homeassistant/components/sun/trigger.py @@ -4,7 +4,7 @@ from typing import Any, Final, Literal, cast, override import astral.sun -import voluptuous as vol +import probatio from homeassistant.const import ( ATTR_ENTITY_ID, @@ -82,9 +82,9 @@ # Offset options shared by the solar event triggers. A positive offset combined # with an offset type of "before" fires earlier than the event; "after" later. -_OFFSET_OPTIONS: dict[vol.Marker, Any] = { - vol.Required(CONF_OFFSET, default=timedelta(0)): cv.time_period, - vol.Required(CONF_OFFSET_TYPE, default=OFFSET_TYPE_BEFORE): vol.In( +_OFFSET_OPTIONS: dict[probatio.Marker, Any] = { + probatio.Required(CONF_OFFSET, default=timedelta(0)): cv.time_period, + probatio.Required(CONF_OFFSET_TYPE, default=OFFSET_TYPE_BEFORE): probatio.In( {OFFSET_TYPE_BEFORE, OFFSET_TYPE_AFTER} ), } @@ -101,10 +101,10 @@ _SUN_ENTITY_ID = f"{DOMAIN}.{DOMAIN}" _ELEVATION_DOMAIN_SPECS = {DOMAIN: DomainSpec(value_source=STATE_ATTR_ELEVATION)} -_ELEVATION_CHANGED_TRIGGER_SCHEMA = vol.Schema( +_ELEVATION_CHANGED_TRIGGER_SCHEMA = probatio.Schema( { - vol.Required(CONF_OPTIONS, default=dict): { - vol.Required("threshold"): NumericThresholdSelector( + probatio.Required(CONF_OPTIONS, default=dict): { + probatio.Required("threshold"): NumericThresholdSelector( NumericThresholdSelectorConfig(mode=NumericThresholdMode.CHANGED) ), } @@ -113,13 +113,13 @@ # Unlike the generic numerical triggers there is no behavior option: a behavior # (each/first/all) is only meaningful across multiple targeted entities. -_ELEVATION_CROSSED_TRIGGER_SCHEMA = vol.Schema( +_ELEVATION_CROSSED_TRIGGER_SCHEMA = probatio.Schema( { - vol.Required(CONF_OPTIONS, default=dict): { - vol.Required("threshold"): NumericThresholdSelector( + probatio.Required(CONF_OPTIONS, default=dict): { + probatio.Required("threshold"): NumericThresholdSelector( NumericThresholdSelectorConfig(mode=NumericThresholdMode.CROSSED) ), - vol.Optional(CONF_FOR): cv.positive_time_period, + probatio.Optional(CONF_FOR): cv.positive_time_period, } } ) @@ -159,8 +159,8 @@ class SunElevationCrossedTrigger( _schema = _ELEVATION_CROSSED_TRIGGER_SCHEMA -_EVENT_TRIGGER_SCHEMA = vol.Schema( - {vol.Required(CONF_OPTIONS, default=dict): {**_OFFSET_OPTIONS}} +_EVENT_TRIGGER_SCHEMA = probatio.Schema( + {probatio.Required(CONF_OPTIONS, default=dict): {**_OFFSET_OPTIONS}} ) @@ -174,7 +174,7 @@ class SunEventTrigger(Trigger): _event: str _context: str | None = None - _schema: vol.Schema = _EVENT_TRIGGER_SCHEMA + _schema: probatio.Schema = _EVENT_TRIGGER_SCHEMA @override @classmethod @@ -278,10 +278,10 @@ class SolarMidnightTrigger(SunEventTrigger): _event = _SUN_EVENT_SOLAR_MIDNIGHT -_DAWN_DUSK_TRIGGER_SCHEMA = vol.Schema( +_DAWN_DUSK_TRIGGER_SCHEMA = probatio.Schema( { - vol.Required(CONF_OPTIONS, default=dict): { - vol.Optional(CONF_TYPE, default=_TWILIGHT_CIVIL): vol.In( + probatio.Required(CONF_OPTIONS, default=dict): { + probatio.Optional(CONF_TYPE, default=_TWILIGHT_CIVIL): probatio.In( _TWILIGHT_ELEVATIONS ), **_OFFSET_OPTIONS, @@ -330,10 +330,10 @@ class DuskTrigger(SunDawnDuskTrigger): _event = _SUN_EVENT_DUSK -_GOLDEN_BLUE_HOUR_TRIGGER_SCHEMA = vol.Schema( +_GOLDEN_BLUE_HOUR_TRIGGER_SCHEMA = probatio.Schema( { - vol.Required(CONF_OPTIONS, default=dict): { - vol.Optional(CONF_PERIOD, default=_PERIOD_ANY): vol.In(_PERIODS), + probatio.Required(CONF_OPTIONS, default=dict): { + probatio.Optional(CONF_PERIOD, default=_PERIOD_ANY): probatio.In(_PERIODS), **_OFFSET_OPTIONS, } } @@ -554,16 +554,18 @@ class PolarNightEndedTrigger(_MidnightSunPolarNightTrigger): _target_above = True -_LEGACY_OPTIONS_SCHEMA_DICT: dict[vol.Marker, Any] = { - vol.Required(CONF_EVENT): cv.sun_event, - vol.Optional(CONF_OFFSET, default=timedelta(0)): cv.time_period, +_LEGACY_OPTIONS_SCHEMA_DICT: dict[probatio.Marker, Any] = { + probatio.Required(CONF_EVENT): cv.sun_event, + probatio.Optional(CONF_OFFSET, default=timedelta(0)): cv.time_period, } class LegacySunTrigger(SunEventTrigger): """Backwards compatible trigger for the legacy ``platform: sun`` config.""" - _schema = vol.Schema({vol.Required(CONF_OPTIONS): _LEGACY_OPTIONS_SCHEMA_DICT}) + _schema = probatio.Schema( + {probatio.Required(CONF_OPTIONS): _LEGACY_OPTIONS_SCHEMA_DICT} + ) @override @classmethod diff --git a/homeassistant/components/sunricher_dali/config_flow.py b/homeassistant/components/sunricher_dali/config_flow.py index eb0c6f3494c23..8787c4d4bf8eb 100644 --- a/homeassistant/components/sunricher_dali/config_flow.py +++ b/homeassistant/components/sunricher_dali/config_flow.py @@ -3,10 +3,10 @@ import logging from typing import Any, override +import probatio from PySrDaliGateway import DaliGateway from PySrDaliGateway.discovery import DaliGatewayDiscovery from PySrDaliGateway.exceptions import DaliGatewayError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -48,7 +48,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({}), + data_schema=probatio.Schema({}), ) async def async_step_select_gateway( @@ -111,7 +111,7 @@ async def async_step_select_gateway( return self.async_show_form( step_id="select_gateway", errors=errors or {"base": "no_devices_found"}, - data_schema=vol.Schema({}), + data_schema=probatio.Schema({}), ) gateway_options = [ @@ -124,9 +124,9 @@ async def async_step_select_gateway( return self.async_show_form( step_id="select_gateway", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional("selected_gateway"): SelectSelector( + probatio.Optional("selected_gateway"): SelectSelector( SelectSelectorConfig(options=gateway_options, sort=True) ), } diff --git a/homeassistant/components/sunsynk/config_flow.py b/homeassistant/components/sunsynk/config_flow.py index 29a1eec9a8113..5a8fe93feaca0 100644 --- a/homeassistant/components/sunsynk/config_flow.py +++ b/homeassistant/components/sunsynk/config_flow.py @@ -2,9 +2,9 @@ from typing import Any, override +import probatio from sunsynk.client import SunsynkClient from sunsynk.exceptions import SunsynkAuthenticationError, SunsynkConnectionError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -17,12 +17,12 @@ from .const import DOMAIN -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): TextSelector( + probatio.Required(CONF_USERNAME): TextSelector( TextSelectorConfig(type=TextSelectorType.EMAIL, autocomplete="username") ), - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password" ) diff --git a/homeassistant/components/supervisord/sensor.py b/homeassistant/components/supervisord/sensor.py index 5820baeab33e0..d398c796bf0bc 100644 --- a/homeassistant/components/supervisord/sensor.py +++ b/homeassistant/components/supervisord/sensor.py @@ -4,7 +4,7 @@ from typing import Any, override import xmlrpc.client -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -24,7 +24,7 @@ DEFAULT_URL = "http://localhost:9001/RPC2" PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( - {vol.Optional(CONF_URL, default=DEFAULT_URL): cv.url} + {probatio.Optional(CONF_URL, default=DEFAULT_URL): cv.url} ) diff --git a/homeassistant/components/supla/__init__.py b/homeassistant/components/supla/__init__.py index 5c4180a38a9f7..50ac4f6ff717e 100644 --- a/homeassistant/components/supla/__init__.py +++ b/homeassistant/components/supla/__init__.py @@ -3,7 +3,7 @@ import logging from asyncpysupla import SuplaAPI -import voluptuous as vol +import probatio from homeassistant.const import CONF_ACCESS_TOKEN, Platform from homeassistant.core import HomeAssistant @@ -30,20 +30,24 @@ SUPLA_SERVERS = "supla_servers" SUPLA_COORDINATORS = "supla_coordinators" -SERVER_CONFIG = vol.Schema( +SERVER_CONFIG = probatio.Schema( { - vol.Required(CONF_SERVER): cv.string, - vol.Required(CONF_ACCESS_TOKEN): cv.string, + probatio.Required(CONF_SERVER): cv.string, + probatio.Required(CONF_ACCESS_TOKEN): cv.string, } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( - {vol.Required(CONF_SERVERS): vol.All(cv.ensure_list, [SERVER_CONFIG])} + DOMAIN: probatio.Schema( + { + probatio.Required(CONF_SERVERS): probatio.All( + cv.ensure_list, [SERVER_CONFIG] + ) + } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/surepetcare/config_flow.py b/homeassistant/components/surepetcare/config_flow.py index 05123470e5fb2..f9d051aa8b360 100644 --- a/homeassistant/components/surepetcare/config_flow.py +++ b/homeassistant/components/surepetcare/config_flow.py @@ -4,9 +4,9 @@ import logging from typing import Any, override +import probatio import surepy from surepy.exceptions import SurePetcareAuthenticationError, SurePetcareError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_TOKEN, CONF_USERNAME @@ -16,10 +16,10 @@ _LOGGER = logging.getLogger(__name__) -USER_DATA_SCHEMA = vol.Schema( +USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) @@ -106,6 +106,6 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", description_placeholders={"username": reauth_entry.data[CONF_USERNAME]}, - data_schema=vol.Schema({vol.Required(CONF_PASSWORD): str}), + data_schema=probatio.Schema({probatio.Required(CONF_PASSWORD): str}), errors=errors, ) diff --git a/homeassistant/components/surepetcare/services.py b/homeassistant/components/surepetcare/services.py index 6ff3d3c41c3a9..0f1917030653b 100644 --- a/homeassistant/components/surepetcare/services.py +++ b/homeassistant/components/surepetcare/services.py @@ -1,7 +1,7 @@ """Support for Sure Petcare services.""" +import probatio from surepy.enums import Location -import voluptuous as vol from homeassistant.const import ATTR_LOCATION from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -55,13 +55,13 @@ async def handle_set_pet_location(call: ServiceCall) -> None: DOMAIN, SERVICE_SET_LOCK_STATE, handle_set_lock_state, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(ATTR_FLAP_ID): cv.positive_int, - vol.Required(ATTR_LOCK_STATE): vol.All( + probatio.Required(ATTR_FLAP_ID): cv.positive_int, + probatio.Required(ATTR_LOCK_STATE): probatio.All( cv.string, - vol.Lower, - vol.In( + probatio.Lower, + probatio.In( [ "unlocked", "locked_in", @@ -77,10 +77,10 @@ async def handle_set_pet_location(call: ServiceCall) -> None: DOMAIN, SERVICE_SET_PET_LOCATION, handle_set_pet_location, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(ATTR_PET_NAME): cv.string, - vol.Required(ATTR_LOCATION): vol.In( + probatio.Required(ATTR_PET_NAME): cv.string, + probatio.Required(ATTR_LOCATION): probatio.In( [ Location.INSIDE.name.title(), Location.OUTSIDE.name.title(), diff --git a/homeassistant/components/swiss_hydrological_data/sensor.py b/homeassistant/components/swiss_hydrological_data/sensor.py index f491b45634f97..fb121e03b14f7 100644 --- a/homeassistant/components/swiss_hydrological_data/sensor.py +++ b/homeassistant/components/swiss_hydrological_data/sensor.py @@ -4,8 +4,8 @@ import logging from typing import TYPE_CHECKING, Any, override +import probatio from swisshydrodata import SwissHydroData -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -50,10 +50,10 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_STATION): vol.Coerce(int), - vol.Optional(CONF_MONITORED_CONDITIONS, default=[SENSOR_TEMPERATURE]): vol.All( - cv.ensure_list, [vol.In(CONDITIONS)] - ), + probatio.Required(CONF_STATION): probatio.Coerce(int), + probatio.Optional( + CONF_MONITORED_CONDITIONS, default=[SENSOR_TEMPERATURE] + ): probatio.All(cv.ensure_list, [probatio.In(CONDITIONS)]), } ) diff --git a/homeassistant/components/swiss_public_transport/config_flow.py b/homeassistant/components/swiss_public_transport/config_flow.py index 63dec88dde497..e9557bd33e3e4 100644 --- a/homeassistant/components/swiss_public_transport/config_flow.py +++ b/homeassistant/components/swiss_public_transport/config_flow.py @@ -8,7 +8,7 @@ OpendataTransportConnectionError, OpendataTransportError, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.helpers import config_validation as cv @@ -42,24 +42,26 @@ ) from .helper import offset_opendata, unique_id_from_config -USER_DATA_SCHEMA = vol.Schema( +USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_START): cv.string, - vol.Optional(CONF_VIA): TextSelector( + probatio.Required(CONF_START): cv.string, + probatio.Optional(CONF_VIA): TextSelector( TextSelectorConfig( type=TextSelectorType.TEXT, multiple=True, ), ), - vol.Required(CONF_DESTINATION): cv.string, - vol.Optional(CONF_TIME_MODE, default=DEFAULT_TIME_MODE): SelectSelector( + probatio.Required(CONF_DESTINATION): cv.string, + probatio.Optional(CONF_TIME_MODE, default=DEFAULT_TIME_MODE): SelectSelector( SelectSelectorConfig( options=TIME_MODE_OPTIONS, mode=SelectSelectorMode.DROPDOWN, translation_key="time_mode", ), ), - vol.Optional(CONF_TIME_STATION, default=DEFAULT_TIME_STATION): SelectSelector( + probatio.Optional( + CONF_TIME_STATION, default=DEFAULT_TIME_STATION + ): SelectSelector( SelectSelectorConfig( options=IS_ARRIVAL_OPTIONS, mode=SelectSelectorMode.DROPDOWN, @@ -68,8 +70,10 @@ ), } ) -ADVANCED_TIME_DATA_SCHEMA = {vol.Optional(CONF_TIME_FIXED): TimeSelector()} -ADVANCED_TIME_OFFSET_DATA_SCHEMA = {vol.Optional(CONF_TIME_OFFSET): DurationSelector()} +ADVANCED_TIME_DATA_SCHEMA = {probatio.Optional(CONF_TIME_FIXED): TimeSelector()} +ADVANCED_TIME_OFFSET_DATA_SCHEMA = { + probatio.Optional(CONF_TIME_OFFSET): DurationSelector() +} _LOGGER = logging.getLogger(__name__) @@ -126,7 +130,7 @@ async def async_step_time_fixed( ) -> ConfigFlowResult: """Async time step to set up the connection.""" return await self._async_step_time_mode( - CONF_TIME_FIXED, vol.Schema(ADVANCED_TIME_DATA_SCHEMA), time_input + CONF_TIME_FIXED, probatio.Schema(ADVANCED_TIME_DATA_SCHEMA), time_input ) async def async_step_time_offset( @@ -135,14 +139,14 @@ async def async_step_time_offset( """Async time offset step to set up the connection.""" return await self._async_step_time_mode( CONF_TIME_OFFSET, - vol.Schema(ADVANCED_TIME_OFFSET_DATA_SCHEMA), + probatio.Schema(ADVANCED_TIME_OFFSET_DATA_SCHEMA), time_offset_input, ) async def _async_step_time_mode( self, step_id: str, - time_mode_schema: vol.Schema, + time_mode_schema: probatio.Schema, time_mode_input: dict[str, Any] | None = None, ) -> ConfigFlowResult: """Async time mode step to set up the connection.""" diff --git a/homeassistant/components/swiss_public_transport/services.py b/homeassistant/components/swiss_public_transport/services.py index 575d17047f42e..37fa473a08f36 100644 --- a/homeassistant/components/swiss_public_transport/services.py +++ b/homeassistant/components/swiss_public_transport/services.py @@ -1,6 +1,6 @@ """Define services for the Swiss public transport integration.""" -import voluptuous as vol +import probatio from homeassistant.const import ATTR_CONFIG_ENTRY_ID from homeassistant.core import ( @@ -28,10 +28,10 @@ ) from .coordinator import SwissPublicTransportConfigEntry -SERVICE_FETCH_CONNECTIONS_SCHEMA = vol.Schema( +SERVICE_FETCH_CONNECTIONS_SCHEMA = probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): str, - vol.Optional(ATTR_LIMIT, default=CONNECTIONS_COUNT): NumberSelector( + probatio.Required(ATTR_CONFIG_ENTRY_ID): str, + probatio.Optional(ATTR_LIMIT, default=CONNECTIONS_COUNT): NumberSelector( NumberSelectorConfig( min=1, max=CONNECTIONS_MAX, mode=NumberSelectorMode.BOX ) diff --git a/homeassistant/components/swisscom/config_flow.py b/homeassistant/components/swisscom/config_flow.py index 499197d88f4b6..f834d0d770453 100644 --- a/homeassistant/components/swisscom/config_flow.py +++ b/homeassistant/components/swisscom/config_flow.py @@ -3,12 +3,12 @@ import logging from typing import Any, override +import probatio from swisscom_internet_box import ( SwisscomAuthError, SwisscomClient, SwisscomConnectionError, ) -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME @@ -19,11 +19,11 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST, default=DEFAULT_HOST): str, - vol.Required(CONF_USERNAME, default=DEFAULT_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_HOST, default=DEFAULT_HOST): str, + probatio.Required(CONF_USERNAME, default=DEFAULT_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/swisscom/device_tracker.py b/homeassistant/components/swisscom/device_tracker.py index 9217fb8dbd525..b9a660a110997 100644 --- a/homeassistant/components/swisscom/device_tracker.py +++ b/homeassistant/components/swisscom/device_tracker.py @@ -2,7 +2,7 @@ from typing import override -import voluptuous as vol +import probatio from homeassistant.components.device_tracker import ( PLATFORM_SCHEMA as DEVICE_TRACKER_PLATFORM_SCHEMA, @@ -20,7 +20,7 @@ from .coordinator import SwisscomConfigEntry, SwisscomDataUpdateCoordinator PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( - {vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string} + {probatio.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string} ) diff --git a/homeassistant/components/switch/__init__.py b/homeassistant/components/switch/__init__.py index 0cd20e1452426..7f321455aff89 100644 --- a/homeassistant/components/switch/__init__.py +++ b/homeassistant/components/switch/__init__.py @@ -5,8 +5,8 @@ import logging from typing import override +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( @@ -42,7 +42,7 @@ class SwitchDeviceClass(StrEnum): SWITCH = "switch" -DEVICE_CLASSES_SCHEMA = vol.All(vol.Lower, vol.Coerce(SwitchDeviceClass)) +DEVICE_CLASSES_SCHEMA = probatio.All(probatio.Lower, probatio.Coerce(SwitchDeviceClass)) DEVICE_CLASSES = [cls.value for cls in SwitchDeviceClass] diff --git a/homeassistant/components/switch/device_action.py b/homeassistant/components/switch/device_action.py index 50519b9ed4bd6..77fee17767aeb 100644 --- a/homeassistant/components/switch/device_action.py +++ b/homeassistant/components/switch/device_action.py @@ -1,6 +1,6 @@ """Provides device actions for switches.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import ( async_validate_entity_schema, @@ -14,7 +14,9 @@ # mypy: disallow-any-generics -_ACTION_SCHEMA = toggle_entity.ACTION_SCHEMA.extend({vol.Required(CONF_DOMAIN): DOMAIN}) +_ACTION_SCHEMA = toggle_entity.ACTION_SCHEMA.extend( + {probatio.Required(CONF_DOMAIN): DOMAIN} +) async def async_validate_action_config( diff --git a/homeassistant/components/switch/device_condition.py b/homeassistant/components/switch/device_condition.py index 26e9576ce0ba5..fa55c4f3de5c7 100644 --- a/homeassistant/components/switch/device_condition.py +++ b/homeassistant/components/switch/device_condition.py @@ -1,6 +1,6 @@ """Provides device conditions for switches.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import toggle_entity from homeassistant.const import CONF_DOMAIN @@ -13,7 +13,7 @@ # mypy: disallow-any-generics CONDITION_SCHEMA = toggle_entity.CONDITION_SCHEMA.extend( - {vol.Required(CONF_DOMAIN): DOMAIN} + {probatio.Required(CONF_DOMAIN): DOMAIN} ) @@ -34,6 +34,6 @@ async def async_get_conditions( async def async_get_condition_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List condition capabilities.""" return await toggle_entity.async_get_condition_capabilities(hass, config) diff --git a/homeassistant/components/switch/device_trigger.py b/homeassistant/components/switch/device_trigger.py index 0c5db05f361b1..a6f750db067d0 100644 --- a/homeassistant/components/switch/device_trigger.py +++ b/homeassistant/components/switch/device_trigger.py @@ -1,6 +1,6 @@ """Provides device triggers for switches.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import toggle_entity from homeassistant.const import CONF_DOMAIN @@ -10,9 +10,11 @@ from . import DOMAIN -TRIGGER_SCHEMA = vol.All( +TRIGGER_SCHEMA = probatio.All( toggle_entity.TRIGGER_SCHEMA, - vol.Schema({vol.Required(CONF_DOMAIN): DOMAIN}, extra=vol.ALLOW_EXTRA), + probatio.Schema( + {probatio.Required(CONF_DOMAIN): DOMAIN}, extra=probatio.ALLOW_EXTRA + ), ) @@ -35,6 +37,6 @@ async def async_get_triggers( async def async_get_trigger_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List trigger capabilities.""" return await toggle_entity.async_get_trigger_capabilities(hass, config) diff --git a/homeassistant/components/switch/light.py b/homeassistant/components/switch/light.py index 5433696e9a82f..fbd34d04e0dea 100644 --- a/homeassistant/components/switch/light.py +++ b/homeassistant/components/switch/light.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.light import ( PLATFORM_SCHEMA as LIGHT_PLATFORM_SCHEMA, @@ -30,8 +30,8 @@ PLATFORM_SCHEMA = LIGHT_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Required(CONF_ENTITY_ID): cv.entity_domain(DOMAIN), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_ENTITY_ID): cv.entity_domain(DOMAIN), } ) diff --git a/homeassistant/components/switch_as_x/__init__.py b/homeassistant/components/switch_as_x/__init__.py index 72f1aa56fe389..bbdf11de3b436 100644 --- a/homeassistant/components/switch_as_x/__init__.py +++ b/homeassistant/components/switch_as_x/__init__.py @@ -2,7 +2,7 @@ import logging -import voluptuous as vol +import probatio from homeassistant.components.homeassistant import exposed_entities from homeassistant.config_entries import ConfigEntry @@ -37,7 +37,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: entity_id = er.async_validate_entity_id( entity_registry, entry.options[CONF_ENTITY_ID] ) - except vol.Invalid: + except probatio.Invalid: # The entity is identified by an unknown entity registry ID _LOGGER.error( "Failed to setup switch_as_x for unknown entity %s", @@ -124,7 +124,7 @@ async def async_remove_entry(hass: HomeAssistant, entry: ConfigEntry) -> None: switch_entity_id = er.async_validate_entity_id( registry, entry.options[CONF_ENTITY_ID] ) - except vol.Invalid: + except probatio.Invalid: # The source entity has been removed from the entity registry return diff --git a/homeassistant/components/switch_as_x/config_flow.py b/homeassistant/components/switch_as_x/config_flow.py index 0d85f965451d5..bfc616577f423 100644 --- a/homeassistant/components/switch_as_x/config_flow.py +++ b/homeassistant/components/switch_as_x/config_flow.py @@ -3,7 +3,7 @@ from collections.abc import Mapping from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.const import CONF_ENTITY_ID, Platform from homeassistant.helpers import entity_registry as er, selector @@ -26,13 +26,15 @@ CONFIG_FLOW = { "user": SchemaFlowFormStep( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_ENTITY_ID): selector.EntitySelector( + probatio.Required(CONF_ENTITY_ID): selector.EntitySelector( selector.EntitySelectorConfig(domain=Platform.SWITCH), ), - vol.Optional(CONF_INVERT, default=False): selector.BooleanSelector(), - vol.Required(CONF_TARGET_DOMAIN): selector.SelectSelector( + probatio.Optional( + CONF_INVERT, default=False + ): selector.BooleanSelector(), + probatio.Required(CONF_TARGET_DOMAIN): selector.SelectSelector( selector.SelectSelectorConfig( options=TARGET_DOMAIN_OPTIONS, translation_key="target_domain" ), @@ -44,7 +46,7 @@ OPTIONS_FLOW = { "init": SchemaFlowFormStep( - vol.Schema({vol.Required(CONF_INVERT): selector.BooleanSelector()}) + probatio.Schema({probatio.Required(CONF_INVERT): selector.BooleanSelector()}) ), } diff --git a/homeassistant/components/switchbee/config_flow.py b/homeassistant/components/switchbee/config_flow.py index 0a0cd67ade0ac..4852e8b13e71a 100644 --- a/homeassistant/components/switchbee/config_flow.py +++ b/homeassistant/components/switchbee/config_flow.py @@ -3,9 +3,9 @@ import logging from typing import Any, override +import probatio from switchbee.api.central_unit import SwitchBeeError from switchbee.api.polling import CentralUnitPolling -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME @@ -19,11 +19,11 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, } ) diff --git a/homeassistant/components/switchbot/config_flow.py b/homeassistant/components/switchbot/config_flow.py index ff637aa9bb302..76e4bc0e7d5e8 100644 --- a/homeassistant/components/switchbot/config_flow.py +++ b/homeassistant/components/switchbot/config_flow.py @@ -3,6 +3,7 @@ import logging from typing import Any, override +import probatio from switchbot import ( SwitchbotAccountConnectionError, SwitchBotAdvertisement, @@ -12,7 +13,6 @@ fetch_cloud_devices, parse_advertisement_data, ) -import voluptuous as vol from homeassistant.components import bluetooth from homeassistant.components.bluetooth import ( @@ -166,7 +166,7 @@ async def async_step_confirm( self._set_confirm_only() return self.async_show_form( step_id="confirm", - data_schema=vol.Schema({}), + data_schema=probatio.Schema({}), description_placeholders={ "name": name_from_discovery(self._discovered_adv) }, @@ -185,7 +185,7 @@ async def async_step_password( return self.async_show_form( step_id="password", - data_schema=vol.Schema({vol.Required(CONF_PASSWORD): str}), + data_schema=probatio.Schema({probatio.Required(CONF_PASSWORD): str}), description_placeholders={ "name": name_from_discovery(self._discovered_adv) }, @@ -247,12 +247,12 @@ async def async_step_encrypted_auth( return self.async_show_form( step_id="encrypted_auth", errors=errors, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_USERNAME, default=user_input.get(CONF_USERNAME) ): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ), description_placeholders={ @@ -306,10 +306,10 @@ async def async_step_encrypted_key( return self.async_show_form( step_id="encrypted_key", errors=errors, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_KEY_ID): str, - vol.Required(CONF_ENCRYPTION_KEY): str, + probatio.Required(CONF_KEY_ID): str, + probatio.Required(CONF_ENCRYPTION_KEY): str, } ), description_placeholders={ @@ -402,12 +402,12 @@ async def async_step_cloud_login( return self.async_show_form( step_id="cloud_login", errors=errors, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_USERNAME, default=user_input.get(CONF_USERNAME) ): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ), description_placeholders=description_placeholders, @@ -443,9 +443,9 @@ async def async_step_select_device( return self.async_show_form( step_id="select_device", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_ADDRESS): vol.In( + probatio.Required(CONF_ADDRESS): probatio.In( { address: name_from_discovery(parsed) for address, parsed in self._discovered_advs.items() @@ -468,8 +468,8 @@ async def async_step_init( # Update common entity options for all other entities. return self.async_create_entry(title="", data=user_input) - options: dict[vol.Optional, Any] = { - vol.Optional( + options: dict[probatio.Optional, Any] = { + probatio.Optional( CONF_RETRY_COUNT, default=self.config_entry.options.get( CONF_RETRY_COUNT, DEFAULT_RETRY_COUNT @@ -489,7 +489,7 @@ async def async_step_init( ): options.update( { - vol.Optional( + probatio.Optional( CONF_LOCK_NIGHTLATCH, default=self.config_entry.options.get( CONF_LOCK_NIGHTLATCH, DEFAULT_LOCK_NIGHTLATCH @@ -503,7 +503,7 @@ async def async_step_init( ): options.update( { - vol.Optional( + probatio.Optional( CONF_CURTAIN_SPEED, default=self.config_entry.options.get( CONF_CURTAIN_SPEED, DEFAULT_CURTAIN_SPEED @@ -519,4 +519,6 @@ async def async_step_init( } ) - return self.async_show_form(step_id="init", data_schema=vol.Schema(options)) + return self.async_show_form( + step_id="init", data_schema=probatio.Schema(options) + ) diff --git a/homeassistant/components/switchbot/services.py b/homeassistant/components/switchbot/services.py index 2aad1c2a2f395..7c4bc0b1152f8 100644 --- a/homeassistant/components/switchbot/services.py +++ b/homeassistant/components/switchbot/services.py @@ -1,6 +1,6 @@ """Services for the SwitchBot integration.""" -import voluptuous as vol +import probatio from homeassistant.const import ATTR_DEVICE_ID, CONF_SENSOR_TYPE from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -14,14 +14,14 @@ ATTR_PASSWORD = "password" -_PASSWORD_VALIDATOR = vol.All(cv.string, cv.matches_regex(r"^\d{6,12}$")) +_PASSWORD_VALIDATOR = probatio.All(cv.string, cv.matches_regex(r"^\d{6,12}$")) -SCHEMA_ADD_PASSWORD_SERVICE = vol.Schema( +SCHEMA_ADD_PASSWORD_SERVICE = probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): cv.string, - vol.Required(ATTR_PASSWORD): _PASSWORD_VALIDATOR, + probatio.Required(ATTR_DEVICE_ID): cv.string, + probatio.Required(ATTR_PASSWORD): _PASSWORD_VALIDATOR, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/switchbot_cloud/config_flow.py b/homeassistant/components/switchbot_cloud/config_flow.py index 40f7144f1e4b2..39ff3c9b1f687 100644 --- a/homeassistant/components/switchbot_cloud/config_flow.py +++ b/homeassistant/components/switchbot_cloud/config_flow.py @@ -3,12 +3,12 @@ from logging import getLogger from typing import Any, override +import probatio from switchbot_api import ( SwitchBotAPI, SwitchBotAuthenticationError, SwitchBotConnectionError, ) -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY, CONF_API_TOKEN @@ -17,10 +17,10 @@ _LOGGER = getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_TOKEN): str, - vol.Required(CONF_API_KEY): str, + probatio.Required(CONF_API_TOKEN): str, + probatio.Required(CONF_API_KEY): str, } ) diff --git a/homeassistant/components/switchbot_cloud/services.py b/homeassistant/components/switchbot_cloud/services.py index 2924ca7e092d7..f32eafb4f45f4 100644 --- a/homeassistant/components/switchbot_cloud/services.py +++ b/homeassistant/components/switchbot_cloud/services.py @@ -2,8 +2,8 @@ from logging import getLogger +import probatio from switchbot_api import ArtFrameCommands -import voluptuous as vol from homeassistant.core import HomeAssistant, ServiceCall, callback from homeassistant.exceptions import ServiceValidationError @@ -14,12 +14,12 @@ _LOGGER = getLogger(__name__) -UPLOAD_IMAGE_SCHEMA = vol.Schema( +UPLOAD_IMAGE_SCHEMA = probatio.Schema( { - vol.Required("device_id"): vol.All( - cv.ensure_list, [cv.string], vol.Length(min=1) + probatio.Required("device_id"): probatio.All( + cv.ensure_list, [cv.string], probatio.Length(min=1) ), - vol.Required("image_url"): cv.url, + probatio.Required("image_url"): cv.url, } ) diff --git a/homeassistant/components/switcher_kis/config_flow.py b/homeassistant/components/switcher_kis/config_flow.py index 44480520af3d3..c9459822b6d68 100644 --- a/homeassistant/components/switcher_kis/config_flow.py +++ b/homeassistant/components/switcher_kis/config_flow.py @@ -6,7 +6,7 @@ from aioswitcher.device import SwitcherBase from aioswitcher.device.tools import validate_token -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_TOKEN, CONF_USERNAME @@ -17,10 +17,10 @@ _LOGGER = logging.getLogger(__name__) -CONFIG_SCHEMA: Final = vol.Schema( +CONFIG_SCHEMA: Final = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_TOKEN): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_TOKEN): str, } ) diff --git a/homeassistant/components/switcher_kis/switch.py b/homeassistant/components/switcher_kis/switch.py index f8eac2609e940..c88bab6834cbd 100644 --- a/homeassistant/components/switcher_kis/switch.py +++ b/homeassistant/components/switcher_kis/switch.py @@ -10,7 +10,7 @@ ShutterChildLock, SwitcherShutter, ) -import voluptuous as vol +import probatio from homeassistant.components.switch import SwitchDeviceClass, SwitchEntity from homeassistant.const import EntityCategory @@ -38,12 +38,12 @@ API_SET_CHILD_LOCK = "set_shutter_child_lock" SERVICE_SET_AUTO_OFF_SCHEMA: VolDictType = { - vol.Required(CONF_AUTO_OFF): cv.time_period_str, + probatio.Required(CONF_AUTO_OFF): cv.time_period_str, } SERVICE_TURN_ON_WITH_TIMER_SCHEMA: VolDictType = { - vol.Required(CONF_TIMER_MINUTES): vol.All( - cv.positive_int, vol.Range(min=1, max=150) + probatio.Required(CONF_TIMER_MINUTES): probatio.All( + cv.positive_int, probatio.Range(min=1, max=150) ), } diff --git a/homeassistant/components/switchmate/switch.py b/homeassistant/components/switchmate/switch.py index 9dbb720227610..0f8a642046ef1 100644 --- a/homeassistant/components/switchmate/switch.py +++ b/homeassistant/components/switchmate/switch.py @@ -3,8 +3,8 @@ from datetime import timedelta from typing import Any, override +import probatio from switchmate import Switchmate -import voluptuous as vol from homeassistant.components.switch import ( PLATFORM_SCHEMA as SWITCH_PLATFORM_SCHEMA, @@ -23,9 +23,9 @@ PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_MAC): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_FLIP_ON_OFF, default=False): cv.boolean, + probatio.Required(CONF_MAC): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_FLIP_ON_OFF, default=False): cv.boolean, } ) diff --git a/homeassistant/components/syncthing/config_flow.py b/homeassistant/components/syncthing/config_flow.py index eb901399b2d5d..899e3ad511947 100644 --- a/homeassistant/components/syncthing/config_flow.py +++ b/homeassistant/components/syncthing/config_flow.py @@ -3,7 +3,7 @@ from typing import Any, override import aiosyncthing -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_TOKEN, CONF_URL, CONF_VERIFY_SSL @@ -12,11 +12,11 @@ from .const import DEFAULT_URL, DEFAULT_VERIFY_SSL, DOMAIN -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_URL, default=DEFAULT_URL): str, - vol.Required(CONF_TOKEN): str, - vol.Required(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): bool, + probatio.Required(CONF_URL, default=DEFAULT_URL): str, + probatio.Required(CONF_TOKEN): str, + probatio.Required(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): bool, } ) diff --git a/homeassistant/components/syncthru/config_flow.py b/homeassistant/components/syncthru/config_flow.py index 400b05a8e8959..38d0c29fc8e2b 100644 --- a/homeassistant/components/syncthru/config_flow.py +++ b/homeassistant/components/syncthru/config_flow.py @@ -4,9 +4,9 @@ from typing import TYPE_CHECKING, Any, override from urllib.parse import urlparse +import probatio from pysyncthru import ConnectionMode, SyncThru, SyncThruAPINotSupported from url_normalize import url_normalize -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_NAME, CONF_URL @@ -91,12 +91,16 @@ async def _async_show_form(self, step_id, user_input=None, errors=None): user_input = {} return self.async_show_form( step_id=step_id, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_URL, default=user_input.get(CONF_URL, "")): str, + probatio.Required( + CONF_URL, default=user_input.get(CONF_URL, "") + ): str, # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Optional(CONF_NAME, default=user_input.get(CONF_NAME, "")): str, + probatio.Optional( + CONF_NAME, default=user_input.get(CONF_NAME, "") + ): str, } ), errors=errors or {}, diff --git a/homeassistant/components/synology_chat/notify.py b/homeassistant/components/synology_chat/notify.py index 0dbc40e8937e9..e8922c7b5c23c 100644 --- a/homeassistant/components/synology_chat/notify.py +++ b/homeassistant/components/synology_chat/notify.py @@ -5,8 +5,8 @@ import logging from typing import Any, override +import probatio import requests -import voluptuous as vol from homeassistant.components.notify import ( ATTR_DATA, @@ -22,8 +22,8 @@ PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_RESOURCE): cv.url, - vol.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, + probatio.Required(CONF_RESOURCE): cv.url, + probatio.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, } ) diff --git a/homeassistant/components/synology_dsm/config_flow.py b/homeassistant/components/synology_dsm/config_flow.py index 2654d74fdd5fe..0c709f918bea5 100644 --- a/homeassistant/components/synology_dsm/config_flow.py +++ b/homeassistant/components/synology_dsm/config_flow.py @@ -7,6 +7,7 @@ from typing import TYPE_CHECKING, Any, cast, override from urllib.parse import urlparse +import probatio from synology_dsm import SynologyDSM from synology_dsm.api.file_station.models import SynoFileSharedFolder from synology_dsm.exceptions import ( @@ -16,7 +17,6 @@ SynologyDSMLoginInvalidException, SynologyDSMRequestException, ) -import voluptuous as vol from homeassistant.config_entries import ( ConfigEntry, @@ -80,37 +80,43 @@ HTTP_SUFFIX = "._http._tcp.local." -def _discovery_schema_with_defaults(discovery_info: DiscoveryInfoType) -> vol.Schema: - return vol.Schema(_ordered_shared_schema(discovery_info)) +def _discovery_schema_with_defaults( + discovery_info: DiscoveryInfoType, +) -> probatio.Schema: + return probatio.Schema(_ordered_shared_schema(discovery_info)) -def _reauth_schema() -> vol.Schema: - return vol.Schema( +def _reauth_schema() -> probatio.Schema: + return probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) -def _user_schema_with_defaults(user_input: dict[str, Any]) -> vol.Schema: +def _user_schema_with_defaults(user_input: dict[str, Any]) -> probatio.Schema: user_schema: VolDictType = { - vol.Required(CONF_HOST, default=user_input.get(CONF_HOST, "")): str, + probatio.Required(CONF_HOST, default=user_input.get(CONF_HOST, "")): str, } user_schema.update(_ordered_shared_schema(user_input)) - return vol.Schema(user_schema) + return probatio.Schema(user_schema) 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, - vol.Optional(CONF_PORT, default=schema_input.get(CONF_PORT, "")): str, - vol.Optional( + probatio.Required( + CONF_USERNAME, default=schema_input.get(CONF_USERNAME, "") + ): str, + probatio.Required( + CONF_PASSWORD, default=schema_input.get(CONF_PASSWORD, "") + ): str, + probatio.Optional(CONF_PORT, default=schema_input.get(CONF_PORT, "")): str, + probatio.Optional( CONF_SSL, default=schema_input.get(CONF_SSL, DEFAULT_USE_SSL) ): bool, - vol.Optional( + probatio.Optional( CONF_VERIFY_SSL, default=schema_input.get(CONF_VERIFY_SSL, DEFAULT_VERIFY_SSL), ): bool, @@ -400,7 +406,7 @@ async def async_step_2sa( if not user_input.get(CONF_OTP_CODE): return self.async_show_form( step_id="2sa", - data_schema=vol.Schema({vol.Required(CONF_OTP_CODE): str}), + data_schema=probatio.Schema({probatio.Required(CONF_OTP_CODE): str}), errors=errors or {}, ) @@ -419,9 +425,9 @@ async def async_step_backup_share( if user_input is None: return self.async_show_form( step_id="backup_share", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_BACKUP_SHARE): SelectSelector( + probatio.Required(CONF_BACKUP_SHARE): SelectSelector( SelectSelectorConfig( options=[ SelectOptionDict(value=s.path, label=s.name) @@ -430,10 +436,10 @@ async def async_step_backup_share( mode=SelectSelectorMode.DROPDOWN, ), ), - vol.Required( + probatio.Required( CONF_BACKUP_PATH, default=f"{DEFAULT_BACKUP_PATH}_{slugify(self.hass.config.location_name)}", - ): vol.All(str, vol.Length(min=1)), + ): probatio.All(str, probatio.Length(min=1)), } ), ) @@ -471,14 +477,14 @@ async def async_step_init( syno_data = self.config_entry.runtime_data - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required( + probatio.Required( CONF_SNAPSHOT_QUALITY, default=self.config_entry.options.get( CONF_SNAPSHOT_QUALITY, DEFAULT_SNAPSHOT_QUALITY ), - ): vol.All(vol.Coerce(int), vol.Range(min=0, max=2)), + ): probatio.All(probatio.Coerce(int), probatio.Range(min=0, max=2)), } ) @@ -492,7 +498,7 @@ async def async_step_init( if shares: data_schema = data_schema.extend( { - vol.Required( + probatio.Required( CONF_BACKUP_SHARE, default=self.config_entry.options[CONF_BACKUP_SHARE], ): SelectSelector( @@ -504,7 +510,7 @@ async def async_step_init( mode=SelectSelectorMode.DROPDOWN, ), ), - vol.Required( + probatio.Required( CONF_BACKUP_PATH, default=self.config_entry.options[CONF_BACKUP_PATH], ): str, diff --git a/homeassistant/components/synology_dsm/repairs.py b/homeassistant/components/synology_dsm/repairs.py index 2e425b18c6129..eb8445bd0ab2f 100644 --- a/homeassistant/components/synology_dsm/repairs.py +++ b/homeassistant/components/synology_dsm/repairs.py @@ -4,8 +4,8 @@ import logging from typing import cast +import probatio from synology_dsm.api.file_station.models import SynoFileSharedFolder -import voluptuous as vol from homeassistant.components.repairs import ( ConfirmRepairFlow, @@ -78,9 +78,9 @@ async def async_step_confirm( return self.async_abort(reason="no_shares") return self.async_show_form( - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_BACKUP_SHARE, default=self.entry.options[CONF_BACKUP_SHARE], ): SelectSelector( @@ -92,7 +92,7 @@ async def async_step_confirm( mode=SelectSelectorMode.DROPDOWN, ), ), - vol.Required( + probatio.Required( CONF_BACKUP_PATH, default=self.entry.options[CONF_BACKUP_PATH], ): str, diff --git a/homeassistant/components/synology_dsm/services.py b/homeassistant/components/synology_dsm/services.py index 844b9f8f4cb53..f0ca0fed74e4f 100644 --- a/homeassistant/components/synology_dsm/services.py +++ b/homeassistant/components/synology_dsm/services.py @@ -3,8 +3,8 @@ import logging from typing import cast +import probatio from synology_dsm.exceptions import SynologyDSMException -import voluptuous as vol from homeassistant.core import HomeAssistant, ServiceCall, callback from homeassistant.exceptions import HomeAssistantError @@ -96,5 +96,5 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, service, _service_handler, - vol.Schema({}, extra=vol.ALLOW_EXTRA), + probatio.Schema({}, extra=probatio.ALLOW_EXTRA), ) diff --git a/homeassistant/components/synology_srm/device_tracker.py b/homeassistant/components/synology_srm/device_tracker.py index b54f6ebd04766..84b1aa372ec46 100644 --- a/homeassistant/components/synology_srm/device_tracker.py +++ b/homeassistant/components/synology_srm/device_tracker.py @@ -3,8 +3,8 @@ import logging from typing import override +import probatio import synology_srm -import voluptuous as vol from homeassistant.components.device_tracker import ( DOMAIN as DEVICE_TRACKER_DOMAIN, @@ -32,12 +32,12 @@ PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_USERNAME, default=DEFAULT_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, - vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_USERNAME, default=DEFAULT_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, + probatio.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, } ) diff --git a/homeassistant/components/syslog/notify.py b/homeassistant/components/syslog/notify.py index 1c0916b3e4745..76fa9b5a197b6 100644 --- a/homeassistant/components/syslog/notify.py +++ b/homeassistant/components/syslog/notify.py @@ -3,7 +3,7 @@ import syslog from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.notify import ( ATTR_TITLE, @@ -60,9 +60,15 @@ PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_FACILITY, default="syslog"): vol.In(SYSLOG_FACILITY.keys()), - vol.Optional(CONF_OPTION, default="pid"): vol.In(SYSLOG_OPTION.keys()), - vol.Optional(CONF_PRIORITY, default=-1): vol.In(SYSLOG_PRIORITY.keys()), + probatio.Optional(CONF_FACILITY, default="syslog"): probatio.In( + SYSLOG_FACILITY.keys() + ), + probatio.Optional(CONF_OPTION, default="pid"): probatio.In( + SYSLOG_OPTION.keys() + ), + probatio.Optional(CONF_PRIORITY, default=-1): probatio.In( + SYSLOG_PRIORITY.keys() + ), } ) diff --git a/homeassistant/components/system_bridge/config_flow.py b/homeassistant/components/system_bridge/config_flow.py index 097c84d1bc4fd..d088f78d442b0 100644 --- a/homeassistant/components/system_bridge/config_flow.py +++ b/homeassistant/components/system_bridge/config_flow.py @@ -5,6 +5,7 @@ import logging from typing import Any, override +import probatio from systembridgeconnector.exceptions import ( AuthenticationException, ConnectionClosedException, @@ -12,7 +13,6 @@ ) from systembridgeconnector.models.modules import GetData, Module from systembridgeconnector.websocket_client import WebSocketClient -import voluptuous as vol from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PORT, CONF_TOKEN @@ -26,12 +26,14 @@ _LOGGER = logging.getLogger(__name__) -STEP_AUTHENTICATE_DATA_SCHEMA = vol.Schema({vol.Required(CONF_TOKEN): cv.string}) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_AUTHENTICATE_DATA_SCHEMA = probatio.Schema( + {probatio.Required(CONF_TOKEN): cv.string} +) +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_PORT, default=9170): cv.string, - vol.Required(CONF_TOKEN): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_PORT, default=9170): cv.string, + probatio.Required(CONF_TOKEN): cv.string, } ) diff --git a/homeassistant/components/system_bridge/services.py b/homeassistant/components/system_bridge/services.py index 97b505cba79b7..be05a522caa96 100644 --- a/homeassistant/components/system_bridge/services.py +++ b/homeassistant/components/system_bridge/services.py @@ -4,12 +4,12 @@ import logging from typing import Any +import probatio from systembridgeconnector.models.keyboard_key import KeyboardKey from systembridgeconnector.models.keyboard_text import KeyboardText from systembridgeconnector.models.modules.processes import Process from systembridgeconnector.models.open_path import OpenPath from systembridgeconnector.models.open_url import OpenUrl -import voluptuous as vol from homeassistant.const import CONF_COMMAND, CONF_ID, CONF_NAME, CONF_PATH, CONF_URL from homeassistant.core import ( @@ -49,10 +49,10 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, "get_process_by_id", handle_get_process_by_id, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(CONF_BRIDGE): cv.string, - vol.Required(CONF_ID): cv.positive_int, + probatio.Required(CONF_BRIDGE): cv.string, + probatio.Required(CONF_ID): cv.positive_int, }, ), supports_response=SupportsResponse.ONLY, @@ -62,10 +62,10 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, "get_processes_by_name", handle_get_processes_by_name, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(CONF_BRIDGE): cv.string, - vol.Required(CONF_NAME): cv.string, + probatio.Required(CONF_BRIDGE): cv.string, + probatio.Required(CONF_NAME): cv.string, }, ), supports_response=SupportsResponse.ONLY, @@ -75,10 +75,10 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, "open_path", handle_open_path, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(CONF_BRIDGE): cv.string, - vol.Required(CONF_PATH): cv.string, + probatio.Required(CONF_BRIDGE): cv.string, + probatio.Required(CONF_PATH): cv.string, }, ), supports_response=SupportsResponse.ONLY, @@ -88,10 +88,10 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, "power_command", handle_power_command, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(CONF_BRIDGE): cv.string, - vol.Required(CONF_COMMAND): vol.In(POWER_COMMAND_MAP), + probatio.Required(CONF_BRIDGE): cv.string, + probatio.Required(CONF_COMMAND): probatio.In(POWER_COMMAND_MAP), }, ), supports_response=SupportsResponse.ONLY, @@ -101,10 +101,10 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, "open_url", handle_open_url, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(CONF_BRIDGE): cv.string, - vol.Required(CONF_URL): cv.string, + probatio.Required(CONF_BRIDGE): cv.string, + probatio.Required(CONF_URL): cv.string, }, ), supports_response=SupportsResponse.ONLY, @@ -114,10 +114,10 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, "send_keypress", handle_send_keypress, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(CONF_BRIDGE): cv.string, - vol.Required(CONF_KEY): cv.string, + probatio.Required(CONF_BRIDGE): cv.string, + probatio.Required(CONF_KEY): cv.string, }, ), supports_response=SupportsResponse.ONLY, @@ -130,10 +130,10 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, "send_text", handle_send_text, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(CONF_BRIDGE): cv.string, - vol.Required(CONF_TEXT): cv.string, + probatio.Required(CONF_BRIDGE): cv.string, + probatio.Required(CONF_TEXT): cv.string, }, ), supports_response=SupportsResponse.ONLY, diff --git a/homeassistant/components/system_health/__init__.py b/homeassistant/components/system_health/__init__.py index f3716a31597ea..7e18a65b800ca 100644 --- a/homeassistant/components/system_health/__init__.py +++ b/homeassistant/components/system_health/__init__.py @@ -8,7 +8,7 @@ from typing import Any, Protocol import aiohttp -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.core import HomeAssistant, callback @@ -174,7 +174,7 @@ def _format_value(val: Any) -> Any: return val -@websocket_api.websocket_command({vol.Required("type"): "system_health/info"}) +@websocket_api.websocket_command({probatio.Required("type"): "system_health/info"}) @websocket_api.async_response async def handle_info( hass: HomeAssistant, connection: websocket_api.ActiveConnection, msg: dict[str, Any] diff --git a/homeassistant/components/system_log/__init__.py b/homeassistant/components/system_log/__init__.py index d9893ef95d64f..df913eea7288f 100644 --- a/homeassistant/components/system_log/__init__.py +++ b/homeassistant/components/system_log/__init__.py @@ -8,7 +8,7 @@ from types import FrameType from typing import Any, cast, override -import voluptuous as vol +import probatio from homeassistant import __path__ as HOMEASSISTANT_PATH from homeassistant.components import websocket_api @@ -35,28 +35,30 @@ SERVICE_CLEAR = "clear" SERVICE_WRITE = "write" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_MAX_ENTRIES, default=DEFAULT_MAX_ENTRIES ): cv.positive_int, - vol.Optional(CONF_FIRE_EVENT, default=DEFAULT_FIRE_EVENT): cv.boolean, + probatio.Optional( + CONF_FIRE_EVENT, default=DEFAULT_FIRE_EVENT + ): cv.boolean, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -SERVICE_CLEAR_SCHEMA = vol.Schema({}) -SERVICE_WRITE_SCHEMA = vol.Schema( +SERVICE_CLEAR_SCHEMA = probatio.Schema({}) +SERVICE_WRITE_SCHEMA = probatio.Schema( { - vol.Required(CONF_MESSAGE): cv.string, - vol.Optional(CONF_LEVEL, default="error"): vol.In( + probatio.Required(CONF_MESSAGE): cv.string, + probatio.Optional(CONF_LEVEL, default="error"): probatio.In( ["debug", "info", "warning", "error", "critical"] ), - vol.Optional(CONF_LOGGER): cv.string, + probatio.Optional(CONF_LOGGER): cv.string, } ) @@ -340,7 +342,7 @@ def _async_write_service_handler(service: ServiceCall) -> None: @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required("type"): "system_log/list"}) +@websocket_api.websocket_command({probatio.Required("type"): "system_log/list"}) @callback def list_errors( hass: HomeAssistant, connection: websocket_api.ActiveConnection, msg: dict[str, Any] diff --git a/homeassistant/components/systemmonitor/config_flow.py b/homeassistant/components/systemmonitor/config_flow.py index a198be0e8e786..b36b785d34fce 100644 --- a/homeassistant/components/systemmonitor/config_flow.py +++ b/homeassistant/components/systemmonitor/config_flow.py @@ -3,7 +3,7 @@ from collections.abc import Mapping from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import DOMAIN as BINARY_SENSOR_DOMAIN from homeassistant.helpers import entity_registry as er @@ -47,13 +47,13 @@ async def validate_sensor_setup( return {} -async def get_sensor_setup_schema(handler: SchemaCommonFlowHandler) -> vol.Schema: +async def get_sensor_setup_schema(handler: SchemaCommonFlowHandler) -> probatio.Schema: """Return process sensor setup schema.""" hass = handler.parent_handler.hass processes = list(await hass.async_add_executor_job(get_all_running_processes, hass)) - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_PROCESS): SelectSelector( + probatio.Required(CONF_PROCESS): SelectSelector( SelectSelectorConfig( options=processes, multiple=True, @@ -74,7 +74,7 @@ async def get_suggested_value(handler: SchemaCommonFlowHandler) -> dict[str, Any CONFIG_FLOW = { - "user": SchemaFlowFormStep(schema=vol.Schema({})), + "user": SchemaFlowFormStep(schema=probatio.Schema({})), } OPTIONS_FLOW = { "init": SchemaFlowFormStep( diff --git a/homeassistant/components/systemnexa2/config_flow.py b/homeassistant/components/systemnexa2/config_flow.py index 460c659584e2c..0ab16b7122e6b 100644 --- a/homeassistant/components/systemnexa2/config_flow.py +++ b/homeassistant/components/systemnexa2/config_flow.py @@ -6,8 +6,8 @@ from typing import Any, override import aiohttp +import probatio from sn2.device import Device -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_RECONFIGURE, @@ -31,9 +31,9 @@ _LOGGER = logging.getLogger(__name__) -_SCHEMA = vol.Schema( +_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, + probatio.Required(CONF_HOST): str, } ) diff --git a/homeassistant/components/tado/climate.py b/homeassistant/components/tado/climate.py index 3bf8c182e8679..3a74e7a4788b9 100644 --- a/homeassistant/components/tado/climate.py +++ b/homeassistant/components/tado/climate.py @@ -4,8 +4,8 @@ import logging from typing import Any, override +import probatio import PyTado -import voluptuous as vol from homeassistant.components.climate import ( FAN_AUTO, @@ -79,20 +79,20 @@ ATTR_REQUESTED_OVERLAY = "requested_overlay" CLIMATE_TIMER_SCHEMA: VolDictType = { - vol.Required(ATTR_TEMPERATURE): vol.Coerce(float), - vol.Exclusive(ATTR_TIME_PERIOD, CONST_EXCLUSIVE_OVERLAY_GROUP): vol.All( + probatio.Required(ATTR_TEMPERATURE): probatio.Coerce(float), + probatio.Exclusive(ATTR_TIME_PERIOD, CONST_EXCLUSIVE_OVERLAY_GROUP): probatio.All( cv.time_period, cv.positive_timedelta, lambda td: td.total_seconds() ), - vol.Exclusive(ATTR_REQUESTED_OVERLAY, CONST_EXCLUSIVE_OVERLAY_GROUP): vol.In( - CONST_OVERLAY_TADO_OPTIONS - ), + probatio.Exclusive( + ATTR_REQUESTED_OVERLAY, CONST_EXCLUSIVE_OVERLAY_GROUP + ): probatio.In(CONST_OVERLAY_TADO_OPTIONS), } SERVICE_TEMP_OFFSET = "set_climate_temperature_offset" ATTR_OFFSET = "offset" CLIMATE_TEMP_OFFSET_SCHEMA: VolDictType = { - vol.Required(ATTR_OFFSET, default=0): vol.Coerce(float), + probatio.Required(ATTR_OFFSET, default=0): probatio.Coerce(float), } diff --git a/homeassistant/components/tado/config_flow.py b/homeassistant/components/tado/config_flow.py index a57b07f87b59e..a8782202a75be 100644 --- a/homeassistant/components/tado/config_flow.py +++ b/homeassistant/components/tado/config_flow.py @@ -5,10 +5,10 @@ import logging from typing import Any, override +import probatio from PyTado.exceptions import TadoException from PyTado.http import DeviceActivationStatus from PyTado.interface import Tado -import voluptuous as vol from yarl import URL from homeassistant.config_entries import ( @@ -210,14 +210,14 @@ async def async_step_init( await self.hass.config_entries.async_reload(self.config_entry.entry_id) return result - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_FALLBACK, default=self.config_entry.options.get( CONF_FALLBACK, CONST_OVERLAY_TADO_DEFAULT ), - ): vol.In(CONST_OVERLAY_TADO_OPTIONS), + ): probatio.In(CONST_OVERLAY_TADO_OPTIONS), } ) return self.async_show_form(step_id="init", data_schema=data_schema) diff --git a/homeassistant/components/tado/services.py b/homeassistant/components/tado/services.py index 6f0c4f4ba8d8c..9b1f7cce0021a 100644 --- a/homeassistant/components/tado/services.py +++ b/homeassistant/components/tado/services.py @@ -2,7 +2,7 @@ import logging -import voluptuous as vol +import probatio from homeassistant.core import HomeAssistant, ServiceCall, callback from homeassistant.exceptions import HomeAssistantError @@ -18,14 +18,14 @@ from .coordinator import TadoConfigEntry _LOGGER = logging.getLogger(__name__) -SCHEMA_ADD_METER_READING = vol.Schema( +SCHEMA_ADD_METER_READING = probatio.Schema( { - vol.Required(CONF_CONFIG_ENTRY): selector.ConfigEntrySelector( + probatio.Required(CONF_CONFIG_ENTRY): selector.ConfigEntrySelector( { "integration": DOMAIN, } ), - vol.Required(CONF_READING): vol.Coerce(int), + probatio.Required(CONF_READING): probatio.Coerce(int), } ) diff --git a/homeassistant/components/tado/water_heater.py b/homeassistant/components/tado/water_heater.py index 175069a7171b4..b9d69f3fb945e 100644 --- a/homeassistant/components/tado/water_heater.py +++ b/homeassistant/components/tado/water_heater.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.water_heater import ( WaterHeaterEntity, @@ -52,10 +52,10 @@ ATTR_TIME_PERIOD = "time_period" WATER_HEATER_TIMER_SCHEMA: VolDictType = { - vol.Required(ATTR_TIME_PERIOD, default="01:00:00"): vol.All( + probatio.Required(ATTR_TIME_PERIOD, default="01:00:00"): probatio.All( cv.time_period, cv.positive_timedelta, lambda td: td.total_seconds() ), - vol.Optional(ATTR_TEMPERATURE): vol.Coerce(float), + probatio.Optional(ATTR_TEMPERATURE): probatio.Coerce(float), } diff --git a/homeassistant/components/tag/__init__.py b/homeassistant/components/tag/__init__.py index f1a895f33bed0..689a41df45dec 100644 --- a/homeassistant/components/tag/__init__.py +++ b/homeassistant/components/tag/__init__.py @@ -5,7 +5,7 @@ from typing import TYPE_CHECKING, Any, final, override import uuid -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.const import CONF_ID, CONF_NAME @@ -36,18 +36,18 @@ TAG_DATA: HassKey[TagStorageCollection] = HassKey(DOMAIN) CREATE_FIELDS: VolDictType = { - vol.Optional(TAG_ID): cv.string, - vol.Optional(CONF_NAME): vol.All(str, vol.Length(min=1)), - vol.Optional("description"): cv.string, - vol.Optional(LAST_SCANNED): cv.datetime, - vol.Optional(DEVICE_ID): cv.string, + probatio.Optional(TAG_ID): cv.string, + probatio.Optional(CONF_NAME): probatio.All(str, probatio.Length(min=1)), + probatio.Optional("description"): cv.string, + probatio.Optional(LAST_SCANNED): cv.datetime, + probatio.Optional(DEVICE_ID): cv.string, } UPDATE_FIELDS: VolDictType = { - vol.Optional(CONF_NAME): vol.All(str, vol.Length(min=1)), - vol.Optional("description"): cv.string, - vol.Optional(LAST_SCANNED): cv.datetime, - vol.Optional(DEVICE_ID): cv.string, + probatio.Optional(CONF_NAME): probatio.All(str, probatio.Length(min=1)), + probatio.Optional("description"): cv.string, + probatio.Optional(LAST_SCANNED): cv.datetime, + probatio.Optional(DEVICE_ID): cv.string, } CONFIG_SCHEMA = cv.empty_config_schema(DOMAIN) @@ -124,8 +124,8 @@ async def _async_migrate_func( class TagStorageCollection(collection.DictStorageCollection): """Tag collection stored in storage.""" - CREATE_SCHEMA = vol.Schema(CREATE_FIELDS) - UPDATE_SCHEMA = vol.Schema(UPDATE_FIELDS) + CREATE_SCHEMA = probatio.Schema(CREATE_FIELDS) + UPDATE_SCHEMA = probatio.Schema(UPDATE_FIELDS) def __init__( self, diff --git a/homeassistant/components/tag/trigger.py b/homeassistant/components/tag/trigger.py index ff4bc2ac2dafc..f89ad87f0c35c 100644 --- a/homeassistant/components/tag/trigger.py +++ b/homeassistant/components/tag/trigger.py @@ -1,6 +1,6 @@ """Support for tag triggers.""" -import voluptuous as vol +import probatio from homeassistant.const import CONF_PLATFORM from homeassistant.core import CALLBACK_TYPE, Event, HassJob, HomeAssistant @@ -12,9 +12,9 @@ TRIGGER_SCHEMA = cv.TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_PLATFORM): DOMAIN, - vol.Required(TAG_ID): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(DEVICE_ID): vol.All(cv.ensure_list, [cv.string]), + probatio.Required(CONF_PLATFORM): DOMAIN, + probatio.Required(TAG_ID): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(DEVICE_ID): probatio.All(cv.ensure_list, [cv.string]), } ) diff --git a/homeassistant/components/tailscale/config_flow.py b/homeassistant/components/tailscale/config_flow.py index dc8b16ad3c64c..b6052f40f0c4d 100644 --- a/homeassistant/components/tailscale/config_flow.py +++ b/homeassistant/components/tailscale/config_flow.py @@ -3,8 +3,8 @@ from collections.abc import Mapping from typing import Any, override +import probatio from tailscale import Tailscale, TailscaleAuthenticationError, TailscaleError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY @@ -66,12 +66,12 @@ async def async_step_user( return self.async_show_form( step_id="user", description_placeholders={"authkeys_url": AUTHKEYS_URL}, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_TAILNET, default=user_input.get(CONF_TAILNET, "") ): str, - vol.Required( + probatio.Required( CONF_API_KEY, default=user_input.get(CONF_API_KEY, "") ): str, } @@ -112,6 +112,6 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", description_placeholders={"authkeys_url": AUTHKEYS_URL}, - data_schema=vol.Schema({vol.Required(CONF_API_KEY): str}), + data_schema=probatio.Schema({probatio.Required(CONF_API_KEY): str}), errors=errors, ) diff --git a/homeassistant/components/tailwind/config_flow.py b/homeassistant/components/tailwind/config_flow.py index ae8c3d6a497d6..d4f65c6157161 100644 --- a/homeassistant/components/tailwind/config_flow.py +++ b/homeassistant/components/tailwind/config_flow.py @@ -11,7 +11,7 @@ TailwindUnsupportedFirmwareVersionError, tailwind_device_id_to_mac_address, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -72,12 +72,12 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_HOST, default=user_input.get(CONF_HOST) ): TextSelector(TextSelectorConfig(autocomplete="off")), - vol.Required(CONF_TOKEN): TextSelector( + probatio.Required(CONF_TOKEN): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } @@ -137,9 +137,9 @@ async def async_step_zeroconf_confirm( return self.async_show_form( step_id="zeroconf_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_TOKEN): TextSelector( + probatio.Required(CONF_TOKEN): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } @@ -173,13 +173,13 @@ async def async_step_reconfigure( return self.async_show_form( step_id="reconfigure", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_HOST, default=reconfigure_entry.data[CONF_HOST], ): TextSelector(TextSelectorConfig(autocomplete="off")), - vol.Required(CONF_TOKEN): TextSelector( + probatio.Required(CONF_TOKEN): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } @@ -216,9 +216,9 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_TOKEN): TextSelector( + probatio.Required(CONF_TOKEN): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } diff --git a/homeassistant/components/tami4/config_flow.py b/homeassistant/components/tami4/config_flow.py index 26cdccf6509c5..7b5bf9f7be5de 100644 --- a/homeassistant/components/tami4/config_flow.py +++ b/homeassistant/components/tami4/config_flow.py @@ -4,8 +4,8 @@ import re from typing import Any, override +import probatio from Tami4EdgeAPI import Tami4EdgeAPI, exceptions -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.exceptions import HomeAssistantError @@ -15,9 +15,9 @@ _LOGGER = logging.getLogger(__name__) -_STEP_PHONE_NUMBER_SCHEMA = vol.Schema({vol.Required(CONF_PHONE): cv.string}) +_STEP_PHONE_NUMBER_SCHEMA = probatio.Schema({probatio.Required(CONF_PHONE): cv.string}) -_STEP_OTP_CODE_SCHEMA = vol.Schema({vol.Required("otp"): cv.string}) +_STEP_OTP_CODE_SCHEMA = probatio.Schema({probatio.Required("otp"): cv.string}) _PHONE_MATCHER = re.compile(r"^(\+?972)?0?(?P\d{8,9})$") diff --git a/homeassistant/components/tank_utility/sensor.py b/homeassistant/components/tank_utility/sensor.py index e9da8df17289a..89b78b8a06140 100644 --- a/homeassistant/components/tank_utility/sensor.py +++ b/homeassistant/components/tank_utility/sensor.py @@ -3,9 +3,9 @@ import datetime import logging +import probatio import requests from tank_utility import auth, device as tank_monitor -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -23,9 +23,11 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_EMAIL): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Required(CONF_DEVICES): vol.All(cv.ensure_list, vol.Length(min=1)), + probatio.Required(CONF_EMAIL): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_DEVICES): probatio.All( + cv.ensure_list, probatio.Length(min=1) + ), } ) diff --git a/homeassistant/components/tankerkoenig/config_flow.py b/homeassistant/components/tankerkoenig/config_flow.py index 0f93f3e4c9e75..196cda94eee7d 100644 --- a/homeassistant/components/tankerkoenig/config_flow.py +++ b/homeassistant/components/tankerkoenig/config_flow.py @@ -10,7 +10,7 @@ Tankerkoenig, TankerkoenigInvalidKeyError, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigFlow, @@ -121,8 +121,8 @@ async def async_step_select_station( return self.async_show_form( step_id="select_station", description_placeholders={"stations_count": str(len(self._stations))}, - data_schema=vol.Schema( - {vol.Required(CONF_STATIONS): cv.multi_select(self._stations)} + data_schema=probatio.Schema( + {probatio.Required(CONF_STATIONS): cv.multi_select(self._stations)} ), ) @@ -167,17 +167,17 @@ def _show_form_user( user_input = {} return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Required( + probatio.Required( CONF_NAME, default=user_input.get(CONF_NAME, "") ): cv.string, - vol.Required( + probatio.Required( CONF_API_KEY, default=user_input.get(CONF_API_KEY, "") ): cv.string, - vol.Required( + probatio.Required( CONF_LOCATION, default=user_input.get( CONF_LOCATION, @@ -187,7 +187,7 @@ def _show_form_user( }, ), ): LocationSelector(), - vol.Required( + probatio.Required( CONF_RADIUS, default=user_input.get(CONF_RADIUS, DEFAULT_RADIUS) ): NumberSelector( NumberSelectorConfig( @@ -211,9 +211,9 @@ def _show_form_reauth( user_input = {} return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_API_KEY, default=user_input.get(CONF_API_KEY, "") ): cv.string, } @@ -277,13 +277,13 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_SHOW_ON_MAP, default=self.config_entry.options[CONF_SHOW_ON_MAP], ): bool, - vol.Required( + probatio.Required( CONF_STATIONS, default=self.config_entry.data[CONF_STATIONS] ): cv.multi_select(self._stations), } diff --git a/homeassistant/components/tapsaff/binary_sensor.py b/homeassistant/components/tapsaff/binary_sensor.py index 9adfa30cfe890..754dea743dc7f 100644 --- a/homeassistant/components/tapsaff/binary_sensor.py +++ b/homeassistant/components/tapsaff/binary_sensor.py @@ -4,8 +4,8 @@ import logging from typing import override +import probatio from tapsaff import TapsAff -import voluptuous as vol from homeassistant.components.binary_sensor import ( PLATFORM_SCHEMA as BINARY_SENSOR_PLATFORM_SCHEMA, @@ -25,8 +25,8 @@ PLATFORM_SCHEMA = BINARY_SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_LOCATION): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_LOCATION): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/tasmota/config_flow.py b/homeassistant/components/tasmota/config_flow.py index 68f2d6570ba3d..291231c9945e1 100644 --- a/homeassistant/components/tasmota/config_flow.py +++ b/homeassistant/components/tasmota/config_flow.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.mqtt import valid_subscribe_topic from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -74,7 +74,7 @@ async def async_step_config( prefix = prefix.removesuffix("/#") try: valid_subscribe_topic(f"{prefix}/#") - except vol.Invalid: + except probatio.Invalid: errors["base"] = "invalid_discovery_topic" bad_prefix = True else: @@ -83,10 +83,10 @@ async def async_step_config( return self.async_create_entry(title="Tasmota", data=data) fields = {} - fields[vol.Optional(CONF_DISCOVERY_PREFIX, default=self._prefix)] = str + fields[probatio.Optional(CONF_DISCOVERY_PREFIX, default=self._prefix)] = str return self.async_show_form( - step_id="config", data_schema=vol.Schema(fields), errors=errors + step_id="config", data_schema=probatio.Schema(fields), errors=errors ) async def async_step_confirm( diff --git a/homeassistant/components/tasmota/device_trigger.py b/homeassistant/components/tasmota/device_trigger.py index f6378bbb3c2e0..4a9474ce1915d 100644 --- a/homeassistant/components/tasmota/device_trigger.py +++ b/homeassistant/components/tasmota/device_trigger.py @@ -6,7 +6,7 @@ import attr from hatasmota.models import DiscoveryHashType from hatasmota.trigger import TasmotaTrigger, TasmotaTriggerConfig -import voluptuous as vol +import probatio from homeassistant.components.device_automation import DEVICE_TRIGGER_BASE_SCHEMA from homeassistant.components.homeassistant.triggers import event as event_trigger @@ -31,12 +31,12 @@ TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_PLATFORM): DEVICE, - vol.Required(CONF_DOMAIN): DOMAIN, - vol.Required(CONF_DEVICE_ID): str, - vol.Required(CONF_DISCOVERY_ID): str, - vol.Required(CONF_TYPE): cv.string, - vol.Required(CONF_SUBTYPE): cv.string, + probatio.Required(CONF_PLATFORM): DEVICE, + probatio.Required(CONF_DOMAIN): DOMAIN, + probatio.Required(CONF_DEVICE_ID): str, + probatio.Required(CONF_DISCOVERY_ID): str, + probatio.Required(CONF_TYPE): cv.string, + probatio.Required(CONF_SUBTYPE): cv.string, } ) diff --git a/homeassistant/components/tautulli/config_flow.py b/homeassistant/components/tautulli/config_flow.py index 2fe74a39dfe51..c1669b92d8b80 100644 --- a/homeassistant/components/tautulli/config_flow.py +++ b/homeassistant/components/tautulli/config_flow.py @@ -3,8 +3,8 @@ from collections.abc import Mapping from typing import Any, override +import probatio from pytautulli import PyTautulli, PyTautulliException, exceptions -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY, CONF_URL, CONF_VERIFY_SSL @@ -35,16 +35,18 @@ async def async_step_user( user_input = user_input or {} data_schema = { - vol.Required(CONF_API_KEY, default=user_input.get(CONF_API_KEY, "")): str, - vol.Required(CONF_URL, default=user_input.get(CONF_URL, "")): str, - vol.Optional( + probatio.Required( + CONF_API_KEY, default=user_input.get(CONF_API_KEY, "") + ): str, + probatio.Required(CONF_URL, default=user_input.get(CONF_URL, "")): str, + probatio.Optional( CONF_VERIFY_SSL, default=user_input.get(CONF_VERIFY_SSL, True) ): bool, } return self.async_show_form( step_id="user", - data_schema=vol.Schema(data_schema), + data_schema=probatio.Schema(data_schema), errors=errors or {}, description_placeholders={ "sample_url": "http://192.168.0.10:8181", @@ -71,7 +73,7 @@ async def async_step_reauth_confirm( errors["base"] = error return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema({vol.Required(CONF_API_KEY): str}), + data_schema=probatio.Schema({probatio.Required(CONF_API_KEY): str}), errors=errors, ) diff --git a/homeassistant/components/tcp/common.py b/homeassistant/components/tcp/common.py index accb7ac6206ac..1df7da80417db 100644 --- a/homeassistant/components/tcp/common.py +++ b/homeassistant/components/tcp/common.py @@ -2,7 +2,7 @@ from typing import Any, Final -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_HOST, @@ -27,16 +27,16 @@ DEFAULT_VERIFY_SSL, ) -TCP_PLATFORM_SCHEMA: Final[dict[vol.Marker, Any]] = { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_PORT): cv.port, - vol.Required(CONF_PAYLOAD): cv.string, - vol.Optional(CONF_BUFFER_SIZE, default=DEFAULT_BUFFER_SIZE): cv.positive_int, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, - vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, - vol.Optional(CONF_VALUE_ON): cv.string, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, - vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, - vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, +TCP_PLATFORM_SCHEMA: Final[dict[probatio.Marker, Any]] = { + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_PORT): cv.port, + probatio.Required(CONF_PAYLOAD): cv.string, + probatio.Optional(CONF_BUFFER_SIZE, default=DEFAULT_BUFFER_SIZE): cv.positive_int, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, + probatio.Optional(CONF_VALUE_ON): cv.string, + probatio.Optional(CONF_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, + probatio.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, } diff --git a/homeassistant/components/technove/config_flow.py b/homeassistant/components/technove/config_flow.py index fb4eabff5482e..934b799c6eb2c 100644 --- a/homeassistant/components/technove/config_flow.py +++ b/homeassistant/components/technove/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from technove import Station as TechnoVEStation, TechnoVE, TechnoVEError -import voluptuous as vol from homeassistant.components import onboarding from homeassistant.config_entries import ( @@ -64,7 +64,7 @@ async def async_step_user( }, ) - data_schema = vol.Schema({vol.Required(CONF_HOST): str}) + data_schema = probatio.Schema({probatio.Required(CONF_HOST): str}) if self.source == SOURCE_RECONFIGURE: data_schema = self.add_suggested_values_to_schema( data_schema, diff --git a/homeassistant/components/ted5000/sensor.py b/homeassistant/components/ted5000/sensor.py index bc15665fdd770..4d01cef74cbef 100644 --- a/homeassistant/components/ted5000/sensor.py +++ b/homeassistant/components/ted5000/sensor.py @@ -5,8 +5,8 @@ import logging from typing import override +import probatio import requests -import voluptuous as vol import xmltodict from homeassistant.components.sensor import ( @@ -38,9 +38,9 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_PORT, default=80): cv.port, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_PORT, default=80): cv.port, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/tedee/config_flow.py b/homeassistant/components/tedee/config_flow.py index b2287fbc50306..2c5fbfa3b079b 100644 --- a/homeassistant/components/tedee/config_flow.py +++ b/homeassistant/components/tedee/config_flow.py @@ -11,7 +11,7 @@ TedeeLocalAuthException, TedeeLocalClient, ) -import voluptuous as vol +import probatio from homeassistant.components.webhook import async_generate_id as webhook_generate_id from homeassistant.config_entries import ( @@ -81,12 +81,12 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_HOST, ): str, - vol.Required( + probatio.Required( CONF_LOCAL_ACCESS_TOKEN, ): str, } @@ -107,9 +107,9 @@ async def async_step_reauth_confirm( if not user_input: return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_LOCAL_ACCESS_TOKEN, default=self._get_reauth_entry().data[ CONF_LOCAL_ACCESS_TOKEN @@ -128,12 +128,12 @@ async def async_step_reconfigure( reconfigure_entry = self._get_reconfigure_entry() return self.async_show_form( step_id="reconfigure", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_HOST, default=reconfigure_entry.data[CONF_HOST] ): str, - vol.Required( + probatio.Required( CONF_LOCAL_ACCESS_TOKEN, default=reconfigure_entry.data[CONF_LOCAL_ACCESS_TOKEN], ): str, diff --git a/homeassistant/components/telegram/notify.py b/homeassistant/components/telegram/notify.py index 1eb9646ddb983..da6451cdb42db 100644 --- a/homeassistant/components/telegram/notify.py +++ b/homeassistant/components/telegram/notify.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.notify import ( ATTR_DATA, @@ -42,7 +42,7 @@ CONF_CHAT_ID = "chat_id" PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_CHAT_ID): vol.Coerce(int)} + {probatio.Required(CONF_CHAT_ID): probatio.Coerce(int)} ) diff --git a/homeassistant/components/telegram_bot/config_flow.py b/homeassistant/components/telegram_bot/config_flow.py index 0aa84bc996c95..620dd4c041724 100644 --- a/homeassistant/components/telegram_bot/config_flow.py +++ b/homeassistant/components/telegram_bot/config_flow.py @@ -6,9 +6,9 @@ from types import MappingProxyType from typing import Any, override +import probatio from telegram import Bot, ChatFullInfo from telegram.error import BadRequest, InvalidToken, TelegramError -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_RECONFIGURE, @@ -69,9 +69,9 @@ "default_api_endpoint": DEFAULT_API_ENDPOINT, } -STEP_USER_DATA_SCHEMA: vol.Schema = vol.Schema( +STEP_USER_DATA_SCHEMA: probatio.Schema = probatio.Schema( { - vol.Required(CONF_PLATFORM): SelectSelector( + probatio.Required(CONF_PLATFORM): SelectSelector( SelectSelectorConfig( options=[ PLATFORM_BROADCAST, @@ -81,22 +81,22 @@ translation_key="platforms", ) ), - vol.Required(CONF_API_KEY): TextSelector( + probatio.Required(CONF_API_KEY): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", ) ), - vol.Required(SECTION_ADDITIONAL_SETTINGS): section( - vol.Schema( + probatio.Required(SECTION_ADDITIONAL_SETTINGS): section( + probatio.Schema( { - vol.Required( + probatio.Required( CONF_API_ENDPOINT, default=DEFAULT_API_ENDPOINT, ): TextSelector( config=TextSelectorConfig(type=TextSelectorType.URL) ), - vol.Optional(CONF_PROXY_URL): TextSelector( + probatio.Optional(CONF_PROXY_URL): TextSelector( config=TextSelectorConfig(type=TextSelectorType.URL) ), }, @@ -105,9 +105,9 @@ ), } ) -STEP_RECONFIGURE_USER_DATA_SCHEMA: vol.Schema = vol.Schema( +STEP_RECONFIGURE_USER_DATA_SCHEMA: probatio.Schema = probatio.Schema( { - vol.Required(CONF_PLATFORM): SelectSelector( + probatio.Required(CONF_PLATFORM): SelectSelector( SelectSelectorConfig( options=[ PLATFORM_BROADCAST, @@ -117,16 +117,16 @@ translation_key="platforms", ) ), - vol.Required(SECTION_ADDITIONAL_SETTINGS): section( - vol.Schema( + probatio.Required(SECTION_ADDITIONAL_SETTINGS): section( + probatio.Schema( { - vol.Required( + probatio.Required( CONF_API_ENDPOINT, default=DEFAULT_API_ENDPOINT, ): TextSelector( config=TextSelectorConfig(type=TextSelectorType.URL) ), - vol.Optional(CONF_PROXY_URL): TextSelector( + probatio.Optional(CONF_PROXY_URL): TextSelector( config=TextSelectorConfig(type=TextSelectorType.URL) ), }, @@ -135,9 +135,9 @@ ), } ) -STEP_REAUTH_DATA_SCHEMA: vol.Schema = vol.Schema( +STEP_REAUTH_DATA_SCHEMA: probatio.Schema = probatio.Schema( { - vol.Required(CONF_API_KEY): TextSelector( + probatio.Required(CONF_API_KEY): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", @@ -145,18 +145,20 @@ ) } ) -STEP_WEBHOOKS_DATA_SCHEMA: vol.Schema = vol.Schema( +STEP_WEBHOOKS_DATA_SCHEMA: probatio.Schema = probatio.Schema( { - vol.Optional(CONF_URL): TextSelector( + probatio.Optional(CONF_URL): TextSelector( config=TextSelectorConfig(type=TextSelectorType.URL) ), - vol.Required(CONF_TRUSTED_NETWORKS): vol.Coerce(str), + probatio.Required(CONF_TRUSTED_NETWORKS): probatio.Coerce(str), } ) -SUBENTRY_SCHEMA: vol.Schema = vol.Schema({vol.Required(CONF_CHAT_ID): vol.Coerce(int)}) -OPTIONS_SCHEMA: vol.Schema = vol.Schema( +SUBENTRY_SCHEMA: probatio.Schema = probatio.Schema( + {probatio.Required(CONF_CHAT_ID): probatio.Coerce(int)} +) +OPTIONS_SCHEMA: probatio.Schema = probatio.Schema( { - vol.Required( + probatio.Required( ATTR_PARSER, ): SelectSelector( SelectSelectorConfig( diff --git a/homeassistant/components/telegram_bot/services.py b/homeassistant/components/telegram_bot/services.py index f87275e18d803..acd58d7a05871 100644 --- a/homeassistant/components/telegram_bot/services.py +++ b/homeassistant/components/telegram_bot/services.py @@ -2,9 +2,9 @@ import logging +import probatio from telegram.constants import InputMediaType from telegram.error import TelegramError -import voluptuous as vol from homeassistant.components.script import DOMAIN as SCRIPT_DOMAIN from homeassistant.config_entries import ConfigEntryState @@ -120,63 +120,79 @@ _LOGGER = logging.getLogger(__name__) -ATTR_PARSER_SCHEMA = vol.All( +ATTR_PARSER_SCHEMA = probatio.All( cv.string, - vol.In([PARSER_HTML, PARSER_MD, PARSER_MD2, PARSER_PLAIN_TEXT]), + probatio.In([PARSER_HTML, PARSER_MD, PARSER_MD2, PARSER_PLAIN_TEXT]), ) -BASE_SERVICE_SCHEMA = vol.Schema( +BASE_SERVICE_SCHEMA = probatio.Schema( { - vol.Optional(ATTR_ENTITY_ID): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(ATTR_TARGET): vol.All(cv.ensure_list, [vol.Coerce(int)]), - vol.Optional(CONF_CONFIG_ENTRY_ID): cv.string, - vol.Optional(ATTR_CHAT_ID): vol.All(cv.ensure_list, [vol.Coerce(int)]), - vol.Optional(ATTR_PARSER): ATTR_PARSER_SCHEMA, - vol.Optional(ATTR_DISABLE_NOTIF): cv.boolean, - vol.Optional(ATTR_DISABLE_WEB_PREV): cv.boolean, - vol.Optional(ATTR_RESIZE_KEYBOARD): cv.boolean, - vol.Optional(ATTR_ONE_TIME_KEYBOARD): cv.boolean, - vol.Optional(ATTR_KEYBOARD): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(ATTR_KEYBOARD_INLINE): cv.ensure_list, - vol.Optional(ATTR_TIMEOUT): cv.positive_int, - vol.Optional(ATTR_MESSAGE_TAG): cv.string, - vol.Optional(ATTR_MESSAGE_THREAD_ID): vol.Coerce(int), + probatio.Optional(ATTR_ENTITY_ID): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(ATTR_TARGET): probatio.All( + cv.ensure_list, [probatio.Coerce(int)] + ), + probatio.Optional(CONF_CONFIG_ENTRY_ID): cv.string, + probatio.Optional(ATTR_CHAT_ID): probatio.All( + cv.ensure_list, [probatio.Coerce(int)] + ), + probatio.Optional(ATTR_PARSER): ATTR_PARSER_SCHEMA, + probatio.Optional(ATTR_DISABLE_NOTIF): cv.boolean, + probatio.Optional(ATTR_DISABLE_WEB_PREV): cv.boolean, + probatio.Optional(ATTR_RESIZE_KEYBOARD): cv.boolean, + probatio.Optional(ATTR_ONE_TIME_KEYBOARD): cv.boolean, + probatio.Optional(ATTR_KEYBOARD): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(ATTR_KEYBOARD_INLINE): cv.ensure_list, + probatio.Optional(ATTR_TIMEOUT): cv.positive_int, + probatio.Optional(ATTR_MESSAGE_TAG): cv.string, + probatio.Optional(ATTR_MESSAGE_THREAD_ID): probatio.Coerce(int), } ) -SERVICE_SCHEMA_SEND_MESSAGE = vol.All( +SERVICE_SCHEMA_SEND_MESSAGE = probatio.All( cv.deprecated(ATTR_TIMEOUT), BASE_SERVICE_SCHEMA.extend( { - vol.Required(ATTR_MESSAGE): cv.string, - vol.Optional(ATTR_TITLE): cv.string, - vol.Optional(ATTR_REPLY_TO_MSGID): vol.Coerce(int), + probatio.Required(ATTR_MESSAGE): cv.string, + probatio.Optional(ATTR_TITLE): cv.string, + probatio.Optional(ATTR_REPLY_TO_MSGID): probatio.Coerce(int), } ), ) -SERVICE_SCHEMA_SEND_MESSAGE_DRAFT = vol.Schema( +SERVICE_SCHEMA_SEND_MESSAGE_DRAFT = probatio.Schema( { - vol.Optional(ATTR_ENTITY_ID): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(ATTR_TARGET): vol.All(cv.ensure_list, [vol.Coerce(int)]), - vol.Optional(CONF_CONFIG_ENTRY_ID): cv.string, - vol.Optional(ATTR_CHAT_ID): vol.All(cv.ensure_list, [vol.Coerce(int)]), - vol.Optional(ATTR_MESSAGE_THREAD_ID): vol.Coerce(int), - vol.Required(ATTR_DRAFT_ID): vol.All(vol.Coerce(int), vol.Range(min=1)), - vol.Required(ATTR_MESSAGE): cv.string, - vol.Optional(ATTR_PARSER): ATTR_PARSER_SCHEMA, + probatio.Optional(ATTR_ENTITY_ID): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(ATTR_TARGET): probatio.All( + cv.ensure_list, [probatio.Coerce(int)] + ), + probatio.Optional(CONF_CONFIG_ENTRY_ID): cv.string, + probatio.Optional(ATTR_CHAT_ID): probatio.All( + cv.ensure_list, [probatio.Coerce(int)] + ), + probatio.Optional(ATTR_MESSAGE_THREAD_ID): probatio.Coerce(int), + probatio.Required(ATTR_DRAFT_ID): probatio.All( + probatio.Coerce(int), probatio.Range(min=1) + ), + probatio.Required(ATTR_MESSAGE): cv.string, + probatio.Optional(ATTR_PARSER): ATTR_PARSER_SCHEMA, } ) -SERVICE_SCHEMA_SEND_CHAT_ACTION = vol.All( +SERVICE_SCHEMA_SEND_CHAT_ACTION = probatio.All( cv.deprecated(ATTR_TIMEOUT), - vol.Schema( + probatio.Schema( { - vol.Optional(ATTR_ENTITY_ID): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(CONF_CONFIG_ENTRY_ID): cv.string, - vol.Optional(ATTR_TARGET): vol.All(cv.ensure_list, [vol.Coerce(int)]), - vol.Optional(ATTR_CHAT_ID): vol.All(cv.ensure_list, [vol.Coerce(int)]), - vol.Required(ATTR_CHAT_ACTION): vol.In( + probatio.Optional(ATTR_ENTITY_ID): probatio.All( + cv.ensure_list, [cv.string] + ), + probatio.Optional(CONF_CONFIG_ENTRY_ID): cv.string, + probatio.Optional(ATTR_TARGET): probatio.All( + cv.ensure_list, [probatio.Coerce(int)] + ), + probatio.Optional(ATTR_CHAT_ID): probatio.All( + cv.ensure_list, [probatio.Coerce(int)] + ), + probatio.Required(ATTR_CHAT_ACTION): probatio.In( ( CHAT_ACTION_TYPING, CHAT_ACTION_UPLOAD_PHOTO, @@ -191,40 +207,42 @@ CHAT_ACTION_UPLOAD_VIDEO_NOTE, ) ), - vol.Optional(ATTR_MESSAGE_THREAD_ID): vol.Coerce(int), + probatio.Optional(ATTR_MESSAGE_THREAD_ID): probatio.Coerce(int), } ), ) SERVICE_SCHEMA_BASE_SEND_FILE = BASE_SERVICE_SCHEMA.extend( { - vol.Optional(ATTR_URL): cv.string, - vol.Optional(ATTR_FILE): cv.string, - vol.Optional(ATTR_CAPTION): cv.string, - vol.Optional(ATTR_USERNAME): cv.string, - vol.Optional(ATTR_PASSWORD): cv.string, - vol.Optional(ATTR_AUTHENTICATION): cv.string, - vol.Optional(ATTR_VERIFY_SSL): cv.boolean, - vol.Optional(ATTR_REPLY_TO_MSGID): vol.Coerce(int), + probatio.Optional(ATTR_URL): cv.string, + probatio.Optional(ATTR_FILE): cv.string, + probatio.Optional(ATTR_CAPTION): cv.string, + probatio.Optional(ATTR_USERNAME): cv.string, + probatio.Optional(ATTR_PASSWORD): cv.string, + probatio.Optional(ATTR_AUTHENTICATION): cv.string, + probatio.Optional(ATTR_VERIFY_SSL): cv.boolean, + probatio.Optional(ATTR_REPLY_TO_MSGID): probatio.Coerce(int), } ) -SERVICE_SCHEMA_SEND_FILE = vol.All( +SERVICE_SCHEMA_SEND_FILE = probatio.All( cv.deprecated(ATTR_TIMEOUT), SERVICE_SCHEMA_BASE_SEND_FILE, ) -SERVICE_SCHEMA_SEND_MEDIA_GROUP = vol.Schema( +SERVICE_SCHEMA_SEND_MEDIA_GROUP = probatio.Schema( { - vol.Optional(ATTR_ENTITY_ID): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(CONF_CONFIG_ENTRY_ID): cv.string, - vol.Optional(ATTR_CHAT_ID): vol.All(cv.ensure_list, [vol.Coerce(int)]), - vol.Required(ATTR_MEDIA): vol.All( + probatio.Optional(ATTR_ENTITY_ID): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(CONF_CONFIG_ENTRY_ID): cv.string, + probatio.Optional(ATTR_CHAT_ID): probatio.All( + cv.ensure_list, [probatio.Coerce(int)] + ), + probatio.Required(ATTR_MEDIA): probatio.All( cv.ensure_list, [ - vol.Schema( + probatio.Schema( { - vol.Required(ATTR_MEDIA_TYPE): vol.In( + probatio.Required(ATTR_MEDIA_TYPE): probatio.In( ( str(InputMediaType.AUDIO), str(InputMediaType.VIDEO), @@ -232,94 +250,106 @@ str(InputMediaType.PHOTO), ) ), - vol.Optional(ATTR_URL): cv.string, - vol.Optional(ATTR_FILE): cv.string, - vol.Optional(ATTR_CAPTION): cv.string, - vol.Optional(ATTR_USERNAME): cv.string, - vol.Optional(ATTR_PASSWORD): cv.string, - vol.Optional(ATTR_AUTHENTICATION): cv.string, - vol.Optional(ATTR_VERIFY_SSL, default=True): cv.boolean, + probatio.Optional(ATTR_URL): cv.string, + probatio.Optional(ATTR_FILE): cv.string, + probatio.Optional(ATTR_CAPTION): cv.string, + probatio.Optional(ATTR_USERNAME): cv.string, + probatio.Optional(ATTR_PASSWORD): cv.string, + probatio.Optional(ATTR_AUTHENTICATION): cv.string, + probatio.Optional(ATTR_VERIFY_SSL, default=True): cv.boolean, } ) ], - vol.Length(min=2, max=10), + probatio.Length(min=2, max=10), ), - vol.Optional(ATTR_PARSER): ATTR_PARSER_SCHEMA, - vol.Optional(ATTR_DISABLE_NOTIF): cv.boolean, - vol.Optional(ATTR_PROTECT_CONTENT): cv.boolean, - vol.Optional(ATTR_REPLY_TO_MSGID): vol.Coerce(int), - vol.Optional(ATTR_MESSAGE_THREAD_ID): vol.Coerce(int), + probatio.Optional(ATTR_PARSER): ATTR_PARSER_SCHEMA, + probatio.Optional(ATTR_DISABLE_NOTIF): cv.boolean, + probatio.Optional(ATTR_PROTECT_CONTENT): cv.boolean, + probatio.Optional(ATTR_REPLY_TO_MSGID): probatio.Coerce(int), + probatio.Optional(ATTR_MESSAGE_THREAD_ID): probatio.Coerce(int), } ) -SERVICE_SCHEMA_SEND_STICKER = vol.All( +SERVICE_SCHEMA_SEND_STICKER = probatio.All( cv.deprecated(ATTR_TIMEOUT), - SERVICE_SCHEMA_BASE_SEND_FILE.extend({vol.Optional(ATTR_STICKER_ID): cv.string}), + SERVICE_SCHEMA_BASE_SEND_FILE.extend( + {probatio.Optional(ATTR_STICKER_ID): cv.string} + ), ) -SERVICE_SCHEMA_SEND_LOCATION = vol.All( +SERVICE_SCHEMA_SEND_LOCATION = probatio.All( cv.deprecated(ATTR_TIMEOUT), BASE_SERVICE_SCHEMA.extend( { - vol.Required(ATTR_LONGITUDE): cv.string, - vol.Required(ATTR_LATITUDE): cv.string, - vol.Optional(ATTR_REPLY_TO_MSGID): vol.Coerce(int), + probatio.Required(ATTR_LONGITUDE): cv.string, + probatio.Required(ATTR_LATITUDE): cv.string, + probatio.Optional(ATTR_REPLY_TO_MSGID): probatio.Coerce(int), } ), ) -SERVICE_SCHEMA_SEND_POLL = vol.All( +SERVICE_SCHEMA_SEND_POLL = probatio.All( cv.deprecated(ATTR_TIMEOUT), - vol.Schema( + probatio.Schema( { - vol.Optional(ATTR_ENTITY_ID): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(CONF_CONFIG_ENTRY_ID): cv.string, - vol.Optional(ATTR_CHAT_ID): vol.All(cv.ensure_list, [vol.Coerce(int)]), - vol.Optional(ATTR_TARGET): vol.All(cv.ensure_list, [vol.Coerce(int)]), - vol.Required(ATTR_QUESTION): cv.string, - vol.Required(ATTR_OPTIONS): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(ATTR_OPEN_PERIOD): cv.positive_int, - vol.Optional(ATTR_IS_ANONYMOUS, default=True): cv.boolean, - vol.Optional(ATTR_ALLOWS_MULTIPLE_ANSWERS, default=False): cv.boolean, - vol.Optional(ATTR_DISABLE_NOTIF): cv.boolean, - vol.Optional(ATTR_MESSAGE_THREAD_ID): vol.Coerce(int), - vol.Optional(ATTR_REPLY_TO_MSGID): vol.Coerce(int), + probatio.Optional(ATTR_ENTITY_ID): probatio.All( + cv.ensure_list, [cv.string] + ), + probatio.Optional(CONF_CONFIG_ENTRY_ID): cv.string, + probatio.Optional(ATTR_CHAT_ID): probatio.All( + cv.ensure_list, [probatio.Coerce(int)] + ), + probatio.Optional(ATTR_TARGET): probatio.All( + cv.ensure_list, [probatio.Coerce(int)] + ), + probatio.Required(ATTR_QUESTION): cv.string, + probatio.Required(ATTR_OPTIONS): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(ATTR_OPEN_PERIOD): cv.positive_int, + probatio.Optional(ATTR_IS_ANONYMOUS, default=True): cv.boolean, + probatio.Optional(ATTR_ALLOWS_MULTIPLE_ANSWERS, default=False): cv.boolean, + probatio.Optional(ATTR_DISABLE_NOTIF): cv.boolean, + probatio.Optional(ATTR_MESSAGE_THREAD_ID): probatio.Coerce(int), + probatio.Optional(ATTR_REPLY_TO_MSGID): probatio.Coerce(int), } ), ) -SERVICE_SCHEMA_EDIT_MESSAGE = vol.All( +SERVICE_SCHEMA_EDIT_MESSAGE = probatio.All( cv.deprecated(ATTR_TIMEOUT), - vol.Schema( + probatio.Schema( { - vol.Optional(ATTR_ENTITY_ID): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(CONF_CONFIG_ENTRY_ID): cv.string, - vol.Optional(ATTR_TITLE): cv.string, - vol.Required(ATTR_MESSAGE): cv.string, - vol.Required(ATTR_MESSAGE_ID): vol.Any( - cv.positive_int, vol.All(cv.string, "last") + probatio.Optional(ATTR_ENTITY_ID): probatio.All( + cv.ensure_list, [cv.string] + ), + probatio.Optional(CONF_CONFIG_ENTRY_ID): cv.string, + probatio.Optional(ATTR_TITLE): cv.string, + probatio.Required(ATTR_MESSAGE): cv.string, + probatio.Required(ATTR_MESSAGE_ID): probatio.Any( + cv.positive_int, probatio.All(cv.string, "last") ), - vol.Optional(ATTR_CHAT_ID): vol.Coerce(int), - vol.Optional(ATTR_PARSER): ATTR_PARSER_SCHEMA, - vol.Optional(ATTR_KEYBOARD_INLINE): cv.ensure_list, - vol.Optional(ATTR_DISABLE_WEB_PREV): cv.boolean, + probatio.Optional(ATTR_CHAT_ID): probatio.Coerce(int), + probatio.Optional(ATTR_PARSER): ATTR_PARSER_SCHEMA, + probatio.Optional(ATTR_KEYBOARD_INLINE): cv.ensure_list, + probatio.Optional(ATTR_DISABLE_WEB_PREV): cv.boolean, } ), ) -SERVICE_SCHEMA_EDIT_MESSAGE_MEDIA = vol.All( +SERVICE_SCHEMA_EDIT_MESSAGE_MEDIA = probatio.All( cv.deprecated(ATTR_TIMEOUT), - vol.Schema( + probatio.Schema( { - vol.Optional(ATTR_ENTITY_ID): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(CONF_CONFIG_ENTRY_ID): cv.string, - vol.Required(ATTR_MESSAGE_ID): vol.Any( - cv.positive_int, vol.All(cv.string, "last") + probatio.Optional(ATTR_ENTITY_ID): probatio.All( + cv.ensure_list, [cv.string] + ), + probatio.Optional(CONF_CONFIG_ENTRY_ID): cv.string, + probatio.Required(ATTR_MESSAGE_ID): probatio.Any( + cv.positive_int, probatio.All(cv.string, "last") ), - vol.Optional(ATTR_CHAT_ID): vol.Coerce(int), - vol.Optional(ATTR_CAPTION): cv.string, - vol.Optional(ATTR_PARSER): ATTR_PARSER_SCHEMA, - vol.Required(ATTR_MEDIA_TYPE): vol.In( + probatio.Optional(ATTR_CHAT_ID): probatio.Coerce(int), + probatio.Optional(ATTR_CAPTION): cv.string, + probatio.Optional(ATTR_PARSER): ATTR_PARSER_SCHEMA, + probatio.Required(ATTR_MEDIA_TYPE): probatio.In( ( str(InputMediaType.ANIMATION), str(InputMediaType.AUDIO), @@ -328,89 +358,89 @@ str(InputMediaType.PHOTO), ) ), - vol.Optional(ATTR_URL): cv.string, - vol.Optional(ATTR_FILE): cv.string, - vol.Optional(ATTR_USERNAME): cv.string, - vol.Optional(ATTR_PASSWORD): cv.string, - vol.Optional(ATTR_AUTHENTICATION): cv.string, - vol.Optional(ATTR_VERIFY_SSL): cv.boolean, - vol.Optional(ATTR_KEYBOARD_INLINE): cv.ensure_list, + probatio.Optional(ATTR_URL): cv.string, + probatio.Optional(ATTR_FILE): cv.string, + probatio.Optional(ATTR_USERNAME): cv.string, + probatio.Optional(ATTR_PASSWORD): cv.string, + probatio.Optional(ATTR_AUTHENTICATION): cv.string, + probatio.Optional(ATTR_VERIFY_SSL): cv.boolean, + probatio.Optional(ATTR_KEYBOARD_INLINE): cv.ensure_list, } ), ) -SERVICE_SCHEMA_EDIT_CAPTION = vol.Schema( +SERVICE_SCHEMA_EDIT_CAPTION = probatio.Schema( { - vol.Optional(ATTR_ENTITY_ID): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(CONF_CONFIG_ENTRY_ID): cv.string, - vol.Required(ATTR_MESSAGE_ID): vol.Any( - cv.positive_int, vol.All(cv.string, "last") + probatio.Optional(ATTR_ENTITY_ID): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(CONF_CONFIG_ENTRY_ID): cv.string, + probatio.Required(ATTR_MESSAGE_ID): probatio.Any( + cv.positive_int, probatio.All(cv.string, "last") ), - vol.Optional(ATTR_CHAT_ID): vol.Coerce(int), - vol.Optional(ATTR_PARSER): ATTR_PARSER_SCHEMA, - vol.Required(ATTR_CAPTION): cv.string, - vol.Optional(ATTR_KEYBOARD_INLINE): cv.ensure_list, + probatio.Optional(ATTR_CHAT_ID): probatio.Coerce(int), + probatio.Optional(ATTR_PARSER): ATTR_PARSER_SCHEMA, + probatio.Required(ATTR_CAPTION): cv.string, + probatio.Optional(ATTR_KEYBOARD_INLINE): cv.ensure_list, } ) -SERVICE_SCHEMA_EDIT_REPLYMARKUP = vol.Schema( +SERVICE_SCHEMA_EDIT_REPLYMARKUP = probatio.Schema( { - vol.Optional(ATTR_ENTITY_ID): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(CONF_CONFIG_ENTRY_ID): cv.string, - vol.Required(ATTR_MESSAGE_ID): vol.Any( - cv.positive_int, vol.All(cv.string, "last") + probatio.Optional(ATTR_ENTITY_ID): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(CONF_CONFIG_ENTRY_ID): cv.string, + probatio.Required(ATTR_MESSAGE_ID): probatio.Any( + cv.positive_int, probatio.All(cv.string, "last") ), - vol.Optional(ATTR_CHAT_ID): vol.Coerce(int), - vol.Required(ATTR_KEYBOARD_INLINE): cv.ensure_list, + probatio.Optional(ATTR_CHAT_ID): probatio.Coerce(int), + probatio.Required(ATTR_KEYBOARD_INLINE): cv.ensure_list, } ) -SERVICE_SCHEMA_ANSWER_CALLBACK_QUERY = vol.Schema( +SERVICE_SCHEMA_ANSWER_CALLBACK_QUERY = probatio.Schema( { - vol.Optional(CONF_CONFIG_ENTRY_ID): cv.string, - vol.Required(ATTR_MESSAGE): cv.string, - vol.Required(ATTR_CALLBACK_QUERY_ID): vol.Coerce(int), - vol.Optional(ATTR_SHOW_ALERT): cv.boolean, + probatio.Optional(CONF_CONFIG_ENTRY_ID): cv.string, + probatio.Required(ATTR_MESSAGE): cv.string, + probatio.Required(ATTR_CALLBACK_QUERY_ID): probatio.Coerce(int), + probatio.Optional(ATTR_SHOW_ALERT): cv.boolean, } ) -SERVICE_SCHEMA_DELETE_MESSAGE = vol.Schema( +SERVICE_SCHEMA_DELETE_MESSAGE = probatio.Schema( { - vol.Optional(ATTR_ENTITY_ID): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(CONF_CONFIG_ENTRY_ID): cv.string, - vol.Optional(ATTR_CHAT_ID): vol.Coerce(int), - vol.Required(ATTR_MESSAGE_ID): vol.Any( - cv.positive_int, vol.All(cv.string, "last") + probatio.Optional(ATTR_ENTITY_ID): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(CONF_CONFIG_ENTRY_ID): cv.string, + probatio.Optional(ATTR_CHAT_ID): probatio.Coerce(int), + probatio.Required(ATTR_MESSAGE_ID): probatio.Any( + cv.positive_int, probatio.All(cv.string, "last") ), } ) -SERVICE_SCHEMA_LEAVE_CHAT = vol.Schema( +SERVICE_SCHEMA_LEAVE_CHAT = probatio.Schema( { - vol.Optional(ATTR_ENTITY_ID): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(CONF_CONFIG_ENTRY_ID): cv.string, - vol.Optional(ATTR_CHAT_ID): vol.Coerce(int), + probatio.Optional(ATTR_ENTITY_ID): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(CONF_CONFIG_ENTRY_ID): cv.string, + probatio.Optional(ATTR_CHAT_ID): probatio.Coerce(int), } ) -SERVICE_SCHEMA_SET_MESSAGE_REACTION = vol.Schema( +SERVICE_SCHEMA_SET_MESSAGE_REACTION = probatio.Schema( { - vol.Optional(CONF_CONFIG_ENTRY_ID): cv.string, - vol.Required(ATTR_MESSAGE_ID): vol.Any( - cv.positive_int, vol.All(cv.string, "last") + probatio.Optional(CONF_CONFIG_ENTRY_ID): cv.string, + probatio.Required(ATTR_MESSAGE_ID): probatio.Any( + cv.positive_int, probatio.All(cv.string, "last") ), - vol.Optional(ATTR_CHAT_ID): vol.Coerce(int), - vol.Required(ATTR_REACTION): cv.string, - vol.Optional(ATTR_IS_BIG, default=False): cv.boolean, + probatio.Optional(ATTR_CHAT_ID): probatio.Coerce(int), + probatio.Required(ATTR_REACTION): cv.string, + probatio.Optional(ATTR_IS_BIG, default=False): cv.boolean, } ) -SERVICE_SCHEMA_DOWNLOAD_FILE = vol.Schema( +SERVICE_SCHEMA_DOWNLOAD_FILE = probatio.Schema( { - vol.Optional(CONF_CONFIG_ENTRY_ID): cv.string, - vol.Required(ATTR_FILE_ID): cv.string, - vol.Optional(ATTR_DIRECTORY_PATH): cv.string, - vol.Optional(ATTR_FILE_NAME): cv.string, + probatio.Optional(CONF_CONFIG_ENTRY_ID): cv.string, + probatio.Required(ATTR_FILE_ID): cv.string, + probatio.Optional(ATTR_DIRECTORY_PATH): cv.string, + probatio.Optional(ATTR_FILE_NAME): cv.string, } ) diff --git a/homeassistant/components/teleinfo/config_flow.py b/homeassistant/components/teleinfo/config_flow.py index 858920932ed74..2ed17da6c53c0 100644 --- a/homeassistant/components/teleinfo/config_flow.py +++ b/homeassistant/components/teleinfo/config_flow.py @@ -3,9 +3,9 @@ import logging from typing import TYPE_CHECKING, Any, override +import probatio import serial from teleinfo import decode, read_frame -import voluptuous as vol from homeassistant.components import usb from homeassistant.components.usb import human_readable_device_name @@ -16,9 +16,9 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_SERIAL_PORT): str, + probatio.Required(CONF_SERIAL_PORT): str, } ) diff --git a/homeassistant/components/tellduslive/__init__.py b/homeassistant/components/tellduslive/__init__.py index 93d9ed8448985..86eddb7228fbd 100644 --- a/homeassistant/components/tellduslive/__init__.py +++ b/homeassistant/components/tellduslive/__init__.py @@ -4,8 +4,8 @@ from functools import partial import logging +import probatio from tellduslive import DIM, TURNON, UP, Session -import voluptuous as vol from homeassistant import config_entries from homeassistant.config_entries import ConfigEntry @@ -32,18 +32,20 @@ _LOGGER = logging.getLogger(__name__) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Optional(CONF_HOST, default=DOMAIN): cv.string, - vol.Optional(CONF_SCAN_INTERVAL, default=SCAN_INTERVAL): vol.All( - cv.time_period, vol.Clamp(min=MIN_UPDATE_INTERVAL) + probatio.Optional(CONF_HOST, default=DOMAIN): cv.string, + probatio.Optional( + CONF_SCAN_INTERVAL, default=SCAN_INTERVAL + ): probatio.All( + cv.time_period, probatio.Clamp(min=MIN_UPDATE_INTERVAL) ), } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) DATA_CONFIG_ENTRY_LOCK = "tellduslive_config_entry_lock" diff --git a/homeassistant/components/tellduslive/config_flow.py b/homeassistant/components/tellduslive/config_flow.py index 5aea91a07c428..634e9f9b786bd 100644 --- a/homeassistant/components/tellduslive/config_flow.py +++ b/homeassistant/components/tellduslive/config_flow.py @@ -5,8 +5,8 @@ import os from typing import Any, override +import probatio from tellduslive import Session, supports_local_api -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST @@ -67,8 +67,8 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_HOST): vol.In(list(self._hosts))} + data_schema=probatio.Schema( + {probatio.Required(CONF_HOST): probatio.In(list(self._hosts))} ), ) diff --git a/homeassistant/components/tellstick/__init__.py b/homeassistant/components/tellstick/__init__.py index 6ccc1f14b5fd8..5fb33ad72f873 100644 --- a/homeassistant/components/tellstick/__init__.py +++ b/homeassistant/components/tellstick/__init__.py @@ -2,10 +2,10 @@ import logging +import probatio from tellcore.constants import TELLSTICK_DIM, TELLSTICK_UP from tellcore.telldus import AsyncioCallbackDispatcher, TelldusCore from tellcorenet import TellCoreClient -import voluptuous as vol from homeassistant.const import CONF_HOST, CONF_PORT, EVENT_HOMEASSISTANT_STOP from homeassistant.core import HomeAssistant, callback @@ -27,21 +27,21 @@ DOMAIN = "tellstick" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Inclusive(CONF_HOST, "tellcore-net"): cv.string, - vol.Inclusive(CONF_PORT, "tellcore-net"): vol.All( - cv.ensure_list, [cv.port], vol.Length(min=2, max=2) + probatio.Inclusive(CONF_HOST, "tellcore-net"): cv.string, + probatio.Inclusive(CONF_PORT, "tellcore-net"): probatio.All( + cv.ensure_list, [cv.port], probatio.Length(min=2, max=2) ), - vol.Optional( + probatio.Optional( CONF_SIGNAL_REPETITIONS, default=DEFAULT_SIGNAL_REPETITIONS - ): vol.Coerce(int), + ): probatio.Coerce(int), } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/tellstick/sensor.py b/homeassistant/components/tellstick/sensor.py index 744040ac060a2..fa9378b334261 100644 --- a/homeassistant/components/tellstick/sensor.py +++ b/homeassistant/components/tellstick/sensor.py @@ -3,9 +3,9 @@ from collections import namedtuple import logging +import probatio from tellcore import telldus import tellcore.constants as tellcore_constants -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -40,21 +40,21 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Optional( + probatio.Optional( CONF_TEMPERATURE_SCALE, default=DEFAULT_TEMPERATURE_SCALE ): cv.string, - vol.Optional( + probatio.Optional( CONF_DATATYPE_MASK, default=DEFAULT_DATATYPE_MASK ): cv.positive_int, - vol.Optional(CONF_ONLY_NAMED, default=[]): vol.All( + probatio.Optional(CONF_ONLY_NAMED, default=[]): probatio.All( cv.ensure_list, [ - vol.Schema( + probatio.Schema( { - vol.Required(CONF_ID): cv.positive_int, - vol.Required(CONF_NAME): cv.string, - vol.Optional(CONF_PROTOCOL): cv.string, - vol.Optional(CONF_MODEL): cv.string, + probatio.Required(CONF_ID): cv.positive_int, + probatio.Required(CONF_NAME): cv.string, + probatio.Optional(CONF_PROTOCOL): cv.string, + probatio.Optional(CONF_MODEL): cv.string, } ) ], diff --git a/homeassistant/components/telnet/switch.py b/homeassistant/components/telnet/switch.py index ce897fb84c541..d0bce8c381e97 100644 --- a/homeassistant/components/telnet/switch.py +++ b/homeassistant/components/telnet/switch.py @@ -4,8 +4,8 @@ import logging from typing import Any, override +import probatio import telnetlib # pylint: disable=deprecated-module -import voluptuous as vol from homeassistant.components.switch import ( ENTITY_ID_FORMAT, @@ -34,21 +34,23 @@ DEFAULT_PORT = 23 DEFAULT_TIMEOUT = 0.2 -SWITCH_SCHEMA = vol.Schema( +SWITCH_SCHEMA = probatio.Schema( { - vol.Required(CONF_COMMAND_OFF): cv.string, - vol.Required(CONF_COMMAND_ON): cv.string, - vol.Required(CONF_RESOURCE): cv.string, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, - vol.Optional(CONF_COMMAND_STATE): cv.string, - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): vol.Coerce(float), + probatio.Required(CONF_COMMAND_OFF): cv.string, + probatio.Required(CONF_COMMAND_ON): cv.string, + probatio.Required(CONF_RESOURCE): cv.string, + probatio.Optional(CONF_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_COMMAND_STATE): cv.string, + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): probatio.Coerce( + float + ), } ) PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_SWITCHES): cv.schema_with_slug_keys(SWITCH_SCHEMA)} + {probatio.Required(CONF_SWITCHES): cv.schema_with_slug_keys(SWITCH_SCHEMA)} ) SCAN_INTERVAL = timedelta(seconds=10) diff --git a/homeassistant/components/teltonika/config_flow.py b/homeassistant/components/teltonika/config_flow.py index 5ea13a6c6b5ed..f1ab9d9ebacbe 100644 --- a/homeassistant/components/teltonika/config_flow.py +++ b/homeassistant/components/teltonika/config_flow.py @@ -4,8 +4,8 @@ import logging from typing import Any, override +import probatio from teltasync import Teltasync, TeltonikaAuthenticationError, TeltonikaConnectionError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME, CONF_VERIFY_SSL @@ -20,12 +20,12 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Optional(CONF_VERIFY_SSL, default=False): bool, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Optional(CONF_VERIFY_SSL, default=False): bool, } ) @@ -171,10 +171,10 @@ async def async_step_reauth_confirm( data_updates=user_input, ) - reauth_schema = vol.Schema( + reauth_schema = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) @@ -306,10 +306,10 @@ async def async_step_dhcp_confirm( return self.async_show_form( step_id="dhcp_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, diff --git a/homeassistant/components/temper/sensor.py b/homeassistant/components/temper/sensor.py index f2d5efcb33c04..1861f71bf63ae 100644 --- a/homeassistant/components/temper/sensor.py +++ b/homeassistant/components/temper/sensor.py @@ -2,8 +2,8 @@ import logging +import probatio from temperusb.temper import TemperHandler -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -26,9 +26,9 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_NAME, default=DEVICE_DEFAULT_NAME): vol.Coerce(str), - vol.Optional(CONF_SCALE, default=1): vol.Coerce(float), - vol.Optional(CONF_OFFSET, default=0): vol.Coerce(float), + probatio.Optional(CONF_NAME, default=DEVICE_DEFAULT_NAME): probatio.Coerce(str), + probatio.Optional(CONF_SCALE, default=1): probatio.Coerce(float), + probatio.Optional(CONF_OFFSET, default=0): probatio.Coerce(float), } ) diff --git a/homeassistant/components/template/__init__.py b/homeassistant/components/template/__init__.py index c29feb5c786fd..020ada5ed53cf 100644 --- a/homeassistant/components/template/__init__.py +++ b/homeassistant/components/template/__init__.py @@ -5,8 +5,8 @@ import logging from typing import Any -import voluptuous as vol -from voluptuous.humanize import humanize_error +import probatio +from probatio.humanize import humanize_error from homeassistant import config as conf_util from homeassistant.config_entries import ConfigEntry @@ -198,8 +198,8 @@ async def async_migrate_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> def _humanize(err: Exception, data: Any) -> str: - """Humanize vol.Invalid, stringify other exceptions.""" - if isinstance(err, vol.Invalid): + """Humanize probatio.Invalid, stringify other exceptions.""" + if isinstance(err, probatio.Invalid): return humanize_error(data, err) return str(err) @@ -229,7 +229,7 @@ async def init_coordinator( conf_section[CONF_ACTIONS] = await async_validate_actions_config( hass, actions_config ) - except (vol.Invalid, HomeAssistantError) as err: + except (probatio.Invalid, HomeAssistantError) as err: breadcrumb = "template section" if (unique_id := conf_section.get(CONF_UNIQUE_ID)) is not None: breadcrumb = f"template section with unique_id: {unique_id}" diff --git a/homeassistant/components/template/alarm_control_panel.py b/homeassistant/components/template/alarm_control_panel.py index 9f7855526f4bc..a89232c52f803 100644 --- a/homeassistant/components/template/alarm_control_panel.py +++ b/homeassistant/components/template/alarm_control_panel.py @@ -4,7 +4,7 @@ import logging from typing import TYPE_CHECKING, Any, override -import voluptuous as vol +import probatio from homeassistant.components.alarm_control_panel import ( DOMAIN as ALARM_CONTROL_PANEL_DOMAIN, @@ -77,20 +77,20 @@ class TemplateCodeFormat(Enum): DEFAULT_NAME = "Template Alarm Control Panel" -ALARM_CONTROL_PANEL_COMMON_SCHEMA = vol.Schema( +ALARM_CONTROL_PANEL_COMMON_SCHEMA = probatio.Schema( { - vol.Optional(CONF_ARM_AWAY_ACTION): cv.SCRIPT_SCHEMA, - vol.Optional(CONF_ARM_CUSTOM_BYPASS_ACTION): cv.SCRIPT_SCHEMA, - vol.Optional(CONF_ARM_HOME_ACTION): cv.SCRIPT_SCHEMA, - vol.Optional(CONF_ARM_NIGHT_ACTION): cv.SCRIPT_SCHEMA, - vol.Optional(CONF_ARM_VACATION_ACTION): cv.SCRIPT_SCHEMA, - vol.Optional(CONF_CODE_ARM_REQUIRED, default=True): cv.boolean, - vol.Optional(CONF_CODE_FORMAT, default=TemplateCodeFormat.number.name): cv.enum( - TemplateCodeFormat - ), - vol.Optional(CONF_DISARM_ACTION): cv.SCRIPT_SCHEMA, - vol.Optional(CONF_STATE): cv.template, - vol.Optional(CONF_TRIGGER_ACTION): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_ARM_AWAY_ACTION): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_ARM_CUSTOM_BYPASS_ACTION): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_ARM_HOME_ACTION): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_ARM_NIGHT_ACTION): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_ARM_VACATION_ACTION): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_CODE_ARM_REQUIRED, default=True): cv.boolean, + probatio.Optional( + CONF_CODE_FORMAT, default=TemplateCodeFormat.number.name + ): cv.enum(TemplateCodeFormat), + probatio.Optional(CONF_DISARM_ACTION): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_STATE): cv.template, + probatio.Optional(CONF_TRIGGER_ACTION): cv.SCRIPT_SCHEMA, } ) diff --git a/homeassistant/components/template/binary_sensor.py b/homeassistant/components/template/binary_sensor.py index 75ded4bc7a460..bf826b6526951 100644 --- a/homeassistant/components/template/binary_sensor.py +++ b/homeassistant/components/template/binary_sensor.py @@ -7,7 +7,7 @@ import logging from typing import Any, Self, override -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import ( DEVICE_CLASSES_SCHEMA, @@ -55,14 +55,20 @@ CONF_AUTO_OFF = "auto_off" -BINARY_SENSOR_COMMON_SCHEMA = vol.Schema( +BINARY_SENSOR_COMMON_SCHEMA = probatio.Schema( { - vol.Optional(CONF_AUTO_OFF): vol.Any(cv.positive_time_period, cv.template), - vol.Optional(CONF_DELAY_OFF): vol.Any(cv.positive_time_period, cv.template), - vol.Optional(CONF_DELAY_ON): vol.Any(cv.positive_time_period, cv.template), - vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, - vol.Required(CONF_STATE): cv.template, - vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, + probatio.Optional(CONF_AUTO_OFF): probatio.Any( + cv.positive_time_period, cv.template + ), + probatio.Optional(CONF_DELAY_OFF): probatio.Any( + cv.positive_time_period, cv.template + ), + probatio.Optional(CONF_DELAY_ON): probatio.Any( + cv.positive_time_period, cv.template + ), + probatio.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, + probatio.Required(CONF_STATE): cv.template, + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, } ) @@ -151,13 +157,13 @@ def __init__(self, config: dict[str, Any]) -> None: # pylint: disable=super-ini self._delay_on = None try: self._delay_on = cv.positive_time_period(config.get(CONF_DELAY_ON)) - except vol.Invalid: + except probatio.Invalid: self.setup_template(CONF_DELAY_ON, "_delay_on", cv.positive_time_period) self._delay_off = None try: self._delay_off = cv.positive_time_period(config.get(CONF_DELAY_OFF)) - except vol.Invalid: + except probatio.Invalid: self.setup_template(CONF_DELAY_OFF, "_delay_off", cv.positive_time_period) @override @@ -348,7 +354,7 @@ def _update_state(self, result): if not isinstance(delay, timedelta): try: delay = cv.positive_time_period(delay) - except vol.Invalid as err: + except probatio.Invalid as err: key = CONF_DELAY_ON if state else CONF_DELAY_OFF logging.getLogger(__name__).warning( "Error rendering %s template: %s", key, err @@ -382,7 +388,7 @@ def _set_state(self, state, _=None): if not isinstance(auto_off_delay, timedelta): try: auto_off_delay = cv.positive_time_period(auto_off_delay) - except vol.Invalid as err: + except probatio.Invalid as err: logging.getLogger(__name__).warning( "Error rendering %s template: %s", CONF_AUTO_OFF, err ) diff --git a/homeassistant/components/template/button.py b/homeassistant/components/template/button.py index 77d83cad22722..ae9a9d6ff2e3f 100644 --- a/homeassistant/components/template/button.py +++ b/homeassistant/components/template/button.py @@ -3,7 +3,7 @@ import logging from typing import TYPE_CHECKING, override -import voluptuous as vol +import probatio from homeassistant.components.button import ( DEVICE_CLASSES_SCHEMA, @@ -39,10 +39,10 @@ _BLOCKED_ATTRIBUTES = tcv.BlockedTemplateAttributes(device_class=True) -BUTTON_YAML_SCHEMA = vol.Schema( +BUTTON_YAML_SCHEMA = probatio.Schema( { - vol.Required(CONF_PRESS): cv.SCRIPT_SCHEMA, - vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, + probatio.Required(CONF_PRESS): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, } ).extend( make_template_entity_common_schema( @@ -50,10 +50,10 @@ ).schema ) -BUTTON_CONFIG_ENTRY_SCHEMA = vol.Schema( +BUTTON_CONFIG_ENTRY_SCHEMA = probatio.Schema( { - vol.Optional(CONF_PRESS): cv.SCRIPT_SCHEMA, - vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_PRESS): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, } ).extend(TEMPLATE_ENTITY_COMMON_CONFIG_ENTRY_SCHEMA.schema) diff --git a/homeassistant/components/template/config.py b/homeassistant/components/template/config.py index 20622091071b6..08d22e11a1a65 100644 --- a/homeassistant/components/template/config.py +++ b/homeassistant/components/template/config.py @@ -6,7 +6,7 @@ import logging from typing import Any -import voluptuous as vol +import probatio from homeassistant.components.alarm_control_panel import ( DOMAIN as ALARM_CONTROL_PANEL_DOMAIN, @@ -108,7 +108,7 @@ def _identify_entity_config_requires_trigger( platform: Platform, option: str, entity_config: ConfigType ) -> None: - """Raise vol.Invalid if an entity sets an option that requires a trigger.""" + """Raise probatio.Invalid if an entity sets an option that requires a trigger.""" if option not in entity_config: return @@ -125,7 +125,7 @@ def _identify_entity_config_requires_trigger( elif unique_id := entity_config.get(CONF_UNIQUE_ID): identifier = f"{CONF_UNIQUE_ID}: {unique_id}" - raise vol.Invalid( + raise probatio.Invalid( f"The {option} option for template {platform.replace('_', ' ')}: {identifier} " f"requires a trigger, remove the {option} option or rewrite " "configuration to use a trigger" @@ -172,7 +172,7 @@ def validate(obj: dict): if found_domains := domains.intersection(options): invalid = {CONF_TRIGGERS, CONF_ACTIONS} if found_invalid := invalid.intersection(set(obj.keys())): - raise vol.Invalid( + raise probatio.Invalid( f"Unsupported option(s) found for domain" f" {found_domains.pop()}, please remove" f" ({', '.join(found_invalid)})" @@ -231,68 +231,68 @@ def _backward_compat_schema(value: Any | None) -> Any: return cv.renamed(CONF_CONDITION, CONF_CONDITIONS)(value) -CONFIG_SECTION_SCHEMA = vol.All( +CONFIG_SECTION_SCHEMA = probatio.All( _backward_compat_schema, - vol.Schema( + probatio.Schema( { - vol.Optional(CONF_ACTIONS): cv.SCRIPT_SCHEMA, - vol.Optional(CONF_CONDITIONS): cv.CONDITIONS_SCHEMA, - vol.Optional(CONF_TRIGGERS): cv.TRIGGER_SCHEMA, - vol.Optional(CONF_UNIQUE_ID): cv.string, - vol.Optional(CONF_VARIABLES): cv.SCRIPT_VARIABLES_SCHEMA, - vol.Optional(ALARM_CONTROL_PANEL_DOMAIN): vol.All( + probatio.Optional(CONF_ACTIONS): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_CONDITIONS): cv.CONDITIONS_SCHEMA, + probatio.Optional(CONF_TRIGGERS): cv.TRIGGER_SCHEMA, + probatio.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Optional(CONF_VARIABLES): cv.SCRIPT_VARIABLES_SCHEMA, + probatio.Optional(ALARM_CONTROL_PANEL_DOMAIN): probatio.All( cv.ensure_list, [alarm_control_panel_platform.ALARM_CONTROL_PANEL_YAML_SCHEMA], ), - vol.Optional(BINARY_SENSOR_DOMAIN): vol.All( + probatio.Optional(BINARY_SENSOR_DOMAIN): probatio.All( cv.ensure_list, [binary_sensor_platform.BINARY_SENSOR_YAML_SCHEMA] ), - vol.Optional(BUTTON_DOMAIN): vol.All( + probatio.Optional(BUTTON_DOMAIN): probatio.All( cv.ensure_list, [button_platform.BUTTON_YAML_SCHEMA] ), - vol.Optional(COVER_DOMAIN): vol.All( + probatio.Optional(COVER_DOMAIN): probatio.All( cv.ensure_list, [cover_platform.COVER_YAML_SCHEMA] ), - vol.Optional(DEVICE_TRACKER_DOMAIN): vol.All( + probatio.Optional(DEVICE_TRACKER_DOMAIN): probatio.All( cv.ensure_list, [device_tracker_platform.TRACKER_YAML_SCHEMA] ), - vol.Optional(EVENT_DOMAIN): vol.All( + probatio.Optional(EVENT_DOMAIN): probatio.All( cv.ensure_list, [event_platform.EVENT_YAML_SCHEMA] ), - vol.Optional(FAN_DOMAIN): vol.All( + probatio.Optional(FAN_DOMAIN): probatio.All( cv.ensure_list, [fan_platform.FAN_YAML_SCHEMA] ), - vol.Optional(IMAGE_DOMAIN): vol.All( + probatio.Optional(IMAGE_DOMAIN): probatio.All( cv.ensure_list, [image_platform.IMAGE_YAML_SCHEMA] ), - vol.Optional(LIGHT_DOMAIN): vol.All( + probatio.Optional(LIGHT_DOMAIN): probatio.All( cv.ensure_list, [light_platform.LIGHT_YAML_SCHEMA] ), - vol.Optional(LOCK_DOMAIN): vol.All( + probatio.Optional(LOCK_DOMAIN): probatio.All( cv.ensure_list, [lock_platform.LOCK_YAML_SCHEMA] ), - vol.Optional(NUMBER_DOMAIN): vol.All( + probatio.Optional(NUMBER_DOMAIN): probatio.All( cv.ensure_list, [number_platform.NUMBER_YAML_SCHEMA] ), - vol.Optional(SELECT_DOMAIN): vol.All( + probatio.Optional(SELECT_DOMAIN): probatio.All( cv.ensure_list, [select_platform.SELECT_YAML_SCHEMA] ), - vol.Optional(SENSOR_DOMAIN): vol.All( + probatio.Optional(SENSOR_DOMAIN): probatio.All( cv.ensure_list, [sensor_platform.SENSOR_YAML_SCHEMA] ), - vol.Optional(SWITCH_DOMAIN): vol.All( + probatio.Optional(SWITCH_DOMAIN): probatio.All( cv.ensure_list, [switch_platform.SWITCH_YAML_SCHEMA] ), - vol.Optional(UPDATE_DOMAIN): vol.All( + probatio.Optional(UPDATE_DOMAIN): probatio.All( cv.ensure_list, [update_platform.UPDATE_YAML_SCHEMA] ), - vol.Optional(VACUUM_DOMAIN): vol.All( + probatio.Optional(VACUUM_DOMAIN): probatio.All( cv.ensure_list, [vacuum_platform.VACUUM_YAML_SCHEMA] ), - vol.Optional(WEATHER_DOMAIN): vol.All( + probatio.Optional(WEATHER_DOMAIN): probatio.All( cv.ensure_list, [ - vol.Any( + probatio.Any( weather_platform.WEATHER_YAML_SCHEMA, weather_platform.WEATHER_MODERN_YAML_SCHEMA, ) @@ -307,7 +307,7 @@ def _backward_compat_schema(value: Any | None) -> Any: validate_entity_config_with_conditions_has_trigger, ) -TEMPLATE_BLUEPRINT_SCHEMA = vol.All( +TEMPLATE_BLUEPRINT_SCHEMA = probatio.All( _backward_compat_schema, blueprint_schemas.BLUEPRINT_SCHEMA ) @@ -344,7 +344,7 @@ async def _async_resolve_template_config( platforms = [platform for platform in PLATFORMS if platform in config] platform_config: list[ConfigType] | ConfigType if len(platforms) > 1: - raise vol.Invalid("more than one platform defined per blueprint") + raise probatio.Invalid("more than one platform defined per blueprint") if len(platforms) == 1: platform = platforms.pop() for prop in (CONF_NAME, CONF_UNIQUE_ID): @@ -355,7 +355,7 @@ async def _async_resolve_template_config( continue if len(platform_config) > 1: - raise vol.Invalid( + raise probatio.Invalid( f"more than one {platform} entity defined in blueprint" ) platform_config[0][prop] = config.pop(prop) @@ -441,7 +441,7 @@ async def async_validate_config(hass: HomeAssistant, config: ConfigType) -> Conf template_config: TemplateConfig = await async_validate_config_section( hass, cfg ) - except vol.Invalid as err: + except probatio.Invalid as err: async_log_schema_error(err, DOMAIN, cfg, hass) async_notify_setup_error(hass, DOMAIN) continue diff --git a/homeassistant/components/template/config_flow.py b/homeassistant/components/template/config_flow.py index e68085bdf52c1..cbce57db40fd3 100644 --- a/homeassistant/components/template/config_flow.py +++ b/homeassistant/components/template/config_flow.py @@ -4,7 +4,7 @@ from functools import partial from typing import Any, cast, override -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.components.sensor import ( @@ -141,33 +141,33 @@ async_create_preview_weather, ) -_SCHEMA_STATE: dict[vol.Marker, Any] = { - vol.Required(CONF_STATE): selector.TemplateSelector(), +_SCHEMA_STATE: dict[probatio.Marker, Any] = { + probatio.Required(CONF_STATE): selector.TemplateSelector(), } -def generate_schema(domain: str, flow_type: str) -> vol.Schema: +def generate_schema(domain: str, flow_type: str) -> probatio.Schema: """Generate schema.""" - schema: dict[vol.Marker, Any] = {} - additional_options: dict[vol.Marker, Any] = {} + schema: dict[probatio.Marker, Any] = {} + additional_options: dict[probatio.Marker, Any] = {} if flow_type == "config": - schema = {vol.Required(CONF_NAME): selector.TextSelector()} + schema = {probatio.Required(CONF_NAME): selector.TextSelector()} if domain == Platform.ALARM_CONTROL_PANEL: schema |= { - vol.Optional(CONF_VALUE_TEMPLATE): selector.TemplateSelector(), - vol.Optional(CONF_DISARM_ACTION): selector.ActionSelector(), - vol.Optional(CONF_ARM_AWAY_ACTION): selector.ActionSelector(), - vol.Optional(CONF_ARM_CUSTOM_BYPASS_ACTION): selector.ActionSelector(), - vol.Optional(CONF_ARM_HOME_ACTION): selector.ActionSelector(), - vol.Optional(CONF_ARM_NIGHT_ACTION): selector.ActionSelector(), - vol.Optional(CONF_ARM_VACATION_ACTION): selector.ActionSelector(), - vol.Optional(CONF_TRIGGER_ACTION): selector.ActionSelector(), - vol.Optional( + probatio.Optional(CONF_VALUE_TEMPLATE): selector.TemplateSelector(), + probatio.Optional(CONF_DISARM_ACTION): selector.ActionSelector(), + probatio.Optional(CONF_ARM_AWAY_ACTION): selector.ActionSelector(), + probatio.Optional(CONF_ARM_CUSTOM_BYPASS_ACTION): selector.ActionSelector(), + probatio.Optional(CONF_ARM_HOME_ACTION): selector.ActionSelector(), + probatio.Optional(CONF_ARM_NIGHT_ACTION): selector.ActionSelector(), + probatio.Optional(CONF_ARM_VACATION_ACTION): selector.ActionSelector(), + probatio.Optional(CONF_TRIGGER_ACTION): selector.ActionSelector(), + probatio.Optional( CONF_CODE_ARM_REQUIRED, default=True ): selector.BooleanSelector(), - vol.Optional( + probatio.Optional( CONF_CODE_FORMAT, default=TemplateCodeFormat.number.name ): selector.SelectSelector( selector.SelectSelectorConfig( @@ -180,67 +180,71 @@ def generate_schema(domain: str, flow_type: str) -> vol.Schema: if domain == Platform.BINARY_SENSOR: schema |= _SCHEMA_STATE | { - vol.Optional(CONF_DEVICE_CLASS): selector.DeviceClassSelector( + probatio.Optional(CONF_DEVICE_CLASS): selector.DeviceClassSelector( selector.DeviceClassSelectorConfig(domain=Platform.BINARY_SENSOR), ), } if domain == Platform.BUTTON: schema |= { - vol.Optional(CONF_PRESS): selector.ActionSelector(), + probatio.Optional(CONF_PRESS): selector.ActionSelector(), } if flow_type == "config": schema |= { - vol.Optional(CONF_DEVICE_CLASS): selector.DeviceClassSelector( + probatio.Optional(CONF_DEVICE_CLASS): selector.DeviceClassSelector( selector.DeviceClassSelectorConfig(domain=Platform.BUTTON), ), } if domain == Platform.COVER: schema |= _SCHEMA_STATE | { - vol.Inclusive(OPEN_ACTION, CONF_OPEN_AND_CLOSE): selector.ActionSelector(), - vol.Inclusive(CLOSE_ACTION, CONF_OPEN_AND_CLOSE): selector.ActionSelector(), - vol.Optional(STOP_ACTION): selector.ActionSelector(), - vol.Optional(CONF_POSITION): selector.TemplateSelector(), - vol.Optional(POSITION_ACTION): selector.ActionSelector(), + probatio.Inclusive( + OPEN_ACTION, CONF_OPEN_AND_CLOSE + ): selector.ActionSelector(), + probatio.Inclusive( + CLOSE_ACTION, CONF_OPEN_AND_CLOSE + ): selector.ActionSelector(), + probatio.Optional(STOP_ACTION): selector.ActionSelector(), + probatio.Optional(CONF_POSITION): selector.TemplateSelector(), + probatio.Optional(POSITION_ACTION): selector.ActionSelector(), } if flow_type == "config": schema |= { - vol.Optional(CONF_DEVICE_CLASS): selector.DeviceClassSelector( + probatio.Optional(CONF_DEVICE_CLASS): selector.DeviceClassSelector( selector.DeviceClassSelectorConfig(domain=Platform.COVER), ), } if domain == Platform.DEVICE_TRACKER: schema |= { - vol.Optional(CONF_IN_ZONES): selector.TemplateSelector(), - vol.Optional(CONF_LATITUDE): selector.TemplateSelector(), - vol.Optional(CONF_LONGITUDE): selector.TemplateSelector(), + probatio.Optional(CONF_IN_ZONES): selector.TemplateSelector(), + probatio.Optional(CONF_LATITUDE): selector.TemplateSelector(), + probatio.Optional(CONF_LONGITUDE): selector.TemplateSelector(), } additional_options |= { - vol.Optional(CONF_LOCATION_ACCURACY): selector.TemplateSelector(), + probatio.Optional(CONF_LOCATION_ACCURACY): selector.TemplateSelector(), } if domain == Platform.EVENT: schema |= { - vol.Required(CONF_EVENT_TYPE): selector.TemplateSelector(), - vol.Required(CONF_EVENT_TYPES): selector.TemplateSelector(), + probatio.Required(CONF_EVENT_TYPE): selector.TemplateSelector(), + probatio.Required(CONF_EVENT_TYPES): selector.TemplateSelector(), } if flow_type == "config": schema |= { - vol.Optional(CONF_DEVICE_CLASS): selector.DeviceClassSelector( + probatio.Optional(CONF_DEVICE_CLASS): selector.DeviceClassSelector( selector.DeviceClassSelectorConfig(domain=Platform.EVENT), ), } if domain == Platform.FAN: schema |= _SCHEMA_STATE | { - vol.Required(CONF_ON_ACTION): selector.ActionSelector(), - vol.Required(CONF_OFF_ACTION): selector.ActionSelector(), - vol.Optional(CONF_PERCENTAGE): selector.TemplateSelector(), - vol.Optional(CONF_SET_PERCENTAGE_ACTION): selector.ActionSelector(), - vol.Optional(CONF_SPEED_COUNT): selector.NumberSelector( + probatio.Required(CONF_ON_ACTION): selector.ActionSelector(), + probatio.Required(CONF_OFF_ACTION): selector.ActionSelector(), + probatio.Optional(CONF_PERCENTAGE): selector.TemplateSelector(), + probatio.Optional(CONF_SET_PERCENTAGE_ACTION): selector.ActionSelector(), + probatio.Optional(CONF_SPEED_COUNT): selector.NumberSelector( selector.NumberSelectorConfig( min=1, max=100, step=1, mode=selector.NumberSelectorMode.BOX ), @@ -249,62 +253,68 @@ def generate_schema(domain: str, flow_type: str) -> vol.Schema: if domain == Platform.IMAGE: schema |= { - vol.Required(CONF_URL): selector.TemplateSelector(), - vol.Optional(CONF_VERIFY_SSL, default=True): selector.BooleanSelector(), + probatio.Required(CONF_URL): selector.TemplateSelector(), + probatio.Optional( + CONF_VERIFY_SSL, default=True + ): selector.BooleanSelector(), } if domain == Platform.LIGHT: schema |= _SCHEMA_STATE | { - vol.Required(CONF_TURN_ON): selector.ActionSelector(), - vol.Required(CONF_TURN_OFF): selector.ActionSelector(), - vol.Optional(CONF_LEVEL): selector.TemplateSelector(), - vol.Optional(CONF_LEVEL_ACTION): selector.ActionSelector(), - vol.Optional(CONF_HS): selector.TemplateSelector(), - vol.Optional(CONF_HS_ACTION): selector.ActionSelector(), - vol.Optional(CONF_TEMPERATURE): selector.TemplateSelector(), - vol.Optional(CONF_TEMPERATURE_ACTION): selector.ActionSelector(), + probatio.Required(CONF_TURN_ON): selector.ActionSelector(), + probatio.Required(CONF_TURN_OFF): selector.ActionSelector(), + probatio.Optional(CONF_LEVEL): selector.TemplateSelector(), + probatio.Optional(CONF_LEVEL_ACTION): selector.ActionSelector(), + probatio.Optional(CONF_HS): selector.TemplateSelector(), + probatio.Optional(CONF_HS_ACTION): selector.ActionSelector(), + probatio.Optional(CONF_TEMPERATURE): selector.TemplateSelector(), + probatio.Optional(CONF_TEMPERATURE_ACTION): selector.ActionSelector(), } if domain == Platform.LOCK: schema |= _SCHEMA_STATE | { - vol.Required(CONF_LOCK): selector.ActionSelector(), - vol.Required(CONF_UNLOCK): selector.ActionSelector(), - vol.Optional(CONF_CODE_FORMAT): selector.TemplateSelector(), - vol.Optional(CONF_OPEN): selector.ActionSelector(), + probatio.Required(CONF_LOCK): selector.ActionSelector(), + probatio.Required(CONF_UNLOCK): selector.ActionSelector(), + probatio.Optional(CONF_CODE_FORMAT): selector.TemplateSelector(), + probatio.Optional(CONF_OPEN): selector.ActionSelector(), } if domain == Platform.NUMBER: schema |= { - vol.Optional(CONF_DEVICE_CLASS): selector.DeviceClassSelector( + probatio.Optional(CONF_DEVICE_CLASS): selector.DeviceClassSelector( selector.DeviceClassSelectorConfig(domain=Platform.NUMBER), ), - vol.Required(CONF_STATE): selector.TemplateSelector(), - vol.Required(CONF_MIN, default=DEFAULT_MIN_VALUE): selector.NumberSelector( + probatio.Required(CONF_STATE): selector.TemplateSelector(), + probatio.Required( + CONF_MIN, default=DEFAULT_MIN_VALUE + ): selector.NumberSelector( selector.NumberSelectorConfig(mode=selector.NumberSelectorMode.BOX), ), - vol.Required(CONF_MAX, default=DEFAULT_MAX_VALUE): selector.NumberSelector( + probatio.Required( + CONF_MAX, default=DEFAULT_MAX_VALUE + ): selector.NumberSelector( selector.NumberSelectorConfig(mode=selector.NumberSelectorMode.BOX), ), - vol.Required(CONF_STEP, default=DEFAULT_STEP): selector.NumberSelector( + probatio.Required(CONF_STEP, default=DEFAULT_STEP): selector.NumberSelector( selector.NumberSelectorConfig(mode=selector.NumberSelectorMode.BOX), ), - vol.Optional(CONF_UNIT_OF_MEASUREMENT): selector.TextSelector( + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): selector.TextSelector( selector.TextSelectorConfig( type=selector.TextSelectorType.TEXT, multiline=False ) ), - vol.Required(CONF_SET_VALUE): selector.ActionSelector(), + probatio.Required(CONF_SET_VALUE): selector.ActionSelector(), } if domain == Platform.SELECT: schema |= _SCHEMA_STATE | { - vol.Required(CONF_OPTIONS): selector.TemplateSelector(), - vol.Optional(CONF_SELECT_OPTION): selector.ActionSelector(), + probatio.Required(CONF_OPTIONS): selector.TemplateSelector(), + probatio.Optional(CONF_SELECT_OPTION): selector.ActionSelector(), } if domain == Platform.SENSOR: schema |= _SCHEMA_STATE | { - vol.Optional(CONF_UNIT_OF_MEASUREMENT): selector.SelectSelector( + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): selector.SelectSelector( selector.SelectSelectorConfig( options=list( { @@ -320,44 +330,44 @@ def generate_schema(domain: str, flow_type: str) -> vol.Schema: sort=True, ), ), - vol.Optional(CONF_DEVICE_CLASS): selector.DeviceClassSelector( + probatio.Optional(CONF_DEVICE_CLASS): selector.DeviceClassSelector( selector.DeviceClassSelectorConfig(domain=Platform.SENSOR), ), - vol.Optional(CONF_STATE_CLASS): selector.StateClassSelector(), + probatio.Optional(CONF_STATE_CLASS): selector.StateClassSelector(), } if domain == Platform.SWITCH: schema |= { - vol.Optional(CONF_VALUE_TEMPLATE): selector.TemplateSelector(), - vol.Optional(CONF_TURN_ON): selector.ActionSelector(), - vol.Optional(CONF_TURN_OFF): selector.ActionSelector(), + probatio.Optional(CONF_VALUE_TEMPLATE): selector.TemplateSelector(), + probatio.Optional(CONF_TURN_ON): selector.ActionSelector(), + probatio.Optional(CONF_TURN_OFF): selector.ActionSelector(), } if domain == Platform.UPDATE: schema |= { - vol.Optional(CONF_INSTALLED_VERSION): selector.TemplateSelector(), - vol.Optional(CONF_LATEST_VERSION): selector.TemplateSelector(), - vol.Optional(CONF_INSTALL): selector.ActionSelector(), - vol.Optional(CONF_IN_PROGRESS): selector.TemplateSelector(), - vol.Optional(CONF_RELEASE_SUMMARY): selector.TemplateSelector(), - vol.Optional(CONF_RELEASE_URL): selector.TemplateSelector(), - vol.Optional(CONF_TITLE): selector.TemplateSelector(), - vol.Optional(CONF_UPDATE_PERCENTAGE): selector.TemplateSelector(), - vol.Optional(CONF_BACKUP): selector.BooleanSelector(), - vol.Optional(CONF_SPECIFIC_VERSION): selector.BooleanSelector(), + probatio.Optional(CONF_INSTALLED_VERSION): selector.TemplateSelector(), + probatio.Optional(CONF_LATEST_VERSION): selector.TemplateSelector(), + probatio.Optional(CONF_INSTALL): selector.ActionSelector(), + probatio.Optional(CONF_IN_PROGRESS): selector.TemplateSelector(), + probatio.Optional(CONF_RELEASE_SUMMARY): selector.TemplateSelector(), + probatio.Optional(CONF_RELEASE_URL): selector.TemplateSelector(), + probatio.Optional(CONF_TITLE): selector.TemplateSelector(), + probatio.Optional(CONF_UPDATE_PERCENTAGE): selector.TemplateSelector(), + probatio.Optional(CONF_BACKUP): selector.BooleanSelector(), + probatio.Optional(CONF_SPECIFIC_VERSION): selector.BooleanSelector(), } if flow_type == "config": schema |= { - vol.Optional(CONF_DEVICE_CLASS): selector.DeviceClassSelector( + probatio.Optional(CONF_DEVICE_CLASS): selector.DeviceClassSelector( selector.DeviceClassSelectorConfig(domain=Platform.UPDATE), ), } if domain == Platform.VACUUM: schema |= _SCHEMA_STATE | { - vol.Required(SERVICE_START): selector.ActionSelector(), - vol.Optional(CONF_FAN_SPEED): selector.TemplateSelector(), - vol.Optional(CONF_FAN_SPEED_LIST): selector.SelectSelector( + probatio.Required(SERVICE_START): selector.ActionSelector(), + probatio.Optional(CONF_FAN_SPEED): selector.TemplateSelector(), + probatio.Optional(CONF_FAN_SPEED_LIST): selector.SelectSelector( selector.SelectSelectorConfig( options=[], multiple=True, @@ -365,36 +375,36 @@ def generate_schema(domain: str, flow_type: str) -> vol.Schema: mode=selector.SelectSelectorMode.DROPDOWN, ) ), - vol.Optional(SERVICE_SET_FAN_SPEED): selector.ActionSelector(), - vol.Optional(SERVICE_STOP): selector.ActionSelector(), - vol.Optional(SERVICE_PAUSE): selector.ActionSelector(), - vol.Optional(SERVICE_RETURN_TO_BASE): selector.ActionSelector(), - vol.Optional(SERVICE_CLEAN_SPOT): selector.ActionSelector(), - vol.Optional(SERVICE_LOCATE): selector.ActionSelector(), + probatio.Optional(SERVICE_SET_FAN_SPEED): selector.ActionSelector(), + probatio.Optional(SERVICE_STOP): selector.ActionSelector(), + probatio.Optional(SERVICE_PAUSE): selector.ActionSelector(), + probatio.Optional(SERVICE_RETURN_TO_BASE): selector.ActionSelector(), + probatio.Optional(SERVICE_CLEAN_SPOT): selector.ActionSelector(), + probatio.Optional(SERVICE_LOCATE): selector.ActionSelector(), } if domain == Platform.WEATHER: schema |= { - vol.Required(CONF_CONDITION): selector.TemplateSelector(), - vol.Required(CONF_HUMIDITY): selector.TemplateSelector(), - vol.Required(CONF_WEATHER_TEMPERATURE): selector.TemplateSelector(), - vol.Optional(CONF_TEMPERATURE_UNIT): selector.SelectSelector( + probatio.Required(CONF_CONDITION): selector.TemplateSelector(), + probatio.Required(CONF_HUMIDITY): selector.TemplateSelector(), + probatio.Required(CONF_WEATHER_TEMPERATURE): selector.TemplateSelector(), + probatio.Optional(CONF_TEMPERATURE_UNIT): selector.SelectSelector( selector.SelectSelectorConfig( options=[cls.value for cls in UnitOfTemperature], mode=selector.SelectSelectorMode.DROPDOWN, sort=True, ), ), - vol.Optional(CONF_FORECAST_DAILY): selector.TemplateSelector(), - vol.Optional(CONF_FORECAST_HOURLY): selector.TemplateSelector(), + probatio.Optional(CONF_FORECAST_DAILY): selector.TemplateSelector(), + probatio.Optional(CONF_FORECAST_HOURLY): selector.TemplateSelector(), } schema |= { - vol.Optional(CONF_DEVICE_ID): selector.DeviceSelector(), - vol.Optional(CONF_ADDITIONAL_OPTIONS): section( - vol.Schema( + probatio.Optional(CONF_DEVICE_ID): selector.DeviceSelector(), + probatio.Optional(CONF_ADDITIONAL_OPTIONS): section( + probatio.Schema( { - vol.Optional(CONF_AVAILABILITY): selector.TemplateSelector(), + probatio.Optional(CONF_AVAILABILITY): selector.TemplateSelector(), **additional_options, } ), @@ -402,7 +412,7 @@ def generate_schema(domain: str, flow_type: str) -> vol.Schema: ), } - return vol.Schema(schema) + return probatio.Schema(schema) options_schema = partial(generate_schema, flow_type="options") @@ -444,7 +454,7 @@ def _validate_unit(options: dict[str, Any]) -> None: else: units_string = f"one of {', '.join(sorted_units)}" - raise vol.Invalid( + raise probatio.Invalid( f"'{unit}' is not a valid unit for device class '{device_class}'; " f"expected {units_string}" ) @@ -469,7 +479,7 @@ def _validate_state_class(options: dict[str, Any]) -> None: else: state_classes_string = f"one of {', '.join(sorted_state_classes)}" - raise vol.Invalid( + raise probatio.Invalid( f"'{state_class}' is not a valid state class for device class " f"'{device_class}'; expected {state_classes_string}" ) @@ -743,10 +753,10 @@ async def async_setup_preview(hass: HomeAssistant) -> None: @websocket_api.websocket_command( { - vol.Required("type"): "template/start_preview", - vol.Required("flow_id"): str, - vol.Required("flow_type"): vol.Any("config_flow", "options_flow"), - vol.Required("user_input"): dict, + probatio.Required("type"): "template/start_preview", + probatio.Required("flow_id"): str, + probatio.Required("flow_type"): probatio.Any("config_flow", "options_flow"), + probatio.Required("user_input"): dict, } ) @callback @@ -757,25 +767,27 @@ def ws_start_preview( ) -> None: """Generate a preview.""" - def _validate(schema: vol.Schema, domain: str, user_input: dict[str, Any]) -> Any: + def _validate( + schema: probatio.Schema, domain: str, user_input: dict[str, Any] + ) -> Any: errors = {} - key: vol.Marker + key: probatio.Marker for key, validator in schema.schema.items(): if key.schema not in user_input: continue try: validator(user_input[key.schema]) - except vol.Invalid as ex: + except probatio.Invalid as ex: errors[key.schema] = str(ex.msg) if domain == Platform.SENSOR: try: _validate_unit(user_input) - except vol.Invalid as ex: + except probatio.Invalid as ex: errors[CONF_UNIT_OF_MEASUREMENT] = str(ex.msg) try: _validate_state_class(user_input) - except vol.Invalid as ex: + except probatio.Invalid as ex: errors[CONF_STATE_CLASS] = str(ex.msg) return errors @@ -785,7 +797,7 @@ def _validate(schema: vol.Schema, domain: str, user_input: dict[str, Any]) -> An flow_status = hass.config_entries.flow.async_get(msg["flow_id"]) template_type = flow_status["step_id"] form_step = cast(SchemaFlowFormStep, CONFIG_FLOW[template_type]) - schema = cast(vol.Schema, form_step.schema) + schema = cast(probatio.Schema, form_step.schema) name = msg["user_input"]["name"] else: flow_status = hass.config_entries.options.async_get(msg["flow_id"]) @@ -794,7 +806,7 @@ def _validate(schema: vol.Schema, domain: str, user_input: dict[str, Any]) -> An raise HomeAssistantError template_type = config_entry.options["template_type"] name = config_entry.options["name"] - schema = cast(vol.Schema, OPTIONS_FLOW[template_type].schema) + schema = cast(probatio.Schema, OPTIONS_FLOW[template_type].schema) entity_registry = er.async_get(hass) entries = er.async_entries_for_config_entry( entity_registry, flow_status["handler"] diff --git a/homeassistant/components/template/cover.py b/homeassistant/components/template/cover.py index e62e61e1edfaf..90b6d6a6728a8 100644 --- a/homeassistant/components/template/cover.py +++ b/homeassistant/components/template/cover.py @@ -3,7 +3,7 @@ from dataclasses import asdict, dataclass from typing import TYPE_CHECKING, Any, Self, override -import voluptuous as vol +import probatio from homeassistant.components.cover import ( ATTR_POSITION, @@ -76,17 +76,17 @@ DEFAULT_NAME = "Template Cover" -COVER_COMMON_SCHEMA = vol.Schema( +COVER_COMMON_SCHEMA = probatio.Schema( { - vol.Inclusive(CLOSE_ACTION, CONF_OPEN_AND_CLOSE): cv.SCRIPT_SCHEMA, - vol.Inclusive(OPEN_ACTION, CONF_OPEN_AND_CLOSE): cv.SCRIPT_SCHEMA, - vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, - vol.Optional(CONF_POSITION): cv.template, - vol.Optional(CONF_STATE): cv.template, - vol.Optional(CONF_TILT): cv.template, - vol.Optional(POSITION_ACTION): cv.SCRIPT_SCHEMA, - vol.Optional(STOP_ACTION): cv.SCRIPT_SCHEMA, - vol.Optional(TILT_ACTION): cv.SCRIPT_SCHEMA, + probatio.Inclusive(CLOSE_ACTION, CONF_OPEN_AND_CLOSE): cv.SCRIPT_SCHEMA, + probatio.Inclusive(OPEN_ACTION, CONF_OPEN_AND_CLOSE): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_POSITION): cv.template, + probatio.Optional(CONF_STATE): cv.template, + probatio.Optional(CONF_TILT): cv.template, + probatio.Optional(POSITION_ACTION): cv.SCRIPT_SCHEMA, + probatio.Optional(STOP_ACTION): cv.SCRIPT_SCHEMA, + probatio.Optional(TILT_ACTION): cv.SCRIPT_SCHEMA, } ) @@ -94,10 +94,10 @@ attributes=CoverEntityStateAttribute, device_class=True ) -COVER_YAML_SCHEMA = vol.All( - vol.Schema( +COVER_YAML_SCHEMA = probatio.All( + probatio.Schema( { - vol.Optional(CONF_TILT_OPTIMISTIC): cv.boolean, + probatio.Optional(CONF_TILT_OPTIMISTIC): cv.boolean, } ) .extend(COVER_COMMON_SCHEMA.schema) @@ -110,7 +110,7 @@ cv.has_at_least_one_key(OPEN_ACTION, POSITION_ACTION), ) -COVER_CONFIG_ENTRY_SCHEMA = vol.All( +COVER_CONFIG_ENTRY_SCHEMA = probatio.All( COVER_COMMON_SCHEMA.extend(TEMPLATE_ENTITY_COMMON_CONFIG_ENTRY_SCHEMA.schema), cv.has_at_least_one_key(OPEN_ACTION, POSITION_ACTION), ) diff --git a/homeassistant/components/template/device_tracker.py b/homeassistant/components/template/device_tracker.py index 9065c01718797..35428953d25e6 100644 --- a/homeassistant/components/template/device_tracker.py +++ b/homeassistant/components/template/device_tracker.py @@ -4,7 +4,7 @@ from dataclasses import asdict, dataclass from typing import Any, Self, override -import voluptuous as vol +import probatio from homeassistant.components import zone from homeassistant.components.device_tracker import ( @@ -49,13 +49,13 @@ def _validate_in_zones_or_lat_and_lon(obj: dict) -> dict: if CONF_IN_ZONES not in obj: if CONF_LATITUDE not in obj or CONF_LONGITUDE not in obj: - raise vol.Invalid( + raise probatio.Invalid( f"Either '{CONF_IN_ZONES}' or both '{CONF_LATITUDE}' and '{CONF_LONGITUDE}' must be specified" ) elif (CONF_LATITUDE in obj and CONF_LONGITUDE not in obj) or ( CONF_LATITUDE not in obj and CONF_LONGITUDE in obj ): - raise vol.Invalid( + raise probatio.Invalid( f"Both '{CONF_LATITUDE}' and '{CONF_LONGITUDE}' must be specified" ) @@ -89,9 +89,9 @@ def convert(result: Any) -> list[str] | None: for v in result: try: zone_entity_ids.append( - vol.All(cv.entity_id, cv.entity_domain(zone.DOMAIN))(v) + probatio.All(cv.entity_id, cv.entity_domain(zone.DOMAIN))(v) ) - except vol.Invalid: + except probatio.Invalid: failed.append(v) if failed: @@ -107,12 +107,12 @@ def convert(result: Any) -> list[str] | None: return convert -TRACKER_COMMON_SCHEMA = vol.Schema( +TRACKER_COMMON_SCHEMA = probatio.Schema( { - vol.Optional(CONF_IN_ZONES): cv.template, - vol.Optional(CONF_LATITUDE): cv.template, - vol.Optional(CONF_LOCATION_ACCURACY): cv.template, - vol.Optional(CONF_LONGITUDE): cv.template, + probatio.Optional(CONF_IN_ZONES): cv.template, + probatio.Optional(CONF_LATITUDE): cv.template, + probatio.Optional(CONF_LOCATION_ACCURACY): cv.template, + probatio.Optional(CONF_LONGITUDE): cv.template, } ) @@ -124,7 +124,7 @@ def convert(result: Any) -> list[str] | None: ) ) -TRACKER_YAML_SCHEMA = vol.All( +TRACKER_YAML_SCHEMA = probatio.All( _validate_in_zones_or_lat_and_lon, TRACKER_COMMON_SCHEMA.extend( make_template_entity_common_schema( @@ -135,7 +135,7 @@ def convert(result: Any) -> list[str] | None: ), ) -TRACKER_CONFIG_ENTRY_SCHEMA = vol.All( +TRACKER_CONFIG_ENTRY_SCHEMA = probatio.All( _validate_in_zones_or_lat_and_lon, TRACKER_COMMON_SCHEMA.extend(TEMPLATE_ENTITY_COMMON_CONFIG_ENTRY_SCHEMA.schema), ) diff --git a/homeassistant/components/template/event.py b/homeassistant/components/template/event.py index a8ce3dc387e3c..091fed7080ed6 100644 --- a/homeassistant/components/template/event.py +++ b/homeassistant/components/template/event.py @@ -3,7 +3,7 @@ import logging from typing import Any, Final -import voluptuous as vol +import probatio from homeassistant.components.event import ( DOMAIN as EVENT_DOMAIN, @@ -45,13 +45,15 @@ CONF_EVENT_TYPE = "event_type" CONF_EVENT_TYPES = "event_types" -DEVICE_CLASS_SCHEMA: Final = vol.All(vol.Lower, vol.Coerce(EventDeviceClass)) +DEVICE_CLASS_SCHEMA: Final = probatio.All( + probatio.Lower, probatio.Coerce(EventDeviceClass) +) -EVENT_COMMON_SCHEMA = vol.Schema( +EVENT_COMMON_SCHEMA = probatio.Schema( { - vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASS_SCHEMA, - vol.Required(CONF_EVENT_TYPE): cv.template, - vol.Required(CONF_EVENT_TYPES): cv.template, + probatio.Optional(CONF_DEVICE_CLASS): DEVICE_CLASS_SCHEMA, + probatio.Required(CONF_EVENT_TYPE): cv.template, + probatio.Required(CONF_EVENT_TYPES): cv.template, } ) diff --git a/homeassistant/components/template/fan.py b/homeassistant/components/template/fan.py index 6080df8333d9e..a13c4caeaca52 100644 --- a/homeassistant/components/template/fan.py +++ b/homeassistant/components/template/fan.py @@ -5,7 +5,7 @@ import logging from typing import TYPE_CHECKING, Any, Self, override -import voluptuous as vol +import probatio from homeassistant.components.fan import ( DIRECTION_FORWARD, @@ -74,21 +74,21 @@ CONF_SET_PRESET_MODE_ACTION, ) -FAN_COMMON_SCHEMA = vol.Schema( +FAN_COMMON_SCHEMA = probatio.Schema( { - vol.Optional(CONF_DIRECTION): cv.template, - vol.Required(CONF_OFF_ACTION): cv.SCRIPT_SCHEMA, - vol.Required(CONF_ON_ACTION): cv.SCRIPT_SCHEMA, - vol.Optional(CONF_OSCILLATING): cv.template, - vol.Optional(CONF_PERCENTAGE): cv.template, - vol.Optional(CONF_PRESET_MODE): cv.template, - vol.Optional(CONF_PRESET_MODES): cv.ensure_list, - vol.Optional(CONF_SET_DIRECTION_ACTION): cv.SCRIPT_SCHEMA, - vol.Optional(CONF_SET_OSCILLATING_ACTION): cv.SCRIPT_SCHEMA, - vol.Optional(CONF_SET_PERCENTAGE_ACTION): cv.SCRIPT_SCHEMA, - vol.Optional(CONF_SET_PRESET_MODE_ACTION): cv.SCRIPT_SCHEMA, - vol.Optional(CONF_SPEED_COUNT): vol.Coerce(int), - vol.Optional(CONF_STATE): cv.template, + probatio.Optional(CONF_DIRECTION): cv.template, + probatio.Required(CONF_OFF_ACTION): cv.SCRIPT_SCHEMA, + probatio.Required(CONF_ON_ACTION): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_OSCILLATING): cv.template, + probatio.Optional(CONF_PERCENTAGE): cv.template, + probatio.Optional(CONF_PRESET_MODE): cv.template, + probatio.Optional(CONF_PRESET_MODES): cv.ensure_list, + probatio.Optional(CONF_SET_DIRECTION_ACTION): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_SET_OSCILLATING_ACTION): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_SET_PERCENTAGE_ACTION): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_SET_PRESET_MODE_ACTION): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_SPEED_COUNT): probatio.Coerce(int), + probatio.Optional(CONF_STATE): cv.template, } ) diff --git a/homeassistant/components/template/helpers.py b/homeassistant/components/template/helpers.py index 9b1cc998b42be..94a9ba1e0bd0b 100644 --- a/homeassistant/components/template/helpers.py +++ b/homeassistant/components/template/helpers.py @@ -4,8 +4,8 @@ import logging from typing import Any -import voluptuous as vol -from voluptuous.humanize import humanize_error +import probatio +from probatio.humanize import humanize_error from homeassistant.components import blueprint from homeassistant.config_entries import ConfigEntry @@ -143,8 +143,8 @@ async def validate_actions_and_conditions_config( """ def _humanize(err: Exception, data: Any) -> str: - """Humanize vol.Invalid, stringify other exceptions.""" - if isinstance(err, vol.Invalid): + """Humanize probatio.Invalid, stringify other exceptions.""" + if isinstance(err, probatio.Invalid): return humanize_error(data, err) return str(err) @@ -154,7 +154,7 @@ def _humanize(err: Exception, data: Any) -> str: config[CONF_CONDITIONS] = await async_validate_conditions_config( hass, condition_config ) - except (vol.Invalid, HomeAssistantError) as err: + except (probatio.Invalid, HomeAssistantError) as err: if not breadcrumb: breadcrumb = _get_config_breadcrumbs(config) _LOGGER.error( @@ -173,7 +173,7 @@ def _humanize(err: Exception, data: Any) -> str: config[script_option] = await async_validate_actions_config( hass, script_config ) - except (vol.Invalid, HomeAssistantError) as err: + except (probatio.Invalid, HomeAssistantError) as err: if not breadcrumb: breadcrumb = _get_config_breadcrumbs(config) _LOGGER.error( @@ -260,7 +260,7 @@ async def async_setup_template_entry( config_entry: ConfigEntry, async_add_entities: AddConfigEntryEntitiesCallback, state_entity_cls: type[TemplateEntity], - config_schema: vol.Schema | vol.All, + config_schema: probatio.Schema | probatio.All, replace_value_template: bool = False, script_options: tuple[str, ...] | None = None, ) -> None: @@ -288,7 +288,7 @@ def async_setup_template_preview[T: TemplateEntity]( name: str, config: ConfigType, state_entity_cls: type[T], - schema: vol.Schema | vol.All, + schema: probatio.Schema | probatio.All, replace_value_template: bool = False, ) -> T: """Setup the Template preview.""" diff --git a/homeassistant/components/template/image.py b/homeassistant/components/template/image.py index f46adf5b2db84..9f1362fc29f9f 100644 --- a/homeassistant/components/template/image.py +++ b/homeassistant/components/template/image.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.image import ( DOMAIN as IMAGE_DOMAIN, @@ -43,10 +43,10 @@ attributes=ImageEntityStateAttribute ) -IMAGE_YAML_SCHEMA = vol.Schema( +IMAGE_YAML_SCHEMA = probatio.Schema( { - vol.Required(CONF_URL): cv.template, - vol.Optional(CONF_VERIFY_SSL, default=True): bool, + probatio.Required(CONF_URL): cv.template, + probatio.Optional(CONF_VERIFY_SSL, default=True): bool, } ).extend( make_template_entity_common_schema( @@ -55,10 +55,10 @@ ) -IMAGE_CONFIG_ENTRY_SCHEMA = vol.Schema( +IMAGE_CONFIG_ENTRY_SCHEMA = probatio.Schema( { - vol.Required(CONF_URL): cv.template, - vol.Optional(CONF_VERIFY_SSL, default=True): bool, + probatio.Required(CONF_URL): cv.template, + probatio.Optional(CONF_VERIFY_SSL, default=True): bool, } ).extend(TEMPLATE_ENTITY_COMMON_CONFIG_ENTRY_SCHEMA.schema) diff --git a/homeassistant/components/template/light.py b/homeassistant/components/template/light.py index 8906f5064d973..f20bf37d82338 100644 --- a/homeassistant/components/template/light.py +++ b/homeassistant/components/template/light.py @@ -6,7 +6,7 @@ import logging from typing import TYPE_CHECKING, Any, Self, override -import voluptuous as vol +import probatio from homeassistant.components.light import ( ATTR_BRIGHTNESS, @@ -106,31 +106,31 @@ CONF_XY_ACTION, ) -LIGHT_COMMON_SCHEMA = vol.Schema( +LIGHT_COMMON_SCHEMA = probatio.Schema( { - vol.Inclusive(CONF_EFFECT_ACTION, "effect"): cv.SCRIPT_SCHEMA, - vol.Inclusive(CONF_EFFECT_LIST, "effect"): cv.template, - vol.Inclusive(CONF_EFFECT, "effect"): cv.template, - vol.Optional(CONF_HS_ACTION): cv.SCRIPT_SCHEMA, - vol.Optional(CONF_HS): cv.template, - vol.Optional(CONF_LEVEL_ACTION): cv.SCRIPT_SCHEMA, - vol.Optional(CONF_LEVEL): cv.template, - vol.Optional(CONF_MAX_MIREDS): cv.template, - vol.Optional(CONF_MIN_MIREDS): cv.template, - vol.Required(CONF_OFF_ACTION): cv.SCRIPT_SCHEMA, - vol.Required(CONF_ON_ACTION): cv.SCRIPT_SCHEMA, - vol.Optional(CONF_RGB_ACTION): cv.SCRIPT_SCHEMA, - vol.Optional(CONF_RGB): cv.template, - vol.Optional(CONF_RGBW_ACTION): cv.SCRIPT_SCHEMA, - vol.Optional(CONF_RGBW): cv.template, - vol.Optional(CONF_RGBWW_ACTION): cv.SCRIPT_SCHEMA, - vol.Optional(CONF_RGBWW): cv.template, - vol.Optional(CONF_STATE): cv.template, - vol.Optional(CONF_SUPPORTS_TRANSITION): cv.template, - vol.Optional(CONF_TEMPERATURE_ACTION): cv.SCRIPT_SCHEMA, - vol.Optional(CONF_TEMPERATURE): cv.template, - vol.Optional(CONF_XY): cv.template, - vol.Optional(CONF_XY_ACTION): cv.SCRIPT_SCHEMA, + probatio.Inclusive(CONF_EFFECT_ACTION, "effect"): cv.SCRIPT_SCHEMA, + probatio.Inclusive(CONF_EFFECT_LIST, "effect"): cv.template, + probatio.Inclusive(CONF_EFFECT, "effect"): cv.template, + probatio.Optional(CONF_HS_ACTION): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_HS): cv.template, + probatio.Optional(CONF_LEVEL_ACTION): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_LEVEL): cv.template, + probatio.Optional(CONF_MAX_MIREDS): cv.template, + probatio.Optional(CONF_MIN_MIREDS): cv.template, + probatio.Required(CONF_OFF_ACTION): cv.SCRIPT_SCHEMA, + probatio.Required(CONF_ON_ACTION): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_RGB_ACTION): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_RGB): cv.template, + probatio.Optional(CONF_RGBW_ACTION): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_RGBW): cv.template, + probatio.Optional(CONF_RGBWW_ACTION): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_RGBWW): cv.template, + probatio.Optional(CONF_STATE): cv.template, + probatio.Optional(CONF_SUPPORTS_TRANSITION): cv.template, + probatio.Optional(CONF_TEMPERATURE_ACTION): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_TEMPERATURE): cv.template, + probatio.Optional(CONF_XY): cv.template, + probatio.Optional(CONF_XY_ACTION): cv.SCRIPT_SCHEMA, } ) diff --git a/homeassistant/components/template/lock.py b/homeassistant/components/template/lock.py index 2e82cf5f91d3b..07bd1d1a75591 100644 --- a/homeassistant/components/template/lock.py +++ b/homeassistant/components/template/lock.py @@ -3,7 +3,7 @@ from dataclasses import asdict, dataclass from typing import TYPE_CHECKING, Any, Self, override -import voluptuous as vol +import probatio from homeassistant.components.lock import ( DOMAIN as LOCK_DOMAIN, @@ -57,13 +57,13 @@ ) -LOCK_COMMON_SCHEMA = vol.Schema( +LOCK_COMMON_SCHEMA = probatio.Schema( { - vol.Optional(CONF_CODE_FORMAT): cv.template, - vol.Required(CONF_LOCK): cv.SCRIPT_SCHEMA, - vol.Optional(CONF_OPEN): cv.SCRIPT_SCHEMA, - vol.Optional(CONF_STATE): cv.template, - vol.Required(CONF_UNLOCK): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_CODE_FORMAT): cv.template, + probatio.Required(CONF_LOCK): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_OPEN): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_STATE): cv.template, + probatio.Required(CONF_UNLOCK): cv.SCRIPT_SCHEMA, } ) diff --git a/homeassistant/components/template/number.py b/homeassistant/components/template/number.py index 1566eb78d53e4..fe2104cb4b175 100644 --- a/homeassistant/components/template/number.py +++ b/homeassistant/components/template/number.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING, Any, override -import voluptuous as vol +import probatio from homeassistant.components.number import ( DEFAULT_MAX_VALUE, @@ -53,15 +53,15 @@ SCRIPT_FIELDS = (CONF_SET_VALUE,) -NUMBER_COMMON_SCHEMA = vol.Schema( +NUMBER_COMMON_SCHEMA = probatio.Schema( { - vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, - vol.Optional(CONF_MAX, default=DEFAULT_MAX_VALUE): cv.template, - vol.Optional(CONF_MIN, default=DEFAULT_MIN_VALUE): cv.template, - vol.Required(CONF_SET_VALUE): cv.SCRIPT_SCHEMA, - vol.Optional(CONF_STATE): cv.template, - vol.Optional(CONF_STEP, default=DEFAULT_STEP): cv.template, - vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, + probatio.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_MAX, default=DEFAULT_MAX_VALUE): cv.template, + probatio.Optional(CONF_MIN, default=DEFAULT_MIN_VALUE): cv.template, + probatio.Required(CONF_SET_VALUE): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_STATE): cv.template, + probatio.Optional(CONF_STEP, default=DEFAULT_STEP): cv.template, + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, } ) diff --git a/homeassistant/components/template/repairs.py b/homeassistant/components/template/repairs.py index 3854c36a458d8..185b7c6bc4295 100644 --- a/homeassistant/components/template/repairs.py +++ b/homeassistant/components/template/repairs.py @@ -1,6 +1,6 @@ """Repairs platform for the template integration.""" -import voluptuous as vol +import probatio from homeassistant.components.repairs import ( ConfirmRepairFlow, @@ -62,9 +62,9 @@ async def async_step_select_device( return self.async_show_form( step_id="select_device", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_DEVICE_ID, description={ "suggested_value": entry.options.get(CONF_DEVICE_ID) diff --git a/homeassistant/components/template/schemas.py b/homeassistant/components/template/schemas.py index 4feab70a04d21..e7ae3040cb317 100644 --- a/homeassistant/components/template/schemas.py +++ b/homeassistant/components/template/schemas.py @@ -1,6 +1,6 @@ """Shared schemas for config entry and YAML config items.""" -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_CONDITIONS, @@ -21,22 +21,22 @@ ) from .validators import BlockedTemplateAttributes, validate_attributes -TEMPLATE_ENTITY_AVAILABILITY_SCHEMA = vol.Schema( +TEMPLATE_ENTITY_AVAILABILITY_SCHEMA = probatio.Schema( { - vol.Optional(CONF_AVAILABILITY): cv.template, + probatio.Optional(CONF_AVAILABILITY): cv.template, } ) -TEMPLATE_ENTITY_COMMON_CONFIG_ENTRY_SCHEMA = vol.Schema( +TEMPLATE_ENTITY_COMMON_CONFIG_ENTRY_SCHEMA = probatio.Schema( { - vol.Required(CONF_NAME): cv.template, - vol.Optional(CONF_DEVICE_ID): selector.DeviceSelector(), + probatio.Required(CONF_NAME): cv.template, + probatio.Optional(CONF_DEVICE_ID): selector.DeviceSelector(), } ).extend(TEMPLATE_ENTITY_AVAILABILITY_SCHEMA.schema) TEMPLATE_ENTITY_OPTIMISTIC_SCHEMA = { - vol.Optional(CONF_OPTIMISTIC): cv.boolean, + probatio.Optional(CONF_OPTIMISTIC): cv.boolean, } @@ -44,23 +44,23 @@ def make_template_entity_common_schema( domain: str, default_name: str, blocked_attributes: BlockedTemplateAttributes | None = None, -) -> vol.Schema: +) -> probatio.Schema: """Return a schema with default name.""" - return vol.Schema( + return probatio.Schema( { - vol.Optional(CONF_AVAILABILITY): cv.template, - vol.Optional(CONF_DEFAULT_ENTITY_ID): vol.All( + probatio.Optional(CONF_AVAILABILITY): cv.template, + probatio.Optional(CONF_DEFAULT_ENTITY_ID): probatio.All( cv.entity_id, cv.entity_domain(domain) ), - vol.Optional(CONF_ICON): cv.template, - vol.Optional(CONF_NAME, default=default_name): cv.template, - vol.Optional(CONF_PICTURE): cv.template, - vol.Optional(CONF_UNIQUE_ID): cv.string, - vol.Optional(CONF_VARIABLES): cv.SCRIPT_VARIABLES_SCHEMA, - vol.Optional(CONF_CONDITIONS): cv.CONDITIONS_SCHEMA, - vol.Optional(CONF_ATTRIBUTES): vol.Schema( - vol.Any( - vol.All( + probatio.Optional(CONF_ICON): cv.template, + probatio.Optional(CONF_NAME, default=default_name): cv.template, + probatio.Optional(CONF_PICTURE): cv.template, + probatio.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Optional(CONF_VARIABLES): cv.SCRIPT_VARIABLES_SCHEMA, + probatio.Optional(CONF_CONDITIONS): cv.CONDITIONS_SCHEMA, + probatio.Optional(CONF_ATTRIBUTES): probatio.Schema( + probatio.Any( + probatio.All( {cv.string: cv.template}, validate_attributes(default_name, blocked_attributes), ), diff --git a/homeassistant/components/template/select.py b/homeassistant/components/template/select.py index 6ba3fafdc231e..99de37d4d139d 100644 --- a/homeassistant/components/template/select.py +++ b/homeassistant/components/template/select.py @@ -4,7 +4,7 @@ import logging from typing import TYPE_CHECKING, Any, Self, override -import voluptuous as vol +import probatio from homeassistant.components.select import ( DOMAIN as SELECT_DOMAIN, @@ -47,11 +47,11 @@ SCRIPT_FIELDS = (CONF_SELECT_OPTION,) -SELECT_COMMON_SCHEMA = vol.Schema( +SELECT_COMMON_SCHEMA = probatio.Schema( { - vol.Required(CONF_OPTIONS): cv.template, - vol.Optional(CONF_SELECT_OPTION): cv.SCRIPT_SCHEMA, - vol.Optional(CONF_STATE): cv.template, + probatio.Required(CONF_OPTIONS): cv.template, + probatio.Optional(CONF_SELECT_OPTION): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_STATE): cv.template, } ) diff --git a/homeassistant/components/template/sensor.py b/homeassistant/components/template/sensor.py index 6cce22e5d3724..fed7242afd6ef 100644 --- a/homeassistant/components/template/sensor.py +++ b/homeassistant/components/template/sensor.py @@ -6,7 +6,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( CONF_STATE_CLASS, @@ -56,19 +56,19 @@ def validate_last_reset(val): val.get(CONF_LAST_RESET) is not None and val.get(CONF_STATE_CLASS) != SensorStateClass.TOTAL ): - raise vol.Invalid( + raise probatio.Invalid( "last_reset is only valid for template sensors with state_class 'total'" ) return val -SENSOR_COMMON_SCHEMA = vol.Schema( +SENSOR_COMMON_SCHEMA = probatio.Schema( { - vol.Required(CONF_STATE): cv.template, - vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, - vol.Optional(CONF_STATE_CLASS): STATE_CLASSES_SCHEMA, - vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, + probatio.Required(CONF_STATE): cv.template, + probatio.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_STATE_CLASS): STATE_CLASSES_SCHEMA, + probatio.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, } ) @@ -78,10 +78,10 @@ def validate_last_reset(val): allowed_attributes=(SensorEntityCapabilityAttribute.OPTIONS,), ) -SENSOR_YAML_SCHEMA = vol.All( - vol.Schema( +SENSOR_YAML_SCHEMA = probatio.All( + probatio.Schema( { - vol.Optional(CONF_LAST_RESET): cv.template, + probatio.Optional(CONF_LAST_RESET): cv.template, } ) .extend(SENSOR_COMMON_SCHEMA.schema) diff --git a/homeassistant/components/template/switch.py b/homeassistant/components/template/switch.py index 535a311f57b8e..13a68c05f8269 100644 --- a/homeassistant/components/template/switch.py +++ b/homeassistant/components/template/switch.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING, Any, override -import voluptuous as vol +import probatio from homeassistant.components.switch import ( DOMAIN as SWITCH_DOMAIN, @@ -43,11 +43,11 @@ CONF_TURN_ON, ) -SWITCH_COMMON_SCHEMA = vol.Schema( +SWITCH_COMMON_SCHEMA = probatio.Schema( { - vol.Optional(CONF_STATE): cv.template, - vol.Optional(CONF_TURN_OFF): cv.SCRIPT_SCHEMA, - vol.Optional(CONF_TURN_ON): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_STATE): cv.template, + probatio.Optional(CONF_TURN_OFF): cv.SCRIPT_SCHEMA, + probatio.Optional(CONF_TURN_ON): cv.SCRIPT_SCHEMA, } ) diff --git a/homeassistant/components/template/template_entity.py b/homeassistant/components/template/template_entity.py index 33eee540c14e5..967a310bf32fc 100644 --- a/homeassistant/components/template/template_entity.py +++ b/homeassistant/components/template/template_entity.py @@ -5,8 +5,8 @@ import logging from typing import Any, cast, override +import probatio from propcache.api import under_cached_property -import voluptuous as vol from homeassistant.components.blueprint import CONF_USE_BLUEPRINT from homeassistant.const import ( @@ -122,7 +122,7 @@ def handle_result( try: validated = self.validator(result) - except vol.Invalid as ex: + except probatio.Invalid as ex: log_validation_error( result, self.template, self._attribute, self._entity.entity_id, ex ) @@ -204,7 +204,7 @@ def name(self) -> str: # if the entity renders unavailable. self._attr_name = None for option, attribute, validator in ( - (CONF_ICON, "_attr_icon", vol.Or(cv.whitespace, cv.icon)), + (CONF_ICON, "_attr_icon", probatio.Or(cv.whitespace, cv.icon)), (CONF_PICTURE, "_attr_entity_picture", cv.string), (CONF_NAME, "_attr_name", cv.string), ): @@ -524,11 +524,11 @@ def _update_attributes(result: dict | TemplateError) -> None: return try: - self._attr_extra_state_attributes = vol.All( + self._attr_extra_state_attributes = probatio.All( dict, validate_attributes(self.entity_id, self._blocked_attributes), )(result) - except vol.Invalid as err: + except probatio.Invalid as err: log_validation_error( result, template, CONF_ATTRIBUTES, self.entity_id, err ) diff --git a/homeassistant/components/template/trigger.py b/homeassistant/components/template/trigger.py index c3e5a5d141f53..dc96c0ad9db35 100644 --- a/homeassistant/components/template/trigger.py +++ b/homeassistant/components/template/trigger.py @@ -4,7 +4,7 @@ import logging from typing import Any -import voluptuous as vol +import probatio from homeassistant import exceptions from homeassistant.const import CONF_FOR, CONF_PLATFORM, CONF_VALUE_TEMPLATE @@ -31,9 +31,9 @@ TRIGGER_SCHEMA = IF_ACTION_SCHEMA = cv.TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_PLATFORM): "template", - vol.Required(CONF_VALUE_TEMPLATE): cv.template, - vol.Optional(CONF_FOR): cv.positive_time_period_template, + probatio.Required(CONF_PLATFORM): "template", + probatio.Required(CONF_VALUE_TEMPLATE): cv.template, + probatio.Optional(CONF_FOR): cv.positive_time_period_template, } ) @@ -140,7 +140,7 @@ def call_action(*_: Any) -> None: period: timedelta = cv.positive_time_period( template.render_complex(time_delta, period_variables) ) - except (exceptions.TemplateError, vol.Invalid) as ex: + except (exceptions.TemplateError, probatio.Invalid) as ex: _LOGGER.error( "Error rendering '%s' for template: %s", trigger_info["name"], ex ) diff --git a/homeassistant/components/template/trigger_entity.py b/homeassistant/components/template/trigger_entity.py index 121cf644e9138..69f98468f3b3a 100644 --- a/homeassistant/components/template/trigger_entity.py +++ b/homeassistant/components/template/trigger_entity.py @@ -4,7 +4,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.const import CONF_CONDITIONS, CONF_VARIABLES from homeassistant.core import HomeAssistant, callback @@ -274,7 +274,7 @@ def _render_templates(self, variables: dict[str, Any]) -> None: validated = {} try: result = template_render_complex(attributes_template, variables) - validated = vol.All( + validated = probatio.All( dict, validate_attributes( self.entity_id, @@ -286,7 +286,7 @@ def _render_templates(self, variables: dict[str, Any]) -> None: log_triggered_template_error( self.entity_id, err, attribute=CONF_ATTRIBUTES ) - except vol.Invalid as err: + except probatio.Invalid as err: log_validation_error( result, attributes_template, CONF_ATTRIBUTES, self.entity_id, err ) diff --git a/homeassistant/components/template/update.py b/homeassistant/components/template/update.py index 1ba120b8befc0..dd6a3ead6c724 100644 --- a/homeassistant/components/template/update.py +++ b/homeassistant/components/template/update.py @@ -3,7 +3,7 @@ import logging from typing import TYPE_CHECKING, Any, override -import voluptuous as vol +import probatio from homeassistant.components.update import ( DEVICE_CLASSES_SCHEMA, @@ -59,19 +59,19 @@ SCRIPT_FIELDS = (CONF_INSTALL,) -UPDATE_COMMON_SCHEMA = vol.Schema( +UPDATE_COMMON_SCHEMA = probatio.Schema( { - vol.Optional(CONF_BACKUP, default=False): cv.boolean, - vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, - vol.Optional(CONF_IN_PROGRESS): cv.template, - vol.Optional(CONF_INSTALL): cv.SCRIPT_SCHEMA, - vol.Required(CONF_INSTALLED_VERSION): cv.template, - vol.Required(CONF_LATEST_VERSION): cv.template, - vol.Optional(CONF_RELEASE_SUMMARY): cv.template, - vol.Optional(CONF_RELEASE_URL): cv.template, - vol.Optional(CONF_SPECIFIC_VERSION, default=False): cv.boolean, - vol.Optional(CONF_TITLE): cv.template, - vol.Optional(CONF_UPDATE_PERCENTAGE): cv.template, + probatio.Optional(CONF_BACKUP, default=False): cv.boolean, + probatio.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_IN_PROGRESS): cv.template, + probatio.Optional(CONF_INSTALL): cv.SCRIPT_SCHEMA, + probatio.Required(CONF_INSTALLED_VERSION): cv.template, + probatio.Required(CONF_LATEST_VERSION): cv.template, + probatio.Optional(CONF_RELEASE_SUMMARY): cv.template, + probatio.Optional(CONF_RELEASE_URL): cv.template, + probatio.Optional(CONF_SPECIFIC_VERSION, default=False): cv.boolean, + probatio.Optional(CONF_TITLE): cv.template, + probatio.Optional(CONF_UPDATE_PERCENTAGE): cv.template, } ) diff --git a/homeassistant/components/template/vacuum.py b/homeassistant/components/template/vacuum.py index 4917ea7d48fa1..fcf68739b98c4 100644 --- a/homeassistant/components/template/vacuum.py +++ b/homeassistant/components/template/vacuum.py @@ -5,7 +5,7 @@ import logging from typing import TYPE_CHECKING, Any, Self, override -import voluptuous as vol +import probatio from homeassistant.components.vacuum import ( DOMAIN as VACUUM_DOMAIN, @@ -75,24 +75,24 @@ CLEAN_AREA_GROUP = "clean_area_group" -VACUUM_COMMON_SCHEMA = vol.Schema( +VACUUM_COMMON_SCHEMA = probatio.Schema( { - vol.Optional(CONF_FAN_SPEED_LIST, default=[]): cv.ensure_list, - vol.Optional(CONF_FAN_SPEED): cv.template, - vol.Optional(CONF_STATE): cv.template, - vol.Inclusive( + probatio.Optional(CONF_FAN_SPEED_LIST, default=[]): cv.ensure_list, + probatio.Optional(CONF_FAN_SPEED): cv.template, + probatio.Optional(CONF_STATE): cv.template, + probatio.Inclusive( CONF_SEGMENTS, CLEAN_AREA_GROUP, f"Options `{CONF_SEGMENTS}` and `{CONF_CLEAN_SEGMENTS}` must both exist", ): cv.template, - vol.Optional(SERVICE_CLEAN_SPOT): cv.SCRIPT_SCHEMA, - vol.Optional(SERVICE_LOCATE): cv.SCRIPT_SCHEMA, - vol.Optional(SERVICE_PAUSE): cv.SCRIPT_SCHEMA, - vol.Optional(SERVICE_RETURN_TO_BASE): cv.SCRIPT_SCHEMA, - vol.Optional(SERVICE_SET_FAN_SPEED): cv.SCRIPT_SCHEMA, - vol.Required(SERVICE_START): cv.SCRIPT_SCHEMA, - vol.Optional(SERVICE_STOP): cv.SCRIPT_SCHEMA, - vol.Inclusive( + probatio.Optional(SERVICE_CLEAN_SPOT): cv.SCRIPT_SCHEMA, + probatio.Optional(SERVICE_LOCATE): cv.SCRIPT_SCHEMA, + probatio.Optional(SERVICE_PAUSE): cv.SCRIPT_SCHEMA, + probatio.Optional(SERVICE_RETURN_TO_BASE): cv.SCRIPT_SCHEMA, + probatio.Optional(SERVICE_SET_FAN_SPEED): cv.SCRIPT_SCHEMA, + probatio.Required(SERVICE_START): cv.SCRIPT_SCHEMA, + probatio.Optional(SERVICE_STOP): cv.SCRIPT_SCHEMA, + probatio.Inclusive( CONF_CLEAN_SEGMENTS, CLEAN_AREA_GROUP, f"Options `{CONF_SEGMENTS}` and `{CONF_CLEAN_SEGMENTS}` must both exist", @@ -104,7 +104,7 @@ attributes=(VacuumEntityCapabilityAttribute, VacuumEntityStateAttribute) ) -VACUUM_YAML_SCHEMA = vol.All( +VACUUM_YAML_SCHEMA = probatio.All( VACUUM_COMMON_SCHEMA.extend(TEMPLATE_ENTITY_OPTIMISTIC_SCHEMA).extend( make_template_entity_common_schema(VACUUM_DOMAIN, DEFAULT_NAME).schema ), diff --git a/homeassistant/components/template/validators.py b/homeassistant/components/template/validators.py index d4cf2baf9ef24..82147be7d4eee 100644 --- a/homeassistant/components/template/validators.py +++ b/homeassistant/components/template/validators.py @@ -6,7 +6,7 @@ import logging from typing import Any -import voluptuous as vol +import probatio from homeassistant.const import STATE_UNAVAILABLE, STATE_UNKNOWN from homeassistant.helpers import config_validation as cv @@ -68,7 +68,7 @@ def validate(obj: dict): return obj if blocked := blocked_attributes.blocked(obj): - raise vol.Invalid( + raise probatio.Invalid( f"Unsupported attribute(s) found for {breadcrumb}: {', '.join(blocked)}" ) @@ -82,7 +82,7 @@ def log_validation_error( template: Template, attribute: str, entity_id: str | None, - exception: vol.Invalid, + exception: probatio.Invalid, ): """Log template entity validation error.""" logging.getLogger( @@ -178,7 +178,7 @@ def convert(result: Any) -> T | None: if state_off and not bool_value: return state_off - except vol.Invalid: + except probatio.Invalid: pass expected = tuple(s.value for s in state_enum) @@ -230,7 +230,7 @@ def convert(result: Any) -> bool | None: try: return cv.boolean(result) - except vol.Invalid: + except probatio.Invalid: pass items: tuple[str, ...] = RESULT_ON + RESULT_OFF @@ -282,10 +282,10 @@ def convert(result: Any) -> float | int | None: value = float(value) else: try: - value = vol.Coerce(float)(result) + value = probatio.Coerce(float)(result) if return_type is int: value = int(value) - except vol.Invalid: + except probatio.Invalid: log_validation_result_error(entity, attribute, result, message) return None @@ -408,7 +408,7 @@ def convert(result: Any) -> str | None: try: return cv.url(result) - except vol.Invalid: + except probatio.Invalid: log_validation_result_error( entity, attribute, @@ -436,7 +436,7 @@ def convert(result: Any) -> str | None: try: return cv.string(result) - except vol.Invalid: + except probatio.Invalid: log_validation_result_error( entity, attribute, diff --git a/homeassistant/components/template/weather.py b/homeassistant/components/template/weather.py index 5d47c381dc2a3..0441262297976 100644 --- a/homeassistant/components/template/weather.py +++ b/homeassistant/components/template/weather.py @@ -5,7 +5,7 @@ import logging from typing import Any, Literal, Self, override -import voluptuous as vol +import probatio from homeassistant.components.weather import ( ATTR_CONDITION_CLEAR_NIGHT, @@ -166,56 +166,76 @@ # These options that are templates all have _template. These fields will # enter deprecation after legacy templates are removed. -WEATHER_COMMON_LEGACY_SCHEMA = vol.Schema( +WEATHER_COMMON_LEGACY_SCHEMA = probatio.Schema( { - vol.Optional(CONF_APPARENT_TEMPERATURE_TEMPLATE): cv.template, - vol.Optional(CONF_ATTRIBUTION_TEMPLATE): cv.template, - vol.Optional(CONF_CLOUD_COVERAGE_TEMPLATE): cv.template, - vol.Required(CONF_CONDITION_TEMPLATE): cv.template, - vol.Optional(CONF_DEW_POINT_TEMPLATE): cv.template, - vol.Optional(CONF_FORECAST_DAILY_TEMPLATE): cv.template, - vol.Optional(CONF_FORECAST_HOURLY_TEMPLATE): cv.template, - vol.Optional(CONF_FORECAST_TWICE_DAILY_TEMPLATE): cv.template, - vol.Required(CONF_HUMIDITY_TEMPLATE): cv.template, - vol.Optional(CONF_OZONE_TEMPLATE): cv.template, - vol.Optional(CONF_PRECIPITATION_UNIT): vol.In(DistanceConverter.VALID_UNITS), - vol.Optional(CONF_PRESSURE_TEMPLATE): cv.template, - vol.Optional(CONF_PRESSURE_UNIT): vol.In(PressureConverter.VALID_UNITS), - vol.Required(CONF_TEMPERATURE_TEMPLATE): cv.template, - vol.Optional(CONF_TEMPERATURE_UNIT): vol.In(TemperatureConverter.VALID_UNITS), - vol.Optional(CONF_VISIBILITY_TEMPLATE): cv.template, - vol.Optional(CONF_VISIBILITY_UNIT): vol.In(DistanceConverter.VALID_UNITS), - vol.Optional(CONF_WIND_BEARING_TEMPLATE): cv.template, - vol.Optional(CONF_WIND_GUST_SPEED_TEMPLATE): cv.template, - vol.Optional(CONF_WIND_SPEED_TEMPLATE): cv.template, - vol.Optional(CONF_WIND_SPEED_UNIT): vol.In(SpeedConverter.VALID_UNITS), + probatio.Optional(CONF_APPARENT_TEMPERATURE_TEMPLATE): cv.template, + probatio.Optional(CONF_ATTRIBUTION_TEMPLATE): cv.template, + probatio.Optional(CONF_CLOUD_COVERAGE_TEMPLATE): cv.template, + probatio.Required(CONF_CONDITION_TEMPLATE): cv.template, + probatio.Optional(CONF_DEW_POINT_TEMPLATE): cv.template, + probatio.Optional(CONF_FORECAST_DAILY_TEMPLATE): cv.template, + probatio.Optional(CONF_FORECAST_HOURLY_TEMPLATE): cv.template, + probatio.Optional(CONF_FORECAST_TWICE_DAILY_TEMPLATE): cv.template, + probatio.Required(CONF_HUMIDITY_TEMPLATE): cv.template, + probatio.Optional(CONF_OZONE_TEMPLATE): cv.template, + probatio.Optional(CONF_PRECIPITATION_UNIT): probatio.In( + DistanceConverter.VALID_UNITS + ), + probatio.Optional(CONF_PRESSURE_TEMPLATE): cv.template, + probatio.Optional(CONF_PRESSURE_UNIT): probatio.In( + PressureConverter.VALID_UNITS + ), + probatio.Required(CONF_TEMPERATURE_TEMPLATE): cv.template, + probatio.Optional(CONF_TEMPERATURE_UNIT): probatio.In( + TemperatureConverter.VALID_UNITS + ), + probatio.Optional(CONF_VISIBILITY_TEMPLATE): cv.template, + probatio.Optional(CONF_VISIBILITY_UNIT): probatio.In( + DistanceConverter.VALID_UNITS + ), + probatio.Optional(CONF_WIND_BEARING_TEMPLATE): cv.template, + probatio.Optional(CONF_WIND_GUST_SPEED_TEMPLATE): cv.template, + probatio.Optional(CONF_WIND_SPEED_TEMPLATE): cv.template, + probatio.Optional(CONF_WIND_SPEED_UNIT): probatio.In( + SpeedConverter.VALID_UNITS + ), } ) -WEATHER_COMMON_MODERN_SCHEMA = vol.Schema( +WEATHER_COMMON_MODERN_SCHEMA = probatio.Schema( { - vol.Optional(CONF_APPARENT_TEMPERATURE): cv.template, - vol.Optional(CONF_ATTRIBUTION): cv.template, - vol.Optional(CONF_CLOUD_COVERAGE): cv.template, - vol.Required(CONF_CONDITION): cv.template, - vol.Optional(CONF_DEW_POINT): cv.template, - vol.Optional(CONF_FORECAST_DAILY): cv.template, - vol.Optional(CONF_FORECAST_HOURLY): cv.template, - vol.Optional(CONF_FORECAST_TWICE_DAILY): cv.template, - vol.Required(CONF_HUMIDITY): cv.template, - vol.Optional(CONF_OZONE): cv.template, - vol.Optional(CONF_PRECIPITATION_UNIT): vol.In(DistanceConverter.VALID_UNITS), - vol.Optional(CONF_PRESSURE): cv.template, - vol.Optional(CONF_PRESSURE_UNIT): vol.In(PressureConverter.VALID_UNITS), - vol.Required(CONF_TEMPERATURE): cv.template, - vol.Optional(CONF_TEMPERATURE_UNIT): vol.In(TemperatureConverter.VALID_UNITS), - vol.Optional(CONF_UV_INDEX): cv.template, - vol.Optional(CONF_VISIBILITY): cv.template, - vol.Optional(CONF_VISIBILITY_UNIT): vol.In(DistanceConverter.VALID_UNITS), - vol.Optional(CONF_WIND_BEARING): cv.template, - vol.Optional(CONF_WIND_GUST_SPEED): cv.template, - vol.Optional(CONF_WIND_SPEED): cv.template, - vol.Optional(CONF_WIND_SPEED_UNIT): vol.In(SpeedConverter.VALID_UNITS), + probatio.Optional(CONF_APPARENT_TEMPERATURE): cv.template, + probatio.Optional(CONF_ATTRIBUTION): cv.template, + probatio.Optional(CONF_CLOUD_COVERAGE): cv.template, + probatio.Required(CONF_CONDITION): cv.template, + probatio.Optional(CONF_DEW_POINT): cv.template, + probatio.Optional(CONF_FORECAST_DAILY): cv.template, + probatio.Optional(CONF_FORECAST_HOURLY): cv.template, + probatio.Optional(CONF_FORECAST_TWICE_DAILY): cv.template, + probatio.Required(CONF_HUMIDITY): cv.template, + probatio.Optional(CONF_OZONE): cv.template, + probatio.Optional(CONF_PRECIPITATION_UNIT): probatio.In( + DistanceConverter.VALID_UNITS + ), + probatio.Optional(CONF_PRESSURE): cv.template, + probatio.Optional(CONF_PRESSURE_UNIT): probatio.In( + PressureConverter.VALID_UNITS + ), + probatio.Required(CONF_TEMPERATURE): cv.template, + probatio.Optional(CONF_TEMPERATURE_UNIT): probatio.In( + TemperatureConverter.VALID_UNITS + ), + probatio.Optional(CONF_UV_INDEX): cv.template, + probatio.Optional(CONF_VISIBILITY): cv.template, + probatio.Optional(CONF_VISIBILITY_UNIT): probatio.In( + DistanceConverter.VALID_UNITS + ), + probatio.Optional(CONF_WIND_BEARING): cv.template, + probatio.Optional(CONF_WIND_GUST_SPEED): cv.template, + probatio.Optional(CONF_WIND_SPEED): cv.template, + probatio.Optional(CONF_WIND_SPEED_UNIT): probatio.In( + SpeedConverter.VALID_UNITS + ), } ) @@ -225,9 +245,9 @@ WEATHER_YAML_SCHEMA = ( - vol.Schema( + probatio.Schema( { - vol.Optional(CONF_UV_INDEX_TEMPLATE): cv.template, + probatio.Optional(CONF_UV_INDEX_TEMPLATE): cv.template, } ) .extend(WEATHER_COMMON_LEGACY_SCHEMA.schema) @@ -514,7 +534,7 @@ def __init__( # pylint: disable=super-init-not-called self.setup_template( CONF_ATTRIBUTION, "_attribution", - vol.Coerce(str), + probatio.Coerce(str), ) self.setup_template( CONF_WIND_BEARING, "_attr_wind_bearing", None, self._update_wind_bearing @@ -590,9 +610,9 @@ def attribution(self) -> str | None: @callback def _update_wind_bearing(self, result: Any) -> None: try: - self._attr_wind_bearing = vol.Coerce(float)(result) - except vol.Invalid: - self._attr_wind_bearing = vol.Coerce(str)(result) + self._attr_wind_bearing = probatio.Coerce(float)(result) + except probatio.Invalid: + self._attr_wind_bearing = probatio.Coerce(str)(result) @callback def _update_forecast( diff --git a/homeassistant/components/tesla_fleet/config_flow.py b/homeassistant/components/tesla_fleet/config_flow.py index 3e82df6f5fdb7..46db9f0d3c77c 100644 --- a/homeassistant/components/tesla_fleet/config_flow.py +++ b/homeassistant/components/tesla_fleet/config_flow.py @@ -6,6 +6,7 @@ from typing import Any, cast, override import jwt +import probatio from tesla_fleet_api import TeslaFleetApi from tesla_fleet_api.const import Scope from tesla_fleet_api.exceptions import ( @@ -15,7 +16,6 @@ PreconditionFailed, TeslaFleetError, ) -import voluptuous as vol from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlowResult from homeassistant.const import CONF_DOMAIN, CONF_REGION @@ -128,9 +128,9 @@ async def async_step_region( return self.async_show_form( step_id="region", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_REGION, default=self.region): SelectSelector( + probatio.Required(CONF_REGION, default=self.region): SelectSelector( SelectSelectorConfig( options=REGIONS, translation_key="region", @@ -166,9 +166,9 @@ async def async_step_domain_input( description_placeholders={ "dashboard": "https://developer.tesla.com/en_AU/dashboard/" }, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_DOMAIN): str, + probatio.Required(CONF_DOMAIN): str, } ), errors=errors, @@ -234,9 +234,9 @@ async def async_step_registration_complete( return await self.async_step_domain_input() virtual_key_url = f"https://www.tesla.com/_ak/{self.domain}" - data_schema = vol.Schema({}).extend( + data_schema = probatio.Schema({}).extend( { - vol.Optional("qr_code"): QrCodeSelector( + probatio.Optional("qr_code"): QrCodeSelector( config=QrCodeSelectorConfig( data=virtual_key_url, scale=6, diff --git a/homeassistant/components/tesla_wall_connector/config_flow.py b/homeassistant/components/tesla_wall_connector/config_flow.py index aa1b9c24c0bd2..b7bee1cd762ce 100644 --- a/homeassistant/components/tesla_wall_connector/config_flow.py +++ b/homeassistant/components/tesla_wall_connector/config_flow.py @@ -3,9 +3,9 @@ import logging from typing import Any, override +import probatio from tesla_wall_connector import WallConnector from tesla_wall_connector.exceptions import WallConnectorError -import voluptuous as vol from homeassistant.config_entries import ( ConfigFlow, @@ -45,9 +45,9 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_SPLIT_PHASE, default=self.config_entry.options.get( CONF_SPLIT_PHASE, DEFAULT_SPLIT_PHASE @@ -139,10 +139,10 @@ async def async_step_user( self, user_input: dict[str, Any] | None = None ) -> ConfigFlowResult: """Handle the initial step.""" - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_HOST, default=self.ip_address): str, - vol.Optional( + probatio.Required(CONF_HOST, default=self.ip_address): str, + probatio.Optional( CONF_SPLIT_PHASE, default=DEFAULT_SPLIT_PHASE ): BooleanSelector(), } diff --git a/homeassistant/components/teslemetry/config_flow.py b/homeassistant/components/teslemetry/config_flow.py index 38b77f89c72a5..8d071f9199ee2 100644 --- a/homeassistant/components/teslemetry/config_flow.py +++ b/homeassistant/components/teslemetry/config_flow.py @@ -9,6 +9,7 @@ from aiohttp import ClientError from aiopowerwall import PowerwallAuthenticationError, PowerwallClient, PowerwallError from bleak.exc import BleakError +import probatio from tesla_fleet_api.const import ( AuthorizedClientKeyType, AuthorizedClientState, @@ -27,7 +28,6 @@ from tesla_fleet_api.tesla.vehicle.bluetooth import VehicleBluetooth from tesla_fleet_api.teslemetry import Teslemetry from tesla_fleet_api.teslemetry.energysite import AuthorizedClient, TeslemetryEnergySite -import voluptuous as vol from homeassistant.components.application_credentials import ( ClientCredential, @@ -250,9 +250,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_VIN): SelectSelector( + probatio.Required(CONF_VIN): SelectSelector( SelectSelectorConfig( options=[ SelectOptionDict(value=vin, label=name) @@ -474,9 +474,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_SITE_ID): vol.In( + probatio.Required(CONF_SITE_ID): probatio.In( { site_id: energy_data.device.get("name") or site_id for site_id, energy_data in available.items() @@ -643,13 +643,13 @@ async def async_step_credentials( return self.async_show_form( step_id="credentials", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_HOST, - default=self._discovered_host or vol.UNDEFINED, + default=self._discovered_host or probatio.UNDEFINED, ): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, diff --git a/homeassistant/components/teslemetry/services.py b/homeassistant/components/teslemetry/services.py index 58a5fa12f2e64..518537d2f2ed6 100644 --- a/homeassistant/components/teslemetry/services.py +++ b/homeassistant/components/teslemetry/services.py @@ -3,8 +3,7 @@ import logging from typing import TYPE_CHECKING -import voluptuous as vol -from voluptuous import All, Range +import probatio from homeassistant.const import ( ATTR_ID, @@ -131,14 +130,14 @@ async def navigate_gps_request(call: ServiceCall) -> None: DOMAIN, SERVICE_NAVIGATE_ATTR_GPS_REQUEST, navigate_gps_request, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(CONF_DEVICE_ID): cv.string, - vol.Required(ATTR_GPS): { - vol.Required(CONF_LATITUDE): cv.latitude, - vol.Required(CONF_LONGITUDE): cv.longitude, + probatio.Required(CONF_DEVICE_ID): cv.string, + probatio.Required(ATTR_GPS): { + probatio.Required(CONF_LATITUDE): cv.latitude, + probatio.Required(CONF_LONGITUDE): cv.longitude, }, - vol.Optional(ATTR_ORDER): cv.positive_int, + probatio.Optional(ATTR_ORDER): cv.positive_int, } ), ) @@ -168,11 +167,11 @@ async def set_scheduled_charging(call: ServiceCall) -> None: DOMAIN, SERVICE_SET_SCHEDULED_CHARGING, set_scheduled_charging, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(CONF_DEVICE_ID): cv.string, - vol.Required(ATTR_ENABLE): bool, - vol.Optional(ATTR_TIME): str, + probatio.Required(CONF_DEVICE_ID): cv.string, + probatio.Required(ATTR_ENABLE): bool, + probatio.Optional(ATTR_TIME): str, } ), ) @@ -235,16 +234,16 @@ async def set_scheduled_departure(call: ServiceCall) -> None: DOMAIN, SERVICE_SET_SCHEDULED_DEPARTURE, set_scheduled_departure, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(CONF_DEVICE_ID): cv.string, - vol.Optional(ATTR_ENABLE): bool, - vol.Optional(ATTR_PRECONDITIONING_ENABLED): bool, - vol.Optional(ATTR_PRECONDITIONING_WEEKDAYS): bool, - vol.Optional(ATTR_DEPARTURE_TIME): str, - vol.Optional(ATTR_OFF_PEAK_CHARGING_ENABLED): bool, - vol.Optional(ATTR_OFF_PEAK_CHARGING_WEEKDAYS): bool, - vol.Optional(ATTR_END_OFF_PEAK_TIME): str, + probatio.Required(CONF_DEVICE_ID): cv.string, + probatio.Optional(ATTR_ENABLE): bool, + probatio.Optional(ATTR_PRECONDITIONING_ENABLED): bool, + probatio.Optional(ATTR_PRECONDITIONING_WEEKDAYS): bool, + probatio.Optional(ATTR_DEPARTURE_TIME): str, + probatio.Optional(ATTR_OFF_PEAK_CHARGING_ENABLED): bool, + probatio.Optional(ATTR_OFF_PEAK_CHARGING_WEEKDAYS): bool, + probatio.Optional(ATTR_END_OFF_PEAK_TIME): str, } ), ) @@ -262,11 +261,13 @@ async def valet_mode(call: ServiceCall) -> None: DOMAIN, SERVICE_VALET_MODE, valet_mode, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(CONF_DEVICE_ID): cv.string, - vol.Required(ATTR_ENABLE): cv.boolean, - vol.Required(ATTR_PIN): All(cv.positive_int, Range(min=1000, max=9999)), + probatio.Required(CONF_DEVICE_ID): cv.string, + probatio.Required(ATTR_ENABLE): cv.boolean, + probatio.Required(ATTR_PIN): probatio.All( + cv.positive_int, probatio.Range(min=1000, max=9999) + ), } ), ) @@ -290,11 +291,13 @@ async def speed_limit(call: ServiceCall) -> None: DOMAIN, SERVICE_SPEED_LIMIT, speed_limit, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(CONF_DEVICE_ID): cv.string, - vol.Required(ATTR_ENABLE): cv.boolean, - vol.Required(ATTR_PIN): All(cv.positive_int, Range(min=1000, max=9999)), + probatio.Required(CONF_DEVICE_ID): cv.string, + probatio.Required(ATTR_ENABLE): cv.boolean, + probatio.Required(ATTR_PIN): probatio.All( + cv.positive_int, probatio.Range(min=1000, max=9999) + ), } ), ) @@ -321,10 +324,10 @@ async def time_of_use(call: ServiceCall) -> None: DOMAIN, SERVICE_TIME_OF_USE, time_of_use, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(CONF_DEVICE_ID): cv.string, - vol.Required(ATTR_TOU_SETTINGS): dict, + probatio.Required(CONF_DEVICE_ID): cv.string, + probatio.Required(ATTR_TOU_SETTINGS): dict, } ), description_placeholders={ @@ -387,20 +390,20 @@ async def add_charge_schedule(call: ServiceCall) -> None: DOMAIN, SERVICE_ADD_CHARGE_SCHEDULE, add_charge_schedule, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(CONF_DEVICE_ID): cv.string, - vol.Required(ATTR_DAYS_OF_WEEK): cv.ensure_list, - vol.Required(ATTR_ENABLE): cv.boolean, - vol.Optional(ATTR_LOCATION): { - vol.Required(CONF_LATITUDE): cv.latitude, - vol.Required(CONF_LONGITUDE): cv.longitude, + probatio.Required(CONF_DEVICE_ID): cv.string, + probatio.Required(ATTR_DAYS_OF_WEEK): cv.ensure_list, + probatio.Required(ATTR_ENABLE): cv.boolean, + probatio.Optional(ATTR_LOCATION): { + probatio.Required(CONF_LATITUDE): cv.latitude, + probatio.Required(CONF_LONGITUDE): cv.longitude, }, - vol.Optional(ATTR_START_TIME): cv.time, - vol.Optional(ATTR_END_TIME): cv.time, - vol.Optional(ATTR_ONE_TIME): cv.boolean, - vol.Optional(ATTR_ID): cv.positive_int, - vol.Optional(ATTR_NAME): cv.string, + probatio.Optional(ATTR_START_TIME): cv.time, + probatio.Optional(ATTR_END_TIME): cv.time, + probatio.Optional(ATTR_ONE_TIME): cv.boolean, + probatio.Optional(ATTR_ID): cv.positive_int, + probatio.Optional(ATTR_NAME): cv.string, } ), ) @@ -423,10 +426,10 @@ async def remove_charge_schedule(call: ServiceCall) -> None: DOMAIN, SERVICE_REMOVE_CHARGE_SCHEDULE, remove_charge_schedule, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(CONF_DEVICE_ID): cv.string, - vol.Required(ATTR_ID): cv.positive_int, + probatio.Required(CONF_DEVICE_ID): cv.string, + probatio.Required(ATTR_ID): cv.positive_int, } ), ) @@ -479,19 +482,19 @@ async def add_precondition_schedule(call: ServiceCall) -> None: DOMAIN, SERVICE_ADD_PRECONDITION_SCHEDULE, add_precondition_schedule, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(CONF_DEVICE_ID): cv.string, - vol.Required(ATTR_DAYS_OF_WEEK): cv.ensure_list, - vol.Required(ATTR_ENABLE): cv.boolean, - vol.Optional(ATTR_LOCATION): { - vol.Required(CONF_LATITUDE): cv.latitude, - vol.Required(CONF_LONGITUDE): cv.longitude, + probatio.Required(CONF_DEVICE_ID): cv.string, + probatio.Required(ATTR_DAYS_OF_WEEK): cv.ensure_list, + probatio.Required(ATTR_ENABLE): cv.boolean, + probatio.Optional(ATTR_LOCATION): { + probatio.Required(CONF_LATITUDE): cv.latitude, + probatio.Required(CONF_LONGITUDE): cv.longitude, }, - vol.Required(ATTR_PRECONDITION_TIME): cv.time, - vol.Optional(ATTR_ID): cv.positive_int, - vol.Optional(ATTR_ONE_TIME): cv.boolean, - vol.Optional(ATTR_NAME): cv.string, + probatio.Required(ATTR_PRECONDITION_TIME): cv.time, + probatio.Optional(ATTR_ID): cv.positive_int, + probatio.Optional(ATTR_ONE_TIME): cv.boolean, + probatio.Optional(ATTR_NAME): cv.string, } ), ) @@ -514,10 +517,10 @@ async def remove_precondition_schedule(call: ServiceCall) -> None: DOMAIN, SERVICE_REMOVE_PRECONDITION_SCHEDULE, remove_precondition_schedule, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(CONF_DEVICE_ID): cv.string, - vol.Required(ATTR_ID): cv.positive_int, + probatio.Required(CONF_DEVICE_ID): cv.string, + probatio.Required(ATTR_ID): cv.positive_int, } ), ) diff --git a/homeassistant/components/tessie/config_flow.py b/homeassistant/components/tessie/config_flow.py index af8e0cb084f9b..cae2c7d8bffb0 100644 --- a/homeassistant/components/tessie/config_flow.py +++ b/homeassistant/components/tessie/config_flow.py @@ -4,9 +4,9 @@ from typing import Any, override from aiohttp import ClientConnectionError +import probatio from tesla_fleet_api.exceptions import InvalidToken, MissingToken, TeslaFleetError from tesla_fleet_api.tessie import Tessie -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_ACCESS_TOKEN @@ -15,7 +15,7 @@ from .const import DOMAIN -TESSIE_SCHEMA = vol.Schema({vol.Required(CONF_ACCESS_TOKEN): str}) +TESSIE_SCHEMA = probatio.Schema({probatio.Required(CONF_ACCESS_TOKEN): str}) DESCRIPTION_PLACEHOLDERS = { "name": "Tessie", "url": "[my.tessie.com/settings/api](https://my.tessie.com/settings/api)", diff --git a/homeassistant/components/text/__init__.py b/homeassistant/components/text/__init__.py index 911f3c6aa391c..cee4d3c1e9077 100644 --- a/homeassistant/components/text/__init__.py +++ b/homeassistant/components/text/__init__.py @@ -7,8 +7,8 @@ import re from typing import Any, final, override +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.config_entries import ConfigEntry from homeassistant.const import ATTR_MODE, MAX_LENGTH_STATE_STATE # noqa: F401 @@ -59,7 +59,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: component.async_register_entity_service( SERVICE_SET_VALUE, - {vol.Required(ATTR_VALUE): cv.string}, + {probatio.Required(ATTR_VALUE): cv.string}, _async_set_value, ) diff --git a/homeassistant/components/text/condition.py b/homeassistant/components/text/condition.py index 433adeecec138..7b888f35d27b5 100644 --- a/homeassistant/components/text/condition.py +++ b/homeassistant/components/text/condition.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING, override -import voluptuous as vol +import probatio from homeassistant.components.input_text import DOMAIN as INPUT_TEXT_DOMAIN from homeassistant.const import CONF_OPTIONS @@ -22,8 +22,8 @@ _TEXT_CONDITION_SCHEMA = ENTITY_STATE_CONDITION_SCHEMA_ANY_ALL.extend( { - vol.Required(CONF_OPTIONS): { - vol.Required(CONF_VALUE): cv.string, + probatio.Required(CONF_OPTIONS): { + probatio.Required(CONF_VALUE): cv.string, }, } ) diff --git a/homeassistant/components/text/device_action.py b/homeassistant/components/text/device_action.py index 1fc9c3519f534..83f686170baa5 100644 --- a/homeassistant/components/text/device_action.py +++ b/homeassistant/components/text/device_action.py @@ -1,6 +1,6 @@ """Provides device actions for Text.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import async_validate_entity_schema from homeassistant.const import ( @@ -20,9 +20,9 @@ _ACTION_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): ATYP_SET_VALUE, - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(ATTR_VALUE): cv.string, + probatio.Required(CONF_TYPE): ATYP_SET_VALUE, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(ATTR_VALUE): cv.string, } ) @@ -79,8 +79,8 @@ async def async_call_action_from_config( async def async_get_action_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List action capabilities.""" - fields = {vol.Required(ATTR_VALUE): cv.string} + fields = {probatio.Required(ATTR_VALUE): cv.string} - return {"extra_fields": vol.Schema(fields)} + return {"extra_fields": probatio.Schema(fields)} diff --git a/homeassistant/components/thermobeacon/config_flow.py b/homeassistant/components/thermobeacon/config_flow.py index 0d897fb51ab18..4a832d4c36e75 100644 --- a/homeassistant/components/thermobeacon/config_flow.py +++ b/homeassistant/components/thermobeacon/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from thermobeacon_ble import ThermoBeaconBluetoothDeviceData as DeviceData -import voluptuous as vol from homeassistant.components.bluetooth import ( BluetoothServiceInfoBleak, @@ -88,7 +88,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_ADDRESS): vol.In(self._discovered_devices)} + data_schema=probatio.Schema( + {probatio.Required(CONF_ADDRESS): probatio.In(self._discovered_devices)} ), ) diff --git a/homeassistant/components/thermopro/config_flow.py b/homeassistant/components/thermopro/config_flow.py index 1f6721fd1514a..80a9315ced462 100644 --- a/homeassistant/components/thermopro/config_flow.py +++ b/homeassistant/components/thermopro/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from thermopro_ble import ThermoProBluetoothDeviceData as DeviceData -import voluptuous as vol from homeassistant.components import bluetooth from homeassistant.components.bluetooth import ( @@ -90,7 +90,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_ADDRESS): vol.In(self._discovered_devices)} + data_schema=probatio.Schema( + {probatio.Required(CONF_ADDRESS): probatio.In(self._discovered_devices)} ), ) diff --git a/homeassistant/components/thethingsnetwork/config_flow.py b/homeassistant/components/thethingsnetwork/config_flow.py index 143b3e8d99447..e09e910565fb2 100644 --- a/homeassistant/components/thethingsnetwork/config_flow.py +++ b/homeassistant/components/thethingsnetwork/config_flow.py @@ -4,8 +4,8 @@ import logging from typing import Any, override +import probatio from ttn_client import TTNAuthError, TTNClient -import voluptuous as vol from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY, CONF_HOST @@ -70,11 +70,11 @@ async def async_step_user( user_input = {CONF_HOST: TTN_API_HOST} schema = self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_APP_ID): str, - vol.Required(CONF_API_KEY): TextSelector( + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_APP_ID): str, + probatio.Required(CONF_API_KEY): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="api_key" ) diff --git a/homeassistant/components/thingspeak/__init__.py b/homeassistant/components/thingspeak/__init__.py index 1798e4f1de0ca..7b430e70651e8 100644 --- a/homeassistant/components/thingspeak/__init__.py +++ b/homeassistant/components/thingspeak/__init__.py @@ -2,9 +2,9 @@ import logging +import probatio from requests.exceptions import RequestException import thingspeak -import voluptuous as vol from homeassistant.const import ( CONF_API_KEY, @@ -23,17 +23,17 @@ TIMEOUT = 5 -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_API_KEY): cv.string, - vol.Required(CONF_ID): int, - vol.Required(CONF_WHITELIST): cv.string, + probatio.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_ID): int, + probatio.Required(CONF_WHITELIST): cv.string, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/thinkingcleaner/sensor.py b/homeassistant/components/thinkingcleaner/sensor.py index 136bfcb4702f8..ae9fcb6351824 100644 --- a/homeassistant/components/thinkingcleaner/sensor.py +++ b/homeassistant/components/thinkingcleaner/sensor.py @@ -2,8 +2,8 @@ from datetime import timedelta +import probatio from pythinkingcleaner import Discovery, ThinkingCleaner -import voluptuous as vol from homeassistant import util from homeassistant.components.sensor import ( @@ -64,7 +64,9 @@ "st_unknown": "Unknown state", } -PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend({vol.Optional(CONF_HOST): cv.string}) +PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( + {probatio.Optional(CONF_HOST): cv.string} +) def setup_platform( diff --git a/homeassistant/components/thinkingcleaner/switch.py b/homeassistant/components/thinkingcleaner/switch.py index b4229c83f492d..f02edfe0f2fe5 100644 --- a/homeassistant/components/thinkingcleaner/switch.py +++ b/homeassistant/components/thinkingcleaner/switch.py @@ -4,8 +4,8 @@ import time from typing import Any, override +import probatio from pythinkingcleaner import Discovery, ThinkingCleaner -import voluptuous as vol from homeassistant import util from homeassistant.components.switch import ( @@ -40,7 +40,9 @@ ), ) -PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend({vol.Optional(CONF_HOST): cv.string}) +PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( + {probatio.Optional(CONF_HOST): cv.string} +) def setup_platform( diff --git a/homeassistant/components/thomson/device_tracker.py b/homeassistant/components/thomson/device_tracker.py index 89abd164311e1..48d7f03b7cd75 100644 --- a/homeassistant/components/thomson/device_tracker.py +++ b/homeassistant/components/thomson/device_tracker.py @@ -4,8 +4,8 @@ import re from typing import override +import probatio import telnetlib # pylint: disable=deprecated-module -import voluptuous as vol from homeassistant.components.device_tracker import ( DOMAIN as DEVICE_TRACKER_DOMAIN, @@ -31,9 +31,9 @@ PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_USERNAME): cv.string, } ) diff --git a/homeassistant/components/thread/websocket_api.py b/homeassistant/components/thread/websocket_api.py index c725bc5d2e68d..bc82d83d49238 100644 --- a/homeassistant/components/thread/websocket_api.py +++ b/homeassistant/components/thread/websocket_api.py @@ -2,8 +2,8 @@ from typing import Any +import probatio from python_otbr_api.tlv_parser import TLVError -import voluptuous as vol from homeassistant.components import websocket_api from homeassistant.core import HomeAssistant, callback @@ -26,9 +26,9 @@ def async_setup(hass: HomeAssistant) -> None: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "thread/add_dataset_tlv", - vol.Required("source"): str, - vol.Required("tlv"): str, + probatio.Required("type"): "thread/add_dataset_tlv", + probatio.Required("source"): str, + probatio.Required("tlv"): str, } ) @websocket_api.async_response @@ -55,10 +55,10 @@ async def ws_add_dataset( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "thread/set_preferred_border_agent", - vol.Required("dataset_id"): str, - vol.Required("border_agent_id"): vol.Any(str, None), - vol.Required("extended_address"): str, + probatio.Required("type"): "thread/set_preferred_border_agent", + probatio.Required("dataset_id"): str, + probatio.Required("border_agent_id"): probatio.Any(str, None), + probatio.Required("extended_address"): str, } ) @websocket_api.async_response @@ -79,8 +79,8 @@ async def ws_set_preferred_border_agent( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "thread/set_preferred_dataset", - vol.Required("dataset_id"): str, + probatio.Required("type"): "thread/set_preferred_dataset", + probatio.Required("dataset_id"): str, } ) @websocket_api.async_response @@ -103,8 +103,8 @@ async def ws_set_preferred_dataset( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "thread/delete_dataset", - vol.Required("dataset_id"): str, + probatio.Required("type"): "thread/delete_dataset", + probatio.Required("dataset_id"): str, } ) @websocket_api.async_response @@ -130,8 +130,8 @@ async def ws_delete_dataset( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "thread/get_dataset_tlv", - vol.Required("dataset_id"): str, + probatio.Required("type"): "thread/get_dataset_tlv", + probatio.Required("dataset_id"): str, } ) @websocket_api.async_response @@ -152,7 +152,7 @@ async def ws_get_dataset( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "thread/list_datasets", + probatio.Required("type"): "thread/list_datasets", } ) @websocket_api.async_response @@ -185,7 +185,7 @@ async def ws_list_datasets( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "thread/discover_routers", + probatio.Required("type"): "thread/discover_routers", } ) @websocket_api.async_response diff --git a/homeassistant/components/threshold/binary_sensor.py b/homeassistant/components/threshold/binary_sensor.py index 6afb5aea8a365..bce6f4ad4eb4d 100644 --- a/homeassistant/components/threshold/binary_sensor.py +++ b/homeassistant/components/threshold/binary_sensor.py @@ -4,7 +4,7 @@ import logging from typing import Any, Final, override -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import ( DEVICE_CLASSES_SCHEMA, @@ -66,22 +66,22 @@ def no_missing_threshold(value: dict) -> dict: """Validate data point list is greater than polynomial degrees.""" if value.get(CONF_LOWER) is None and value.get(CONF_UPPER) is None: - raise vol.Invalid("Lower or Upper thresholds are not provided") + raise probatio.Invalid("Lower or Upper thresholds are not provided") return value -PLATFORM_SCHEMA = vol.All( +PLATFORM_SCHEMA = probatio.All( BINARY_SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id, - vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, - vol.Optional(CONF_HYSTERESIS, default=DEFAULT_HYSTERESIS): vol.Coerce( - float - ), - vol.Optional(CONF_LOWER): vol.Coerce(float), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_UPPER): vol.Coerce(float), + probatio.Required(CONF_ENTITY_ID): cv.entity_id, + probatio.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, + probatio.Optional( + CONF_HYSTERESIS, default=DEFAULT_HYSTERESIS + ): probatio.Coerce(float), + probatio.Optional(CONF_LOWER): probatio.Coerce(float), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_UPPER): probatio.Coerce(float), } ), no_missing_threshold, diff --git a/homeassistant/components/threshold/config_flow.py b/homeassistant/components/threshold/config_flow.py index f1ed3f1d8fc8c..66e2f6d313c9c 100644 --- a/homeassistant/components/threshold/config_flow.py +++ b/homeassistant/components/threshold/config_flow.py @@ -3,7 +3,7 @@ from collections.abc import Mapping from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN @@ -31,34 +31,34 @@ async def _validate_mode( return {CONF_LOWER: None, CONF_UPPER: None, **user_input} -OPTIONS_SCHEMA = vol.Schema( +OPTIONS_SCHEMA = probatio.Schema( { - vol.Required( + probatio.Required( CONF_HYSTERESIS, default=DEFAULT_HYSTERESIS ): selector.NumberSelector( selector.NumberSelectorConfig( mode=selector.NumberSelectorMode.BOX, step="any" ), ), - vol.Optional(CONF_LOWER): selector.NumberSelector( + probatio.Optional(CONF_LOWER): selector.NumberSelector( selector.NumberSelectorConfig( mode=selector.NumberSelectorMode.BOX, step="any" ), ), - vol.Optional(CONF_UPPER): selector.NumberSelector( + probatio.Optional(CONF_UPPER): selector.NumberSelector( selector.NumberSelectorConfig( mode=selector.NumberSelectorMode.BOX, step="any" ), ), - vol.Required(CONF_ENTITY_ID): selector.EntitySelector( + probatio.Required(CONF_ENTITY_ID): selector.EntitySelector( selector.EntitySelectorConfig(domain=SENSOR_DOMAIN) ), } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Required(CONF_NAME): selector.TextSelector(), + probatio.Required(CONF_NAME): selector.TextSelector(), } ).extend(OPTIONS_SCHEMA.schema) @@ -99,10 +99,10 @@ async def async_setup_preview(hass: HomeAssistant) -> None: @websocket_api.websocket_command( { - vol.Required("type"): "threshold/start_preview", - vol.Required("flow_id"): str, - vol.Required("flow_type"): vol.Any("config_flow", "options_flow"), - vol.Required("user_input"): dict, + probatio.Required("type"): "threshold/start_preview", + probatio.Required("flow_id"): str, + probatio.Required("flow_type"): probatio.Any("config_flow", "options_flow"), + probatio.Required("user_input"): dict, } ) @callback diff --git a/homeassistant/components/tibber/services.py b/homeassistant/components/tibber/services.py index 7528d670c04e6..fcf75699db367 100644 --- a/homeassistant/components/tibber/services.py +++ b/homeassistant/components/tibber/services.py @@ -5,8 +5,8 @@ from typing import TYPE_CHECKING, Any, Final import aiohttp +import probatio import tibber -import voluptuous as vol from homeassistant.core import ( HomeAssistant, @@ -27,10 +27,10 @@ ATTR_START: Final = "start" ATTR_END: Final = "end" -SERVICE_SCHEMA: Final = vol.Schema( +SERVICE_SCHEMA: Final = probatio.Schema( { - vol.Optional(ATTR_START): str, - vol.Optional(ATTR_END): str, + probatio.Optional(ATTR_START): str, + probatio.Optional(ATTR_END): str, } ) diff --git a/homeassistant/components/tile/config_flow.py b/homeassistant/components/tile/config_flow.py index 2e5a0c78ffa20..6ee1fd0587734 100644 --- a/homeassistant/components/tile/config_flow.py +++ b/homeassistant/components/tile/config_flow.py @@ -3,9 +3,9 @@ from collections.abc import Mapping from typing import Any, override +import probatio from pytile import async_login from pytile.errors import InvalidAuthError, TileError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -13,16 +13,16 @@ from .const import DOMAIN, LOGGER -STEP_REAUTH_SCHEMA = vol.Schema( +STEP_REAUTH_SCHEMA = probatio.Schema( { - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ) -STEP_USER_SCHEMA = vol.Schema( +STEP_USER_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) @@ -37,7 +37,9 @@ def __init__(self) -> None: self._password: str | None = None self._username: str | None = None - async def _async_verify(self, step_id: str, schema: vol.Schema) -> ConfigFlowResult: + async def _async_verify( + self, step_id: str, schema: probatio.Schema + ) -> ConfigFlowResult: """Attempt to authenticate the provided credentials.""" assert self._username assert self._password diff --git a/homeassistant/components/tilt_ble/config_flow.py b/homeassistant/components/tilt_ble/config_flow.py index 3156c9040e5c9..4af0b9e3dc9ac 100644 --- a/homeassistant/components/tilt_ble/config_flow.py +++ b/homeassistant/components/tilt_ble/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from tilt_ble import TiltBluetoothDeviceData as DeviceData -import voluptuous as vol from homeassistant.components import bluetooth from homeassistant.components.bluetooth import ( @@ -90,7 +90,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_ADDRESS): vol.In(self._discovered_devices)} + data_schema=probatio.Schema( + {probatio.Required(CONF_ADDRESS): probatio.In(self._discovered_devices)} ), ) diff --git a/homeassistant/components/tilt_pi/config_flow.py b/homeassistant/components/tilt_pi/config_flow.py index a150b21339705..a3b84214a52a9 100644 --- a/homeassistant/components/tilt_pi/config_flow.py +++ b/homeassistant/components/tilt_pi/config_flow.py @@ -3,8 +3,8 @@ from typing import Any, override import aiohttp +import probatio from tiltpi import TiltPiClient, TiltPiError -import voluptuous as vol from yarl import URL from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -59,6 +59,6 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_URL): str}), + data_schema=probatio.Schema({probatio.Required(CONF_URL): str}), errors=errors, ) diff --git a/homeassistant/components/time/__init__.py b/homeassistant/components/time/__init__.py index 3cf945cc73340..56a9e9e81c789 100644 --- a/homeassistant/components/time/__init__.py +++ b/homeassistant/components/time/__init__.py @@ -4,8 +4,8 @@ import logging from typing import final, override +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.config_entries import ConfigEntry from homeassistant.const import ATTR_TIME @@ -43,7 +43,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: await component.async_setup(config) component.async_register_entity_service( - SERVICE_SET_VALUE, {vol.Required(ATTR_TIME): cv.time}, _async_set_value + SERVICE_SET_VALUE, {probatio.Required(ATTR_TIME): cv.time}, _async_set_value ) return True diff --git a/homeassistant/components/time_date/config_flow.py b/homeassistant/components/time_date/config_flow.py index 16b09968ca7c3..ba6121f0444a2 100644 --- a/homeassistant/components/time_date/config_flow.py +++ b/homeassistant/components/time_date/config_flow.py @@ -4,7 +4,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN @@ -28,9 +28,9 @@ _LOGGER = logging.getLogger(__name__) -USER_SCHEMA = vol.Schema( +USER_SCHEMA = probatio.Schema( { - vol.Required(CONF_DISPLAY_OPTIONS): SelectSelector( + probatio.Required(CONF_DISPLAY_OPTIONS): SelectSelector( SelectSelectorConfig( options=OPTION_TYPES, mode=SelectSelectorMode.DROPDOWN, @@ -84,10 +84,10 @@ async def async_setup_preview(hass: HomeAssistant) -> None: @websocket_api.websocket_command( { - vol.Required("type"): "time_date/start_preview", - vol.Required("flow_id"): str, - vol.Required("flow_type"): vol.Any("config_flow"), - vol.Required("user_input"): dict, + probatio.Required("type"): "time_date/start_preview", + probatio.Required("flow_id"): str, + probatio.Required("flow_type"): probatio.Any("config_flow"), + probatio.Required("user_input"): dict, } ) @websocket_api.async_response diff --git a/homeassistant/components/time_date/sensor.py b/homeassistant/components/time_date/sensor.py index fab2639eeb4ca..f121bf3a8364d 100644 --- a/homeassistant/components/time_date/sensor.py +++ b/homeassistant/components/time_date/sensor.py @@ -5,7 +5,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( ENTITY_ID_FORMAT, @@ -33,8 +33,8 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_DISPLAY_OPTIONS, default=["time"]): vol.All( - cv.ensure_list, [vol.In(OPTION_TYPES)] + probatio.Optional(CONF_DISPLAY_OPTIONS, default=["time"]): probatio.All( + cv.ensure_list, [probatio.In(OPTION_TYPES)] ) } ) diff --git a/homeassistant/components/timer/__init__.py b/homeassistant/components/timer/__init__.py index 8344f19df8136..a2ac7bdf6dd7f 100644 --- a/homeassistant/components/timer/__init__.py +++ b/homeassistant/components/timer/__init__.py @@ -5,7 +5,7 @@ import logging from typing import Any, Self, override -import voluptuous as vol +import probatio from homeassistant.const import ( # noqa: F401 ATTR_EDITABLE, @@ -67,10 +67,10 @@ STORAGE_VERSION = 1 STORAGE_FIELDS: VolDictType = { - vol.Required(CONF_NAME): cv.string, - vol.Optional(CONF_ICON): cv.icon, - vol.Optional(CONF_DURATION, default=DEFAULT_DURATION): cv.time_period, - vol.Optional(CONF_RESTORE, default=DEFAULT_RESTORE): cv.boolean, + probatio.Required(CONF_NAME): cv.string, + probatio.Optional(CONF_ICON): cv.icon, + probatio.Optional(CONF_DURATION, default=DEFAULT_DURATION): cv.time_period, + probatio.Optional(CONF_RESTORE, default=DEFAULT_RESTORE): cv.boolean, } @@ -87,26 +87,28 @@ def _none_to_empty_dict[_T](value: _T | None) -> _T | dict[Any, Any]: return value -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { DOMAIN: cv.schema_with_slug_keys( - vol.All( + probatio.All( _none_to_empty_dict, { - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_ICON): cv.icon, - vol.Optional(CONF_DURATION, default=DEFAULT_DURATION): vol.All( - cv.time_period, _format_timedelta - ), - vol.Optional(CONF_RESTORE, default=DEFAULT_RESTORE): cv.boolean, + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_ICON): cv.icon, + probatio.Optional( + CONF_DURATION, default=DEFAULT_DURATION + ): probatio.All(cv.time_period, _format_timedelta), + probatio.Optional( + CONF_RESTORE, default=DEFAULT_RESTORE + ): cv.boolean, }, ) ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -RELOAD_SERVICE_SCHEMA = vol.Schema({}) +RELOAD_SERVICE_SCHEMA = probatio.Schema({}) async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: @@ -154,7 +156,7 @@ async def reload_service_handler(service_call: ServiceCall) -> None: ) component.async_register_entity_service( SERVICE_START, - {vol.Optional(ATTR_DURATION, default=DEFAULT_DURATION): cv.time_period}, + {probatio.Optional(ATTR_DURATION, default=DEFAULT_DURATION): cv.time_period}, "async_start", ) component.async_register_entity_service(SERVICE_PAUSE, None, "async_pause") @@ -162,7 +164,7 @@ async def reload_service_handler(service_call: ServiceCall) -> None: component.async_register_entity_service(SERVICE_FINISH, None, "async_finish") component.async_register_entity_service( SERVICE_CHANGE, - {vol.Optional(ATTR_DURATION, default=DEFAULT_DURATION): cv.time_period}, + {probatio.Optional(ATTR_DURATION, default=DEFAULT_DURATION): cv.time_period}, "async_change", ) @@ -172,7 +174,7 @@ async def reload_service_handler(service_call: ServiceCall) -> None: class TimerStorageCollection(collection.DictStorageCollection): """Timer storage based collection.""" - CREATE_UPDATE_SCHEMA = vol.Schema(STORAGE_FIELDS) + CREATE_UPDATE_SCHEMA = probatio.Schema(STORAGE_FIELDS) @override async def _process_create_data(self, data: dict) -> dict: diff --git a/homeassistant/components/timer/trigger.py b/homeassistant/components/timer/trigger.py index 28349cff3b2a8..785e91cfb6bc4 100644 --- a/homeassistant/components/timer/trigger.py +++ b/homeassistant/components/timer/trigger.py @@ -4,7 +4,7 @@ from datetime import datetime, timedelta from typing import cast, override -import voluptuous as vol +import probatio from homeassistant.const import ATTR_ENTITY_ID, CONF_OPTIONS from homeassistant.core import CALLBACK_TYPE, Context, HomeAssistant, State, callback @@ -33,8 +33,8 @@ TIME_REMAINING_TRIGGER_SCHEMA = ENTITY_STATE_TRIGGER_SCHEMA.extend( { - vol.Required(CONF_OPTIONS): { - vol.Required(CONF_REMAINING): cv.positive_time_period_dict, + probatio.Required(CONF_OPTIONS): { + probatio.Required(CONF_REMAINING): cv.positive_time_period_dict, }, } ) diff --git a/homeassistant/components/tmb/sensor.py b/homeassistant/components/tmb/sensor.py index 409b9c0d88769..f4a103a97d6c1 100644 --- a/homeassistant/components/tmb/sensor.py +++ b/homeassistant/components/tmb/sensor.py @@ -4,9 +4,9 @@ import logging from typing import Any, override +import probatio from requests import HTTPError from tmb import IBus -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -31,19 +31,21 @@ MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=60) -LINE_STOP_SCHEMA = vol.Schema( +LINE_STOP_SCHEMA = probatio.Schema( { - vol.Required(CONF_BUS_STOP): cv.string, - vol.Required(CONF_LINE): cv.string, - vol.Optional(CONF_NAME): cv.string, + probatio.Required(CONF_BUS_STOP): cv.string, + probatio.Required(CONF_LINE): cv.string, + probatio.Optional(CONF_NAME): cv.string, } ) PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_APP_ID): cv.string, - vol.Required(CONF_APP_KEY): cv.string, - vol.Required(CONF_BUS_STOPS): vol.All(cv.ensure_list, [LINE_STOP_SCHEMA]), + probatio.Required(CONF_APP_ID): cv.string, + probatio.Required(CONF_APP_KEY): cv.string, + probatio.Required(CONF_BUS_STOPS): probatio.All( + cv.ensure_list, [LINE_STOP_SCHEMA] + ), } ) diff --git a/homeassistant/components/tod/binary_sensor.py b/homeassistant/components/tod/binary_sensor.py index 7711125ffcb5b..6856abed5a91d 100644 --- a/homeassistant/components/tod/binary_sensor.py +++ b/homeassistant/components/tod/binary_sensor.py @@ -5,7 +5,7 @@ import logging from typing import Any, Literal, TypeGuard, override -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import ( PLATFORM_SCHEMA as BINARY_SENSOR_PLATFORM_SCHEMA, @@ -47,12 +47,16 @@ PLATFORM_SCHEMA = BINARY_SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_AFTER): vol.Any(cv.time, vol.All(vol.Lower, cv.sun_event)), - vol.Required(CONF_BEFORE): vol.Any(cv.time, vol.All(vol.Lower, cv.sun_event)), - vol.Required(CONF_NAME): cv.string, - vol.Optional(CONF_AFTER_OFFSET, default=timedelta(0)): cv.time_period, - vol.Optional(CONF_BEFORE_OFFSET, default=timedelta(0)): cv.time_period, - vol.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Required(CONF_AFTER): probatio.Any( + cv.time, probatio.All(probatio.Lower, cv.sun_event) + ), + probatio.Required(CONF_BEFORE): probatio.Any( + cv.time, probatio.All(probatio.Lower, cv.sun_event) + ), + probatio.Required(CONF_NAME): cv.string, + probatio.Optional(CONF_AFTER_OFFSET, default=timedelta(0)): cv.time_period, + probatio.Optional(CONF_BEFORE_OFFSET, default=timedelta(0)): cv.time_period, + probatio.Optional(CONF_UNIQUE_ID): cv.string, } ) diff --git a/homeassistant/components/tod/config_flow.py b/homeassistant/components/tod/config_flow.py index a4a4318c4872f..f74b5b43d4df5 100644 --- a/homeassistant/components/tod/config_flow.py +++ b/homeassistant/components/tod/config_flow.py @@ -3,7 +3,7 @@ from collections.abc import Mapping from typing import Any, cast, override -import voluptuous as vol +import probatio from homeassistant.const import CONF_NAME from homeassistant.helpers import selector @@ -14,16 +14,16 @@ from .const import CONF_AFTER_TIME, CONF_BEFORE_TIME, DOMAIN -OPTIONS_SCHEMA = vol.Schema( +OPTIONS_SCHEMA = probatio.Schema( { - vol.Required(CONF_AFTER_TIME): selector.TimeSelector(), - vol.Required(CONF_BEFORE_TIME): selector.TimeSelector(), + probatio.Required(CONF_AFTER_TIME): selector.TimeSelector(), + probatio.Required(CONF_BEFORE_TIME): selector.TimeSelector(), } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Required(CONF_NAME): selector.TextSelector(), + probatio.Required(CONF_NAME): selector.TextSelector(), } ).extend(OPTIONS_SCHEMA.schema) diff --git a/homeassistant/components/todo/__init__.py b/homeassistant/components/todo/__init__.py index d573bc9799af8..c7be4a69eae85 100644 --- a/homeassistant/components/todo/__init__.py +++ b/homeassistant/components/todo/__init__.py @@ -7,8 +7,8 @@ import logging from typing import Any, final, override +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.components import frontend, websocket_api from homeassistant.components.websocket_api import ERR_NOT_FOUND, ERR_NOT_SUPPORTED @@ -62,7 +62,7 @@ class TodoItemFieldDescription: """Field name for TodoItem.""" validation: Callable[[Any], Any] - """Voluptuous validation function.""" + """Probatio validation function.""" required_feature: TodoListEntityFeature """Entity feature that enables this field.""" @@ -71,32 +71,32 @@ class TodoItemFieldDescription: TODO_ITEM_FIELDS = [ TodoItemFieldDescription( service_field=ATTR_DUE_DATE, - validation=vol.Any(cv.date, None), + validation=probatio.Any(cv.date, None), todo_item_field=ATTR_DUE, required_feature=TodoListEntityFeature.SET_DUE_DATE_ON_ITEM, ), TodoItemFieldDescription( service_field=ATTR_DUE_DATETIME, - validation=vol.Any(vol.All(cv.datetime, dt_util.as_local), None), + validation=probatio.Any(probatio.All(cv.datetime, dt_util.as_local), None), todo_item_field=ATTR_DUE, required_feature=TodoListEntityFeature.SET_DUE_DATETIME_ON_ITEM, ), TodoItemFieldDescription( service_field=ATTR_DESCRIPTION, - validation=vol.Any(cv.string, None), + validation=probatio.Any(cv.string, None), todo_item_field=ATTR_DESCRIPTION, required_feature=TodoListEntityFeature.SET_DESCRIPTION_ON_ITEM, ), ] TODO_ITEM_FIELD_SCHEMA = { - vol.Optional(desc.service_field): desc.validation for desc in TODO_ITEM_FIELDS + probatio.Optional(desc.service_field): desc.validation for desc in TODO_ITEM_FIELDS } TODO_ITEM_FIELD_VALIDATIONS = [cv.has_at_most_one_key(ATTR_DUE_DATE, ATTR_DUE_DATETIME)] TODO_SERVICE_GET_ITEMS_SCHEMA = { - vol.Optional(ATTR_STATUS): vol.All( + probatio.Optional(ATTR_STATUS): probatio.All( cv.ensure_list, - [vol.In({TodoItemStatus.NEEDS_ACTION, TodoItemStatus.COMPLETED})], + [probatio.In({TodoItemStatus.NEEDS_ACTION, TodoItemStatus.COMPLETED})], ), } @@ -130,11 +130,11 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: component.async_register_entity_service( TodoServices.ADD_ITEM, - vol.All( + probatio.All( cv.make_entity_service_schema( { - vol.Required(ATTR_ITEM): vol.All( - cv.string, str.strip, vol.Length(min=1) + probatio.Required(ATTR_ITEM): probatio.All( + cv.string, str.strip, probatio.Length(min=1) ), **TODO_ITEM_FIELD_SCHEMA, } @@ -146,14 +146,16 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: ) component.async_register_entity_service( TodoServices.UPDATE_ITEM, - vol.All( + probatio.All( cv.make_entity_service_schema( { - vol.Required(ATTR_ITEM): vol.All(cv.string, vol.Length(min=1)), - vol.Optional(ATTR_RENAME): vol.All( - cv.string, str.strip, vol.Length(min=1) + probatio.Required(ATTR_ITEM): probatio.All( + cv.string, probatio.Length(min=1) ), - vol.Optional(ATTR_STATUS): vol.In( + probatio.Optional(ATTR_RENAME): probatio.All( + cv.string, str.strip, probatio.Length(min=1) + ), + probatio.Optional(ATTR_STATUS): probatio.In( {TodoItemStatus.NEEDS_ACTION, TodoItemStatus.COMPLETED}, ), **TODO_ITEM_FIELD_SCHEMA, @@ -173,7 +175,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: TodoServices.REMOVE_ITEM, cv.make_entity_service_schema( { - vol.Required(ATTR_ITEM): vol.All(cv.ensure_list, [cv.string]), + probatio.Required(ATTR_ITEM): probatio.All(cv.ensure_list, [cv.string]), } ), _async_remove_todo_items, @@ -333,8 +335,8 @@ def _async_write_ha_state(self) -> None: @websocket_api.websocket_command( { - vol.Required("type"): "todo/item/subscribe", - vol.Required("entity_id"): cv.entity_domain(DOMAIN), + probatio.Required("type"): "todo/item/subscribe", + probatio.Required("entity_id"): cv.entity_domain(DOMAIN), } ) @websocket_api.async_response @@ -387,8 +389,8 @@ def _api_items_factory(obj: Iterable[tuple[str, Any]]) -> dict[str, str]: @websocket_api.websocket_command( { - vol.Required("type"): "todo/item/list", - vol.Required("entity_id"): cv.entity_id, + probatio.Required("type"): "todo/item/list", + probatio.Required("entity_id"): cv.entity_id, } ) @websocket_api.async_response @@ -420,10 +422,10 @@ async def websocket_handle_todo_item_list( @websocket_api.websocket_command( { - vol.Required("type"): "todo/item/move", - vol.Required("entity_id"): cv.entity_id, - vol.Required("uid"): cv.string, - vol.Optional("previous_uid"): cv.string, + probatio.Required("type"): "todo/item/move", + probatio.Required("entity_id"): cv.entity_id, + probatio.Required("uid"): cv.string, + probatio.Optional("previous_uid"): cv.string, } ) @websocket_api.async_response diff --git a/homeassistant/components/todo/intent.py b/homeassistant/components/todo/intent.py index c11437678034b..b98ddd3d7a0ed 100644 --- a/homeassistant/components/todo/intent.py +++ b/homeassistant/components/todo/intent.py @@ -2,7 +2,7 @@ from typing import override -import voluptuous as vol +import probatio from homeassistant.core import HomeAssistant from homeassistant.helpers import intent @@ -26,8 +26,8 @@ class ListBaseIntentHandler(intent.IntentHandler): """Base class for toto intent handlers.""" slot_schema = { - vol.Required("item"): intent.non_empty_string, - vol.Required("name"): intent.non_empty_string, + probatio.Required("item"): intent.non_empty_string, + probatio.Required("name"): intent.non_empty_string, } platforms = {DOMAIN} diff --git a/homeassistant/components/todo/llm.py b/homeassistant/components/todo/llm.py index 7aaf3334f4aa8..d9f28e37dbc50 100644 --- a/homeassistant/components/todo/llm.py +++ b/homeassistant/components/todo/llm.py @@ -3,7 +3,7 @@ from operator import attrgetter from typing import Any, cast, override -import voluptuous as vol +import probatio from homeassistant.components.homeassistant import async_should_expose from homeassistant.components.llm import LLMTools @@ -43,10 +43,10 @@ class TodoGetItemsTool(Tool): def __init__(self, todo_lists: list[str]) -> None: """Init the get items tool.""" - self.parameters = vol.Schema( + self.parameters = probatio.Schema( { - vol.Required("todo_list"): vol.In(todo_lists), - vol.Optional( + probatio.Required("todo_list"): probatio.In(todo_lists), + probatio.Optional( "status", description=( "Filter returned items by status," @@ -54,7 +54,7 @@ def __init__(self, todo_lists: list[str]) -> None: " items" ), default="needs_action", - ): vol.In(["needs_action", "completed", "all"]), + ): probatio.In(["needs_action", "completed", "all"]), } ) diff --git a/homeassistant/components/todo/trigger.py b/homeassistant/components/todo/trigger.py index d0b77f0d84758..b5795dd080793 100644 --- a/homeassistant/components/todo/trigger.py +++ b/homeassistant/components/todo/trigger.py @@ -8,7 +8,7 @@ import logging from typing import TYPE_CHECKING, cast, override -import voluptuous as vol +import probatio from homeassistant.const import ( ATTR_ENTITY_ID, @@ -40,10 +40,10 @@ from . import TodoItem, TodoListEntity from .const import DATA_COMPONENT, DOMAIN, TodoItemStatus -ITEM_TRIGGER_SCHEMA = vol.Schema( +ITEM_TRIGGER_SCHEMA = probatio.Schema( { - vol.Required(CONF_TARGET): cv.TARGET_FIELDS, - vol.Required(CONF_OPTIONS, default={}): {}, + probatio.Required(CONF_TARGET): cv.TARGET_FIELDS, + probatio.Required(CONF_OPTIONS, default={}): {}, } ) diff --git a/homeassistant/components/todoist/calendar.py b/homeassistant/components/todoist/calendar.py index b5ce72c38194a..5fd9f38e5e921 100644 --- a/homeassistant/components/todoist/calendar.py +++ b/homeassistant/components/todoist/calendar.py @@ -5,9 +5,9 @@ import logging from typing import Any, override +import probatio from todoist_api_python.api_async import TodoistAPIAsync from todoist_api_python.models import Label, Project, Task -import voluptuous as vol from homeassistant.components.calendar import ( PLATFORM_SCHEMA as CALENDAR_PLATFORM_SCHEMA, @@ -52,21 +52,26 @@ PLATFORM_SCHEMA = CALENDAR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_TOKEN): cv.string, - vol.Optional(CONF_EXTRA_PROJECTS, default=[]): vol.All( + probatio.Required(CONF_TOKEN): cv.string, + probatio.Optional(CONF_EXTRA_PROJECTS, default=[]): probatio.All( cv.ensure_list, - vol.Schema( + probatio.Schema( [ - vol.Schema( + probatio.Schema( { - vol.Required(CONF_NAME): cv.string, - vol.Optional(CONF_PROJECT_DUE_DATE): vol.Coerce(int), - vol.Optional(CONF_PROJECT_WHITELIST, default=[]): vol.All( - cv.ensure_list, [vol.All(cv.string, vol.Lower)] + probatio.Required(CONF_NAME): cv.string, + probatio.Optional(CONF_PROJECT_DUE_DATE): probatio.Coerce( + int ), - vol.Optional( + probatio.Optional( + CONF_PROJECT_WHITELIST, default=[] + ): probatio.All( + cv.ensure_list, + [probatio.All(cv.string, probatio.Lower)], + ), + probatio.Optional( CONF_PROJECT_LABEL_WHITELIST, default=[] - ): vol.All(cv.ensure_list, [vol.All(cv.string)]), + ): probatio.All(cv.ensure_list, [probatio.All(cv.string)]), } ) ] diff --git a/homeassistant/components/todoist/config_flow.py b/homeassistant/components/todoist/config_flow.py index c8432a64d37db..190a33181e38e 100644 --- a/homeassistant/components/todoist/config_flow.py +++ b/homeassistant/components/todoist/config_flow.py @@ -4,9 +4,9 @@ import logging from typing import Any, override +import probatio from requests.exceptions import HTTPError from todoist_api_python.api_async import TodoistAPIAsync -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_TOKEN @@ -18,9 +18,9 @@ SETTINGS_URL = "https://app.todoist.com/app/settings/integrations/developer" -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_TOKEN): str, + probatio.Required(CONF_TOKEN): str, } ) diff --git a/homeassistant/components/todoist/services.py b/homeassistant/components/todoist/services.py index 46a8585311de7..a8f324f17163d 100644 --- a/homeassistant/components/todoist/services.py +++ b/homeassistant/components/todoist/services.py @@ -6,7 +6,7 @@ from typing import Any import uuid -import voluptuous as vol +import probatio from homeassistant.core import HomeAssistant, ServiceCall, callback from homeassistant.exceptions import ServiceValidationError @@ -36,23 +36,29 @@ _LOGGER = logging.getLogger(__name__) -NEW_TASK_SERVICE_SCHEMA = vol.Schema( +NEW_TASK_SERVICE_SCHEMA = probatio.Schema( { - vol.Required(CONTENT): cv.string, - vol.Optional(DESCRIPTION): cv.string, - vol.Optional(PROJECT_NAME, default="inbox"): vol.All(cv.string, vol.Lower), - vol.Optional(SECTION_NAME): vol.All(cv.string, vol.Lower), - vol.Optional(LABELS): cv.ensure_list_csv, - vol.Optional(ASSIGNEE): cv.string, - vol.Optional(PRIORITY): vol.All(vol.Coerce(int), vol.Range(min=1, max=4)), - vol.Exclusive(DUE_DATE_STRING, "due_date"): cv.string, - vol.Optional(DUE_DATE_LANG): vol.All(cv.string, vol.In(DUE_DATE_VALID_LANGS)), - vol.Exclusive(DUE_DATE, "due_date"): cv.string, - vol.Exclusive(REMINDER_DATE_STRING, "reminder_date"): cv.string, - vol.Optional(REMINDER_DATE_LANG): vol.All( - cv.string, vol.In(DUE_DATE_VALID_LANGS) + probatio.Required(CONTENT): cv.string, + probatio.Optional(DESCRIPTION): cv.string, + probatio.Optional(PROJECT_NAME, default="inbox"): probatio.All( + cv.string, probatio.Lower ), - vol.Exclusive(REMINDER_DATE, "reminder_date"): cv.string, + probatio.Optional(SECTION_NAME): probatio.All(cv.string, probatio.Lower), + probatio.Optional(LABELS): cv.ensure_list_csv, + probatio.Optional(ASSIGNEE): cv.string, + probatio.Optional(PRIORITY): probatio.All( + probatio.Coerce(int), probatio.Range(min=1, max=4) + ), + probatio.Exclusive(DUE_DATE_STRING, "due_date"): cv.string, + probatio.Optional(DUE_DATE_LANG): probatio.All( + cv.string, probatio.In(DUE_DATE_VALID_LANGS) + ), + probatio.Exclusive(DUE_DATE, "due_date"): cv.string, + probatio.Exclusive(REMINDER_DATE_STRING, "reminder_date"): cv.string, + probatio.Optional(REMINDER_DATE_LANG): probatio.All( + cv.string, probatio.In(DUE_DATE_VALID_LANGS) + ), + probatio.Exclusive(REMINDER_DATE, "reminder_date"): cv.string, } ) diff --git a/homeassistant/components/togrill/config_flow.py b/homeassistant/components/togrill/config_flow.py index 4dbc31ccf9f5a..8ec119b078683 100644 --- a/homeassistant/components/togrill/config_flow.py +++ b/homeassistant/components/togrill/config_flow.py @@ -3,10 +3,10 @@ from typing import Any, override from bleak.exc import BleakError +import probatio from togrill_bluetooth import SUPPORTED_DEVICES from togrill_bluetooth.client import Client from togrill_bluetooth.packets import PacketA0Notify -import voluptuous as vol from homeassistant.components import bluetooth from homeassistant.components.bluetooth import ( @@ -135,5 +135,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_ADDRESS): vol.In(addresses)}), + data_schema=probatio.Schema( + {probatio.Required(CONF_ADDRESS): probatio.In(addresses)} + ), ) diff --git a/homeassistant/components/tolo/config_flow.py b/homeassistant/components/tolo/config_flow.py index 3ac312d23a6c6..c2b4bbcd793c7 100644 --- a/homeassistant/components/tolo/config_flow.py +++ b/homeassistant/components/tolo/config_flow.py @@ -4,8 +4,8 @@ from types import MappingProxyType from typing import Any, override +import probatio from tololib import ToloClient, ToloCommunicationError -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_RECONFIGURE, @@ -20,9 +20,9 @@ _LOGGER = logging.getLogger(__name__) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, + probatio.Required(CONF_HOST): str, } ) diff --git a/homeassistant/components/tomato/device_tracker.py b/homeassistant/components/tomato/device_tracker.py index 5a50a70400749..857c84cc3037e 100644 --- a/homeassistant/components/tomato/device_tracker.py +++ b/homeassistant/components/tomato/device_tracker.py @@ -6,8 +6,8 @@ import re from typing import override +import probatio import requests -import voluptuous as vol from homeassistant.components.device_tracker import ( DOMAIN as DEVICE_TRACKER_DOMAIN, @@ -32,13 +32,15 @@ PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_PORT): cv.port, - vol.Optional(CONF_SSL, default=False): cv.boolean, - vol.Optional(CONF_VERIFY_SSL, default=True): vol.Any(cv.boolean, cv.isfile), - vol.Required(CONF_PASSWORD): cv.string, - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_HTTP_ID): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_PORT): cv.port, + probatio.Optional(CONF_SSL, default=False): cv.boolean, + probatio.Optional(CONF_VERIFY_SSL, default=True): probatio.Any( + cv.boolean, cv.isfile + ), + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_HTTP_ID): cv.string, } ) diff --git a/homeassistant/components/tomorrowio/config_flow.py b/homeassistant/components/tomorrowio/config_flow.py index 7067858ad2646..968bb04b59944 100644 --- a/homeassistant/components/tomorrowio/config_flow.py +++ b/homeassistant/components/tomorrowio/config_flow.py @@ -4,13 +4,13 @@ import logging from typing import Any, override +import probatio from pytomorrowio.exceptions import ( CantConnectException, InvalidAPIKeyException, RateLimitedException, ) from pytomorrowio.pytomorrowio import TomorrowioV4 -import voluptuous as vol from homeassistant.components.zone import async_active_zone from homeassistant.config_entries import ( @@ -46,7 +46,7 @@ def _get_config_schema( hass: HomeAssistant, source: str | None, input_dict: dict[str, Any] | None = None, -) -> vol.Schema: +) -> probatio.Schema: """Return schema defaults for init step based on user input/config dict. Retain info already provided for future form views by setting them as @@ -56,7 +56,7 @@ def _get_config_schema( input_dict = {} api_key_schema = { - vol.Required(CONF_API_KEY, default=input_dict.get(CONF_API_KEY)): str, + probatio.Required(CONF_API_KEY, default=input_dict.get(CONF_API_KEY)): str, } default_location = input_dict.get( @@ -66,10 +66,10 @@ def _get_config_schema( CONF_LONGITUDE: hass.config.longitude, }, ) - return vol.Schema( + return probatio.Schema( { **api_key_schema, - vol.Required( + probatio.Required( CONF_LOCATION, default=default_location, ): LocationSelector(LocationSelectorConfig(radius=False)), @@ -97,14 +97,14 @@ async def async_step_init( return self.async_create_entry(title="", data=user_input) options_schema = { - vol.Required( + probatio.Required( CONF_TIMESTEP, default=self.config_entry.options[CONF_TIMESTEP], - ): vol.In([1, 5, 15, 30, 60]), + ): probatio.In([1, 5, 15, 30, 60]), } return self.async_show_form( - step_id="init", data_schema=vol.Schema(options_schema) + step_id="init", data_schema=probatio.Schema(options_schema) ) diff --git a/homeassistant/components/tonewinner/config_flow.py b/homeassistant/components/tonewinner/config_flow.py index 71d46d694c953..d1b3dd62b5171 100644 --- a/homeassistant/components/tonewinner/config_flow.py +++ b/homeassistant/components/tonewinner/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from tonewinner_rs232 import ReceiverInfo, TonewinnerReceiver -import voluptuous as vol from homeassistant.config_entries import ( ConfigEntryState, @@ -18,9 +18,9 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_SERIAL_PORT): SerialPortSelector(), + probatio.Required(CONF_SERIAL_PORT): SerialPortSelector(), } ) diff --git a/homeassistant/components/toon/__init__.py b/homeassistant/components/toon/__init__.py index 6edfd23505169..1513635a6d602 100644 --- a/homeassistant/components/toon/__init__.py +++ b/homeassistant/components/toon/__init__.py @@ -1,6 +1,6 @@ """Support for Toon van Eneco devices.""" -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry from homeassistant.const import ( @@ -30,22 +30,22 @@ ] # Validation of the user's configuration -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.All( + DOMAIN: probatio.All( cv.deprecated(CONF_SCAN_INTERVAL), - vol.Schema( + probatio.Schema( { - vol.Required(CONF_CLIENT_ID): cv.string, - vol.Required(CONF_CLIENT_SECRET): cv.string, - vol.Optional( + probatio.Required(CONF_CLIENT_ID): cv.string, + probatio.Required(CONF_CLIENT_SECRET): cv.string, + probatio.Optional( CONF_SCAN_INTERVAL, default=DEFAULT_SCAN_INTERVAL ): cv.positive_time_period, } ), ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/toon/config_flow.py b/homeassistant/components/toon/config_flow.py index 00803db2aa767..589cdd3dca2d2 100644 --- a/homeassistant/components/toon/config_flow.py +++ b/homeassistant/components/toon/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from toonapi import Agreement, Toon, ToonError -import voluptuous as vol from homeassistant.config_entries import ConfigFlowResult from homeassistant.helpers.aiohttp_client import async_get_clientsession @@ -81,8 +81,8 @@ async def async_step_agreement( if user_input is None: return self.async_show_form( step_id="agreement", - data_schema=vol.Schema( - {vol.Required(CONF_AGREEMENT): vol.In(agreements_list)} + data_schema=probatio.Schema( + {probatio.Required(CONF_AGREEMENT): probatio.In(agreements_list)} ), ) diff --git a/homeassistant/components/torque/sensor.py b/homeassistant/components/torque/sensor.py index 6062c7a2595fa..7e2b5324adb30 100644 --- a/homeassistant/components/torque/sensor.py +++ b/homeassistant/components/torque/sensor.py @@ -3,7 +3,7 @@ import re from aiohttp import web -import voluptuous as vol +import probatio from homeassistant.components.http import HomeAssistantView from homeassistant.components.sensor import ( @@ -34,8 +34,8 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_EMAIL): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_EMAIL): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/totalconnect/config_flow.py b/homeassistant/components/totalconnect/config_flow.py index 21142073725e7..7efbea358ce15 100644 --- a/homeassistant/components/totalconnect/config_flow.py +++ b/homeassistant/components/totalconnect/config_flow.py @@ -3,9 +3,9 @@ from collections.abc import Mapping from typing import TYPE_CHECKING, Any, override +import probatio from total_connect_client.client import TotalConnectClient from total_connect_client.exceptions import AuthenticationError -import voluptuous as vol from homeassistant.config_entries import ( ConfigEntry, @@ -19,7 +19,7 @@ from .const import AUTO_BYPASS, CODE_REQUIRED, CONF_USERCODES, DOMAIN -PASSWORD_DATA_SCHEMA = vol.Schema({vol.Required(CONF_PASSWORD): str}) +PASSWORD_DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_PASSWORD): str}) class TotalConnectConfigFlow(ConfigFlow, domain=DOMAIN): @@ -63,8 +63,11 @@ async def async_step_user( self.client = client return await self.async_step_locations() - data_schema = vol.Schema( - {vol.Required(CONF_USERNAME): str, vol.Required(CONF_PASSWORD): str} + data_schema = probatio.Schema( + { + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + } ) return self.async_show_form( @@ -116,14 +119,14 @@ async def async_step_locations( if self.usercodes[location_id] is None: location_for_user = str(location_id) location_codes[ - vol.Required( + probatio.Required( CONF_USERCODES, default="0000", ) ] = str break - data_schema = vol.Schema(location_codes) + data_schema = probatio.Schema(location_codes) return self.async_show_form( step_id="locations", data_schema=data_schema, @@ -204,13 +207,13 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( AUTO_BYPASS, default=self.config_entry.options.get(AUTO_BYPASS, False), ): bool, - vol.Required( + probatio.Required( CODE_REQUIRED, default=self.config_entry.options.get(CODE_REQUIRED, False), ): bool, diff --git a/homeassistant/components/touchline/climate.py b/homeassistant/components/touchline/climate.py index a259274b1cb59..196f9c9b2ddc3 100644 --- a/homeassistant/components/touchline/climate.py +++ b/homeassistant/components/touchline/climate.py @@ -2,8 +2,8 @@ from typing import Any, NamedTuple, override +import probatio from pytouchline_extended import PyTouchline -import voluptuous as vol from homeassistant.components.climate import ( PLATFORM_SCHEMA as CLIMATE_PLATFORM_SCHEMA, @@ -52,7 +52,9 @@ class PresetMode(NamedTuple): for preset, settings in PRESET_MODES.items() } -PLATFORM_SCHEMA = CLIMATE_PLATFORM_SCHEMA.extend({vol.Required(CONF_HOST): cv.string}) +PLATFORM_SCHEMA = CLIMATE_PLATFORM_SCHEMA.extend( + {probatio.Required(CONF_HOST): cv.string} +) async def async_setup_entry( diff --git a/homeassistant/components/touchline/config_flow.py b/homeassistant/components/touchline/config_flow.py index 5d2d522ae3bf0..41dc88e5c138e 100644 --- a/homeassistant/components/touchline/config_flow.py +++ b/homeassistant/components/touchline/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from pytouchline_extended import PyTouchline -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST @@ -17,9 +17,9 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): cv.string, + probatio.Required(CONF_HOST): cv.string, } ) diff --git a/homeassistant/components/touchline_sl/config_flow.py b/homeassistant/components/touchline_sl/config_flow.py index 4a6a6cc4e95a7..09efb3d76cb6d 100644 --- a/homeassistant/components/touchline_sl/config_flow.py +++ b/homeassistant/components/touchline_sl/config_flow.py @@ -3,9 +3,9 @@ import logging from typing import Any, override +import probatio from pytouchlinesl import TouchlineSL from pytouchlinesl.client import RothAPIError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -14,10 +14,10 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/tplink/config_flow.py b/homeassistant/components/tplink/config_flow.py index 6b2764aee3690..03d9f0c2fac05 100644 --- a/homeassistant/components/tplink/config_flow.py +++ b/homeassistant/components/tplink/config_flow.py @@ -14,7 +14,7 @@ Module, TimeoutError, ) -import voluptuous as vol +import probatio from homeassistant.components import ffmpeg, stream from homeassistant.config_entries import ( @@ -62,17 +62,17 @@ _LOGGER = logging.getLogger(__name__) -STEP_AUTH_DATA_SCHEMA = vol.Schema( - {vol.Required(CONF_USERNAME): str, vol.Required(CONF_PASSWORD): str} +STEP_AUTH_DATA_SCHEMA = probatio.Schema( + {probatio.Required(CONF_USERNAME): str, probatio.Required(CONF_PASSWORD): str} ) -STEP_RECONFIGURE_DATA_SCHEMA = vol.Schema({vol.Required(CONF_HOST): str}) +STEP_RECONFIGURE_DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_HOST): str}) -STEP_CAMERA_AUTH_DATA_SCHEMA = vol.Schema( +STEP_CAMERA_AUTH_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_LIVE_VIEW): bool, - vol.Optional(CONF_USERNAME): str, - vol.Optional(CONF_PASSWORD): str, + probatio.Required(CONF_LIVE_VIEW): bool, + probatio.Optional(CONF_USERNAME): str, + probatio.Optional(CONF_PASSWORD): str, } ) @@ -368,7 +368,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Optional(CONF_HOST, default=""): str}), + data_schema=probatio.Schema( + {probatio.Optional(CONF_HOST, default=""): str} + ), errors=errors, description_placeholders=placeholders, ) @@ -568,7 +570,9 @@ async def async_step_pick_device( return self.async_abort(reason="no_devices_found") return self.async_show_form( step_id="pick_device", - data_schema=vol.Schema({vol.Required(CONF_DEVICE): vol.In(devices_name)}), + data_schema=probatio.Schema( + {probatio.Required(CONF_DEVICE): probatio.In(devices_name)} + ), ) async def _async_reload_requires_auth_entries(self) -> None: diff --git a/homeassistant/components/tplink/light.py b/homeassistant/components/tplink/light.py index 3759bf9f4c505..532381be21daf 100644 --- a/homeassistant/components/tplink/light.py +++ b/homeassistant/components/tplink/light.py @@ -8,7 +8,7 @@ from kasa import Device, DeviceType, KasaException, LightState, Module from kasa.interfaces import LightEffect from kasa.iot import IotDevice -import voluptuous as vol +import probatio from homeassistant.components.light import ( ATTR_BRIGHTNESS, @@ -48,74 +48,76 @@ SERVICE_RANDOM_EFFECT = "random_effect" SERVICE_SEQUENCE_EFFECT = "sequence_effect" -HUE = vol.Range(min=0, max=360) -SAT = vol.Range(min=0, max=100) -VAL = vol.Range(min=0, max=100) -TRANSITION = vol.Range(min=0, max=6000) -HSV_SEQUENCE = vol.ExactSequence((HUE, SAT, VAL)) +HUE = probatio.Range(min=0, max=360) +SAT = probatio.Range(min=0, max=100) +VAL = probatio.Range(min=0, max=100) +TRANSITION = probatio.Range(min=0, max=6000) +HSV_SEQUENCE = probatio.ExactSequence((HUE, SAT, VAL)) BASE_EFFECT_DICT: VolDictType = { - vol.Optional("brightness", default=100): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) + probatio.Optional("brightness", default=100): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) ), - vol.Optional("duration", default=0): vol.All( - vol.Coerce(int), vol.Range(min=0, max=5000) + probatio.Optional("duration", default=0): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=5000) ), - vol.Optional("transition", default=0): vol.All(vol.Coerce(int), TRANSITION), - vol.Optional("segments", default=[0]): vol.All( + probatio.Optional("transition", default=0): probatio.All( + probatio.Coerce(int), TRANSITION + ), + probatio.Optional("segments", default=[0]): probatio.All( cv.ensure_list_csv, - vol.Length(min=1, max=80), - [vol.All(vol.Coerce(int), vol.Range(min=0, max=80))], + probatio.Length(min=1, max=80), + [probatio.All(probatio.Coerce(int), probatio.Range(min=0, max=80))], ), } SEQUENCE_EFFECT_DICT: VolDictType = { **BASE_EFFECT_DICT, - vol.Required("sequence"): vol.All( + probatio.Required("sequence"): probatio.All( cv.ensure_list, - vol.Length(min=1, max=16), - [vol.All(vol.Coerce(tuple), HSV_SEQUENCE)], + probatio.Length(min=1, max=16), + [probatio.All(probatio.Coerce(tuple), HSV_SEQUENCE)], ), - vol.Optional("repeat_times", default=0): vol.All( - vol.Coerce(int), vol.Range(min=0, max=10) + probatio.Optional("repeat_times", default=0): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=10) ), - vol.Optional("spread", default=1): vol.All( - vol.Coerce(int), vol.Range(min=1, max=16) + probatio.Optional("spread", default=1): probatio.All( + probatio.Coerce(int), probatio.Range(min=1, max=16) ), - vol.Optional("direction", default=4): vol.All( - vol.Coerce(int), vol.Range(min=1, max=4) + probatio.Optional("direction", default=4): probatio.All( + probatio.Coerce(int), probatio.Range(min=1, max=4) ), } RANDOM_EFFECT_DICT: VolDictType = { **BASE_EFFECT_DICT, - vol.Optional("fadeoff", default=0): vol.All( - vol.Coerce(int), vol.Range(min=0, max=3000) + probatio.Optional("fadeoff", default=0): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=3000) ), - vol.Optional("hue_range"): vol.All( - cv.ensure_list_csv, [vol.Coerce(int)], vol.ExactSequence((HUE, HUE)) + probatio.Optional("hue_range"): probatio.All( + cv.ensure_list_csv, [probatio.Coerce(int)], probatio.ExactSequence((HUE, HUE)) ), - vol.Optional("saturation_range"): vol.All( - cv.ensure_list_csv, [vol.Coerce(int)], vol.ExactSequence((SAT, SAT)) + probatio.Optional("saturation_range"): probatio.All( + cv.ensure_list_csv, [probatio.Coerce(int)], probatio.ExactSequence((SAT, SAT)) ), - vol.Optional("brightness_range"): vol.All( - cv.ensure_list_csv, [vol.Coerce(int)], vol.ExactSequence((VAL, VAL)) + probatio.Optional("brightness_range"): probatio.All( + cv.ensure_list_csv, [probatio.Coerce(int)], probatio.ExactSequence((VAL, VAL)) ), - vol.Optional("transition_range"): vol.All( + probatio.Optional("transition_range"): probatio.All( cv.ensure_list_csv, - [vol.Coerce(int)], - vol.ExactSequence((TRANSITION, TRANSITION)), + [probatio.Coerce(int)], + probatio.ExactSequence((TRANSITION, TRANSITION)), ), - vol.Required("init_states"): vol.All( - cv.ensure_list_csv, [vol.Coerce(int)], HSV_SEQUENCE + probatio.Required("init_states"): probatio.All( + cv.ensure_list_csv, [probatio.Coerce(int)], HSV_SEQUENCE ), - vol.Optional("random_seed", default=100): vol.All( - vol.Coerce(int), vol.Range(min=1, max=600) + probatio.Optional("random_seed", default=100): probatio.All( + probatio.Coerce(int), probatio.Range(min=1, max=600) ), - vol.Optional("backgrounds"): vol.All( + probatio.Optional("backgrounds"): probatio.All( cv.ensure_list, - vol.Length(min=1, max=16), - [vol.All(vol.Coerce(tuple), HSV_SEQUENCE)], + probatio.Length(min=1, max=16), + [probatio.All(probatio.Coerce(tuple), HSV_SEQUENCE)], ), } diff --git a/homeassistant/components/tplink_lte/__init__.py b/homeassistant/components/tplink_lte/__init__.py index 9713a1aa227c5..dcb5ae551daab 100644 --- a/homeassistant/components/tplink_lte/__init__.py +++ b/homeassistant/components/tplink_lte/__init__.py @@ -1,6 +1,6 @@ """The tplink_lte integration.""" -import voluptuous as vol +import probatio from homeassistant.core import HomeAssistant from homeassistant.helpers import config_validation as cv, issue_registry as ir @@ -8,9 +8,9 @@ DOMAIN = "tplink_lte" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( {DOMAIN: cv.match_all}, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/tplink_omada/config_flow.py b/homeassistant/components/tplink_omada/config_flow.py index 499e43b474fda..f29716335d999 100644 --- a/homeassistant/components/tplink_omada/config_flow.py +++ b/homeassistant/components/tplink_omada/config_flow.py @@ -7,6 +7,7 @@ from urllib.parse import urlsplit from aiohttp import CookieJar +import probatio from tplink_omada_client import OmadaClient, OmadaSite from tplink_omada_client.exceptions import ( ConnectionFailed, @@ -14,7 +15,6 @@ OmadaClientException, UnsupportedControllerVersion, ) -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_USERNAME, CONF_VERIFY_SSL @@ -31,12 +31,12 @@ CONF_SITE = "site" -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_VERIFY_SSL, default=True): bool, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_VERIFY_SSL, default=True): bool, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) @@ -132,9 +132,9 @@ async def async_step_site( """Handle step to select site to manage.""" if user_input is None: - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required(CONF_SITE, "site"): selector.SelectSelector( + probatio.Required(CONF_SITE, "site"): selector.SelectSelector( selector.SelectSelectorConfig( options=[ selector.SelectOptionDict(value=s.id, label=s.name) @@ -193,10 +193,10 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, diff --git a/homeassistant/components/tplink_omada/services.py b/homeassistant/components/tplink_omada/services.py index d13a87ec0af4b..abcf0ffe47d5e 100644 --- a/homeassistant/components/tplink_omada/services.py +++ b/homeassistant/components/tplink_omada/services.py @@ -2,9 +2,9 @@ from typing import cast +import probatio from tplink_omada_client import OmadaClientSettings from tplink_omada_client.exceptions import OmadaClientException, RequestFailed -import voluptuous as vol from homeassistant.config_entries import ConfigEntry, ConfigEntryState from homeassistant.const import ATTR_CONFIG_ENTRY_ID, ATTR_DEVICE_ID, ATTR_NAME @@ -172,15 +172,17 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, "set_client_name", _handle_set_client_name, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(ATTR_CONFIG_ENTRY_ID): selector.ConfigEntrySelector( + probatio.Required(ATTR_CONFIG_ENTRY_ID): selector.ConfigEntrySelector( { "integration": DOMAIN, } ), - vol.Required(ATTR_DEVICE_ID): selector.DeviceSelector(), - vol.Required(ATTR_NAME): vol.All(cv.string, vol.Length(min=1)), + probatio.Required(ATTR_DEVICE_ID): selector.DeviceSelector(), + probatio.Required(ATTR_NAME): probatio.All( + cv.string, probatio.Length(min=1) + ), } ), ) @@ -188,14 +190,14 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, "reconnect_client", _handle_reconnect_client, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Optional(ATTR_CONFIG_ENTRY_ID): selector.ConfigEntrySelector( + probatio.Optional(ATTR_CONFIG_ENTRY_ID): selector.ConfigEntrySelector( { "integration": DOMAIN, } ), - vol.Required(ATTR_MAC): cv.string, + probatio.Required(ATTR_MAC): cv.string, } ), ) diff --git a/homeassistant/components/traccar/__init__.py b/homeassistant/components/traccar/__init__.py index 2576196a921d1..85ab2b8a90e0a 100644 --- a/homeassistant/components/traccar/__init__.py +++ b/homeassistant/components/traccar/__init__.py @@ -5,8 +5,8 @@ import logging from aiohttp import web -import voluptuous as vol -from voluptuous.humanize import humanize_error +import probatio +from probatio.humanize import humanize_error from homeassistant.components import webhook from homeassistant.config_entries import ConfigEntry @@ -44,18 +44,22 @@ def _id(value: str) -> str: return value.replace("-", "") -WEBHOOK_SCHEMA = vol.Schema( +WEBHOOK_SCHEMA = probatio.Schema( { - vol.Required(ATTR_ID): vol.All(cv.string, _id), - vol.Required(ATTR_LATITUDE): cv.latitude, - vol.Required(ATTR_LONGITUDE): cv.longitude, - vol.Optional(ATTR_ACCURACY, default=DEFAULT_ACCURACY): vol.Coerce(float), - vol.Optional(ATTR_ALTITUDE): vol.Coerce(float), - vol.Optional(ATTR_BATTERY, default=DEFAULT_BATTERY): vol.Coerce(float), - vol.Optional(ATTR_BEARING): vol.Coerce(float), - vol.Optional(ATTR_SPEED): vol.Coerce(float), + probatio.Required(ATTR_ID): probatio.All(cv.string, _id), + probatio.Required(ATTR_LATITUDE): cv.latitude, + probatio.Required(ATTR_LONGITUDE): cv.longitude, + probatio.Optional(ATTR_ACCURACY, default=DEFAULT_ACCURACY): probatio.Coerce( + float + ), + probatio.Optional(ATTR_ALTITUDE): probatio.Coerce(float), + probatio.Optional(ATTR_BATTERY, default=DEFAULT_BATTERY): probatio.Coerce( + float + ), + probatio.Optional(ATTR_BEARING): probatio.Coerce(float), + probatio.Optional(ATTR_SPEED): probatio.Coerce(float), }, - extra=vol.REMOVE_EXTRA, + extra=probatio.REMOVE_EXTRA, ) @@ -93,7 +97,7 @@ async def handle_webhook( ) try: data = WEBHOOK_SCHEMA(requestdata) - except vol.MultipleInvalid as error: + except probatio.MultipleInvalid as error: LOGGER.warning(humanize_error(requestdata, error)) return web.Response( text=error.error_message, diff --git a/homeassistant/components/traccar_server/config_flow.py b/homeassistant/components/traccar_server/config_flow.py index c3f0623f9e4bd..46bd10cb5838b 100644 --- a/homeassistant/components/traccar_server/config_flow.py +++ b/homeassistant/components/traccar_server/config_flow.py @@ -3,13 +3,13 @@ from collections.abc import Mapping from typing import Any, override +import probatio from pytraccar import ( ApiClient, ServerModel, TraccarAuthenticationException, TraccarException, ) -import voluptuous as vol from homeassistant import config_entries from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -50,19 +50,21 @@ LOGGER, ) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): TextSelector( + probatio.Required(CONF_HOST): TextSelector( TextSelectorConfig(type=TextSelectorType.TEXT) ), - vol.Optional(CONF_PORT, default="8082"): TextSelector( + probatio.Optional(CONF_PORT, default="8082"): TextSelector( TextSelectorConfig(type=TextSelectorType.TEXT) ), - vol.Required(CONF_API_TOKEN): TextSelector( + probatio.Required(CONF_API_TOKEN): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), - vol.Optional(CONF_SSL, default=False): BooleanSelector(BooleanSelectorConfig()), - vol.Optional(CONF_VERIFY_SSL, default=True): BooleanSelector( + probatio.Optional(CONF_SSL, default=False): BooleanSelector( + BooleanSelectorConfig() + ), + probatio.Optional(CONF_VERIFY_SSL, default=True): BooleanSelector( BooleanSelectorConfig() ), } @@ -70,15 +72,15 @@ OPTIONS_FLOW = { "init": SchemaFlowFormStep( - schema=vol.Schema( + schema=probatio.Schema( { - vol.Optional(CONF_MAX_ACCURACY, default=0.0): NumberSelector( + probatio.Optional(CONF_MAX_ACCURACY, default=0.0): NumberSelector( NumberSelectorConfig( mode=NumberSelectorMode.BOX, min=0.0, ) ), - vol.Optional(CONF_CUSTOM_ATTRIBUTES, default=[]): SelectSelector( + probatio.Optional(CONF_CUSTOM_ATTRIBUTES, default=[]): SelectSelector( SelectSelectorConfig( mode=SelectSelectorMode.DROPDOWN, multiple=True, @@ -87,7 +89,9 @@ options=[], ) ), - vol.Optional(CONF_SKIP_ACCURACY_FILTER_FOR, default=[]): SelectSelector( + probatio.Optional( + CONF_SKIP_ACCURACY_FILTER_FOR, default=[] + ): SelectSelector( SelectSelectorConfig( mode=SelectSelectorMode.DROPDOWN, multiple=True, @@ -96,7 +100,7 @@ options=[], ) ), - vol.Optional(CONF_EVENTS, default=[]): SelectSelector( + probatio.Optional(CONF_EVENTS, default=[]): SelectSelector( SelectSelectorConfig( mode=SelectSelectorMode.DROPDOWN, multiple=True, @@ -199,9 +203,9 @@ async def async_step_reauth_confirm( ) return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_API_TOKEN): TextSelector( + probatio.Required(CONF_API_TOKEN): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } diff --git a/homeassistant/components/trace/__init__.py b/homeassistant/components/trace/__init__.py index a0f51ac58a171..7be5d64ca559e 100644 --- a/homeassistant/components/trace/__init__.py +++ b/homeassistant/components/trace/__init__.py @@ -2,7 +2,7 @@ import logging -import voluptuous as vol +import probatio from homeassistant.const import EVENT_HOMEASSISTANT_STOP from homeassistant.core import Event, HomeAssistant @@ -30,7 +30,9 @@ STORAGE_VERSION = 1 TRACE_CONFIG_SCHEMA = { - vol.Optional(CONF_STORED_TRACES, default=DEFAULT_STORED_TRACES): cv.positive_int + probatio.Optional( + CONF_STORED_TRACES, default=DEFAULT_STORED_TRACES + ): cv.positive_int } CONFIG_SCHEMA = cv.empty_config_schema(DOMAIN) diff --git a/homeassistant/components/trace/websocket_api.py b/homeassistant/components/trace/websocket_api.py index d75fff1a46694..7eddc5326601f 100644 --- a/homeassistant/components/trace/websocket_api.py +++ b/homeassistant/components/trace/websocket_api.py @@ -3,7 +3,7 @@ import json from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.core import HomeAssistant, callback @@ -49,10 +49,10 @@ def async_setup(hass: HomeAssistant) -> None: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "trace/get", - vol.Required("domain"): vol.In(TRACE_DOMAINS), - vol.Required("item_id"): str, - vol.Required("run_id"): str, + probatio.Required("type"): "trace/get", + probatio.Required("domain"): probatio.In(TRACE_DOMAINS), + probatio.Required("item_id"): str, + probatio.Required("run_id"): str, } ) @websocket_api.async_response @@ -83,9 +83,9 @@ async def websocket_trace_get( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "trace/list", - vol.Required("domain", "id"): vol.In(TRACE_DOMAINS), - vol.Optional("item_id", "id"): str, + probatio.Required("type"): "trace/list", + probatio.Required("domain", "id"): probatio.In(TRACE_DOMAINS), + probatio.Optional("item_id", "id"): str, } ) @websocket_api.async_response @@ -106,9 +106,9 @@ async def websocket_trace_list( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "trace/contexts", - vol.Inclusive("domain", "id"): vol.In(TRACE_DOMAINS), - vol.Inclusive("item_id", "id"): str, + probatio.Required("type"): "trace/contexts", + probatio.Inclusive("domain", "id"): probatio.In(TRACE_DOMAINS), + probatio.Inclusive("item_id", "id"): str, } ) @websocket_api.async_response @@ -129,11 +129,11 @@ async def websocket_trace_contexts( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "trace/debug/breakpoint/set", - vol.Required("domain"): vol.In(TRACE_DOMAINS), - vol.Required("item_id"): str, - vol.Required("node"): str, - vol.Optional("run_id"): str, + probatio.Required("type"): "trace/debug/breakpoint/set", + probatio.Required("domain"): probatio.In(TRACE_DOMAINS), + probatio.Required("item_id"): str, + probatio.Required("node"): str, + probatio.Optional("run_id"): str, } ) def websocket_breakpoint_set( @@ -160,11 +160,11 @@ def websocket_breakpoint_set( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "trace/debug/breakpoint/clear", - vol.Required("domain"): vol.In(TRACE_DOMAINS), - vol.Required("item_id"): str, - vol.Required("node"): str, - vol.Optional("run_id"): str, + probatio.Required("type"): "trace/debug/breakpoint/clear", + probatio.Required("domain"): probatio.In(TRACE_DOMAINS), + probatio.Required("item_id"): str, + probatio.Required("node"): str, + probatio.Optional("run_id"): str, } ) def websocket_breakpoint_clear( @@ -184,7 +184,9 @@ def websocket_breakpoint_clear( @callback @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required("type"): "trace/debug/breakpoint/list"}) +@websocket_api.websocket_command( + {probatio.Required("type"): "trace/debug/breakpoint/list"} +) def websocket_breakpoint_list( hass: HomeAssistant, connection: websocket_api.ActiveConnection, @@ -202,7 +204,7 @@ def websocket_breakpoint_list( @callback @websocket_api.require_admin @websocket_api.websocket_command( - {vol.Required("type"): "trace/debug/breakpoint/subscribe"} + {probatio.Required("type"): "trace/debug/breakpoint/subscribe"} ) def websocket_subscribe_breakpoint_events( hass: HomeAssistant, @@ -251,10 +253,10 @@ def unsub() -> None: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "trace/debug/continue", - vol.Required("domain"): vol.In(TRACE_DOMAINS), - vol.Required("item_id"): str, - vol.Required("run_id"): str, + probatio.Required("type"): "trace/debug/continue", + probatio.Required("domain"): probatio.In(TRACE_DOMAINS), + probatio.Required("item_id"): str, + probatio.Required("run_id"): str, } ) def websocket_debug_continue( @@ -275,10 +277,10 @@ def websocket_debug_continue( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "trace/debug/step", - vol.Required("domain"): vol.In(TRACE_DOMAINS), - vol.Required("item_id"): str, - vol.Required("run_id"): str, + probatio.Required("type"): "trace/debug/step", + probatio.Required("domain"): probatio.In(TRACE_DOMAINS), + probatio.Required("item_id"): str, + probatio.Required("run_id"): str, } ) def websocket_debug_step( @@ -299,10 +301,10 @@ def websocket_debug_step( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "trace/debug/stop", - vol.Required("domain"): vol.In(TRACE_DOMAINS), - vol.Required("item_id"): str, - vol.Required("run_id"): str, + probatio.Required("type"): "trace/debug/stop", + probatio.Required("domain"): probatio.In(TRACE_DOMAINS), + probatio.Required("item_id"): str, + probatio.Required("run_id"): str, } ) def websocket_debug_stop( diff --git a/homeassistant/components/tractive/config_flow.py b/homeassistant/components/tractive/config_flow.py index 46f3896782fa2..4db0df23e8767 100644 --- a/homeassistant/components/tractive/config_flow.py +++ b/homeassistant/components/tractive/config_flow.py @@ -7,7 +7,7 @@ import aiohttp import aiotractive -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_EMAIL, CONF_PASSWORD @@ -18,8 +18,8 @@ _LOGGER = logging.getLogger(__name__) -USER_DATA_SCHEMA = vol.Schema( - {vol.Required(CONF_EMAIL): str, vol.Required(CONF_PASSWORD): str} +USER_DATA_SCHEMA = probatio.Schema( + {probatio.Required(CONF_EMAIL): str, probatio.Required(CONF_PASSWORD): str} ) diff --git a/homeassistant/components/tradfri/config_flow.py b/homeassistant/components/tradfri/config_flow.py index 67976f88f5cbc..17216134ee5d4 100644 --- a/homeassistant/components/tradfri/config_flow.py +++ b/homeassistant/components/tradfri/config_flow.py @@ -4,9 +4,9 @@ from typing import Any, cast, override from uuid import uuid4 +import probatio from pytradfri import Gateway, RequestError from pytradfri.api.aiocoap_api import APIFactory -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST @@ -69,14 +69,18 @@ async def async_step_auth( fields = {} if self._host is None: - fields[vol.Required(CONF_HOST, default=user_input.get(CONF_HOST))] = str + fields[probatio.Required(CONF_HOST, default=user_input.get(CONF_HOST))] = ( + str + ) fields[ - vol.Required(KEY_SECURITY_CODE, default=user_input.get(KEY_SECURITY_CODE)) + probatio.Required( + KEY_SECURITY_CODE, default=user_input.get(KEY_SECURITY_CODE) + ) ] = str return self.async_show_form( - step_id="auth", data_schema=vol.Schema(fields), errors=errors + step_id="auth", data_schema=probatio.Schema(fields), errors=errors ) @override diff --git a/homeassistant/components/trafikverket_camera/config_flow.py b/homeassistant/components/trafikverket_camera/config_flow.py index d9111272cd533..cb4a9a2343612 100644 --- a/homeassistant/components/trafikverket_camera/config_flow.py +++ b/homeassistant/components/trafikverket_camera/config_flow.py @@ -3,6 +3,7 @@ from collections.abc import Mapping from typing import Any, override +import probatio from pytrafikverket import ( CameraInfoModel, InvalidAuthentication, @@ -10,7 +11,6 @@ TrafikverketCamera, UnknownError, ) -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_RECONFIGURE, @@ -84,9 +84,9 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_API_KEY): TextSelector(), + probatio.Required(CONF_API_KEY): TextSelector(), } ), errors=errors, @@ -120,10 +120,10 @@ async def async_step_reconfigure( ) schema = self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_API_KEY): TextSelector(), - vol.Required(CONF_LOCATION): TextSelector(), + probatio.Required(CONF_API_KEY): TextSelector(), + probatio.Required(CONF_LOCATION): TextSelector(), } ), {**reconfigure_entry.data, **(user_input or {})}, @@ -162,10 +162,10 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_API_KEY): TextSelector(), - vol.Required(CONF_LOCATION): TextSelector(), + probatio.Required(CONF_API_KEY): TextSelector(), + probatio.Required(CONF_LOCATION): TextSelector(), } ), errors=errors, @@ -213,9 +213,9 @@ async def async_step_multiple_cameras( return self.async_show_form( step_id="multiple_cameras", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_ID): SelectSelector( + probatio.Required(CONF_ID): SelectSelector( SelectSelectorConfig( options=camera_choices, mode=SelectSelectorMode.LIST ) diff --git a/homeassistant/components/trafikverket_ferry/config_flow.py b/homeassistant/components/trafikverket_ferry/config_flow.py index a8cf72c2a76a3..b0b38d1733578 100644 --- a/homeassistant/components/trafikverket_ferry/config_flow.py +++ b/homeassistant/components/trafikverket_ferry/config_flow.py @@ -4,9 +4,9 @@ import logging from typing import Any, override +import probatio from pytrafikverket import TrafikverketFerry from pytrafikverket.exceptions import InvalidAuthentication, NoFerryFound -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY, CONF_NAME, CONF_WEEKDAY, WEEKDAYS @@ -18,15 +18,21 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_KEY): selector.TextSelector( + probatio.Required(CONF_API_KEY): selector.TextSelector( selector.TextSelectorConfig() ), - vol.Required(CONF_FROM): selector.TextSelector(selector.TextSelectorConfig()), - vol.Optional(CONF_TO): selector.TextSelector(selector.TextSelectorConfig()), - vol.Optional(CONF_TIME): selector.TimeSelector(selector.TimeSelectorConfig()), - vol.Required(CONF_WEEKDAY, default=WEEKDAYS): selector.SelectSelector( + probatio.Required(CONF_FROM): selector.TextSelector( + selector.TextSelectorConfig() + ), + probatio.Optional(CONF_TO): selector.TextSelector( + selector.TextSelectorConfig() + ), + probatio.Optional(CONF_TIME): selector.TimeSelector( + selector.TimeSelectorConfig() + ), + probatio.Required(CONF_WEEKDAY, default=WEEKDAYS): selector.SelectSelector( selector.SelectSelectorConfig( options=WEEKDAYS, multiple=True, @@ -36,9 +42,9 @@ ), } ) -DATA_SCHEMA_REAUTH = vol.Schema( +DATA_SCHEMA_REAUTH = probatio.Schema( { - vol.Required(CONF_API_KEY): selector.TextSelector( + probatio.Required(CONF_API_KEY): selector.TextSelector( selector.TextSelectorConfig() ), } diff --git a/homeassistant/components/trafikverket_train/config_flow.py b/homeassistant/components/trafikverket_train/config_flow.py index c0629c29558ff..0dfb25d3cbbee 100644 --- a/homeassistant/components/trafikverket_train/config_flow.py +++ b/homeassistant/components/trafikverket_train/config_flow.py @@ -4,6 +4,7 @@ import logging from typing import Any, override +import probatio from pytrafikverket import ( InvalidAuthentication, NoTrainStationFound, @@ -11,7 +12,6 @@ TrafikverketTrain, UnknownError, ) -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_RECONFIGURE, @@ -38,16 +38,16 @@ _LOGGER = logging.getLogger(__name__) OPTION_SCHEMA = { - vol.Optional(CONF_FILTER_PRODUCT, default=""): TextSelector(), + probatio.Optional(CONF_FILTER_PRODUCT, default=""): TextSelector(), } -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_KEY): TextSelector(), - vol.Required(CONF_FROM): TextSelector(), - vol.Required(CONF_TO): TextSelector(), - vol.Optional(CONF_TIME): TimeSelector(), - vol.Required(CONF_WEEKDAY, default=WEEKDAYS): SelectSelector( + probatio.Required(CONF_API_KEY): TextSelector(), + probatio.Required(CONF_FROM): TextSelector(), + probatio.Required(CONF_TO): TextSelector(), + probatio.Optional(CONF_TIME): TimeSelector(), + probatio.Required(CONF_WEEKDAY, default=WEEKDAYS): SelectSelector( SelectSelectorConfig( options=WEEKDAYS, multiple=True, @@ -57,9 +57,9 @@ ), } ).extend(OPTION_SCHEMA) -DATA_SCHEMA_REAUTH = vol.Schema( +DATA_SCHEMA_REAUTH = probatio.Schema( { - vol.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_API_KEY): cv.string, } ) @@ -309,13 +309,13 @@ async def async_step_select_stations( ] schema = {} if len(from_options) > 1: - schema[vol.Required(CONF_FROM)] = SelectSelector( + schema[probatio.Required(CONF_FROM)] = SelectSelector( SelectSelectorConfig( options=from_options, mode=SelectSelectorMode.DROPDOWN, sort=True ) ) if len(to_options) > 1: - schema[vol.Required(CONF_TO)] = SelectSelector( + schema[probatio.Required(CONF_TO)] = SelectSelector( SelectSelectorConfig( options=to_options, mode=SelectSelectorMode.DROPDOWN, sort=True ) @@ -324,7 +324,7 @@ async def async_step_select_stations( return self.async_show_form( step_id="select_stations", data_schema=self.add_suggested_values_to_schema( - vol.Schema(schema), user_input or {} + probatio.Schema(schema), user_input or {} ), ) @@ -346,7 +346,7 @@ async def async_step_init( return self.async_show_form( step_id="init", data_schema=self.add_suggested_values_to_schema( - vol.Schema(OPTION_SCHEMA), + probatio.Schema(OPTION_SCHEMA), user_input or self.config_entry.options, ), errors=errors, diff --git a/homeassistant/components/trafikverket_weatherstation/config_flow.py b/homeassistant/components/trafikverket_weatherstation/config_flow.py index f930059b7dadc..f2634969c7ff0 100644 --- a/homeassistant/components/trafikverket_weatherstation/config_flow.py +++ b/homeassistant/components/trafikverket_weatherstation/config_flow.py @@ -4,13 +4,13 @@ import logging from typing import Any, override +import probatio from pytrafikverket.exceptions import ( InvalidAuthentication, MultipleWeatherStationsFound, NoWeatherStationFound, ) from pytrafikverket.trafikverket_weather import TrafikverketWeather -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY @@ -72,10 +72,10 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_API_KEY): cv.string, - vol.Required(CONF_STATION): cv.string, + probatio.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_STATION): cv.string, } ), errors=errors, @@ -115,7 +115,7 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema({vol.Required(CONF_API_KEY): cv.string}), + data_schema=probatio.Schema({probatio.Required(CONF_API_KEY): cv.string}), errors=errors, ) @@ -147,12 +147,12 @@ async def async_step_reconfigure( ) schema = self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_API_KEY): TextSelector( + probatio.Required(CONF_API_KEY): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), - vol.Required(CONF_STATION): TextSelector(), + probatio.Required(CONF_STATION): TextSelector(), } ), {**self._get_reconfigure_entry().data, **(user_input or {})}, diff --git a/homeassistant/components/trane/config_flow.py b/homeassistant/components/trane/config_flow.py index a5acf1c514abd..e4f0bea0a961c 100644 --- a/homeassistant/components/trane/config_flow.py +++ b/homeassistant/components/trane/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from steamloop import PairingError, SteamloopConnectionError, ThermostatConnection -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST @@ -13,9 +13,9 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, + probatio.Required(CONF_HOST): str, } ) diff --git a/homeassistant/components/transmission/config_flow.py b/homeassistant/components/transmission/config_flow.py index 8ec904a778372..f995f8c7d16fe 100644 --- a/homeassistant/components/transmission/config_flow.py +++ b/homeassistant/components/transmission/config_flow.py @@ -3,12 +3,12 @@ from collections.abc import Mapping from typing import Any, override +import probatio from transmission_rpc.error import ( TransmissionAuthError, TransmissionConnectError, TransmissionError, ) -import voluptuous as vol from homeassistant.config_entries import ( ConfigEntry, @@ -43,14 +43,14 @@ ) from .helpers import create_version -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Optional(CONF_SSL, default=DEFAULT_SSL): bool, - vol.Required(CONF_HOST): str, - vol.Required(CONF_PATH, default=DEFAULT_PATH): str, - vol.Optional(CONF_USERNAME): str, - vol.Optional(CONF_PASSWORD): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Optional(CONF_SSL, default=DEFAULT_SSL): bool, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PATH, default=DEFAULT_PATH): str, + probatio.Optional(CONF_USERNAME): str, + probatio.Optional(CONF_PASSWORD): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, } ) @@ -142,9 +142,9 @@ async def async_step_reauth_confirm( CONF_NAME: reauth_entry.title, }, step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, @@ -162,14 +162,18 @@ async def async_step_init( return self.async_create_entry(title="", data=user_input) options = { - vol.Optional( + probatio.Optional( CONF_LIMIT, default=self.config_entry.options.get(CONF_LIMIT, DEFAULT_LIMIT), - ): vol.All(vol.Coerce(int), vol.Range(min=1, max=500)), - vol.Optional( + ): probatio.All(probatio.Coerce(int), probatio.Range(min=1, max=500)), + probatio.Optional( CONF_ORDER, default=self.config_entry.options.get(CONF_ORDER, DEFAULT_ORDER), - ): vol.All(vol.Coerce(str), vol.In(SUPPORTED_ORDER_MODES.keys())), + ): probatio.All( + probatio.Coerce(str), probatio.In(SUPPORTED_ORDER_MODES.keys()) + ), } - return self.async_show_form(step_id="init", data_schema=vol.Schema(options)) + return self.async_show_form( + step_id="init", data_schema=probatio.Schema(options) + ) diff --git a/homeassistant/components/transmission/services.py b/homeassistant/components/transmission/services.py index 3be3c38a794c2..fa4a5dbeedec3 100644 --- a/homeassistant/components/transmission/services.py +++ b/homeassistant/components/transmission/services.py @@ -5,8 +5,8 @@ import logging from typing import Any +import probatio from transmission_rpc import Torrent -import voluptuous as vol from homeassistant.const import CONF_ID from homeassistant.core import HomeAssistant, ServiceCall, SupportsResponse, callback @@ -46,51 +46,53 @@ class TorrentFilter(StrEnum): ACTIVE = "active" -SERVICE_BASE_SCHEMA = vol.Schema( +SERVICE_BASE_SCHEMA = probatio.Schema( { - vol.Required(CONF_ENTRY_ID): selector.ConfigEntrySelector( + probatio.Required(CONF_ENTRY_ID): selector.ConfigEntrySelector( {"integration": DOMAIN} ), } ) -SERVICE_ADD_TORRENT_SCHEMA = vol.All( +SERVICE_ADD_TORRENT_SCHEMA = probatio.All( SERVICE_BASE_SCHEMA.extend( { - vol.Required(ATTR_TORRENT): cv.string, - vol.Optional(ATTR_DOWNLOAD_PATH): cv.string, - vol.Optional(ATTR_LABELS): cv.string, + probatio.Required(ATTR_TORRENT): cv.string, + probatio.Optional(ATTR_DOWNLOAD_PATH): cv.string, + probatio.Optional(ATTR_LABELS): cv.string, } ), ) -SERVICE_GET_TORRENTS_SCHEMA = vol.All( +SERVICE_GET_TORRENTS_SCHEMA = probatio.All( SERVICE_BASE_SCHEMA.extend( { - vol.Required(ATTR_TORRENT_FILTER): vol.In( + probatio.Required(ATTR_TORRENT_FILTER): probatio.In( [x.lower() for x in TorrentFilter] ), } ), ) -SERVICE_REMOVE_TORRENT_SCHEMA = vol.All( +SERVICE_REMOVE_TORRENT_SCHEMA = probatio.All( SERVICE_BASE_SCHEMA.extend( { - vol.Required(CONF_ID): cv.positive_int, - vol.Optional(ATTR_DELETE_DATA, default=DEFAULT_DELETE_DATA): cv.boolean, + probatio.Required(CONF_ID): cv.positive_int, + probatio.Optional( + ATTR_DELETE_DATA, default=DEFAULT_DELETE_DATA + ): cv.boolean, } ) ) -SERVICE_START_TORRENT_SCHEMA = vol.All( - SERVICE_BASE_SCHEMA.extend({vol.Required(CONF_ID): cv.positive_int}), +SERVICE_START_TORRENT_SCHEMA = probatio.All( + SERVICE_BASE_SCHEMA.extend({probatio.Required(CONF_ID): cv.positive_int}), ) -SERVICE_STOP_TORRENT_SCHEMA = vol.All( +SERVICE_STOP_TORRENT_SCHEMA = probatio.All( SERVICE_BASE_SCHEMA.extend( { - vol.Required(CONF_ID): cv.positive_int, + probatio.Required(CONF_ID): cv.positive_int, } ) ) diff --git a/homeassistant/components/transport_nsw/sensor.py b/homeassistant/components/transport_nsw/sensor.py index ea7690bf72267..af20cf9c1b772 100644 --- a/homeassistant/components/transport_nsw/sensor.py +++ b/homeassistant/components/transport_nsw/sensor.py @@ -3,8 +3,8 @@ from datetime import timedelta from typing import Any, override +import probatio from TransportNSW import TransportNSW -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -45,11 +45,11 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_STOP_ID): cv.string, - vol.Required(CONF_API_KEY): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_ROUTE, default=""): cv.string, - vol.Optional(CONF_DESTINATION, default=""): cv.string, + probatio.Required(CONF_STOP_ID): cv.string, + probatio.Required(CONF_API_KEY): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_ROUTE, default=""): cv.string, + probatio.Optional(CONF_DESTINATION, default=""): cv.string, } ) diff --git a/homeassistant/components/travisci/sensor.py b/homeassistant/components/travisci/sensor.py index a224b2a9fd6a1..206bd56d82e42 100644 --- a/homeassistant/components/travisci/sensor.py +++ b/homeassistant/components/travisci/sensor.py @@ -4,9 +4,9 @@ import logging from typing import Any, override +import probatio from travispy import TravisPy from travispy.errors import TravisError -import voluptuous as vol from homeassistant.components import persistent_notification from homeassistant.components.sensor import ( @@ -75,13 +75,15 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_API_KEY): cv.string, - vol.Required(CONF_MONITORED_CONDITIONS, default=SENSOR_KEYS): vol.All( - cv.ensure_list, [vol.In(SENSOR_KEYS)] + probatio.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_MONITORED_CONDITIONS, default=SENSOR_KEYS): probatio.All( + cv.ensure_list, [probatio.In(SENSOR_KEYS)] ), - vol.Required(CONF_BRANCH, default=DEFAULT_BRANCH_NAME): cv.string, - vol.Optional(CONF_REPOSITORY, default=[]): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(CONF_SCAN_INTERVAL, default=SCAN_INTERVAL): cv.time_period, + probatio.Required(CONF_BRANCH, default=DEFAULT_BRANCH_NAME): cv.string, + probatio.Optional(CONF_REPOSITORY, default=[]): probatio.All( + cv.ensure_list, [cv.string] + ), + probatio.Optional(CONF_SCAN_INTERVAL, default=SCAN_INTERVAL): cv.time_period, } ) diff --git a/homeassistant/components/trend/binary_sensor.py b/homeassistant/components/trend/binary_sensor.py index 24ec146966f3e..b2534ffc6038f 100644 --- a/homeassistant/components/trend/binary_sensor.py +++ b/homeassistant/components/trend/binary_sensor.py @@ -7,7 +7,7 @@ from typing import Any, override import numpy as np -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import ( DEVICE_CLASSES_SCHEMA, @@ -72,30 +72,32 @@ def _validate_min_max(data: dict[str, Any]) -> dict[str, Any]: and CONF_MAX_SAMPLES in data and data[CONF_MAX_SAMPLES] < data[CONF_MIN_SAMPLES] ): - raise vol.Invalid("min_samples must be smaller than or equal to max_samples") + raise probatio.Invalid( + "min_samples must be smaller than or equal to max_samples" + ) return data -SENSOR_SCHEMA = vol.All( - vol.Schema( +SENSOR_SCHEMA = probatio.All( + probatio.Schema( { - vol.Required(CONF_ENTITY_ID): cv.entity_id, - vol.Optional(CONF_ATTRIBUTE): cv.string, - vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, - vol.Optional(CONF_FRIENDLY_NAME): cv.string, - vol.Optional(CONF_INVERT, default=False): cv.boolean, - vol.Optional(CONF_MAX_SAMPLES, default=2): cv.positive_int, - vol.Optional(CONF_MIN_GRADIENT, default=0.0): vol.Coerce(float), - vol.Optional(CONF_SAMPLE_DURATION, default=0): cv.positive_int, - vol.Optional(CONF_MIN_SAMPLES, default=2): cv.positive_int, - vol.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Required(CONF_ENTITY_ID): cv.entity_id, + probatio.Optional(CONF_ATTRIBUTE): cv.string, + probatio.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_FRIENDLY_NAME): cv.string, + probatio.Optional(CONF_INVERT, default=False): cv.boolean, + probatio.Optional(CONF_MAX_SAMPLES, default=2): cv.positive_int, + probatio.Optional(CONF_MIN_GRADIENT, default=0.0): probatio.Coerce(float), + probatio.Optional(CONF_SAMPLE_DURATION, default=0): cv.positive_int, + probatio.Optional(CONF_MIN_SAMPLES, default=2): cv.positive_int, + probatio.Optional(CONF_UNIQUE_ID): cv.string, } ), _validate_min_max, ) PLATFORM_SCHEMA = BINARY_SENSOR_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_SENSORS): cv.schema_with_slug_keys(SENSOR_SCHEMA)} + {probatio.Required(CONF_SENSORS): cv.schema_with_slug_keys(SENSOR_SCHEMA)} ) diff --git a/homeassistant/components/trend/config_flow.py b/homeassistant/components/trend/config_flow.py index 2339013dcb5fb..06bf11cff56bc 100644 --- a/homeassistant/components/trend/config_flow.py +++ b/homeassistant/components/trend/config_flow.py @@ -3,7 +3,7 @@ from collections.abc import Mapping from typing import Any, cast, override -import voluptuous as vol +import probatio from homeassistant.components.counter import DOMAIN as COUNTER_DOMAIN from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN @@ -31,28 +31,30 @@ ALLOWED_DOMAINS = [COUNTER_DOMAIN, SENSOR_DOMAIN] -async def get_base_options_schema(handler: SchemaCommonFlowHandler) -> vol.Schema: +async def get_base_options_schema(handler: SchemaCommonFlowHandler) -> probatio.Schema: """Get base options schema.""" - return vol.Schema( + return probatio.Schema( { - vol.Optional(CONF_ENTITY_ID): selector.EntitySelector( + probatio.Optional(CONF_ENTITY_ID): selector.EntitySelector( selector.EntitySelectorConfig(multiple=False, read_only=True), ), - vol.Optional(CONF_ATTRIBUTE): selector.AttributeSelector( + probatio.Optional(CONF_ATTRIBUTE): selector.AttributeSelector( selector.AttributeSelectorConfig( entity_id=handler.options[CONF_ENTITY_ID] ) ), - vol.Optional(CONF_INVERT, default=False): selector.BooleanSelector(), + probatio.Optional(CONF_INVERT, default=False): selector.BooleanSelector(), } ) -async def get_extended_options_schema(handler: SchemaCommonFlowHandler) -> vol.Schema: +async def get_extended_options_schema( + handler: SchemaCommonFlowHandler, +) -> probatio.Schema: """Get extended options schema.""" return (await get_base_options_schema(handler)).extend( { - vol.Optional( + probatio.Optional( CONF_MAX_SAMPLES, default=DEFAULT_MAX_SAMPLES ): selector.NumberSelector( selector.NumberSelectorConfig( @@ -60,7 +62,7 @@ async def get_extended_options_schema(handler: SchemaCommonFlowHandler) -> vol.S mode=selector.NumberSelectorMode.BOX, ), ), - vol.Optional( + probatio.Optional( CONF_MIN_SAMPLES, default=DEFAULT_MIN_SAMPLES ): selector.NumberSelector( selector.NumberSelectorConfig( @@ -68,7 +70,7 @@ async def get_extended_options_schema(handler: SchemaCommonFlowHandler) -> vol.S mode=selector.NumberSelectorMode.BOX, ), ), - vol.Optional( + probatio.Optional( CONF_MIN_GRADIENT, default=DEFAULT_MIN_GRADIENT ): selector.NumberSelector( selector.NumberSelectorConfig( @@ -76,7 +78,7 @@ async def get_extended_options_schema(handler: SchemaCommonFlowHandler) -> vol.S mode=selector.NumberSelectorMode.BOX, ), ), - vol.Optional( + probatio.Optional( CONF_SAMPLE_DURATION, default=DEFAULT_SAMPLE_DURATION ): selector.NumberSelector( selector.NumberSelectorConfig( @@ -89,10 +91,10 @@ async def get_extended_options_schema(handler: SchemaCommonFlowHandler) -> vol.S ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Required(CONF_NAME): selector.TextSelector(), - vol.Required(CONF_ENTITY_ID): selector.EntitySelector( + probatio.Required(CONF_NAME): selector.TextSelector(), + probatio.Required(CONF_ENTITY_ID): selector.EntitySelector( selector.EntitySelectorConfig(domain=ALLOWED_DOMAINS, multiple=False), ), } diff --git a/homeassistant/components/triggercmd/config_flow.py b/homeassistant/components/triggercmd/config_flow.py index 3629f71b821fe..45753882d477e 100644 --- a/homeassistant/components/triggercmd/config_flow.py +++ b/homeassistant/components/triggercmd/config_flow.py @@ -4,8 +4,8 @@ from typing import Any, override import jwt +import probatio from triggercmd import TRIGGERcmdConnectionError, client -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_TOKEN @@ -17,7 +17,7 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema({(CONF_TOKEN): str}) +DATA_SCHEMA = probatio.Schema({(CONF_TOKEN): str}) async def validate_input(hass: HomeAssistant, data: dict) -> str: diff --git a/homeassistant/components/trmnl/config_flow.py b/homeassistant/components/trmnl/config_flow.py index e9f0a400f3bb6..a095e52a5a3a9 100644 --- a/homeassistant/components/trmnl/config_flow.py +++ b/homeassistant/components/trmnl/config_flow.py @@ -3,9 +3,9 @@ from collections.abc import Mapping from typing import Any, override +import probatio from trmnl import TRMNLClient from trmnl.exceptions import TRMNLAuthenticationError, TRMNLError -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -18,7 +18,7 @@ from .const import DOMAIN, LOGGER -STEP_USER_SCHEMA = vol.Schema({vol.Required(CONF_API_KEY): str}) +STEP_USER_SCHEMA = probatio.Schema({probatio.Required(CONF_API_KEY): str}) TRMNL_ACCOUNT_URL = "https://trmnl.com/account" diff --git a/homeassistant/components/tts/__init__.py b/homeassistant/components/tts/__init__.py index 7556369d1ad1e..5e556e62c85b1 100644 --- a/homeassistant/components/tts/__init__.py +++ b/homeassistant/components/tts/__init__.py @@ -19,8 +19,8 @@ from aiohttp import web import mutagen from mutagen.id3 import ID3, TextFrame as ID3Text +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.components import ffmpeg, websocket_api from homeassistant.components.http import HomeAssistantView @@ -125,7 +125,7 @@ ) KEY_PATTERN = "{0}_{1}_{2}_{3}" -SCHEMA_SERVICE_CLEAR_CACHE = vol.Schema({}) +SCHEMA_SERVICE_CLEAR_CACHE = probatio.Schema({}) FFMPEG_CHUNK_SIZE: Final[int] = 4096 @@ -448,11 +448,11 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: component.async_register_entity_service( "speak", { - vol.Required(ATTR_MEDIA_PLAYER_ENTITY_ID): cv.comp_entity_ids, - vol.Required(ATTR_MESSAGE): cv.string, - vol.Optional(ATTR_CACHE, default=DEFAULT_CACHE): cv.boolean, - vol.Optional(ATTR_LANGUAGE): cv.string, - vol.Optional(ATTR_OPTIONS): dict, + probatio.Required(ATTR_MEDIA_PLAYER_ENTITY_ID): cv.comp_entity_ids, + probatio.Required(ATTR_MESSAGE): cv.string, + probatio.Optional(ATTR_CACHE, default=DEFAULT_CACHE): cv.boolean, + probatio.Optional(ATTR_LANGUAGE): cv.string, + probatio.Optional(ATTR_OPTIONS): dict, }, "async_speak", ) @@ -1375,8 +1375,8 @@ async def get(self, request: web.Request, token: str) -> web.StreamResponse: @websocket_api.websocket_command( { "type": "tts/engine/list", - vol.Optional("country"): str, - vol.Optional("language"): str, + probatio.Optional("country"): str, + probatio.Optional("language"): str, } ) @callback @@ -1427,7 +1427,7 @@ def websocket_list_engines( @websocket_api.websocket_command( { "type": "tts/engine/get", - vol.Required("engine_id"): str, + probatio.Required("engine_id"): str, } ) @callback @@ -1472,8 +1472,8 @@ def websocket_get_engine( @websocket_api.websocket_command( { "type": "tts/engine/voices", - vol.Required("engine_id"): str, - vol.Required("language"): str, + probatio.Required("engine_id"): str, + probatio.Required("language"): str, } ) @callback diff --git a/homeassistant/components/tts/legacy.py b/homeassistant/components/tts/legacy.py index a9d79e2a16a23..4f2a50171da23 100644 --- a/homeassistant/components/tts/legacy.py +++ b/homeassistant/components/tts/legacy.py @@ -7,7 +7,7 @@ from pathlib import Path from typing import TYPE_CHECKING, Any, final -import voluptuous as vol +import probatio from homeassistant.components.media_player import ( ATTR_MEDIA_ANNOUNCE, @@ -62,7 +62,7 @@ def _deprecated_platform(value: str) -> str: """Validate if platform is deprecated.""" if value == "google": - raise vol.Invalid( + raise probatio.Invalid( "google tts service has been renamed to google_translate," " please update your configuration." ) @@ -71,26 +71,26 @@ def _deprecated_platform(value: str) -> str: PLATFORM_SCHEMA = cv.PLATFORM_SCHEMA.extend( { - vol.Required(CONF_PLATFORM): vol.All(cv.string, _deprecated_platform), - vol.Optional(CONF_CACHE, default=DEFAULT_CACHE): cv.boolean, - vol.Optional(CONF_CACHE_DIR, default=DEFAULT_CACHE_DIR): cv.string, - vol.Optional(CONF_TIME_MEMORY, default=DEFAULT_TIME_MEMORY): vol.All( - vol.Coerce(int), vol.Range(min=60, max=57600) + probatio.Required(CONF_PLATFORM): probatio.All(cv.string, _deprecated_platform), + probatio.Optional(CONF_CACHE, default=DEFAULT_CACHE): cv.boolean, + probatio.Optional(CONF_CACHE_DIR, default=DEFAULT_CACHE_DIR): cv.string, + probatio.Optional(CONF_TIME_MEMORY, default=DEFAULT_TIME_MEMORY): probatio.All( + probatio.Coerce(int), probatio.Range(min=60, max=57600) ), - vol.Optional(CONF_SERVICE_NAME): cv.string, + probatio.Optional(CONF_SERVICE_NAME): cv.string, } ) PLATFORM_SCHEMA_BASE = cv.PLATFORM_SCHEMA_BASE.extend(PLATFORM_SCHEMA.schema) SERVICE_SAY = "say" -SCHEMA_SERVICE_SAY = vol.Schema( +SCHEMA_SERVICE_SAY = probatio.Schema( { - vol.Required(ATTR_MESSAGE): cv.string, - vol.Optional(ATTR_CACHE): cv.boolean, - vol.Required(ATTR_ENTITY_ID): cv.comp_entity_ids, - vol.Optional(ATTR_LANGUAGE): cv.string, - vol.Optional(ATTR_OPTIONS): dict, + probatio.Required(ATTR_MESSAGE): cv.string, + probatio.Optional(ATTR_CACHE): cv.boolean, + probatio.Required(ATTR_ENTITY_ID): cv.comp_entity_ids, + probatio.Optional(ATTR_LANGUAGE): cv.string, + probatio.Optional(ATTR_OPTIONS): dict, } ) diff --git a/homeassistant/components/tts/notify.py b/homeassistant/components/tts/notify.py index cf182a092a039..de17ab9583a4e 100644 --- a/homeassistant/components/tts/notify.py +++ b/homeassistant/components/tts/notify.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.notify import ( PLATFORM_SCHEMA as NOTIFY_PLATFORM_SCHEMA, @@ -22,17 +22,19 @@ _LOGGER = logging.getLogger(__name__) -PLATFORM_SCHEMA = vol.All( +PLATFORM_SCHEMA = probatio.All( cv.has_at_least_one_key(CONF_TTS_SERVICE, CONF_ENTITY_ID), NOTIFY_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_NAME): cv.string, - vol.Exclusive(CONF_TTS_SERVICE, ENTITY_LEGACY_PROVIDER_GROUP): cv.entity_id, - vol.Exclusive( + probatio.Required(CONF_NAME): cv.string, + probatio.Exclusive( + CONF_TTS_SERVICE, ENTITY_LEGACY_PROVIDER_GROUP + ): cv.entity_id, + probatio.Exclusive( CONF_ENTITY_ID, ENTITY_LEGACY_PROVIDER_GROUP ): cv.entities_domain(DOMAIN), - vol.Required(CONF_MEDIA_PLAYER): cv.entity_id, - vol.Optional(ATTR_LANGUAGE): cv.string, + probatio.Required(CONF_MEDIA_PLAYER): cv.entity_id, + probatio.Optional(ATTR_LANGUAGE): cv.string, } ), ) diff --git a/homeassistant/components/tuya/config_flow.py b/homeassistant/components/tuya/config_flow.py index 7c4985c0df3fe..678bf17d1a3e0 100644 --- a/homeassistant/components/tuya/config_flow.py +++ b/homeassistant/components/tuya/config_flow.py @@ -3,8 +3,8 @@ from collections.abc import Mapping from typing import Any, override +import probatio from tuya_sharing import LoginControl -import voluptuous as vol from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult from homeassistant.helpers import selector @@ -60,9 +60,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_USER_CODE, default=user_input.get(CONF_USER_CODE, "") ): str, } @@ -78,9 +78,9 @@ async def async_step_scan( if user_input is None: return self.async_show_form( step_id="scan", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional("QR"): selector.QrCodeSelector( + probatio.Optional("QR"): selector.QrCodeSelector( config=selector.QrCodeSelectorConfig( data=f"tuyaSmart--qrLogin?token={self.__qr_code}", scale=5, @@ -103,9 +103,9 @@ async def async_step_scan( return self.async_show_form( step_id="scan", errors={"base": "login_error"}, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional("QR"): selector.QrCodeSelector( + probatio.Optional("QR"): selector.QrCodeSelector( config=selector.QrCodeSelectorConfig( data=f"tuyaSmart--qrLogin?token={self.__qr_code}", scale=5, @@ -179,9 +179,9 @@ async def async_step_reauth_user_code( return self.async_show_form( step_id="reauth_user_code", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_USER_CODE, default=user_input.get(CONF_USER_CODE, "") ): str, } diff --git a/homeassistant/components/tuya/services.py b/homeassistant/components/tuya/services.py index 0a6bfa61968fc..4536737a27002 100644 --- a/homeassistant/components/tuya/services.py +++ b/homeassistant/components/tuya/services.py @@ -3,12 +3,12 @@ from enum import StrEnum from typing import Any +import probatio from tuya_device_handlers.device_wrapper.service_feeder_schedule import ( FeederSchedule, get_feeder_schedule_wrapper, ) from tuya_sharing import CustomerDevice, Manager -import voluptuous as vol from homeassistant.const import ATTR_DEVICE_ID from homeassistant.core import HomeAssistant, ServiceCall, SupportsResponse, callback @@ -19,12 +19,12 @@ DAYS = ["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"] -FEEDING_ENTRY_SCHEMA = vol.Schema( +FEEDING_ENTRY_SCHEMA = probatio.Schema( { - vol.Optional("days"): [vol.In(DAYS)], - vol.Required("time"): str, - vol.Required("portion"): int, - vol.Required("enabled"): bool, + probatio.Optional("days"): [probatio.In(DAYS)], + probatio.Required("time"): str, + probatio.Required("portion"): int, + probatio.Required("enabled"): bool, } ) @@ -137,9 +137,9 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, Service.GET_FEEDER_MEAL_PLAN, async_get_feeder_meal_plan, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): str, + probatio.Required(ATTR_DEVICE_ID): str, } ), supports_response=SupportsResponse.ONLY, @@ -149,10 +149,10 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, Service.SET_FEEDER_MEAL_PLAN, async_set_feeder_meal_plan, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): str, - vol.Required("meal_plan"): vol.All( + probatio.Required(ATTR_DEVICE_ID): str, + probatio.Required("meal_plan"): probatio.All( list, [FEEDING_ENTRY_SCHEMA], ), diff --git a/homeassistant/components/twentemilieu/config_flow.py b/homeassistant/components/twentemilieu/config_flow.py index 364925e79957d..17238b62ef101 100644 --- a/homeassistant/components/twentemilieu/config_flow.py +++ b/homeassistant/components/twentemilieu/config_flow.py @@ -2,12 +2,12 @@ from typing import Any, override +import probatio from twentemilieu import ( TwenteMilieu, TwenteMilieuAddressError, TwenteMilieuConnectionError, ) -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_ID @@ -27,11 +27,11 @@ async def _show_setup_form( """Show the setup form to the user.""" return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_POST_CODE): str, - vol.Required(CONF_HOUSE_NUMBER): str, - vol.Optional(CONF_HOUSE_LETTER): str, + probatio.Required(CONF_POST_CODE): str, + probatio.Required(CONF_HOUSE_NUMBER): str, + probatio.Optional(CONF_HOUSE_LETTER): str, } ), errors=errors or {}, diff --git a/homeassistant/components/twilio/__init__.py b/homeassistant/components/twilio/__init__.py index 7ed65bdd54b67..4c1a94e80b8d0 100644 --- a/homeassistant/components/twilio/__init__.py +++ b/homeassistant/components/twilio/__init__.py @@ -1,8 +1,8 @@ """Support for Twilio.""" from aiohttp import web +import probatio from twilio.rest import Client -import voluptuous as vol from homeassistant.components import webhook from homeassistant.config_entries import ConfigEntry @@ -20,16 +20,16 @@ RECEIVED_DATA = f"{DOMAIN}_data_received" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Optional(DOMAIN): vol.Schema( + probatio.Optional(DOMAIN): probatio.Schema( { - vol.Required(CONF_ACCOUNT_SID): cv.string, - vol.Required(CONF_AUTH_TOKEN): cv.string, + probatio.Required(CONF_ACCOUNT_SID): cv.string, + probatio.Required(CONF_AUTH_TOKEN): cv.string, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/twilio_call/notify.py b/homeassistant/components/twilio_call/notify.py index 7b6bb7ba32e10..a1686d1c4c534 100644 --- a/homeassistant/components/twilio_call/notify.py +++ b/homeassistant/components/twilio_call/notify.py @@ -4,8 +4,8 @@ from typing import Any, override import urllib +import probatio from twilio.base.exceptions import TwilioRestException -import voluptuous as vol from homeassistant.components.notify import ( ATTR_TARGET, @@ -23,8 +23,8 @@ PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_FROM_NUMBER): vol.All( - cv.string, vol.Match(r"^\+?[1-9]\d{1,14}$") + probatio.Required(CONF_FROM_NUMBER): probatio.All( + cv.string, probatio.Match(r"^\+?[1-9]\d{1,14}$") ) } ) diff --git a/homeassistant/components/twilio_sms/notify.py b/homeassistant/components/twilio_sms/notify.py index 6a17c667ea0e1..19895b01fa7c9 100644 --- a/homeassistant/components/twilio_sms/notify.py +++ b/homeassistant/components/twilio_sms/notify.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.notify import ( ATTR_DATA, @@ -23,9 +23,9 @@ PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_FROM_NUMBER): vol.All( + probatio.Required(CONF_FROM_NUMBER): probatio.All( cv.string, - vol.Match( + probatio.Match( r"^\+?[1-9]\d{1,14}$|" r"^(?=.{1,11}$)[a-zA-Z0-9\s]*" r"[a-zA-Z][a-zA-Z0-9\s]*$" diff --git a/homeassistant/components/twinkly/config_flow.py b/homeassistant/components/twinkly/config_flow.py index ecc293880a8f3..2c6e79f297f1a 100644 --- a/homeassistant/components/twinkly/config_flow.py +++ b/homeassistant/components/twinkly/config_flow.py @@ -4,8 +4,8 @@ from typing import Any, override from aiohttp import ClientError +from probatio import Required, Schema from ttls.client import Twinkly -from voluptuous import Required, Schema from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_ID, CONF_MODEL, CONF_NAME diff --git a/homeassistant/components/twitter/notify.py b/homeassistant/components/twitter/notify.py index 69a9280803f85..6d220daa7019b 100644 --- a/homeassistant/components/twitter/notify.py +++ b/homeassistant/components/twitter/notify.py @@ -9,8 +9,8 @@ import os from typing import Any, override +import probatio from TwitterAPI import TwitterAPI -import voluptuous as vol from homeassistant.components.notify import ( ATTR_DATA, @@ -35,11 +35,11 @@ PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_ACCESS_TOKEN): cv.string, - vol.Required(CONF_ACCESS_TOKEN_SECRET): cv.string, - vol.Required(CONF_CONSUMER_KEY): cv.string, - vol.Required(CONF_CONSUMER_SECRET): cv.string, - vol.Optional(CONF_USERNAME): cv.string, + probatio.Required(CONF_ACCESS_TOKEN): cv.string, + probatio.Required(CONF_ACCESS_TOKEN_SECRET): cv.string, + probatio.Required(CONF_CONSUMER_KEY): cv.string, + probatio.Required(CONF_CONSUMER_SECRET): cv.string, + probatio.Optional(CONF_USERNAME): cv.string, } ) diff --git a/homeassistant/components/ubus/device_tracker.py b/homeassistant/components/ubus/device_tracker.py index a5d018d01ccd8..c4417a4dbad35 100644 --- a/homeassistant/components/ubus/device_tracker.py +++ b/homeassistant/components/ubus/device_tracker.py @@ -5,7 +5,7 @@ from typing import override from openwrt.ubus import Ubus -import voluptuous as vol +import probatio from homeassistant.components.device_tracker import ( DOMAIN as DEVICE_TRACKER_DOMAIN, @@ -25,12 +25,12 @@ PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Required(CONF_USERNAME): cv.string, - vol.Optional(CONF_DHCP_SOFTWARE, default=DEFAULT_DHCP_SOFTWARE): vol.In( - DHCP_SOFTWARES - ), + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Optional( + CONF_DHCP_SOFTWARE, default=DEFAULT_DHCP_SOFTWARE + ): probatio.In(DHCP_SOFTWARES), } ) diff --git a/homeassistant/components/uhoo/config_flow.py b/homeassistant/components/uhoo/config_flow.py index 581864a611415..2c6d04d795a93 100644 --- a/homeassistant/components/uhoo/config_flow.py +++ b/homeassistant/components/uhoo/config_flow.py @@ -3,9 +3,9 @@ from collections.abc import Mapping from typing import Any, override +import probatio from uhooapi import Client from uhooapi.errors import ForbiddenError, UhooError, UnauthorizedError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY @@ -18,9 +18,9 @@ from .const import DOMAIN, LOGGER -USER_DATA_SCHEMA = vol.Schema( +USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_API_KEY): TextSelector( + probatio.Required(CONF_API_KEY): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, autocomplete="current-password", diff --git a/homeassistant/components/uk_transport/sensor.py b/homeassistant/components/uk_transport/sensor.py index e4b160253711a..f8aafccb8c3ad 100644 --- a/homeassistant/components/uk_transport/sensor.py +++ b/homeassistant/components/uk_transport/sensor.py @@ -6,8 +6,8 @@ import re from typing import Any, override +import probatio import requests -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -38,19 +38,21 @@ CONF_ORIGIN = "origin" CONF_DESTINATION = "destination" -_QUERY_SCHEME = vol.Schema( +_QUERY_SCHEME = probatio.Schema( { - vol.Required(CONF_MODE): vol.All(cv.ensure_list, [vol.In(["bus", "train"])]), - vol.Required(CONF_ORIGIN): cv.string, - vol.Required(CONF_DESTINATION): cv.string, + probatio.Required(CONF_MODE): probatio.All( + cv.ensure_list, [probatio.In(["bus", "train"])] + ), + probatio.Required(CONF_ORIGIN): cv.string, + probatio.Required(CONF_DESTINATION): cv.string, } ) PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_API_APP_ID): cv.string, - vol.Required(CONF_API_APP_KEY): cv.string, - vol.Required(CONF_QUERIES): [_QUERY_SCHEME], + probatio.Required(CONF_API_APP_ID): cv.string, + probatio.Required(CONF_API_APP_KEY): cv.string, + probatio.Required(CONF_QUERIES): [_QUERY_SCHEME], } ) diff --git a/homeassistant/components/ukraine_alarm/config_flow.py b/homeassistant/components/ukraine_alarm/config_flow.py index bb40f72ed62f3..ad7eb1cdeca81 100644 --- a/homeassistant/components/ukraine_alarm/config_flow.py +++ b/homeassistant/components/ukraine_alarm/config_flow.py @@ -4,8 +4,8 @@ from typing import TYPE_CHECKING, Any, override import aiohttp +import probatio from uasiren.client import Client -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_NAME, CONF_REGION @@ -119,9 +119,9 @@ async def _handle_pick_region( regions.update(_make_regions_object(source)) - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required(CONF_REGION): vol.In(regions), + probatio.Required(CONF_REGION): probatio.In(regions), } ) diff --git a/homeassistant/components/unifi/config_flow.py b/homeassistant/components/unifi/config_flow.py index 5aa33f6c0a770..a2a0bbd49e1ec 100644 --- a/homeassistant/components/unifi/config_flow.py +++ b/homeassistant/components/unifi/config_flow.py @@ -13,7 +13,7 @@ from typing import Any, override from aiounifi.interfaces.sites import Sites -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -82,7 +82,7 @@ def async_get_options_flow( def __init__(self) -> None: """Initialize the UniFi Network flow.""" self.config: dict[str, Any] = {} - self.reauth_schema: dict[vol.Marker, Any] = {} + self.reauth_schema: dict[probatio.Marker, Any] = {} @override async def async_step_user( @@ -131,13 +131,13 @@ async def async_step_user( host = "unifi" data = self.reauth_schema or { - vol.Required(CONF_HOST, default=host): str, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Optional( + probatio.Required(CONF_HOST, default=host): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Optional( CONF_PORT, default=self.config.get(CONF_PORT, DEFAULT_PORT) ): int, - vol.Optional( + probatio.Optional( CONF_VERIFY_SSL, default=self.config.get(CONF_VERIFY_SSL, DEFAULT_VERIFY_SSL), ): bool, @@ -145,7 +145,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema(data), + data_schema=probatio.Schema(data), errors=errors, ) @@ -185,7 +185,9 @@ async def async_step_site( site_names = {site.site_id: site.description for site in self.sites.values()} return self.async_show_form( step_id="site", - data_schema=vol.Schema({vol.Required(CONF_SITE_ID): vol.In(site_names)}), + data_schema=probatio.Schema( + {probatio.Required(CONF_SITE_ID): probatio.In(site_names)} + ), ) async def async_step_reauth( @@ -200,11 +202,13 @@ async def async_step_reauth( } self.reauth_schema = { - vol.Required(CONF_HOST, default=reauth_entry.data[CONF_HOST]): str, - vol.Required(CONF_USERNAME, default=reauth_entry.data[CONF_USERNAME]): str, - vol.Required(CONF_PASSWORD): str, - vol.Required(CONF_PORT, default=reauth_entry.data[CONF_PORT]): int, - vol.Required( + probatio.Required(CONF_HOST, default=reauth_entry.data[CONF_HOST]): str, + probatio.Required( + CONF_USERNAME, default=reauth_entry.data[CONF_USERNAME] + ): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PORT, default=reauth_entry.data[CONF_PORT]): int, + probatio.Required( CONF_VERIFY_SSL, default=reauth_entry.data[CONF_VERIFY_SSL] ): bool, } @@ -323,23 +327,23 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_TRACK_CLIENTS, default=self.hub.config.option_track_clients, ): bool, - vol.Optional( + probatio.Optional( CONF_TRACK_DEVICES, default=self.hub.config.option_track_devices, ): bool, - vol.Optional( + probatio.Optional( CONF_BLOCK_CLIENT, default=selected_clients_to_block ): cv.multi_select(clients_to_block), - vol.Required(CONF_MORE_OPTIONS): section( - vol.Schema( + probatio.Required(CONF_MORE_OPTIONS): section( + probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_CLIENT_SOURCE, default=self.options.get(CONF_CLIENT_SOURCE, []), ): cv.multi_select( @@ -350,40 +354,40 @@ async def async_step_init( ) ) ), - vol.Optional( + probatio.Optional( CONF_TRACK_WIRED_CLIENTS, default=self.hub.config.option_track_wired_clients, ): bool, - vol.Optional( + probatio.Optional( CONF_SSID_FILTER, default=selected_ssids_to_filter, ): cv.multi_select(ssid_filter), - vol.Optional( + probatio.Optional( CONF_DETECTION_TIME, default=int( self.hub.config.option_detection_time.total_seconds() ), ): int, - vol.Optional( + probatio.Optional( CONF_IGNORE_WIRED_BUG, default=self.hub.config.option_ignore_wired_bug, ): bool, - vol.Optional( + probatio.Optional( CONF_IGNORE_LOCAL_MAC, default=self.hub.config.option_ignore_local_mac, ): bool, - vol.Optional( + probatio.Optional( CONF_DPI_RESTRICTIONS, default=self.options.get( CONF_DPI_RESTRICTIONS, DEFAULT_DPI_RESTRICTIONS, ), ): bool, - vol.Optional( + probatio.Optional( CONF_ALLOW_BANDWIDTH_SENSORS, default=self.hub.config.option_allow_bandwidth_sensors, ): bool, - vol.Optional( + probatio.Optional( CONF_ALLOW_UPTIME_SENSORS, default=self.hub.config.option_allow_uptime_sensors, ): bool, diff --git a/homeassistant/components/unifi/services.py b/homeassistant/components/unifi/services.py index 0eed98805fd0c..dcdf876a2bf79 100644 --- a/homeassistant/components/unifi/services.py +++ b/homeassistant/components/unifi/services.py @@ -5,7 +5,7 @@ import aiounifi from aiounifi.models.client import ClientReconnectRequest, ClientRemoveRequest -import voluptuous as vol +import probatio from homeassistant.const import ATTR_DEVICE_ID from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -18,8 +18,8 @@ SERVICE_RECONNECT_CLIENT = "reconnect_client" SERVICE_REMOVE_CLIENTS = "remove_clients" -SERVICE_RECONNECT_CLIENT_SCHEMA = vol.All( - vol.Schema({vol.Required(ATTR_DEVICE_ID): str}) +SERVICE_RECONNECT_CLIENT_SCHEMA = probatio.All( + probatio.Schema({probatio.Required(ATTR_DEVICE_ID): str}) ) SUPPORTED_SERVICES = (SERVICE_RECONNECT_CLIENT, SERVICE_REMOVE_CLIENTS) diff --git a/homeassistant/components/unifi_access/config_flow.py b/homeassistant/components/unifi_access/config_flow.py index 3558974b86553..2bec6a0a605a6 100644 --- a/homeassistant/components/unifi_access/config_flow.py +++ b/homeassistant/components/unifi_access/config_flow.py @@ -4,8 +4,8 @@ import logging from typing import Any, override +import probatio from unifi_access_api import ApiAuthError, ApiConnectionError, UnifiAccessApiClient -import voluptuous as vol from homeassistant.config_entries import SOURCE_IGNORE, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_TOKEN, CONF_HOST, CONF_VERIFY_SSL @@ -78,11 +78,11 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_API_TOKEN): str, - vol.Required(CONF_VERIFY_SSL, default=False): bool, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_API_TOKEN): str, + probatio.Required(CONF_VERIFY_SSL, default=False): bool, } ), errors=errors, @@ -110,11 +110,11 @@ async def async_step_reconfigure( return self.async_show_form( step_id="reconfigure", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_API_TOKEN): str, - vol.Required(CONF_VERIFY_SSL): bool, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_API_TOKEN): str, + probatio.Required(CONF_VERIFY_SSL): bool, } ), suggested_values, @@ -180,10 +180,10 @@ async def async_step_discovery_confirm( self.context["title_placeholders"] = placeholders return self.async_show_form( step_id="discovery_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_API_TOKEN): str, - vol.Required(CONF_VERIFY_SSL, default=False): bool, + probatio.Required(CONF_API_TOKEN): str, + probatio.Required(CONF_VERIFY_SSL, default=False): bool, } ), description_placeholders=placeholders, @@ -218,7 +218,7 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema({vol.Required(CONF_API_TOKEN): str}), + data_schema=probatio.Schema({probatio.Required(CONF_API_TOKEN): str}), description_placeholders={CONF_HOST: reauth_entry.data[CONF_HOST]}, errors=errors, ) diff --git a/homeassistant/components/unifi_access/services.py b/homeassistant/components/unifi_access/services.py index 47643a53f8fff..ec8884da73b3f 100644 --- a/homeassistant/components/unifi_access/services.py +++ b/homeassistant/components/unifi_access/services.py @@ -2,8 +2,8 @@ from datetime import timedelta +import probatio from unifi_access_api import UnifiAccessError -import voluptuous as vol from homeassistant.const import ATTR_DEVICE_ID from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -28,14 +28,14 @@ "lock_early", ] -SERVICE_SET_LOCK_RULE_SCHEMA = vol.Schema( +SERVICE_SET_LOCK_RULE_SCHEMA = probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): cv.string, - vol.Required(ATTR_RULE): vol.In(LOCK_RULE_OPTIONS), - vol.Optional(ATTR_INTERVAL): vol.All( + probatio.Required(ATTR_DEVICE_ID): cv.string, + probatio.Required(ATTR_RULE): probatio.In(LOCK_RULE_OPTIONS), + probatio.Optional(ATTR_INTERVAL): probatio.All( cv.time_period, cv.positive_timedelta, - vol.Range( + probatio.Range( min=timedelta(minutes=MIN_LOCK_RULE_INTERVAL), max=timedelta(minutes=MAX_LOCK_RULE_INTERVAL), ), diff --git a/homeassistant/components/unifi_direct/config_flow.py b/homeassistant/components/unifi_direct/config_flow.py index 1d0bb89ed7102..bf2cf16c6e131 100644 --- a/homeassistant/components/unifi_direct/config_flow.py +++ b/homeassistant/components/unifi_direct/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from unifi_ap import UniFiAP, UniFiAPConnectionException, UniFiAPDataException -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PASSWORD, CONF_PORT, CONF_USERNAME @@ -11,12 +11,12 @@ from .const import DEFAULT_NAME, DEFAULT_SSH_PORT, DOMAIN -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Optional(CONF_PORT, default=DEFAULT_SSH_PORT): cv.port, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Optional(CONF_PORT, default=DEFAULT_SSH_PORT): cv.port, } ) diff --git a/homeassistant/components/unifi_direct/device_tracker.py b/homeassistant/components/unifi_direct/device_tracker.py index 1690662f38f35..f6fbcbf4db971 100644 --- a/homeassistant/components/unifi_direct/device_tracker.py +++ b/homeassistant/components/unifi_direct/device_tracker.py @@ -2,7 +2,7 @@ from typing import override -import voluptuous as vol +import probatio from homeassistant.components.device_tracker import ( PLATFORM_SCHEMA as DEVICE_TRACKER_PLATFORM_SCHEMA, @@ -23,10 +23,10 @@ PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_SSH_PORT): cv.port, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_SSH_PORT): cv.port, } ) diff --git a/homeassistant/components/unifiprotect/config_flow.py b/homeassistant/components/unifiprotect/config_flow.py index 6c24cb32c6b2c..5d8ff918ad8fe 100644 --- a/homeassistant/components/unifiprotect/config_flow.py +++ b/homeassistant/components/unifiprotect/config_flow.py @@ -6,11 +6,11 @@ from typing import Any, override from aiohttp import CookieJar +import probatio from uiprotect import ProtectApiClient from uiprotect.data import NVR from uiprotect.exceptions import ClientError, NotAuthorized from unifi_discovery import async_console_is_alive -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_IGNORE, @@ -128,7 +128,7 @@ def _build_schema( include_host: bool = True, include_connection: bool = True, credentials_optional: bool = False, -) -> vol.Schema: +) -> probatio.Schema: """Build a config flow schema. Args: @@ -137,10 +137,10 @@ def _build_schema( credentials_optional: Credentials optional (True to keep existing values). """ - req, opt = vol.Required, vol.Optional + req, opt = probatio.Required, probatio.Optional cred_key = opt if credentials_optional else req - schema: dict[vol.Marker, selector.Selector] = {} + schema: dict[probatio.Marker, selector.Selector] = {} if include_host: schema[req(CONF_HOST)] = _TEXT_SELECTOR if include_connection: @@ -149,17 +149,19 @@ def _build_schema( schema[req(CONF_USERNAME)] = _TEXT_SELECTOR schema[cred_key(CONF_PASSWORD)] = _PASSWORD_SELECTOR schema[cred_key(CONF_API_KEY)] = _PASSWORD_SELECTOR - return vol.Schema(schema) + return probatio.Schema(schema) -def _build_api_key_schema() -> vol.Schema: +def _build_api_key_schema() -> probatio.Schema: """Build the schema for the public-API-only (API-key) connection mode.""" - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_HOST): _TEXT_SELECTOR, - vol.Required(CONF_PORT, default=DEFAULT_PORT): _PORT_SELECTOR, - vol.Required(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): _BOOL_SELECTOR, - vol.Required(CONF_API_KEY): _PASSWORD_SELECTOR, + probatio.Required(CONF_HOST): _TEXT_SELECTOR, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): _PORT_SELECTOR, + probatio.Required( + CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL + ): _BOOL_SELECTOR, + probatio.Required(CONF_API_KEY): _PASSWORD_SELECTOR, } ) @@ -174,10 +176,10 @@ def _build_api_key_schema() -> vol.Schema: # Public-API-only (API key, no local user) flow API_KEY_SCHEMA = _build_api_key_schema() # Discovery variant: host comes from discovery, ssl from the candidate order -DISCOVERY_API_KEY_SCHEMA = vol.Schema( +DISCOVERY_API_KEY_SCHEMA = probatio.Schema( { - vol.Required(CONF_PORT, default=DEFAULT_PORT): _PORT_SELECTOR, - vol.Required(CONF_API_KEY): _PASSWORD_SELECTOR, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): _PORT_SELECTOR, + probatio.Required(CONF_API_KEY): _PASSWORD_SELECTOR, } ) # Reauth flow: only credentials, connection settings preserved @@ -188,7 +190,9 @@ def _build_api_key_schema() -> vol.Schema: "https://www.home-assistant.io/integrations/unifiprotect/#api-key-only" ) # Reauth flow for public-API-only entries: the API key is the only credential -REAUTH_API_KEY_SCHEMA = vol.Schema({vol.Required(CONF_API_KEY): _PASSWORD_SELECTOR}) +REAUTH_API_KEY_SCHEMA = probatio.Schema( + {probatio.Required(CONF_API_KEY): _PASSWORD_SELECTOR} +) async def async_local_user_documentation_url(hass: HomeAssistant) -> str: @@ -843,28 +847,30 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_DISABLE_RTSP, default=self.config_entry.options.get(CONF_DISABLE_RTSP, False), ): bool, - vol.Optional( + probatio.Optional( CONF_ALL_UPDATES, default=self.config_entry.options.get(CONF_ALL_UPDATES, False), ): bool, - vol.Optional( + probatio.Optional( CONF_OVERRIDE_CHOST, default=self.config_entry.options.get( CONF_OVERRIDE_CHOST, False ), ): bool, - vol.Optional( + probatio.Optional( CONF_MAX_MEDIA, default=self.config_entry.options.get( CONF_MAX_MEDIA, DEFAULT_MAX_MEDIA ), - ): vol.All(vol.Coerce(int), vol.Range(min=100, max=10000)), + ): probatio.All( + probatio.Coerce(int), probatio.Range(min=100, max=10000) + ), } ), ) diff --git a/homeassistant/components/unifiprotect/repairs.py b/homeassistant/components/unifiprotect/repairs.py index 2c659bd00b644..60bd9c4000837 100644 --- a/homeassistant/components/unifiprotect/repairs.py +++ b/homeassistant/components/unifiprotect/repairs.py @@ -3,9 +3,9 @@ import logging from typing import cast +import probatio from uiprotect import ProtectApiClient from uiprotect.exceptions import ClientError -import voluptuous as vol from homeassistant.components.repairs import ( ConfirmRepairFlow, @@ -65,7 +65,7 @@ async def async_step_confirm( placeholders = self._async_get_placeholders() return self.async_show_form( step_id="confirm", - data_schema=vol.Schema({}), + data_schema=probatio.Schema({}), description_placeholders=placeholders, ) @@ -109,7 +109,7 @@ async def async_step_start( if user_input is None: return self.async_show_form( step_id="start", - data_schema=vol.Schema({}), + data_schema=probatio.Schema({}), description_placeholders=self._async_get_placeholders(), ) @@ -143,7 +143,7 @@ async def async_step_confirm( placeholders = self._async_get_placeholders() return self.async_show_form( step_id="confirm", - data_schema=vol.Schema({}), + data_schema=probatio.Schema({}), description_placeholders=placeholders, ) diff --git a/homeassistant/components/unifiprotect/services.py b/homeassistant/components/unifiprotect/services.py index 211b64db30e36..183e358370554 100644 --- a/homeassistant/components/unifiprotect/services.py +++ b/homeassistant/components/unifiprotect/services.py @@ -5,11 +5,11 @@ import logging from typing import Any, cast +import probatio from pydantic import ValidationError from uiprotect.api import ProtectApiClient from uiprotect.data import Camera, Chime from uiprotect.exceptions import ClientError -import voluptuous as vol from homeassistant.components.binary_sensor import BinarySensorDeviceClass from homeassistant.const import ATTR_DEVICE_ID, ATTR_NAME, Platform @@ -67,37 +67,37 @@ SERVICE_PTZ_GOTO_PRESET, ] -DOORBELL_TEXT_SCHEMA = vol.Schema( +DOORBELL_TEXT_SCHEMA = probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): str, - vol.Required(ATTR_MESSAGE): cv.string, + probatio.Required(ATTR_DEVICE_ID): str, + probatio.Required(ATTR_MESSAGE): cv.string, }, ) -CHIME_PAIRED_SCHEMA = vol.Schema( +CHIME_PAIRED_SCHEMA = probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): str, + probatio.Required(ATTR_DEVICE_ID): str, "doorbells": cv.ENTITY_SERVICE_FIELDS, }, ) -REMOVE_PRIVACY_ZONE_SCHEMA = vol.Schema( +REMOVE_PRIVACY_ZONE_SCHEMA = probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): str, - vol.Required(ATTR_NAME): cv.string, + probatio.Required(ATTR_DEVICE_ID): str, + probatio.Required(ATTR_NAME): cv.string, }, ) -GET_USER_KEYRING_INFO_SCHEMA = vol.Schema( +GET_USER_KEYRING_INFO_SCHEMA = probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): str, + probatio.Required(ATTR_DEVICE_ID): str, }, ) -PTZ_GOTO_PRESET_SCHEMA = vol.Schema( +PTZ_GOTO_PRESET_SCHEMA = probatio.Schema( { - vol.Required(ATTR_DEVICE_ID): str, - vol.Required(ATTR_PRESET): cv.string, + probatio.Required(ATTR_DEVICE_ID): str, + probatio.Required(ATTR_PRESET): cv.string, }, ) diff --git a/homeassistant/components/universal/media_player.py b/homeassistant/components/universal/media_player.py index 71ffe80206f85..c10c2f0feb8e3 100644 --- a/homeassistant/components/universal/media_player.py +++ b/homeassistant/components/universal/media_player.py @@ -3,7 +3,7 @@ from copy import copy from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.media_player import ( ATTR_INPUT_SOURCE, @@ -106,19 +106,19 @@ PLATFORM_SCHEMA = MEDIA_PLAYER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_NAME): cv.string, - vol.Optional(CONF_CHILDREN, default=[]): cv.entity_ids, - vol.Optional(CONF_COMMANDS, default={}): CMD_SCHEMA, - vol.Optional(CONF_ATTRS, default={}): vol.Or( + probatio.Required(CONF_NAME): cv.string, + probatio.Optional(CONF_CHILDREN, default=[]): cv.entity_ids, + probatio.Optional(CONF_COMMANDS, default={}): CMD_SCHEMA, + probatio.Optional(CONF_ATTRS, default={}): probatio.Or( cv.ensure_list(ATTRS_SCHEMA), ATTRS_SCHEMA ), - vol.Optional(CONF_BROWSE_MEDIA_ENTITY): cv.string, - vol.Optional(CONF_UNIQUE_ID): cv.string, - vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, - vol.Optional(CONF_ACTIVE_CHILD_TEMPLATE): cv.template, - vol.Optional(CONF_STATE_TEMPLATE): cv.template, + probatio.Optional(CONF_BROWSE_MEDIA_ENTITY): cv.string, + probatio.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_ACTIVE_CHILD_TEMPLATE): cv.template, + probatio.Optional(CONF_STATE_TEMPLATE): cv.template, }, - extra=vol.REMOVE_EXTRA, + extra=probatio.REMOVE_EXTRA, ) diff --git a/homeassistant/components/upb/config_flow.py b/homeassistant/components/upb/config_flow.py index a8b306ee4915d..3982234b0c1f7 100644 --- a/homeassistant/components/upb/config_flow.py +++ b/homeassistant/components/upb/config_flow.py @@ -5,8 +5,8 @@ import logging from typing import Any, override +import probatio import upb_lib -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_DEVICE, CONF_FILE_PATH @@ -17,10 +17,10 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_DEVICE): SerialPortSelector(), - vol.Required(CONF_FILE_PATH, default=""): str, + probatio.Required(CONF_DEVICE): SerialPortSelector(), + probatio.Required(CONF_FILE_PATH, default=""): str, } ) diff --git a/homeassistant/components/upb/const.py b/homeassistant/components/upb/const.py index 6e063c5a08873..b4c38ca85ff8d 100644 --- a/homeassistant/components/upb/const.py +++ b/homeassistant/components/upb/const.py @@ -1,6 +1,6 @@ """Support the UPB PIM.""" -import voluptuous as vol +import probatio from homeassistant.helpers import config_validation as cv from homeassistant.helpers.typing import VolDictType @@ -15,23 +15,27 @@ CONF_NETWORK = "network" EVENT_UPB_SCENE_CHANGED = "upb.scene_changed" -VALID_BRIGHTNESS = vol.All(vol.Coerce(int), vol.Clamp(min=0, max=255)) -VALID_BRIGHTNESS_PCT = vol.All(vol.Coerce(float), vol.Range(min=0, max=100)) -VALID_RATE = vol.All(vol.Coerce(float), vol.Clamp(min=-1, max=3600)) +VALID_BRIGHTNESS = probatio.All(probatio.Coerce(int), probatio.Clamp(min=0, max=255)) +VALID_BRIGHTNESS_PCT = probatio.All( + probatio.Coerce(float), probatio.Range(min=0, max=100) +) +VALID_RATE = probatio.All(probatio.Coerce(float), probatio.Clamp(min=-1, max=3600)) -UPB_BRIGHTNESS_RATE_SCHEMA = vol.All( +UPB_BRIGHTNESS_RATE_SCHEMA = probatio.All( cv.has_at_least_one_key(ATTR_BRIGHTNESS, ATTR_BRIGHTNESS_PCT), cv.make_entity_service_schema( { - vol.Exclusive(ATTR_BRIGHTNESS, ATTR_BRIGHTNESS): VALID_BRIGHTNESS, - vol.Exclusive(ATTR_BRIGHTNESS_PCT, ATTR_BRIGHTNESS): VALID_BRIGHTNESS_PCT, - vol.Optional(ATTR_RATE, default=-1): VALID_RATE, + probatio.Exclusive(ATTR_BRIGHTNESS, ATTR_BRIGHTNESS): VALID_BRIGHTNESS, + probatio.Exclusive( + ATTR_BRIGHTNESS_PCT, ATTR_BRIGHTNESS + ): VALID_BRIGHTNESS_PCT, + probatio.Optional(ATTR_RATE, default=-1): VALID_RATE, } ), ) UPB_BLINK_RATE_SCHEMA: VolDictType = { - vol.Required(ATTR_BLINK_RATE, default=0.5): vol.All( - vol.Coerce(float), vol.Range(min=0, max=4.25) + probatio.Required(ATTR_BLINK_RATE, default=0.5): probatio.All( + probatio.Coerce(float), probatio.Range(min=0, max=4.25) ) } diff --git a/homeassistant/components/upc_connect/device_tracker.py b/homeassistant/components/upc_connect/device_tracker.py index f2c7ffd6383dd..29c67a754aba4 100644 --- a/homeassistant/components/upc_connect/device_tracker.py +++ b/homeassistant/components/upc_connect/device_tracker.py @@ -5,7 +5,7 @@ from connect_box import ConnectBox from connect_box.exceptions import ConnectBoxError, ConnectBoxLoginError -import voluptuous as vol +import probatio from homeassistant.components.device_tracker import ( DOMAIN as DEVICE_TRACKER_DOMAIN, @@ -24,8 +24,8 @@ PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_HOST, default=DEFAULT_IP): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_HOST, default=DEFAULT_IP): cv.string, } ) diff --git a/homeassistant/components/upcloud/config_flow.py b/homeassistant/components/upcloud/config_flow.py index ed75911b28171..2ed3d939b3ac4 100644 --- a/homeassistant/components/upcloud/config_flow.py +++ b/homeassistant/components/upcloud/config_flow.py @@ -3,9 +3,9 @@ import logging from typing import Any, override +import probatio import requests.exceptions import upcloud_api -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -70,12 +70,12 @@ def _async_show_form( user_input = {} return self.async_show_form( step_id=step_id, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_USERNAME, default=user_input.get(CONF_USERNAME, "") ): str, - vol.Required( + probatio.Required( CONF_PASSWORD, default=user_input.get(CONF_PASSWORD, "") ): str, } diff --git a/homeassistant/components/update/__init__.py b/homeassistant/components/update/__init__.py index 58761ff95ddca..f495267e5591d 100644 --- a/homeassistant/components/update/__init__.py +++ b/homeassistant/components/update/__init__.py @@ -7,8 +7,8 @@ from typing import Any, Final, final, override from awesomeversion import AwesomeVersion, AwesomeVersionCompareException +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.components import websocket_api from homeassistant.config_entries import ConfigEntry @@ -62,7 +62,7 @@ class UpdateDeviceClass(StrEnum): FIRMWARE = "firmware" -DEVICE_CLASSES_SCHEMA = vol.All(vol.Lower, vol.Coerce(UpdateDeviceClass)) +DEVICE_CLASSES_SCHEMA = probatio.All(probatio.Lower, probatio.Coerce(UpdateDeviceClass)) __all__ = [ @@ -96,8 +96,8 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: component.async_register_entity_service( SERVICE_INSTALL, { - vol.Optional(ATTR_VERSION): cv.string, - vol.Optional(ATTR_BACKUP, default=False): cv.boolean, + probatio.Optional(ATTR_VERSION): cv.string, + probatio.Optional(ATTR_BACKUP, default=False): cv.boolean, }, async_install, [UpdateEntityFeature.INSTALL], @@ -551,8 +551,8 @@ async def async_internal_added_to_hass(self) -> None: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "update/release_notes", - vol.Required("entity_id"): cv.entity_id, + probatio.Required("type"): "update/release_notes", + probatio.Required("entity_id"): cv.entity_id, } ) @websocket_api.async_response diff --git a/homeassistant/components/update/device_trigger.py b/homeassistant/components/update/device_trigger.py index b2a049627d80b..ab3a2ca49e490 100644 --- a/homeassistant/components/update/device_trigger.py +++ b/homeassistant/components/update/device_trigger.py @@ -1,6 +1,6 @@ """Provides device triggers for update entities.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import toggle_entity from homeassistant.const import CONF_DOMAIN @@ -10,9 +10,11 @@ from . import DOMAIN -TRIGGER_SCHEMA = vol.All( +TRIGGER_SCHEMA = probatio.All( toggle_entity.TRIGGER_SCHEMA, - vol.Schema({vol.Required(CONF_DOMAIN): DOMAIN}, extra=vol.ALLOW_EXTRA), + probatio.Schema( + {probatio.Required(CONF_DOMAIN): DOMAIN}, extra=probatio.ALLOW_EXTRA + ), ) @@ -35,6 +37,6 @@ async def async_get_triggers( async def async_get_trigger_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List trigger capabilities.""" return await toggle_entity.async_get_trigger_capabilities(hass, config) diff --git a/homeassistant/components/upnp/config_flow.py b/homeassistant/components/upnp/config_flow.py index 0a52ff9bb5050..87ab4f17e4851 100644 --- a/homeassistant/components/upnp/config_flow.py +++ b/homeassistant/components/upnp/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, cast, override from urllib.parse import urlparse -import voluptuous as vol +import probatio from homeassistant.components import ssdp from homeassistant.config_entries import ( @@ -157,9 +157,9 @@ async def async_step_user( if not self._discoveries: return self.async_abort(reason="no_devices_found") - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required("unique_id"): vol.In( + probatio.Required("unique_id"): probatio.In( { discovery.ssdp_usn: _friendly_name_from_discovery(discovery) for discovery in self._discoveries.values() @@ -318,9 +318,9 @@ async def async_step_init( if user_input is not None: return self.async_create_entry(data=user_input) - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Optional( + probatio.Optional( CONFIG_ENTRY_FORCE_POLL, default=self.config_entry.options.get( CONFIG_ENTRY_FORCE_POLL, DEFAULT_CONFIG_ENTRY_FORCE_POLL diff --git a/homeassistant/components/uptime/config_flow.py b/homeassistant/components/uptime/config_flow.py index 1aab699529ea0..ba136396f96ff 100644 --- a/homeassistant/components/uptime/config_flow.py +++ b/homeassistant/components/uptime/config_flow.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -25,4 +25,4 @@ async def async_step_user( data={}, ) - return self.async_show_form(step_id="user", data_schema=vol.Schema({})) + return self.async_show_form(step_id="user", data_schema=probatio.Schema({})) diff --git a/homeassistant/components/uptime_kuma/config_flow.py b/homeassistant/components/uptime_kuma/config_flow.py index 486fbdb3c252e..f5db51cf96879 100644 --- a/homeassistant/components/uptime_kuma/config_flow.py +++ b/homeassistant/components/uptime_kuma/config_flow.py @@ -4,13 +4,13 @@ import logging from typing import Any, override +import probatio from pythonkuma import ( UptimeKuma, UptimeKumaAuthenticationException, UptimeKumaException, UptimeKumaParseException, ) -import voluptuous as vol from yarl import URL from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -28,19 +28,21 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_URL): TextSelector( + probatio.Required(CONF_URL): TextSelector( TextSelectorConfig( type=TextSelectorType.URL, autocomplete="url", ), ), - vol.Required(CONF_VERIFY_SSL, default=True): bool, - vol.Optional(CONF_API_KEY, default=""): str, + probatio.Required(CONF_VERIFY_SSL, default=True): bool, + probatio.Optional(CONF_API_KEY, default=""): str, } ) -STEP_REAUTH_DATA_SCHEMA = vol.Schema({vol.Optional(CONF_API_KEY, default=""): str}) +STEP_REAUTH_DATA_SCHEMA = probatio.Schema( + {probatio.Optional(CONF_API_KEY, default=""): str} +) PLACEHOLDER = {"example_url": "https://uptime.example.com:3001"} diff --git a/homeassistant/components/uptimerobot/config_flow.py b/homeassistant/components/uptimerobot/config_flow.py index 387b71e697cae..0bce40fc85445 100644 --- a/homeassistant/components/uptimerobot/config_flow.py +++ b/homeassistant/components/uptimerobot/config_flow.py @@ -3,6 +3,7 @@ from collections.abc import Mapping from typing import TYPE_CHECKING, Any, override +import probatio from pyuptimerobot import ( UptimeRobot, UptimeRobotAccount, @@ -10,7 +11,6 @@ UptimeRobotAuthenticationException, UptimeRobotException, ) -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_KEY @@ -18,7 +18,7 @@ from .const import DOMAIN, LOGGER -STEP_USER_DATA_SCHEMA = vol.Schema({vol.Required(CONF_API_KEY): str}) +STEP_USER_DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_API_KEY): str}) class UptimeRobotConfigFlow(ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/components/usb/__init__.py b/homeassistant/components/usb/__init__.py index 0f54b862e3d85..c78e8c7a68721 100644 --- a/homeassistant/components/usb/__init__.py +++ b/homeassistant/components/usb/__init__.py @@ -10,7 +10,7 @@ from typing import Any, overload from aiousbwatcher import AIOUSBWatcher, InotifyNotAvailableError -import voluptuous as vol +import probatio from homeassistant import config_entries from homeassistant.components import websocket_api @@ -529,7 +529,7 @@ async def async_request_scan(self) -> None: @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required("type"): "usb/scan"}) +@websocket_api.websocket_command({probatio.Required("type"): "usb/scan"}) @websocket_api.async_response async def websocket_usb_scan( hass: HomeAssistant, @@ -598,8 +598,8 @@ def _serialize_consumer(consumer: SerialPortConsumer) -> dict[str, Any]: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "usb/list_serial_ports", - vol.Optional("include_usage", default=False): bool, + probatio.Required("type"): "usb/list_serial_ports", + probatio.Optional("include_usage", default=False): bool, } ) @websocket_api.async_response diff --git a/homeassistant/components/usgs_earthquakes_feed/geo_location.py b/homeassistant/components/usgs_earthquakes_feed/geo_location.py index 260a91ea2e7da..88262a8e003ca 100644 --- a/homeassistant/components/usgs_earthquakes_feed/geo_location.py +++ b/homeassistant/components/usgs_earthquakes_feed/geo_location.py @@ -9,7 +9,7 @@ from aio_geojson_usgs_earthquakes.feed_entry import ( UsgsEarthquakeHazardsProgramFeedEntry, ) -import voluptuous as vol +import probatio from homeassistant.components.geo_location import ( PLATFORM_SCHEMA as GEO_LOCATION_PLATFORM_SCHEMA, @@ -83,11 +83,13 @@ PLATFORM_SCHEMA = GEO_LOCATION_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_FEED_TYPE): vol.In(VALID_FEED_TYPES), - vol.Optional(CONF_LATITUDE): cv.latitude, - vol.Optional(CONF_LONGITUDE): cv.longitude, - vol.Optional(CONF_RADIUS, default=DEFAULT_RADIUS_IN_KM): vol.Coerce(float), - vol.Optional( + probatio.Required(CONF_FEED_TYPE): probatio.In(VALID_FEED_TYPES), + probatio.Optional(CONF_LATITUDE): cv.latitude, + probatio.Optional(CONF_LONGITUDE): cv.longitude, + probatio.Optional(CONF_RADIUS, default=DEFAULT_RADIUS_IN_KM): probatio.Coerce( + float + ), + probatio.Optional( CONF_MINIMUM_MAGNITUDE, default=DEFAULT_MINIMUM_MAGNITUDE ): cv.positive_float, } diff --git a/homeassistant/components/utility_meter/__init__.py b/homeassistant/components/utility_meter/__init__.py index 19f0d37ebbc82..df1e6dc36be73 100644 --- a/homeassistant/components/utility_meter/__init__.py +++ b/homeassistant/components/utility_meter/__init__.py @@ -4,7 +4,7 @@ import logging from cronsim import CronSim, CronSimError -import voluptuous as vol +import probatio from homeassistant.components.select import DOMAIN as SELECT_DOMAIN from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN @@ -55,20 +55,20 @@ def validate_cron_pattern(pattern: str) -> str: CronSim(pattern, datetime(2020, 1, 1)) # any date will do except CronSimError as err: _LOGGER.error("Invalid cron pattern %s: %s", pattern, err) - raise vol.Invalid("Invalid pattern") from err + raise probatio.Invalid("Invalid pattern") from err return pattern def period_or_cron(config: ConfigType) -> ConfigType: """Check cron pattern excludes meter type and offset.""" if CONF_CRON_PATTERN in config and CONF_METER_TYPE in config: - raise vol.Invalid(f"Use <{CONF_CRON_PATTERN}> or <{CONF_METER_TYPE}>") + raise probatio.Invalid(f"Use <{CONF_CRON_PATTERN}> or <{CONF_METER_TYPE}>") if ( CONF_CRON_PATTERN in config and CONF_METER_OFFSET in config and config[CONF_METER_OFFSET] != DEFAULT_OFFSET ): - raise vol.Invalid( + raise probatio.Invalid( f"When <{CONF_CRON_PATTERN}> is used <{CONF_METER_OFFSET}> has no meaning" ) return config @@ -77,38 +77,41 @@ def period_or_cron(config: ConfigType) -> ConfigType: def max_28_days(config: timedelta) -> timedelta: """Check that time period does not include more than 28 days.""" if config.days >= 28: - raise vol.Invalid( + raise probatio.Invalid( "Unsupported offset of more than 28 days, please use a cron pattern." ) return config -METER_CONFIG_SCHEMA = vol.Schema( - vol.All( +METER_CONFIG_SCHEMA = probatio.Schema( + probatio.All( { - vol.Required(CONF_SOURCE_SENSOR): cv.entity_id, - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_UNIQUE_ID): cv.string, - vol.Optional(CONF_METER_TYPE): vol.In(METER_TYPES), - vol.Optional(CONF_METER_OFFSET, default=DEFAULT_OFFSET): vol.All( + probatio.Required(CONF_SOURCE_SENSOR): cv.entity_id, + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_UNIQUE_ID): cv.string, + probatio.Optional(CONF_METER_TYPE): probatio.In(METER_TYPES), + probatio.Optional(CONF_METER_OFFSET, default=DEFAULT_OFFSET): probatio.All( cv.time_period, cv.positive_timedelta, max_28_days ), - vol.Optional(CONF_METER_DELTA_VALUES, default=False): cv.boolean, - vol.Optional(CONF_METER_NET_CONSUMPTION, default=False): cv.boolean, - vol.Optional(CONF_METER_PERIODICALLY_RESETTING, default=True): cv.boolean, - vol.Optional(CONF_TARIFFS, default=[]): vol.All( - cv.ensure_list, vol.Unique(), [cv.string] + probatio.Optional(CONF_METER_DELTA_VALUES, default=False): cv.boolean, + probatio.Optional(CONF_METER_NET_CONSUMPTION, default=False): cv.boolean, + probatio.Optional( + CONF_METER_PERIODICALLY_RESETTING, default=True + ): cv.boolean, + probatio.Optional(CONF_TARIFFS, default=[]): probatio.All( + cv.ensure_list, probatio.Unique(), [cv.string] ), - vol.Optional(CONF_CRON_PATTERN): validate_cron_pattern, - vol.Optional(CONF_SENSOR_ALWAYS_AVAILABLE, default=False): cv.boolean, + probatio.Optional(CONF_CRON_PATTERN): validate_cron_pattern, + probatio.Optional(CONF_SENSOR_ALWAYS_AVAILABLE, default=False): cv.boolean, }, period_or_cron, ) ) -CONFIG_SCHEMA = vol.Schema( - {DOMAIN: vol.Schema({cv.slug: METER_CONFIG_SCHEMA})}, extra=vol.ALLOW_EXTRA +CONFIG_SCHEMA = probatio.Schema( + {DOMAIN: probatio.Schema({cv.slug: METER_CONFIG_SCHEMA})}, + extra=probatio.ALLOW_EXTRA, ) @@ -187,7 +190,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: try: er.async_validate_entity_id(entity_registry, entry.options[CONF_SOURCE_SENSOR]) - except vol.Invalid: + except probatio.Invalid: # The entity is identified by an unknown entity registry ID _LOGGER.error( "Failed to setup utility_meter for unknown entity %s", diff --git a/homeassistant/components/utility_meter/config_flow.py b/homeassistant/components/utility_meter/config_flow.py index 2a118f5b76711..b295ef990ad19 100644 --- a/homeassistant/components/utility_meter/config_flow.py +++ b/homeassistant/components/utility_meter/config_flow.py @@ -3,7 +3,7 @@ from collections.abc import Mapping from typing import Any, cast, override -import voluptuous as vol +import probatio from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN from homeassistant.const import CONF_NAME @@ -53,40 +53,40 @@ async def _validate_config( ) -> dict[str, Any]: """Validate config.""" try: - vol.Unique()(user_input[CONF_TARIFFS]) - except vol.Invalid as exc: + probatio.Unique()(user_input[CONF_TARIFFS]) + except probatio.Invalid as exc: raise SchemaFlowError("tariffs_not_unique") from exc return user_input -OPTIONS_SCHEMA = vol.Schema( +OPTIONS_SCHEMA = probatio.Schema( { - vol.Required(CONF_SOURCE_SENSOR): selector.EntitySelector( + probatio.Required(CONF_SOURCE_SENSOR): selector.EntitySelector( selector.EntitySelectorConfig(domain=SENSOR_DOMAIN), ), - vol.Required( + probatio.Required( CONF_METER_PERIODICALLY_RESETTING, ): selector.BooleanSelector(), - vol.Optional( + probatio.Optional( CONF_SENSOR_ALWAYS_AVAILABLE, default=False, ): selector.BooleanSelector(), } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Required(CONF_NAME): selector.TextSelector(), - vol.Required(CONF_SOURCE_SENSOR): selector.EntitySelector( + probatio.Required(CONF_NAME): selector.TextSelector(), + probatio.Required(CONF_SOURCE_SENSOR): selector.EntitySelector( selector.EntitySelectorConfig(domain=SENSOR_DOMAIN), ), - vol.Required(CONF_METER_TYPE): selector.SelectSelector( + probatio.Required(CONF_METER_TYPE): selector.SelectSelector( selector.SelectSelectorConfig( options=METER_TYPES, translation_key=CONF_METER_TYPE ), ), - vol.Required(CONF_METER_OFFSET, default=0): selector.NumberSelector( + probatio.Required(CONF_METER_OFFSET, default=0): selector.NumberSelector( selector.NumberSelectorConfig( min=0, max=28, @@ -95,20 +95,20 @@ async def _validate_config( translation_key=CONF_METER_OFFSET, ), ), - vol.Required(CONF_TARIFFS, default=[]): selector.SelectSelector( + probatio.Required(CONF_TARIFFS, default=[]): selector.SelectSelector( selector.SelectSelectorConfig(options=[], custom_value=True, multiple=True), ), - vol.Required( + probatio.Required( CONF_METER_NET_CONSUMPTION, default=False ): selector.BooleanSelector(), - vol.Required( + probatio.Required( CONF_METER_DELTA_VALUES, default=False ): selector.BooleanSelector(), - vol.Required( + probatio.Required( CONF_METER_PERIODICALLY_RESETTING, default=True, ): selector.BooleanSelector(), - vol.Optional( + probatio.Optional( CONF_SENSOR_ALWAYS_AVAILABLE, default=False, ): selector.BooleanSelector(), diff --git a/homeassistant/components/utility_meter/sensor.py b/homeassistant/components/utility_meter/sensor.py index 01eed834fdda4..28314710e4cca 100644 --- a/homeassistant/components/utility_meter/sensor.py +++ b/homeassistant/components/utility_meter/sensor.py @@ -9,7 +9,7 @@ from typing import Any, Self, override from cronsim import CronSim -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( ATTR_LAST_RESET, @@ -119,7 +119,7 @@ def validate_is_number(value): return value except ValueError, TypeError: pass - raise vol.Invalid("Value is not a number") + raise probatio.Invalid("Value is not a number") async def async_setup_entry( @@ -201,7 +201,7 @@ async def async_setup_entry( platform.async_register_entity_service( SERVICE_CALIBRATE_METER, - {vol.Required(ATTR_VALUE): validate_is_number}, + {probatio.Required(ATTR_VALUE): validate_is_number}, "async_calibrate", ) @@ -283,7 +283,7 @@ async def async_setup_platform( platform.async_register_entity_service( SERVICE_CALIBRATE_METER, - {vol.Required(ATTR_VALUE): validate_is_number}, + {probatio.Required(ATTR_VALUE): validate_is_number}, "async_calibrate", ) diff --git a/homeassistant/components/utility_meter/services.py b/homeassistant/components/utility_meter/services.py index ce2755f46ce5e..0758860617969 100644 --- a/homeassistant/components/utility_meter/services.py +++ b/homeassistant/components/utility_meter/services.py @@ -2,7 +2,7 @@ import logging -import voluptuous as vol +import probatio from homeassistant.components.select import DOMAIN as SELECT_DOMAIN from homeassistant.const import ATTR_ENTITY_ID @@ -39,5 +39,5 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, SERVICE_RESET, async_reset_meters, - vol.Schema({ATTR_ENTITY_ID: vol.All(cv.ensure_list, [cv.entity_id])}), + probatio.Schema({ATTR_ENTITY_ID: probatio.All(cv.ensure_list, [cv.entity_id])}), ) diff --git a/homeassistant/components/uvc/camera.py b/homeassistant/components/uvc/camera.py index eb429a2e30c57..c68013027cc80 100644 --- a/homeassistant/components/uvc/camera.py +++ b/homeassistant/components/uvc/camera.py @@ -5,10 +5,10 @@ import re from typing import Any, cast, override +import probatio from uvcclient import camera as uvc_camera, nvr from uvcclient.camera import UVCCameraClient from uvcclient.nvr import UVCRemote -import voluptuous as vol from homeassistant.components.camera import ( PLATFORM_SCHEMA as CAMERA_PLATFORM_SCHEMA, @@ -34,11 +34,11 @@ PLATFORM_SCHEMA = CAMERA_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_NVR): cv.string, - vol.Required(CONF_KEY): cv.string, - vol.Optional(CONF_PASSWORD, default=DEFAULT_PASSWORD): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, + probatio.Required(CONF_NVR): cv.string, + probatio.Required(CONF_KEY): cv.string, + probatio.Optional(CONF_PASSWORD, default=DEFAULT_PASSWORD): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, } ) diff --git a/homeassistant/components/v2c/config_flow.py b/homeassistant/components/v2c/config_flow.py index 1afe66b28ee29..dcc3519adf92c 100644 --- a/homeassistant/components/v2c/config_flow.py +++ b/homeassistant/components/v2c/config_flow.py @@ -3,9 +3,9 @@ import logging from typing import Any, override +import probatio from pytrydan import Trydan from pytrydan.exceptions import TrydanError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST @@ -15,9 +15,9 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, + probatio.Required(CONF_HOST): str, } ) diff --git a/homeassistant/components/vacuum/__init__.py b/homeassistant/components/vacuum/__init__.py index 818c176cbe579..baa76de82e4c6 100644 --- a/homeassistant/components/vacuum/__init__.py +++ b/homeassistant/components/vacuum/__init__.py @@ -7,8 +7,8 @@ import logging from typing import Any, final, override +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( # noqa: F401 # STATE_PAUSED/IDLE are API @@ -113,7 +113,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: component.async_register_batched_entity_service( SERVICE_CLEAN_AREA, { - vol.Required("cleaning_area_id"): vol.All(cv.ensure_list, [str]), + probatio.Required("cleaning_area_id"): probatio.All(cv.ensure_list, [str]), }, StateVacuumEntity.async_internal_clean_area, [VacuumEntityFeature.CLEAN_AREA], @@ -132,15 +132,15 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: ) component.async_register_entity_service( SERVICE_SET_FAN_SPEED, - {vol.Required(ATTR_FAN_SPEED): cv.string}, + {probatio.Required(ATTR_FAN_SPEED): cv.string}, "async_set_fan_speed", [VacuumEntityFeature.FAN_SPEED], ) component.async_register_entity_service( SERVICE_SEND_COMMAND, { - vol.Required(ATTR_COMMAND): cv.string, - vol.Optional(ATTR_PARAMS): vol.Any(dict, cv.ensure_list), + probatio.Required(ATTR_COMMAND): cv.string, + probatio.Optional(ATTR_PARAMS): probatio.Any(dict, cv.ensure_list), }, "async_send_command", [VacuumEntityFeature.SEND_COMMAND], diff --git a/homeassistant/components/vacuum/device_action.py b/homeassistant/components/vacuum/device_action.py index 62a757afdfba7..92e16742f93dd 100644 --- a/homeassistant/components/vacuum/device_action.py +++ b/homeassistant/components/vacuum/device_action.py @@ -1,6 +1,6 @@ """Provides device automations for Vacuum.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import async_validate_entity_schema from homeassistant.const import ( @@ -20,8 +20,8 @@ _ACTION_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): vol.In(ACTION_TYPES), - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In(ACTION_TYPES), + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, } ) diff --git a/homeassistant/components/vacuum/device_condition.py b/homeassistant/components/vacuum/device_condition.py index d4c251cecaa53..b65055da5a007 100644 --- a/homeassistant/components/vacuum/device_condition.py +++ b/homeassistant/components/vacuum/device_condition.py @@ -1,6 +1,6 @@ """Provide the device automations for Vacuum.""" -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_CONDITION, @@ -24,8 +24,8 @@ CONDITION_SCHEMA = DEVICE_CONDITION_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In(CONDITION_TYPES), + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In(CONDITION_TYPES), } ) diff --git a/homeassistant/components/vacuum/device_trigger.py b/homeassistant/components/vacuum/device_trigger.py index 25616430bcca4..549052c0cd294 100644 --- a/homeassistant/components/vacuum/device_trigger.py +++ b/homeassistant/components/vacuum/device_trigger.py @@ -1,6 +1,6 @@ """Provides device automations for Vacuum.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import DEVICE_TRIGGER_BASE_SCHEMA from homeassistant.components.homeassistant.triggers import state as state_trigger @@ -23,9 +23,9 @@ TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(CONF_TYPE): vol.In(TRIGGER_TYPES), - vol.Optional(CONF_FOR): cv.positive_time_period_dict, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In(TRIGGER_TYPES), + probatio.Optional(CONF_FOR): cv.positive_time_period_dict, } ) @@ -58,11 +58,11 @@ async def async_get_triggers( async def async_get_trigger_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List trigger capabilities.""" return { - "extra_fields": vol.Schema( - {vol.Optional(CONF_FOR): cv.positive_time_period_dict} + "extra_fields": probatio.Schema( + {probatio.Optional(CONF_FOR): cv.positive_time_period_dict} ) } diff --git a/homeassistant/components/vacuum/intent.py b/homeassistant/components/vacuum/intent.py index f232375638b6f..81995407b4bd7 100644 --- a/homeassistant/components/vacuum/intent.py +++ b/homeassistant/components/vacuum/intent.py @@ -3,7 +3,7 @@ import logging from typing import override -import voluptuous as vol +import probatio from homeassistant.core import HomeAssistant from homeassistant.helpers import area_registry as ar, config_validation as cv, intent @@ -68,10 +68,10 @@ class CleanAreaIntentHandler(intent.IntentHandler): def slot_schema(self) -> dict: """Return a slot schema.""" return { - vol.Required("area"): cv.string, - vol.Optional("name"): cv.string, - vol.Optional("preferred_area_id"): cv.string, - vol.Optional("preferred_floor_id"): cv.string, + probatio.Required("area"): cv.string, + probatio.Optional("name"): cv.string, + probatio.Optional("preferred_area_id"): cv.string, + probatio.Optional("preferred_floor_id"): cv.string, } @override diff --git a/homeassistant/components/vacuum/websocket.py b/homeassistant/components/vacuum/websocket.py index 16c540f26c4a5..705f410d060e3 100644 --- a/homeassistant/components/vacuum/websocket.py +++ b/homeassistant/components/vacuum/websocket.py @@ -2,7 +2,7 @@ from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.components.websocket_api import ERR_NOT_FOUND, ERR_NOT_SUPPORTED @@ -21,8 +21,8 @@ def async_register_websocket_handlers(hass: HomeAssistant) -> None: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "vacuum/get_segments", - vol.Required("entity_id"): cv.strict_entity_id, + probatio.Required("type"): "vacuum/get_segments", + probatio.Required("entity_id"): cv.strict_entity_id, } ) @websocket_api.async_response diff --git a/homeassistant/components/vallox/__init__.py b/homeassistant/components/vallox/__init__.py index 2768a3cc3ff3b..11be2adc0c49d 100644 --- a/homeassistant/components/vallox/__init__.py +++ b/homeassistant/components/vallox/__init__.py @@ -2,8 +2,8 @@ import ipaddress +import probatio from vallox_websocket_api import Vallox -import voluptuous as vol from homeassistant.const import CONF_HOST, CONF_NAME, Platform from homeassistant.core import HomeAssistant @@ -14,19 +14,21 @@ from .coordinator import ValloxConfigEntry, ValloxDataUpdateCoordinator from .services import async_setup_services -CONFIG_SCHEMA = vol.Schema( - vol.All( +CONFIG_SCHEMA = probatio.Schema( + probatio.All( cv.deprecated(DOMAIN), { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_HOST): vol.All(ipaddress.ip_address, cv.string), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_HOST): probatio.All( + ipaddress.ip_address, cv.string + ), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) }, ), - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) PLATFORMS: list[str] = [ diff --git a/homeassistant/components/vallox/config_flow.py b/homeassistant/components/vallox/config_flow.py index 9e11b0556630d..8849fbb2743ff 100644 --- a/homeassistant/components/vallox/config_flow.py +++ b/homeassistant/components/vallox/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from vallox_websocket_api import Vallox, ValloxApiException -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_NAME @@ -16,9 +16,9 @@ _LOGGER = logging.getLogger(__name__) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, + probatio.Required(CONF_HOST): str, } ) diff --git a/homeassistant/components/vallox/services.py b/homeassistant/components/vallox/services.py index f92956a4d2644..9cdb4ac331131 100644 --- a/homeassistant/components/vallox/services.py +++ b/homeassistant/components/vallox/services.py @@ -3,8 +3,8 @@ from enum import StrEnum, auto import logging +import probatio from vallox_websocket_api import Profile, ValloxApiException -import voluptuous as vol from homeassistant.core import HomeAssistant, ServiceCall, callback from homeassistant.exceptions import HomeAssistantError @@ -28,19 +28,19 @@ class ValloxService(StrEnum): SET_PROFILE = auto() -SERVICE_SCHEMA_SET_PROFILE_FAN_SPEED = vol.Schema( +SERVICE_SCHEMA_SET_PROFILE_FAN_SPEED = probatio.Schema( { - vol.Required(ATTR_PROFILE_FAN_SPEED): vol.All( - vol.Coerce(int), vol.Clamp(min=0, max=100) + probatio.Required(ATTR_PROFILE_FAN_SPEED): probatio.All( + probatio.Coerce(int), probatio.Clamp(min=0, max=100) ) } ) -SERVICE_SCHEMA_SET_PROFILE = vol.Schema( +SERVICE_SCHEMA_SET_PROFILE = probatio.Schema( { - vol.Required(ATTR_PROFILE): vol.In(I18N_KEY_TO_VALLOX_PROFILE), - vol.Optional(ATTR_DURATION): vol.All( - vol.Coerce(int), vol.Clamp(min=1, max=PROFILE_DURATION_INDEFINITE) + probatio.Required(ATTR_PROFILE): probatio.In(I18N_KEY_TO_VALLOX_PROFILE), + probatio.Optional(ATTR_DURATION): probatio.All( + probatio.Coerce(int), probatio.Clamp(min=1, max=PROFILE_DURATION_INDEFINITE) ), } ) diff --git a/homeassistant/components/valve/__init__.py b/homeassistant/components/valve/__init__.py index 511cf3b09f973..4503920cda217 100644 --- a/homeassistant/components/valve/__init__.py +++ b/homeassistant/components/valve/__init__.py @@ -3,7 +3,7 @@ from datetime import timedelta import logging -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( # noqa: F401 @@ -46,7 +46,7 @@ SCAN_INTERVAL = timedelta(seconds=15) -DEVICE_CLASSES_SCHEMA = vol.All(vol.Lower, vol.Coerce(ValveDeviceClass)) +DEVICE_CLASSES_SCHEMA = probatio.All(probatio.Lower, probatio.Coerce(ValveDeviceClass)) ATTR_POSITION = "position" @@ -74,8 +74,8 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: component.async_register_entity_service( SERVICE_SET_VALVE_POSITION, { - vol.Required(ATTR_POSITION): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) + probatio.Required(ATTR_POSITION): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) ) }, "async_set_valve_position", diff --git a/homeassistant/components/vasttrafik/sensor.py b/homeassistant/components/vasttrafik/sensor.py index e29698033ccbc..4d45ceab088ca 100644 --- a/homeassistant/components/vasttrafik/sensor.py +++ b/homeassistant/components/vasttrafik/sensor.py @@ -3,8 +3,8 @@ from datetime import datetime, timedelta import logging +import probatio import vasttrafik -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -41,17 +41,17 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_KEY): cv.string, - vol.Required(CONF_SECRET): cv.string, - vol.Required(CONF_DEPARTURES): [ + probatio.Required(CONF_KEY): cv.string, + probatio.Required(CONF_SECRET): cv.string, + probatio.Required(CONF_DEPARTURES): [ { - vol.Required(CONF_FROM): cv.string, - vol.Optional(CONF_DELAY, default=DEFAULT_DELAY): cv.positive_int, - vol.Optional(CONF_HEADING): cv.string, - vol.Optional(CONF_LINES, default=[]): vol.All( + probatio.Required(CONF_FROM): cv.string, + probatio.Optional(CONF_DELAY, default=DEFAULT_DELAY): cv.positive_int, + probatio.Optional(CONF_HEADING): cv.string, + probatio.Optional(CONF_LINES, default=[]): probatio.All( cv.ensure_list, [cv.string] ), - vol.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_NAME): cv.string, } ], } diff --git a/homeassistant/components/vegehub/config_flow.py b/homeassistant/components/vegehub/config_flow.py index 8a3bdee0ad84b..116f12795b16d 100644 --- a/homeassistant/components/vegehub/config_flow.py +++ b/homeassistant/components/vegehub/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from vegehub import VegeHub -import voluptuous as vol from homeassistant.components.webhook import ( async_generate_id as webhook_generate_id, @@ -56,9 +56,9 @@ async def async_step_user( # Show the form to allow the user to manually enter the IP address return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_IP_ADDRESS): str, + probatio.Required(CONF_IP_ADDRESS): str, } ), errors=errors, diff --git a/homeassistant/components/velbus/config_flow.py b/homeassistant/components/velbus/config_flow.py index 83866aeb25176..83ff47a50dda4 100644 --- a/homeassistant/components/velbus/config_flow.py +++ b/homeassistant/components/velbus/config_flow.py @@ -4,10 +4,10 @@ import shutil from typing import Any, Final, override +import probatio import velbusaio.controller from velbusaio.exceptions import VelbusConnectionFailed from velbusaio.vlp_reader import VlpFile -import voluptuous as vol from homeassistant.components import usb from homeassistant.components.file_upload import process_uploaded_file @@ -114,12 +114,12 @@ async def async_step_network( return self.async_show_form( step_id="network", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_TLS): bool, - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT): int, - vol.Optional(CONF_PASSWORD): str, + probatio.Required(CONF_TLS): bool, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT): int, + probatio.Optional(CONF_PASSWORD): str, } ), suggested_values=user_input, @@ -154,7 +154,9 @@ async def async_step_usbselect( return self.async_show_form( step_id="usbselect", data_schema=self.add_suggested_values_to_schema( - vol.Schema({vol.Required(CONF_PORT): vol.In(list_of_ports)}), + probatio.Schema( + {probatio.Required(CONF_PORT): probatio.In(list_of_ports)} + ), suggested_values=user_input, ), errors=step_errors, @@ -226,9 +228,9 @@ async def async_step_vlp( return self.async_show_form( step_id="vlp", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Optional(CONF_VLP_FILE): selector.FileSelector( + probatio.Optional(CONF_VLP_FILE): selector.FileSelector( config=selector.FileSelectorConfig(accept=".vlp") ), } diff --git a/homeassistant/components/velbus/services.py b/homeassistant/components/velbus/services.py index 6d84a24f14855..b678fdc569f12 100644 --- a/homeassistant/components/velbus/services.py +++ b/homeassistant/components/velbus/services.py @@ -4,7 +4,7 @@ import shutil from typing import TYPE_CHECKING -import voluptuous as vol +import probatio from homeassistant.const import CONF_ADDRESS from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -117,9 +117,9 @@ def _clear_cache() -> None: DOMAIN, SERVICE_SCAN, scan, - vol.Schema( + probatio.Schema( { - vol.Required(CONF_CONFIG_ENTRY): selector.ConfigEntrySelector( + probatio.Required(CONF_CONFIG_ENTRY): selector.ConfigEntrySelector( { "integration": DOMAIN, } @@ -132,9 +132,9 @@ def _clear_cache() -> None: DOMAIN, SERVICE_SYNC, syn_clock, - vol.Schema( + probatio.Schema( { - vol.Required(CONF_CONFIG_ENTRY): selector.ConfigEntrySelector( + probatio.Required(CONF_CONFIG_ENTRY): selector.ConfigEntrySelector( { "integration": DOMAIN, } @@ -147,17 +147,17 @@ def _clear_cache() -> None: DOMAIN, SERVICE_SET_MEMO_TEXT, set_memo_text, - vol.Schema( + probatio.Schema( { - vol.Required(CONF_CONFIG_ENTRY): selector.ConfigEntrySelector( + probatio.Required(CONF_CONFIG_ENTRY): selector.ConfigEntrySelector( { "integration": DOMAIN, } ), - vol.Required(CONF_ADDRESS): vol.All( - vol.Coerce(int), vol.Range(min=0, max=255) + probatio.Required(CONF_ADDRESS): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=255) ), - vol.Optional(CONF_MEMO_TEXT, default=""): cv.string, + probatio.Optional(CONF_MEMO_TEXT, default=""): cv.string, } ), ) @@ -166,15 +166,15 @@ def _clear_cache() -> None: DOMAIN, SERVICE_CLEAR_CACHE, clear_cache, - vol.Schema( + probatio.Schema( { - vol.Required(CONF_CONFIG_ENTRY): selector.ConfigEntrySelector( + probatio.Required(CONF_CONFIG_ENTRY): selector.ConfigEntrySelector( { "integration": DOMAIN, } ), - vol.Optional(CONF_ADDRESS): vol.All( - vol.Coerce(int), vol.Range(min=0, max=255) + probatio.Optional(CONF_ADDRESS): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=255) ), } ), diff --git a/homeassistant/components/velux/config_flow.py b/homeassistant/components/velux/config_flow.py index e060aa98f619f..e9f32b84d8427 100644 --- a/homeassistant/components/velux/config_flow.py +++ b/homeassistant/components/velux/config_flow.py @@ -3,9 +3,9 @@ from collections.abc import Mapping from typing import Any, override +import probatio from pyvlx import PyVLX, PyVLXException from pyvlx.discovery import sanitize_hostname -import voluptuous as vol from homeassistant.config_entries import ConfigEntryState, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_MAC, CONF_NAME, CONF_PASSWORD @@ -16,10 +16,10 @@ from .const import DOMAIN, LOGGER, PYVLX_FROM_CONFIG_FLOW -USER_SCHEMA = vol.Schema( +USER_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, } ) @@ -119,9 +119,9 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, } ), errors=errors, @@ -220,9 +220,9 @@ async def async_step_discovery_confirm( return self.async_show_form( step_id="discovery_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, } ), errors=errors, diff --git a/homeassistant/components/venstar/climate.py b/homeassistant/components/venstar/climate.py index 415f0a4693675..4a9676324a231 100644 --- a/homeassistant/components/venstar/climate.py +++ b/homeassistant/components/venstar/climate.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.climate import ( ATTR_HVAC_MODE, @@ -53,15 +53,15 @@ PLATFORM_SCHEMA = CLIMATE_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_PASSWORD): cv.string, - vol.Optional(CONF_HUMIDIFIER, default=True): cv.boolean, - vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, - vol.Optional(CONF_TIMEOUT, default=5): vol.All( - vol.Coerce(int), vol.Range(min=1) + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_HUMIDIFIER, default=True): cv.boolean, + probatio.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, + probatio.Optional(CONF_TIMEOUT, default=5): probatio.All( + probatio.Coerce(int), probatio.Range(min=1) ), - vol.Optional(CONF_USERNAME): cv.string, - vol.Optional(CONF_PIN): cv.string, + probatio.Optional(CONF_USERNAME): cv.string, + probatio.Optional(CONF_PIN): cv.string, } ) diff --git a/homeassistant/components/venstar/config_flow.py b/homeassistant/components/venstar/config_flow.py index ab68a87d10929..c10b162f8bb66 100644 --- a/homeassistant/components/venstar/config_flow.py +++ b/homeassistant/components/venstar/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from venstarcolortouch import VenstarColorTouch -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -73,13 +73,13 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Optional(CONF_USERNAME): str, - vol.Optional(CONF_PASSWORD): str, - vol.Optional(CONF_PIN): str, - vol.Optional(CONF_SSL, default=False): bool, + probatio.Required(CONF_HOST): str, + probatio.Optional(CONF_USERNAME): str, + probatio.Optional(CONF_PASSWORD): str, + probatio.Optional(CONF_PIN): str, + probatio.Optional(CONF_SSL, default=False): bool, } ), errors=errors, diff --git a/homeassistant/components/vera/config_flow.py b/homeassistant/components/vera/config_flow.py index f872e4aaa6a74..7debe3000ed17 100644 --- a/homeassistant/components/vera/config_flow.py +++ b/homeassistant/components/vera/config_flow.py @@ -5,9 +5,9 @@ import re from typing import Any, override +import probatio import pyvera as pv from requests.exceptions import RequestException -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_USER, @@ -50,11 +50,11 @@ def options_schema(options: Mapping[str, Any] | None = None) -> VolDictType: """Return options schema.""" options = options or {} return { - vol.Optional( + probatio.Optional( CONF_LIGHTS, default=list_to_str(options.get(CONF_LIGHTS, [])), ): str, - vol.Optional( + probatio.Optional( CONF_EXCLUDE, default=list_to_str(options.get(CONF_EXCLUDE, [])), ): str, @@ -85,7 +85,7 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema(options_schema(self.config_entry.options)), + data_schema=probatio.Schema(options_schema(self.config_entry.options)), description_placeholders={ "sample_ip": "http://192.168.1.161:3480", "documentation_url": "https://www.home-assistant.io/integrations/vera/", @@ -120,8 +120,8 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_CONTROLLER): str, **options_schema()} + data_schema=probatio.Schema( + {probatio.Required(CONF_CONTROLLER): str, **options_schema()} ), description_placeholders={ "sample_ip": "http://192.168.1.161:3480", diff --git a/homeassistant/components/verisure/config_flow.py b/homeassistant/components/verisure/config_flow.py index 782e921f7f6b8..22b12636dcf98 100644 --- a/homeassistant/components/verisure/config_flow.py +++ b/homeassistant/components/verisure/config_flow.py @@ -3,6 +3,7 @@ from collections.abc import Mapping from typing import Any, override +import probatio from verisure import ( Error as VerisureError, LoginError as VerisureLoginError, @@ -10,7 +11,6 @@ ResponseError as VerisureResponseError, Session as Verisure, ) -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, OptionsFlow from homeassistant.const import CONF_CODE, CONF_EMAIL, CONF_PASSWORD @@ -102,10 +102,10 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_EMAIL): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_EMAIL): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, @@ -133,10 +133,10 @@ async def async_step_mfa( return self.async_show_form( step_id="mfa", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_CODE): vol.All( - vol.Coerce(str), vol.Length(min=6, max=6) + probatio.Required(CONF_CODE): probatio.All( + probatio.Coerce(str), probatio.Length(min=6, max=6) ) } ), @@ -163,8 +163,8 @@ async def async_step_installation( if len(installations) != 1: return self.async_show_form( step_id="installation", - data_schema=vol.Schema( - {vol.Required(CONF_GIID): vol.In(installations)} + data_schema=probatio.Schema( + {probatio.Required(CONF_GIID): probatio.In(installations)} ), ) user_input = {CONF_GIID: list(installations)[0]} @@ -251,12 +251,12 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_EMAIL, default=self._get_reauth_entry().data[CONF_EMAIL] ): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, @@ -290,11 +290,11 @@ async def async_step_reauth_mfa( return self.async_show_form( step_id="reauth_mfa", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_CODE): vol.All( - vol.Coerce(str), - vol.Length(min=6, max=6), + probatio.Required(CONF_CODE): probatio.All( + probatio.Coerce(str), + probatio.Length(min=6, max=6), ) } ), @@ -316,9 +316,9 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_LOCK_CODE_DIGITS, description={ "suggested_value": self.config_entry.options.get( diff --git a/homeassistant/components/versasense/__init__.py b/homeassistant/components/versasense/__init__.py index baef32e7b76d5..70dbb0f045544 100644 --- a/homeassistant/components/versasense/__init__.py +++ b/homeassistant/components/versasense/__init__.py @@ -2,8 +2,8 @@ import logging +import probatio import pyversasense as pyv -import voluptuous as vol from homeassistant.const import CONF_HOST, Platform from homeassistant.core import HomeAssistant @@ -27,8 +27,9 @@ DOMAIN = "versasense" # Validation of the user's configuration -CONFIG_SCHEMA = vol.Schema( - {DOMAIN: vol.Schema({vol.Required(CONF_HOST): cv.string})}, extra=vol.ALLOW_EXTRA +CONFIG_SCHEMA = probatio.Schema( + {DOMAIN: probatio.Schema({probatio.Required(CONF_HOST): cv.string})}, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/version/config_flow.py b/homeassistant/components/version/config_flow.py index 184d8e659156a..80e9567ed8f36 100644 --- a/homeassistant/components/version/config_flow.py +++ b/homeassistant/components/version/config_flow.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_SOURCE @@ -50,12 +50,12 @@ async def async_step_user( self._entry_data = DEFAULT_CONFIGURATION.copy() return self.async_show_form( step_id=STEP_USER, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_VERSION_SOURCE, default=VERSION_SOURCE_LOCAL, - ): vol.In(VERSION_SOURCE_MAP.keys()) + ): probatio.In(VERSION_SOURCE_MAP.keys()) } ), ) @@ -81,34 +81,36 @@ async def async_step_version_source( "supervisor", "container", ): - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required( + probatio.Required( CONF_CHANNEL, default=DEFAULT_CHANNEL.title() - ): vol.In(VALID_CHANNELS), + ): probatio.In(VALID_CHANNELS), } ) if self._entry_data[CONF_SOURCE] == "supervisor": data_schema = data_schema.extend( { - vol.Required(CONF_IMAGE, default=DEFAULT_IMAGE): vol.In( - VALID_IMAGES - ), - vol.Required(CONF_BOARD, default=DEFAULT_BOARD): vol.In( - VALID_BOARDS - ), + probatio.Required( + CONF_IMAGE, default=DEFAULT_IMAGE + ): probatio.In(VALID_IMAGES), + probatio.Required( + CONF_BOARD, default=DEFAULT_BOARD + ): probatio.In(VALID_BOARDS), } ) else: data_schema = data_schema.extend( { - vol.Required(CONF_IMAGE, default=DEFAULT_IMAGE): vol.In( - VALID_CONTAINER_IMAGES - ) + probatio.Required( + CONF_IMAGE, default=DEFAULT_IMAGE + ): probatio.In(VALID_CONTAINER_IMAGES) } ) else: - data_schema = vol.Schema({vol.Required(CONF_BETA, default=False): bool}) + data_schema = probatio.Schema( + {probatio.Required(CONF_BETA, default=False): bool} + ) return self.async_show_form( step_id=STEP_VERSION_SOURCE, diff --git a/homeassistant/components/vesync/config_flow.py b/homeassistant/components/vesync/config_flow.py index 03a86e7bf5ba2..41edc24942c38 100644 --- a/homeassistant/components/vesync/config_flow.py +++ b/homeassistant/components/vesync/config_flow.py @@ -4,9 +4,9 @@ import logging from typing import Any, override +import probatio from pyvesync import VeSync from pyvesync.utils.errors import VeSyncError -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -18,10 +18,10 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, } ) diff --git a/homeassistant/components/viaggiatreno/sensor.py b/homeassistant/components/viaggiatreno/sensor.py index d072c3a7fcfb5..a1f4f8e99305a 100644 --- a/homeassistant/components/viaggiatreno/sensor.py +++ b/homeassistant/components/viaggiatreno/sensor.py @@ -5,13 +5,13 @@ from typing import Any, override import aiohttp +import probatio from viaggiatreno_ha.trainline import ( TrainLine, TrainLineStatus, TrainState, Viaggiatreno, ) -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -54,9 +54,9 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_TRAIN_ID): cv.string, - vol.Required(CONF_STATION_ID): cv.string, - vol.Optional(CONF_NAME): cv.string, + probatio.Required(CONF_TRAIN_ID): cv.string, + probatio.Required(CONF_STATION_ID): cv.string, + probatio.Optional(CONF_NAME): cv.string, } ) diff --git a/homeassistant/components/vicare/climate.py b/homeassistant/components/vicare/climate.py index 5a73894a97700..f645e1f799cbe 100644 --- a/homeassistant/components/vicare/climate.py +++ b/homeassistant/components/vicare/climate.py @@ -4,6 +4,7 @@ import logging from typing import Any, override +import probatio from PyViCare.PyViCareDevice import Device as PyViCareDevice from PyViCare.PyViCareDeviceConfig import PyViCareDeviceConfig from PyViCare.PyViCareHeatingDevice import HeatingCircuit as PyViCareHeatingCircuit @@ -11,7 +12,6 @@ PyViCareCommandError, PyViCareNotSupportedFeatureError, ) -import voluptuous as vol from homeassistant.components.climate import ( ClimateEntity, @@ -102,7 +102,7 @@ async def async_setup_entry( platform = entity_platform.async_get_current_platform() platform.async_register_entity_service( SERVICE_SET_VICARE_MODE, - {vol.Required(SERVICE_SET_VICARE_MODE_ATTR_MODE): cv.string}, + {probatio.Required(SERVICE_SET_VICARE_MODE_ATTR_MODE): cv.string}, "set_vicare_mode", ) diff --git a/homeassistant/components/victron_ble/config_flow.py b/homeassistant/components/victron_ble/config_flow.py index bfa950dd3c34e..b91c6f9736ae4 100644 --- a/homeassistant/components/victron_ble/config_flow.py +++ b/homeassistant/components/victron_ble/config_flow.py @@ -4,8 +4,8 @@ import logging from typing import Any, override +import probatio from victron_ble_ha_parser import VictronBluetoothDeviceData -import voluptuous as vol from homeassistant.components import bluetooth from homeassistant.components.bluetooth import ( @@ -19,9 +19,9 @@ _LOGGER = logging.getLogger(__name__) -STEP_ACCESS_TOKEN_DATA_SCHEMA = vol.Schema( +STEP_ACCESS_TOKEN_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_ACCESS_TOKEN): str, + probatio.Required(CONF_ACCESS_TOKEN): str, } ) @@ -122,8 +122,8 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Required(CONF_ADDRESS): vol.In(self._discovered_devices)} + data_schema=probatio.Schema( + {probatio.Required(CONF_ADDRESS): probatio.In(self._discovered_devices)} ), ) diff --git a/homeassistant/components/victron_gx/config_flow.py b/homeassistant/components/victron_gx/config_flow.py index f4b0361b24f7b..845bc269c0f08 100644 --- a/homeassistant/components/victron_gx/config_flow.py +++ b/homeassistant/components/victron_gx/config_flow.py @@ -5,6 +5,7 @@ from typing import Any, override from urllib.parse import urlparse +import probatio from victron_mqtt import ( AuthenticationError, CannotConnectError, @@ -13,7 +14,6 @@ PairingToken, request_pairing_token, ) -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_IGNORE, @@ -45,34 +45,34 @@ ENTRY_TITLE_FORMAT = "Victron OS {installation_id} ({host}:{port})" -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST, default=DEFAULT_HOST): selector.TextSelector(), - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, - vol.Optional(CONF_USERNAME): selector.TextSelector(), - vol.Optional(CONF_PASSWORD): selector.TextSelector( + probatio.Required(CONF_HOST, default=DEFAULT_HOST): selector.TextSelector(), + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Optional(CONF_USERNAME): selector.TextSelector(), + probatio.Optional(CONF_PASSWORD): selector.TextSelector( selector.TextSelectorConfig(type=selector.TextSelectorType.PASSWORD) ), - vol.Required(CONF_SSL, default=False): selector.BooleanSelector(), + probatio.Required(CONF_SSL, default=False): selector.BooleanSelector(), } ) -STEP_SSDP_AUTH_DATA_SCHEMA = vol.Schema( +STEP_SSDP_AUTH_DATA_SCHEMA = probatio.Schema( { - vol.Optional(CONF_PASSWORD, default=""): selector.TextSelector( + probatio.Optional(CONF_PASSWORD, default=""): selector.TextSelector( selector.TextSelectorConfig(type=selector.TextSelectorType.PASSWORD) ), - vol.Optional(CONF_SSL): selector.BooleanSelector(), + probatio.Optional(CONF_SSL): selector.BooleanSelector(), } ) -STEP_REAUTH_DATA_SCHEMA = vol.Schema( +STEP_REAUTH_DATA_SCHEMA = probatio.Schema( { - vol.Optional(CONF_USERNAME, default=""): selector.TextSelector(), - vol.Optional(CONF_PASSWORD, default=""): selector.TextSelector( + probatio.Optional(CONF_USERNAME, default=""): selector.TextSelector(), + probatio.Optional(CONF_PASSWORD, default=""): selector.TextSelector( selector.TextSelectorConfig(type=selector.TextSelectorType.PASSWORD) ), - vol.Optional(CONF_SSL): selector.BooleanSelector(), + probatio.Optional(CONF_SSL): selector.BooleanSelector(), } ) diff --git a/homeassistant/components/victron_remote_monitoring/config_flow.py b/homeassistant/components/victron_remote_monitoring/config_flow.py index 6a9178d56fbd0..0f360d5204633 100644 --- a/homeassistant/components/victron_remote_monitoring/config_flow.py +++ b/homeassistant/components/victron_remote_monitoring/config_flow.py @@ -4,10 +4,10 @@ import logging from typing import Any, override +import probatio from victron_vrm import VictronVRMClient from victron_vrm.exceptions import AuthenticationError, VictronVRMError from victron_vrm.models import Site -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_API_TOKEN @@ -24,7 +24,7 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema({vol.Required(CONF_API_TOKEN): str}) +STEP_USER_DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_API_TOKEN): str}) class CannotConnect(HomeAssistantError): @@ -153,9 +153,9 @@ async def async_step_select_site( site_options = self._build_site_options() return self.async_show_form( step_id="select_site", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_SITE_ID): SelectSelector( + probatio.Required(CONF_SITE_ID): SelectSelector( SelectSelectorConfig( options=site_options, mode=SelectSelectorMode.DROPDOWN ) @@ -194,9 +194,9 @@ async def async_step_select_site( site_options = self._build_site_options() return self.async_show_form( step_id="select_site", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_SITE_ID): SelectSelector( + probatio.Required(CONF_SITE_ID): SelectSelector( SelectSelectorConfig( options=site_options, mode=SelectSelectorMode.DROPDOWN ) @@ -251,6 +251,6 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema({vol.Required(CONF_API_TOKEN): str}), + data_schema=probatio.Schema({probatio.Required(CONF_API_TOKEN): str}), errors=errors, ) diff --git a/homeassistant/components/vilfo/config_flow.py b/homeassistant/components/vilfo/config_flow.py index 40fd11edee314..e161f84ea80e2 100644 --- a/homeassistant/components/vilfo/config_flow.py +++ b/homeassistant/components/vilfo/config_flow.py @@ -3,12 +3,12 @@ import logging from typing import Any, override +import probatio from vilfo import Client as VilfoClient from vilfo.exceptions import ( AuthenticationException as VilfoAuthenticationException, VilfoException, ) -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_ACCESS_TOKEN, CONF_HOST, CONF_ID, CONF_MAC @@ -20,10 +20,10 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST, default=ROUTER_DEFAULT_HOST): str, - vol.Required(CONF_ACCESS_TOKEN, default=""): str, + probatio.Required(CONF_HOST, default=ROUTER_DEFAULT_HOST): str, + probatio.Required(CONF_ACCESS_TOKEN, default=""): str, } ) diff --git a/homeassistant/components/vistapool/config_flow.py b/homeassistant/components/vistapool/config_flow.py index 82c6f419ccf9a..1d660f36bef82 100644 --- a/homeassistant/components/vistapool/config_flow.py +++ b/homeassistant/components/vistapool/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from aioaquarite import AquariteAuth, AquariteClient, AquariteError, AuthenticationError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigEntry, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_PASSWORD, CONF_USERNAME @@ -16,14 +16,14 @@ _LOGGER = logging.getLogger(__name__) -AUTH_SCHEMA = vol.Schema( +AUTH_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, } ) -PASSWORD_SCHEMA = vol.Schema({vol.Required(CONF_PASSWORD): cv.string}) +PASSWORD_SCHEMA = probatio.Schema({probatio.Required(CONF_PASSWORD): cv.string}) class VistapoolConfigFlow(ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/components/vivotek/config_flow.py b/homeassistant/components/vivotek/config_flow.py index 421aa2c1aa5fa..789cfa9699056 100644 --- a/homeassistant/components/vivotek/config_flow.py +++ b/homeassistant/components/vivotek/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from libpyvivotek.vivotek import SECURITY_LEVELS, VivotekCameraError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, OptionsFlow from homeassistant.const import ( @@ -40,18 +40,18 @@ "doc_url": "https://www.home-assistant.io/integrations/vivotek/" } -CONF_SCHEMA = vol.Schema( +CONF_SCHEMA = probatio.Schema( { - vol.Required(CONF_IP_ADDRESS): cv.string, - vol.Required(CONF_PORT, default=80): cv.port, - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Required(CONF_AUTHENTICATION, default=HTTP_BASIC_AUTHENTICATION): vol.In( - [HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION] - ), - vol.Required(CONF_SSL, default=False): cv.boolean, - vol.Required(CONF_VERIFY_SSL, default=True): cv.boolean, - vol.Required(CONF_SECURITY_LEVEL): SelectSelector( + probatio.Required(CONF_IP_ADDRESS): cv.string, + probatio.Required(CONF_PORT, default=80): cv.port, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Required( + CONF_AUTHENTICATION, default=HTTP_BASIC_AUTHENTICATION + ): probatio.In([HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION]), + probatio.Required(CONF_SSL, default=False): cv.boolean, + probatio.Required(CONF_VERIFY_SSL, default=True): cv.boolean, + probatio.Required(CONF_SECURITY_LEVEL): SelectSelector( SelectSelectorConfig( options=list(SECURITY_LEVELS.keys()), mode=SelectSelectorMode.DROPDOWN, @@ -59,16 +59,16 @@ sort=True, ), ), - vol.Required( + probatio.Required( CONF_STREAM_PATH, default=DEFAULT_STREAM_SOURCE, ): cv.string, } ) -OPTIONS_SCHEMA = vol.Schema( +OPTIONS_SCHEMA = probatio.Schema( { - vol.Required(CONF_FRAMERATE, default=DEFAULT_FRAMERATE): NumberSelector( + probatio.Required(CONF_FRAMERATE, default=DEFAULT_FRAMERATE): NumberSelector( NumberSelectorConfig(min=0, unit_of_measurement=UnitOfFrequency.HERTZ) ), } diff --git a/homeassistant/components/vizio/config_flow.py b/homeassistant/components/vizio/config_flow.py index cbcc5424a740e..6c100e81961f6 100644 --- a/homeassistant/components/vizio/config_flow.py +++ b/homeassistant/components/vizio/config_flow.py @@ -5,6 +5,7 @@ import logging from typing import Any, override +import probatio from vizaio import ( AppRecord, PairChallenge, @@ -14,7 +15,6 @@ async_resolve_host, ) from vizaio.apps import APP_HOME, BUNDLED_APPS -import voluptuous as vol from homeassistant.components.media_player import MediaPlayerDeviceClass from homeassistant.config_entries import ( @@ -56,7 +56,7 @@ _LOGGER = logging.getLogger(__name__) -def _get_config_schema(input_dict: dict[str, Any] | None = None) -> vol.Schema: +def _get_config_schema(input_dict: dict[str, Any] | None = None) -> probatio.Schema: """Return schema defaults for init step based on user input/config dict. Retain info already provided for future form views by setting them @@ -65,23 +65,23 @@ def _get_config_schema(input_dict: dict[str, Any] | None = None) -> vol.Schema: if input_dict is None: input_dict = {} - return vol.Schema( + return probatio.Schema( { # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Required( + probatio.Required( CONF_NAME, default=input_dict.get(CONF_NAME, DEFAULT_NAME) ): str, - vol.Required(CONF_HOST, default=input_dict.get(CONF_HOST)): str, - vol.Optional( + probatio.Required(CONF_HOST, default=input_dict.get(CONF_HOST)): str, + probatio.Optional( CONF_ACCESS_TOKEN, default=input_dict.get(CONF_ACCESS_TOKEN, "") ): str, }, - extra=vol.REMOVE_EXTRA, + extra=probatio.REMOVE_EXTRA, ) -def _get_pairing_schema(input_dict: dict[str, Any] | None = None) -> vol.Schema: +def _get_pairing_schema(input_dict: dict[str, Any] | None = None) -> probatio.Schema: """Return schema defaults for pairing data based on user input. Retain info already provided for future form views by setting @@ -90,8 +90,8 @@ def _get_pairing_schema(input_dict: dict[str, Any] | None = None) -> vol.Schema: if input_dict is None: input_dict = {} - return vol.Schema( - {vol.Required(CONF_PIN, default=input_dict.get(CONF_PIN, "")): str} + return probatio.Schema( + {probatio.Required(CONF_PIN, default=input_dict.get(CONF_PIN, "")): str} ) @@ -174,14 +174,14 @@ async def async_step_init( return self.async_create_entry(title="", data=user_input) - options = vol.Schema( + options = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_VOLUME_STEP, default=self.config_entry.options.get( CONF_VOLUME_STEP, DEFAULT_VOLUME_STEP ), - ): vol.All(vol.Coerce(int), vol.Range(min=1, max=10)) + ): probatio.All(probatio.Coerce(int), probatio.Range(min=1, max=10)) } ) @@ -194,13 +194,14 @@ async def async_step_init( ) options = options.extend( { - vol.Optional( + probatio.Optional( CONF_INCLUDE_OR_EXCLUDE, default=default_include_or_exclude.title(), - ): vol.All( - vol.In([CONF_INCLUDE.title(), CONF_EXCLUDE.title()]), vol.Lower + ): probatio.All( + probatio.In([CONF_INCLUDE.title(), CONF_EXCLUDE.title()]), + probatio.Lower, ), - vol.Optional( + probatio.Optional( CONF_APPS_TO_INCLUDE_OR_EXCLUDE, default=self.config_entry.options.get(CONF_APPS, {}).get( default_include_or_exclude, [] @@ -234,7 +235,7 @@ def async_get_options_flow( def __init__(self) -> None: """Initialize config flow.""" - self._user_schema: vol.Schema | None = None + self._user_schema: probatio.Schema | None = None self._must_show_form: bool | None = None self._pair_challenge: PairChallenge | None = None self._data: dict[str, Any] | None = None @@ -249,8 +250,8 @@ def _async_show_source_form( assert self._data return self.async_show_form( step_id="reconfigure", - data_schema=vol.Schema( - {vol.Required(CONF_HOST, default=self._data[CONF_HOST]): str} + data_schema=probatio.Schema( + {probatio.Required(CONF_HOST, default=self._data[CONF_HOST]): str} ), errors=errors, ) diff --git a/homeassistant/components/vizio/remote.py b/homeassistant/components/vizio/remote.py index dc784e15b8b81..5585b34041b17 100644 --- a/homeassistant/components/vizio/remote.py +++ b/homeassistant/components/vizio/remote.py @@ -4,7 +4,7 @@ from collections.abc import Iterable from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.remote import ( ATTR_DELAY_SECS, @@ -104,7 +104,9 @@ async def async_send_command(self, command: Iterable[str], **kwargs: Any) -> Non """Send remote commands to the device.""" num_repeats: int = kwargs.get(ATTR_NUM_REPEATS, 1) delay: float = kwargs.get(ATTR_DELAY_SECS, DEFAULT_DELAY_SECS) - resolved = [vol.All(vol.Lower, self._resolve_command)(cmd) for cmd in command] + resolved = [ + probatio.All(probatio.Lower, self._resolve_command)(cmd) for cmd in command + ] for i in range(num_repeats): for cmd in resolved: diff --git a/homeassistant/components/vizio/services.py b/homeassistant/components/vizio/services.py index 424e5199e95ee..c5499db1a9aa0 100644 --- a/homeassistant/components/vizio/services.py +++ b/homeassistant/components/vizio/services.py @@ -1,6 +1,6 @@ """Vizio SmartCast services.""" -import voluptuous as vol +import probatio from homeassistant.components.media_player import DOMAIN as MEDIA_PLAYER_DOMAIN from homeassistant.core import HomeAssistant, callback @@ -18,13 +18,17 @@ ATTR_TEXT = "text" UPDATE_SETTING_SCHEMA: VolDictType = { - vol.Required(ATTR_SETTING_TYPE): vol.All(cv.string, vol.Lower, cv.slugify), - vol.Required(ATTR_SETTING_NAME): vol.All(cv.string, vol.Lower, cv.slugify), - vol.Required(ATTR_NEW_VALUE): vol.Any(vol.Coerce(int), cv.string), + probatio.Required(ATTR_SETTING_TYPE): probatio.All( + cv.string, probatio.Lower, cv.slugify + ), + probatio.Required(ATTR_SETTING_NAME): probatio.All( + cv.string, probatio.Lower, cv.slugify + ), + probatio.Required(ATTR_NEW_VALUE): probatio.Any(probatio.Coerce(int), cv.string), } SEND_TEXT_SCHEMA: VolDictType = { - vol.Required(ATTR_TEXT): cv.string, + probatio.Required(ATTR_TEXT): cv.string, } diff --git a/homeassistant/components/vlc_telnet/config_flow.py b/homeassistant/components/vlc_telnet/config_flow.py index e9e467639f10e..22c7ad7511341 100644 --- a/homeassistant/components/vlc_telnet/config_flow.py +++ b/homeassistant/components/vlc_telnet/config_flow.py @@ -6,7 +6,7 @@ from aiovlc.client import Client from aiovlc.exceptions import AuthError, ConnectError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PASSWORD, CONF_PORT @@ -19,23 +19,23 @@ _LOGGER = logging.getLogger(__name__) -def user_form_schema(user_input: dict[str, Any] | None) -> vol.Schema: +def user_form_schema(user_input: dict[str, Any] | None) -> probatio.Schema: """Return user form schema.""" user_input = user_input or {} - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_PASSWORD): str, - vol.Optional( + probatio.Required(CONF_PASSWORD): str, + probatio.Optional( CONF_HOST, default=user_input.get(CONF_HOST, "localhost") ): str, - vol.Optional( + probatio.Optional( CONF_PORT, default=user_input.get(CONF_PORT, DEFAULT_PORT) ): int, } ) -STEP_REAUTH_DATA_SCHEMA = vol.Schema({vol.Required(CONF_PASSWORD): str}) +STEP_REAUTH_DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_PASSWORD): str}) async def vlc_connect(vlc: Client) -> None: diff --git a/homeassistant/components/vodafone_station/config_flow.py b/homeassistant/components/vodafone_station/config_flow.py index 3b2af107af171..cd4ab243da65a 100644 --- a/homeassistant/components/vodafone_station/config_flow.py +++ b/homeassistant/components/vodafone_station/config_flow.py @@ -5,7 +5,7 @@ from aiovodafone import exceptions as aiovodafone_exceptions from aiovodafone.models import get_device_type, init_device_class -import voluptuous as vol +import probatio from homeassistant.components.device_tracker import ( CONF_CONSIDER_HOME, @@ -32,19 +32,19 @@ from .utils import async_client_session -def user_form_schema(user_input: dict[str, Any] | None) -> vol.Schema: +def user_form_schema(user_input: dict[str, Any] | None) -> probatio.Schema: """Return user form schema.""" user_input = user_input or {} - return vol.Schema( + return probatio.Schema( { - vol.Optional(CONF_HOST, default=DEFAULT_HOST): str, - vol.Optional(CONF_USERNAME, default=DEFAULT_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Optional(CONF_HOST, default=DEFAULT_HOST): str, + probatio.Optional(CONF_USERNAME, default=DEFAULT_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) -STEP_REAUTH_DATA_SCHEMA = vol.Schema({vol.Required(CONF_PASSWORD): str}) +STEP_REAUTH_DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_PASSWORD): str}) async def validate_input(hass: HomeAssistant, data: dict[str, Any]) -> dict[str, Any]: @@ -218,14 +218,14 @@ async def async_step_init( if user_input is not None: return self.async_create_entry(title="", data=user_input) - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_CONSIDER_HOME, default=self.config_entry.options.get( CONF_CONSIDER_HOME, DEFAULT_CONSIDER_HOME.total_seconds() ), - ): vol.All(vol.Coerce(int), vol.Clamp(min=0, max=900)) + ): probatio.All(probatio.Coerce(int), probatio.Clamp(min=0, max=900)) } ) return self.async_show_form(step_id="init", data_schema=data_schema) diff --git a/homeassistant/components/voicerss/tts.py b/homeassistant/components/voicerss/tts.py index ed9a9c41aff91..0fcf694d6d1b9 100644 --- a/homeassistant/components/voicerss/tts.py +++ b/homeassistant/components/voicerss/tts.py @@ -6,7 +6,7 @@ from typing import TYPE_CHECKING, Any, override import aiohttp -import voluptuous as vol +import probatio from homeassistant.components.tts import ( CONF_LANG, @@ -153,10 +153,16 @@ PLATFORM_SCHEMA = TTS_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_API_KEY): cv.string, - vol.Optional(CONF_LANG, default=DEFAULT_LANG): vol.In(SUPPORT_LANGUAGES), - vol.Optional(CONF_CODEC, default=DEFAULT_CODEC): vol.In(SUPPORT_CODECS), - vol.Optional(CONF_FORMAT, default=DEFAULT_FORMAT): vol.In(SUPPORT_FORMATS), + probatio.Required(CONF_API_KEY): cv.string, + probatio.Optional(CONF_LANG, default=DEFAULT_LANG): probatio.In( + SUPPORT_LANGUAGES + ), + probatio.Optional(CONF_CODEC, default=DEFAULT_CODEC): probatio.In( + SUPPORT_CODECS + ), + probatio.Optional(CONF_FORMAT, default=DEFAULT_FORMAT): probatio.In( + SUPPORT_FORMATS + ), } ) diff --git a/homeassistant/components/voip/config_flow.py b/homeassistant/components/voip/config_flow.py index 915fe26147b7e..1630e51fc9ad2 100644 --- a/homeassistant/components/voip/config_flow.py +++ b/homeassistant/components/voip/config_flow.py @@ -2,8 +2,8 @@ from typing import Any, override +import probatio from voip_utils import SIP_PORT -import voluptuous as vol from homeassistant.config_entries import ( ConfigEntry, @@ -73,23 +73,23 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_SIP_PORT, default=self.config_entry.options.get( CONF_SIP_PORT, SIP_PORT, ), ): cv.port, - vol.Optional( + probatio.Optional( CONF_SIP_USER, description={ "suggested_value": self.config_entry.options.get( CONF_SIP_USER, None ) }, - ): vol.Any(None, cv.string), + ): probatio.Any(None, cv.string), } ), ) diff --git a/homeassistant/components/volkszaehler/sensor.py b/homeassistant/components/volkszaehler/sensor.py index acf58f9c1c41f..c29c92dfb9d35 100644 --- a/homeassistant/components/volkszaehler/sensor.py +++ b/homeassistant/components/volkszaehler/sensor.py @@ -4,9 +4,9 @@ import logging from typing import override +import probatio from volkszaehler import Volkszaehler from volkszaehler.exceptions import VolkszaehlerApiConnectionError -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -74,12 +74,12 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_UUID): cv.string, - vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_MONITORED_CONDITIONS, default=["average"]): vol.All( - cv.ensure_list, [vol.In(SENSOR_KEYS)] + probatio.Required(CONF_UUID): cv.string, + probatio.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_MONITORED_CONDITIONS, default=["average"]): probatio.All( + cv.ensure_list, [probatio.In(SENSOR_KEYS)] ), } ) diff --git a/homeassistant/components/volumio/config_flow.py b/homeassistant/components/volumio/config_flow.py index 91f076a22e727..b455dadf8bec4 100644 --- a/homeassistant/components/volumio/config_flow.py +++ b/homeassistant/components/volumio/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from pyvolumio import CannotConnectError, Volumio -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_ID, CONF_NAME, CONF_PORT @@ -18,8 +18,8 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema( - {vol.Required(CONF_HOST): str, vol.Required(CONF_PORT, default=3000): int} +DATA_SCHEMA = probatio.Schema( + {probatio.Required(CONF_HOST): str, probatio.Required(CONF_PORT, default=3000): int} ) diff --git a/homeassistant/components/volvo/config_flow.py b/homeassistant/components/volvo/config_flow.py index 06d8d02e20b37..54ce36760df3c 100644 --- a/homeassistant/components/volvo/config_flow.py +++ b/homeassistant/components/volvo/config_flow.py @@ -4,7 +4,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from volvocarsapi.api import VolvoCarsApi from volvocarsapi.models import VolvoApiException, VolvoCarsVehicle from volvocarsapi.scopes import ALL_SCOPES @@ -145,9 +145,9 @@ async def async_step_api_key( user_input = {} schema = self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_API_KEY): TextSelector( + probatio.Required(CONF_API_KEY): TextSelector( TextSelectorConfig( type=TextSelectorType.TEXT, autocomplete="password" ) @@ -193,9 +193,9 @@ async def async_step_vin( if len(self._vehicles) == 0: errors[CONF_VIN] = "no_vehicles" - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required(CONF_VIN): SelectSelector( + probatio.Required(CONF_VIN): SelectSelector( SelectSelectorConfig( options=[ SelectOptionDict( diff --git a/homeassistant/components/volvo/services.py b/homeassistant/components/volvo/services.py index 0eaabae110447..67a33b6f638d7 100644 --- a/homeassistant/components/volvo/services.py +++ b/homeassistant/components/volvo/services.py @@ -6,7 +6,7 @@ from urllib import parse from httpx import AsyncClient, HTTPError, HTTPStatusError -import voluptuous as vol +import probatio from homeassistant.core import HomeAssistant, ServiceCall, SupportsResponse, callback from homeassistant.exceptions import HomeAssistantError, ServiceValidationError @@ -21,10 +21,10 @@ CONF_CONFIG_ENTRY_ID = "entry" CONF_IMAGE_TYPES = "images" SERVICE_GET_IMAGE_URL = "get_image_url" -SERVICE_GET_IMAGE_URL_SCHEMA = vol.Schema( +SERVICE_GET_IMAGE_URL_SCHEMA = probatio.Schema( { - vol.Required(CONF_CONFIG_ENTRY_ID): str, - vol.Optional(CONF_IMAGE_TYPES): vol.All(cv.ensure_list, [str]), + probatio.Required(CONF_CONFIG_ENTRY_ID): str, + probatio.Optional(CONF_IMAGE_TYPES): probatio.All(cv.ensure_list, [str]), } ) diff --git a/homeassistant/components/w800rf32/__init__.py b/homeassistant/components/w800rf32/__init__.py index 7dab0b137c535..172c919f6edc0 100644 --- a/homeassistant/components/w800rf32/__init__.py +++ b/homeassistant/components/w800rf32/__init__.py @@ -2,7 +2,7 @@ import logging -import voluptuous as vol +import probatio import W800rf32 as w800 from homeassistant.const import ( @@ -22,8 +22,9 @@ _LOGGER = logging.getLogger(__name__) -CONFIG_SCHEMA = vol.Schema( - {DOMAIN: vol.Schema({vol.Required(CONF_DEVICE): cv.string})}, extra=vol.ALLOW_EXTRA +CONFIG_SCHEMA = probatio.Schema( + {DOMAIN: probatio.Schema({probatio.Required(CONF_DEVICE): cv.string})}, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/w800rf32/binary_sensor.py b/homeassistant/components/w800rf32/binary_sensor.py index bdfed9222c0a0..32b41346c201c 100644 --- a/homeassistant/components/w800rf32/binary_sensor.py +++ b/homeassistant/components/w800rf32/binary_sensor.py @@ -4,7 +4,7 @@ import logging from typing import override -import voluptuous as vol +import probatio import W800rf32 as w800 from homeassistant.components.binary_sensor import ( @@ -28,19 +28,19 @@ PLATFORM_SCHEMA = BINARY_SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_DEVICES): { - cv.string: vol.Schema( + probatio.Required(CONF_DEVICES): { + cv.string: probatio.Schema( { - vol.Required(CONF_NAME): cv.string, - vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, - vol.Optional(CONF_OFF_DELAY): vol.All( + probatio.Required(CONF_NAME): cv.string, + probatio.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, + probatio.Optional(CONF_OFF_DELAY): probatio.All( cv.time_period, cv.positive_timedelta ), } ) } }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/wake_on_lan/__init__.py b/homeassistant/components/wake_on_lan/__init__.py index 8dd1972757084..d25ea2c5a5de2 100644 --- a/homeassistant/components/wake_on_lan/__init__.py +++ b/homeassistant/components/wake_on_lan/__init__.py @@ -3,7 +3,7 @@ from functools import partial import logging -import voluptuous as vol +import probatio import wakeonlan from homeassistant.config_entries import ConfigEntry @@ -18,12 +18,12 @@ SERVICE_SEND_MAGIC_PACKET = "send_magic_packet" -WAKE_ON_LAN_SEND_MAGIC_PACKET_SCHEMA = vol.Schema( +WAKE_ON_LAN_SEND_MAGIC_PACKET_SCHEMA = probatio.Schema( { - vol.Required(CONF_MAC): cv.string, - vol.Optional(CONF_SECUREON_PASSWORD): cv.string, - vol.Optional(CONF_BROADCAST_ADDRESS): cv.string, - vol.Optional(CONF_BROADCAST_PORT): cv.port, + probatio.Required(CONF_MAC): cv.string, + probatio.Optional(CONF_SECUREON_PASSWORD): cv.string, + probatio.Optional(CONF_BROADCAST_ADDRESS): cv.string, + probatio.Optional(CONF_BROADCAST_PORT): cv.port, } ) diff --git a/homeassistant/components/wake_on_lan/config_flow.py b/homeassistant/components/wake_on_lan/config_flow.py index 260cd82ecc46e..8c48989d7d4cc 100644 --- a/homeassistant/components/wake_on_lan/config_flow.py +++ b/homeassistant/components/wake_on_lan/config_flow.py @@ -3,7 +3,7 @@ from collections.abc import Mapping from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.const import CONF_BROADCAST_ADDRESS, CONF_BROADCAST_PORT, CONF_MAC from homeassistant.helpers import device_registry as dr @@ -46,11 +46,11 @@ async def validate_options( return user_input -DATA_SCHEMA = {vol.Required(CONF_MAC): TextSelector()} +DATA_SCHEMA = {probatio.Required(CONF_MAC): TextSelector()} OPTIONS_SCHEMA = { - vol.Optional(CONF_SECUREON_PASSWORD): TextSelector(), - vol.Optional(CONF_BROADCAST_ADDRESS): TextSelector(), - vol.Optional(CONF_BROADCAST_PORT): NumberSelector( + probatio.Optional(CONF_SECUREON_PASSWORD): TextSelector(), + probatio.Optional(CONF_BROADCAST_ADDRESS): TextSelector(), + probatio.Optional(CONF_BROADCAST_PORT): NumberSelector( NumberSelectorConfig(min=0, max=65535, step=1, mode=NumberSelectorMode.BOX) ), } @@ -58,13 +58,13 @@ async def validate_options( CONFIG_FLOW = { "user": SchemaFlowFormStep( - schema=vol.Schema(DATA_SCHEMA).extend(OPTIONS_SCHEMA), + schema=probatio.Schema(DATA_SCHEMA).extend(OPTIONS_SCHEMA), validate_user_input=validate, ) } OPTIONS_FLOW = { "init": SchemaFlowFormStep( - vol.Schema(OPTIONS_SCHEMA), validate_user_input=validate_options + probatio.Schema(OPTIONS_SCHEMA), validate_user_input=validate_options ), } diff --git a/homeassistant/components/wake_on_lan/switch.py b/homeassistant/components/wake_on_lan/switch.py index 623a5928a22b7..37a3680c37406 100644 --- a/homeassistant/components/wake_on_lan/switch.py +++ b/homeassistant/components/wake_on_lan/switch.py @@ -4,7 +4,7 @@ import subprocess as sp from typing import Any, override -import voluptuous as vol +import probatio import wakeonlan from homeassistant.components.switch import ( @@ -30,12 +30,12 @@ PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_MAC): cv.string, - vol.Optional(CONF_BROADCAST_ADDRESS): cv.string, - vol.Optional(CONF_BROADCAST_PORT): cv.port, - vol.Optional(CONF_HOST): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_OFF_ACTION): cv.SCRIPT_SCHEMA, + probatio.Required(CONF_MAC): cv.string, + probatio.Optional(CONF_BROADCAST_ADDRESS): cv.string, + probatio.Optional(CONF_BROADCAST_PORT): cv.port, + probatio.Optional(CONF_HOST): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_OFF_ACTION): cv.SCRIPT_SCHEMA, } ) diff --git a/homeassistant/components/wake_word/__init__.py b/homeassistant/components/wake_word/__init__.py index 7ff3c36facd55..90a2bb6327a75 100644 --- a/homeassistant/components/wake_word/__init__.py +++ b/homeassistant/components/wake_word/__init__.py @@ -6,7 +6,7 @@ import logging from typing import final, override -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.config_entries import ConfigEntry @@ -133,7 +133,7 @@ async def async_internal_added_to_hass(self) -> None: @websocket_api.websocket_command( { "type": "wake_word/info", - vol.Required("entity_id"): cv.entity_domain(DOMAIN), + probatio.Required("entity_id"): cv.entity_domain(DOMAIN), } ) @websocket_api.async_response diff --git a/homeassistant/components/wallbox/config_flow.py b/homeassistant/components/wallbox/config_flow.py index be9ee72360f85..003c0ade07e7e 100644 --- a/homeassistant/components/wallbox/config_flow.py +++ b/homeassistant/components/wallbox/config_flow.py @@ -3,7 +3,7 @@ from collections.abc import Mapping from typing import Any, override -import voluptuous as vol +import probatio from wallbox import Wallbox from homeassistant.config_entries import SOURCE_REAUTH, ConfigFlow, ConfigFlowResult @@ -23,11 +23,11 @@ COMPONENT_DOMAIN = DOMAIN -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_STATION): str, - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_STATION): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/waqi/config_flow.py b/homeassistant/components/waqi/config_flow.py index c87876dc72a79..4b82a904122b4 100644 --- a/homeassistant/components/waqi/config_flow.py +++ b/homeassistant/components/waqi/config_flow.py @@ -9,7 +9,7 @@ WAQIClient, WAQIConnectionError, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -94,7 +94,7 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_API_KEY): str}), + data_schema=probatio.Schema({probatio.Required(CONF_API_KEY): str}), errors=errors, ) @@ -134,9 +134,9 @@ async def async_step_map( return self.async_show_form( step_id=CONF_MAP, data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_LOCATION): LocationSelector(), + probatio.Required(CONF_LOCATION): LocationSelector(), } ), { @@ -170,7 +170,7 @@ async def async_step_station_number( return await self._async_create_entry(measuring_station) return self.async_show_form( step_id=CONF_STATION_NUMBER, - data_schema=vol.Schema({vol.Required(CONF_STATION_NUMBER): int}), + data_schema=probatio.Schema({probatio.Required(CONF_STATION_NUMBER): int}), errors=errors, ) diff --git a/homeassistant/components/water_heater/__init__.py b/homeassistant/components/water_heater/__init__.py index e67343474170d..57845d96297a5 100644 --- a/homeassistant/components/water_heater/__init__.py +++ b/homeassistant/components/water_heater/__init__.py @@ -6,8 +6,8 @@ import logging from typing import Any, final, override +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( @@ -77,14 +77,14 @@ class WaterHeaterEntityFeature(IntFlag): _LOGGER = logging.getLogger(__name__) SET_AWAY_MODE_SCHEMA: VolDictType = { - vol.Required(ATTR_AWAY_MODE): cv.boolean, + probatio.Required(ATTR_AWAY_MODE): cv.boolean, } SET_TEMPERATURE_SCHEMA: VolDictType = { - vol.Required(ATTR_TEMPERATURE, "temperature"): vol.Coerce(float), - vol.Optional(ATTR_OPERATION_MODE): cv.string, + probatio.Required(ATTR_TEMPERATURE, "temperature"): probatio.Coerce(float), + probatio.Optional(ATTR_OPERATION_MODE): cv.string, } SET_OPERATION_MODE_SCHEMA: VolDictType = { - vol.Required(ATTR_OPERATION_MODE): cv.string, + probatio.Required(ATTR_OPERATION_MODE): cv.string, } # mypy: disallow-any-generics diff --git a/homeassistant/components/water_heater/condition.py b/homeassistant/components/water_heater/condition.py index b6f51a348fd67..cbcc03b619938 100644 --- a/homeassistant/components/water_heater/condition.py +++ b/homeassistant/components/water_heater/condition.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING, override -import voluptuous as vol +import probatio from homeassistant.const import CONF_OPTIONS, STATE_OFF, UnitOfTemperature from homeassistant.core import HomeAssistant, State @@ -25,9 +25,9 @@ _OPERATION_MODE_CONDITION_SCHEMA = ENTITY_STATE_CONDITION_SCHEMA_ANY_ALL.extend( { - vol.Required(CONF_OPTIONS): { - vol.Required(ATTR_OPERATION_MODE): vol.All( - cv.ensure_list, vol.Length(min=1), [str] + probatio.Required(CONF_OPTIONS): { + probatio.Required(ATTR_OPERATION_MODE): probatio.All( + cv.ensure_list, probatio.Length(min=1), [str] ), }, } diff --git a/homeassistant/components/water_heater/device_action.py b/homeassistant/components/water_heater/device_action.py index 8ef1735af32a8..81447b7e88644 100644 --- a/homeassistant/components/water_heater/device_action.py +++ b/homeassistant/components/water_heater/device_action.py @@ -1,6 +1,6 @@ """Provides device automations for Water Heater.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import async_validate_entity_schema from homeassistant.const import ( @@ -22,8 +22,8 @@ _ACTION_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): vol.In(ACTION_TYPES), - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_TYPE): probatio.In(ACTION_TYPES), + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, } ) diff --git a/homeassistant/components/water_heater/trigger.py b/homeassistant/components/water_heater/trigger.py index 2fa0063fd63d2..ba1d24b8cd58a 100644 --- a/homeassistant/components/water_heater/trigger.py +++ b/homeassistant/components/water_heater/trigger.py @@ -2,7 +2,7 @@ from typing import override -import voluptuous as vol +import probatio from homeassistant.const import CONF_OPTIONS, STATE_OFF, UnitOfTemperature from homeassistant.core import HomeAssistant, State @@ -28,9 +28,9 @@ _OPERATION_MODE_CHANGED_TRIGGER_SCHEMA = ( ENTITY_STATE_TRIGGER_SCHEMA_WITH_BEHAVIOR.extend( { - vol.Required(CONF_OPTIONS): { - vol.Required(CONF_OPERATION_MODE): vol.All( - cv.ensure_list, vol.Length(min=1), [str] + probatio.Required(CONF_OPTIONS): { + probatio.Required(CONF_OPERATION_MODE): probatio.All( + cv.ensure_list, probatio.Length(min=1), [str] ), }, } diff --git a/homeassistant/components/waterfurnace/__init__.py b/homeassistant/components/waterfurnace/__init__.py index 499e438da6862..a7d55a58e1935 100644 --- a/homeassistant/components/waterfurnace/__init__.py +++ b/homeassistant/components/waterfurnace/__init__.py @@ -3,7 +3,7 @@ import asyncio import logging -import voluptuous as vol +import probatio from waterfurnace.waterfurnace import WaterFurnace, WFCredentialError, WFException from homeassistant.config_entries import SOURCE_IMPORT, ConfigEntry @@ -26,16 +26,16 @@ PLATFORMS = [Platform.CLIMATE, Platform.SENSOR] -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) type WaterFurnaceConfigEntry = ConfigEntry[dict[str, WaterFurnaceDeviceData]] diff --git a/homeassistant/components/waterfurnace/config_flow.py b/homeassistant/components/waterfurnace/config_flow.py index 3596005baf1e4..ddc4e02dd0d4c 100644 --- a/homeassistant/components/waterfurnace/config_flow.py +++ b/homeassistant/components/waterfurnace/config_flow.py @@ -4,7 +4,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from waterfurnace.waterfurnace import WaterFurnace, WFCredentialError, WFException from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -14,10 +14,10 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) diff --git a/homeassistant/components/watergate/config_flow.py b/homeassistant/components/watergate/config_flow.py index 231e99854fa02..d1d6bbd9d69d3 100644 --- a/homeassistant/components/watergate/config_flow.py +++ b/homeassistant/components/watergate/config_flow.py @@ -3,7 +3,7 @@ import logging from typing import override -import voluptuous as vol +import probatio from watergate_local_api.watergate_api import ( WatergateApiException, WatergateLocalApiClient, @@ -19,9 +19,9 @@ _LOGGER = logging.getLogger(__name__) SONIC = "Sonic" -WATERGATE_SCHEMA = vol.Schema( +WATERGATE_SCHEMA = probatio.Schema( { - vol.Required(CONF_IP_ADDRESS): str, + probatio.Required(CONF_IP_ADDRESS): str, } ) diff --git a/homeassistant/components/watts/services.py b/homeassistant/components/watts/services.py index e7659c6e47a66..b73eec819a162 100644 --- a/homeassistant/components/watts/services.py +++ b/homeassistant/components/watts/services.py @@ -2,7 +2,7 @@ from datetime import timedelta -import voluptuous as vol +import probatio from homeassistant.components.climate import DOMAIN as CLIMATE_DOMAIN from homeassistant.const import ATTR_TEMPERATURE @@ -21,10 +21,10 @@ def async_setup_services(hass: HomeAssistant) -> None: SERVICE_ACTIVATE_TIMER_MODE, entity_domain=CLIMATE_DOMAIN, schema={ - vol.Required(ATTR_TEMPERATURE): vol.Coerce(float), - vol.Required(ATTR_DURATION): vol.All( + probatio.Required(ATTR_TEMPERATURE): probatio.Coerce(float), + probatio.Required(ATTR_DURATION): probatio.All( cv.time_period, - vol.Range(min=timedelta(minutes=1), max=timedelta(days=1)), + probatio.Range(min=timedelta(minutes=1), max=timedelta(days=1)), ), }, func="async_activate_timer_mode", diff --git a/homeassistant/components/watttime/config_flow.py b/homeassistant/components/watttime/config_flow.py index 51f099e7d3191..10a76174be682 100644 --- a/homeassistant/components/watttime/config_flow.py +++ b/homeassistant/components/watttime/config_flow.py @@ -5,7 +5,7 @@ from aiowatttime import Client from aiowatttime.errors import CoordinatesNotFoundError, InvalidCredentialsError -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult, OptionsFlow from homeassistant.const import ( @@ -31,31 +31,31 @@ LOCATION_TYPE_COORDINATES = "Specify coordinates" LOCATION_TYPE_HOME = "Use home location" -STEP_COORDINATES_DATA_SCHEMA = vol.Schema( +STEP_COORDINATES_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_LATITUDE): cv.latitude, - vol.Required(CONF_LONGITUDE): cv.longitude, + probatio.Required(CONF_LATITUDE): cv.latitude, + probatio.Required(CONF_LONGITUDE): cv.longitude, } ) -STEP_LOCATION_DATA_SCHEMA = vol.Schema( +STEP_LOCATION_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_LOCATION_TYPE): vol.In( + probatio.Required(CONF_LOCATION_TYPE): probatio.In( [LOCATION_TYPE_HOME, LOCATION_TYPE_COORDINATES] ), } ) -STEP_REAUTH_CONFIRM_DATA_SCHEMA = vol.Schema( +STEP_REAUTH_CONFIRM_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, } ) @@ -77,7 +77,11 @@ def __init__(self) -> None: self._data: dict[str, Any] = {} async def _async_validate_credentials( - self, username: str, password: str, error_step_id: str, error_schema: vol.Schema + self, + username: str, + password: str, + error_step_id: str, + error_schema: probatio.Schema, ) -> ConfigFlowResult: """Validate input credentials and proceed accordingly.""" session = aiohttp_client.async_get_clientsession(self.hass) @@ -248,9 +252,9 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_SHOW_ON_MAP, default=self.config_entry.options.get(CONF_SHOW_ON_MAP, True), ): bool diff --git a/homeassistant/components/wattwaechter/config_flow.py b/homeassistant/components/wattwaechter/config_flow.py index 2de2f5a70d151..b5c81776f59e7 100644 --- a/homeassistant/components/wattwaechter/config_flow.py +++ b/homeassistant/components/wattwaechter/config_flow.py @@ -10,7 +10,7 @@ WattwaechterConnectionError, ) from aio_wattwaechter.models import SystemInfo -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import ( @@ -167,9 +167,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_HOST): str, + probatio.Required(CONF_HOST): str, } ), errors=errors, @@ -209,9 +209,9 @@ async def async_step_auth( return self.async_show_form( step_id="auth", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_TOKEN): str, + probatio.Required(CONF_TOKEN): str, } ), errors=errors, @@ -244,9 +244,9 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_TOKEN): str, + probatio.Required(CONF_TOKEN): str, } ), description_placeholders={"host": reauth_entry.data[CONF_HOST]}, @@ -276,10 +276,10 @@ async def async_step_reconfigure( data_updates={CONF_HOST: user_input[CONF_HOST], CONF_TOKEN: token}, ) - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Optional(CONF_TOKEN): TextSelector( + probatio.Required(CONF_HOST): str, + probatio.Optional(CONF_TOKEN): TextSelector( TextSelectorConfig(type=TextSelectorType.PASSWORD) ), } diff --git a/homeassistant/components/waze_travel_time/config_flow.py b/homeassistant/components/waze_travel_time/config_flow.py index 3b4d24ce26478..0883fc2181d48 100644 --- a/homeassistant/components/waze_travel_time/config_flow.py +++ b/homeassistant/components/waze_travel_time/config_flow.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.config_entries import ( SOURCE_RECONFIGURE, @@ -53,22 +53,22 @@ ) from .helpers import is_valid_config_entry -OPTIONS_SCHEMA = vol.Schema( +OPTIONS_SCHEMA = probatio.Schema( { - vol.Optional(CONF_INCL_FILTER): TextSelector( + probatio.Optional(CONF_INCL_FILTER): TextSelector( TextSelectorConfig( type=TextSelectorType.TEXT, multiple=True, ), ), - vol.Optional(CONF_EXCL_FILTER): TextSelector( + probatio.Optional(CONF_EXCL_FILTER): TextSelector( TextSelectorConfig( type=TextSelectorType.TEXT, multiple=True, ), ), - vol.Optional(CONF_REALTIME): BooleanSelector(), - vol.Required(CONF_VEHICLE_TYPE): SelectSelector( + probatio.Optional(CONF_REALTIME): BooleanSelector(), + probatio.Required(CONF_VEHICLE_TYPE): SelectSelector( SelectSelectorConfig( options=VEHICLE_TYPES, mode=SelectSelectorMode.DROPDOWN, @@ -76,7 +76,7 @@ sort=True, ) ), - vol.Required(CONF_UNITS): SelectSelector( + probatio.Required(CONF_UNITS): SelectSelector( SelectSelectorConfig( options=UNITS, mode=SelectSelectorMode.DROPDOWN, @@ -84,29 +84,29 @@ sort=True, ) ), - vol.Optional(CONF_AVOID_TOLL_ROADS): BooleanSelector(), - vol.Optional(CONF_AVOID_SUBSCRIPTION_ROADS): BooleanSelector(), - vol.Optional(CONF_AVOID_FERRIES): BooleanSelector(), - vol.Optional(CONF_TIME_DELTA): DurationSelector( + probatio.Optional(CONF_AVOID_TOLL_ROADS): BooleanSelector(), + probatio.Optional(CONF_AVOID_SUBSCRIPTION_ROADS): BooleanSelector(), + probatio.Optional(CONF_AVOID_FERRIES): BooleanSelector(), + probatio.Optional(CONF_TIME_DELTA): DurationSelector( DurationSelectorConfig( allow_negative=True, enable_second=False, ) ), - vol.Optional(CONF_BASE_COORDINATES): LocationSelector( + probatio.Optional(CONF_BASE_COORDINATES): LocationSelector( LocationSelectorConfig(radius=False) ), } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Required(CONF_NAME, default=DEFAULT_NAME): TextSelector(), - vol.Required(CONF_ORIGIN): TextSelector(), - vol.Required(CONF_DESTINATION): TextSelector(), - vol.Required(CONF_REGION): SelectSelector( + probatio.Required(CONF_NAME, default=DEFAULT_NAME): TextSelector(), + probatio.Required(CONF_ORIGIN): TextSelector(), + probatio.Required(CONF_DESTINATION): TextSelector(), + probatio.Required(CONF_REGION): SelectSelector( SelectSelectorConfig( options=REGIONS, mode=SelectSelectorMode.DROPDOWN, diff --git a/homeassistant/components/waze_travel_time/services.py b/homeassistant/components/waze_travel_time/services.py index 8e6cf6e8b0cb3..4193f123a2ace 100644 --- a/homeassistant/components/waze_travel_time/services.py +++ b/homeassistant/components/waze_travel_time/services.py @@ -2,8 +2,8 @@ from datetime import timedelta +import probatio from pywaze.route_calculator import WazeRouteCalculator -import voluptuous as vol from homeassistant.const import CONF_REGION from homeassistant.core import ( @@ -54,11 +54,11 @@ from .helpers import base_coordinates_to_tuple SERVICE_GET_TRAVEL_TIMES = "get_travel_times" -SERVICE_GET_TRAVEL_TIMES_SCHEMA = vol.Schema( +SERVICE_GET_TRAVEL_TIMES_SCHEMA = probatio.Schema( { - vol.Required(CONF_ORIGIN): TextSelector(), - vol.Required(CONF_DESTINATION): TextSelector(), - vol.Required(CONF_REGION): SelectSelector( + probatio.Required(CONF_ORIGIN): TextSelector(), + probatio.Required(CONF_DESTINATION): TextSelector(), + probatio.Required(CONF_REGION): SelectSelector( SelectSelectorConfig( options=REGIONS, mode=SelectSelectorMode.DROPDOWN, @@ -66,8 +66,10 @@ sort=True, ) ), - vol.Optional(CONF_REALTIME, default=False): BooleanSelector(), - vol.Optional(CONF_VEHICLE_TYPE, default=DEFAULT_VEHICLE_TYPE): SelectSelector( + probatio.Optional(CONF_REALTIME, default=False): BooleanSelector(), + probatio.Optional( + CONF_VEHICLE_TYPE, default=DEFAULT_VEHICLE_TYPE + ): SelectSelector( SelectSelectorConfig( options=VEHICLE_TYPES, mode=SelectSelectorMode.DROPDOWN, @@ -75,7 +77,7 @@ sort=True, ) ), - vol.Optional(CONF_UNITS, default=METRIC_UNITS): SelectSelector( + probatio.Optional(CONF_UNITS, default=METRIC_UNITS): SelectSelector( SelectSelectorConfig( options=UNITS, mode=SelectSelectorMode.DROPDOWN, @@ -83,25 +85,27 @@ sort=True, ) ), - vol.Optional(CONF_AVOID_TOLL_ROADS, default=False): BooleanSelector(), - vol.Optional(CONF_AVOID_SUBSCRIPTION_ROADS, default=False): BooleanSelector(), - vol.Optional(CONF_AVOID_FERRIES, default=False): BooleanSelector(), - vol.Optional(CONF_INCL_FILTER): TextSelector( + probatio.Optional(CONF_AVOID_TOLL_ROADS, default=False): BooleanSelector(), + probatio.Optional( + CONF_AVOID_SUBSCRIPTION_ROADS, default=False + ): BooleanSelector(), + probatio.Optional(CONF_AVOID_FERRIES, default=False): BooleanSelector(), + probatio.Optional(CONF_INCL_FILTER): TextSelector( TextSelectorConfig( type=TextSelectorType.TEXT, multiple=True, ), ), - vol.Optional(CONF_EXCL_FILTER): TextSelector( + probatio.Optional(CONF_EXCL_FILTER): TextSelector( TextSelectorConfig( type=TextSelectorType.TEXT, multiple=True, ), ), - vol.Optional(CONF_TIME_DELTA): DurationSelector( + probatio.Optional(CONF_TIME_DELTA): DurationSelector( DurationSelectorConfig(allow_negative=True, enable_second=False) ), - vol.Optional(CONF_BASE_COORDINATES): LocationSelector(), + probatio.Optional(CONF_BASE_COORDINATES): LocationSelector(), } ) diff --git a/homeassistant/components/weather/__init__.py b/homeassistant/components/weather/__init__.py index ffc12cd6aba0e..92280a5996436 100644 --- a/homeassistant/components/weather/__init__.py +++ b/homeassistant/components/weather/__init__.py @@ -19,8 +19,8 @@ override, ) +import probatio from propcache.api import cached_property -import voluptuous as vol from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( @@ -212,7 +212,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: ) component.async_register_entity_service( SERVICE_GET_FORECASTS, - {vol.Required("type"): vol.In(("daily", "hourly", "twice_daily"))}, + {probatio.Required("type"): probatio.In(("daily", "hourly", "twice_daily"))}, async_get_forecasts_service, required_features=[ WeatherEntityFeature.FORECAST_DAILY, diff --git a/homeassistant/components/weather/intent.py b/homeassistant/components/weather/intent.py index 207318b376342..00fb52bb18507 100644 --- a/homeassistant/components/weather/intent.py +++ b/homeassistant/components/weather/intent.py @@ -2,7 +2,7 @@ from typing import override -import voluptuous as vol +import probatio from homeassistant.core import HomeAssistant, State from homeassistant.helpers import intent @@ -20,7 +20,7 @@ class GetWeatherIntent(intent.IntentHandler): intent_type = INTENT_GET_WEATHER description = "Gets the current weather" - slot_schema = {vol.Optional("name"): intent.non_empty_string} + slot_schema = {probatio.Optional("name"): intent.non_empty_string} platforms = {DOMAIN} @override diff --git a/homeassistant/components/weather/websocket_api.py b/homeassistant/components/weather/websocket_api.py index 68945a7e5944d..eb5f2d0c0d7ec 100644 --- a/homeassistant/components/weather/websocket_api.py +++ b/homeassistant/components/weather/websocket_api.py @@ -2,7 +2,7 @@ from typing import Any, Literal -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.core import HomeAssistant, callback @@ -28,7 +28,7 @@ def async_setup(hass: HomeAssistant) -> None: @callback @websocket_api.websocket_command( { - vol.Required("type"): "weather/convertible_units", + probatio.Required("type"): "weather/convertible_units", } ) def ws_convertible_units( @@ -43,9 +43,11 @@ def ws_convertible_units( @websocket_api.websocket_command( { - vol.Required("type"): "weather/subscribe_forecast", - vol.Required("entity_id"): cv.entity_domain(DOMAIN), - vol.Required("forecast_type"): vol.In(["daily", "hourly", "twice_daily"]), + probatio.Required("type"): "weather/subscribe_forecast", + probatio.Required("entity_id"): cv.entity_domain(DOMAIN), + probatio.Required("forecast_type"): probatio.In( + ["daily", "hourly", "twice_daily"] + ), } ) @websocket_api.async_response diff --git a/homeassistant/components/weatherflow_cloud/config_flow.py b/homeassistant/components/weatherflow_cloud/config_flow.py index e37274c1501b9..686768153c300 100644 --- a/homeassistant/components/weatherflow_cloud/config_flow.py +++ b/homeassistant/components/weatherflow_cloud/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from aiohttp import ClientResponseError -import voluptuous as vol +import probatio from weatherflow4py.api import WeatherFlowRestAPI from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -56,7 +56,7 @@ async def async_step_reauth_confirm( return self.async_show_form( step_id="reauth_confirm", - data_schema=vol.Schema({vol.Required(CONF_API_TOKEN): str}), + data_schema=probatio.Schema({probatio.Required(CONF_API_TOKEN): str}), errors=errors, ) @@ -79,6 +79,6 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_API_TOKEN): str}), + data_schema=probatio.Schema({probatio.Required(CONF_API_TOKEN): str}), errors=errors, ) diff --git a/homeassistant/components/weatherkit/config_flow.py b/homeassistant/components/weatherkit/config_flow.py index f228919816fd0..7775628924328 100644 --- a/homeassistant/components/weatherkit/config_flow.py +++ b/homeassistant/components/weatherkit/config_flow.py @@ -9,7 +9,7 @@ WeatherKitApiClientCommunicationError, WeatherKitApiClientError, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_LATITUDE, CONF_LOCATION, CONF_LONGITUDE @@ -30,16 +30,16 @@ LOGGER, ) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_LOCATION): LocationSelector( + probatio.Required(CONF_LOCATION): LocationSelector( LocationSelectorConfig(radius=False, icon="") ), # Auth - vol.Required(CONF_KEY_ID): str, - vol.Required(CONF_SERVICE_ID): str, - vol.Required(CONF_TEAM_ID): str, - vol.Required(CONF_KEY_PEM): TextSelector( + probatio.Required(CONF_KEY_ID): str, + probatio.Required(CONF_SERVICE_ID): str, + probatio.Required(CONF_TEAM_ID): str, + probatio.Required(CONF_KEY_PEM): TextSelector( TextSelectorConfig( multiline=True, ) diff --git a/homeassistant/components/web_rtc/__init__.py b/homeassistant/components/web_rtc/__init__.py index 2fd4de986a2c6..f0acd42692f12 100644 --- a/homeassistant/components/web_rtc/__init__.py +++ b/homeassistant/components/web_rtc/__init__.py @@ -3,7 +3,7 @@ from collections.abc import Callable, Iterable from typing import Any -import voluptuous as vol +import probatio from webrtc_models import RTCIceServer from homeassistant.components import websocket_api @@ -25,20 +25,20 @@ DOMAIN = "web_rtc" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_ICE_SERVERS): vol.All( + probatio.Required(CONF_ICE_SERVERS): probatio.All( cv.ensure_list, [ - vol.Schema( + probatio.Schema( { - vol.Required(CONF_URL): vol.All( + probatio.Required(CONF_URL): probatio.All( cv.ensure_list, [validate_stun_or_turn_url] ), - vol.Optional(CONF_USERNAME): cv.string, - vol.Optional(CONF_CREDENTIAL): cv.string, + probatio.Optional(CONF_USERNAME): cv.string, + probatio.Optional(CONF_CREDENTIAL): cv.string, } ) ], @@ -46,7 +46,7 @@ } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) DATA_ICE_SERVERS_USER: HassKey[Iterable[RTCIceServer]] = HassKey( diff --git a/homeassistant/components/webdav/config_flow.py b/homeassistant/components/webdav/config_flow.py index f5fd14bfae35a..4f87381c595ea 100644 --- a/homeassistant/components/webdav/config_flow.py +++ b/homeassistant/components/webdav/config_flow.py @@ -8,7 +8,7 @@ MethodNotSupportedError, UnauthorizedError, ) -import voluptuous as vol +import probatio import yarl from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -24,21 +24,21 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_URL): TextSelector( + probatio.Required(CONF_URL): TextSelector( TextSelectorConfig( type=TextSelectorType.URL, ) ), - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): TextSelector( + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): TextSelector( TextSelectorConfig( type=TextSelectorType.PASSWORD, ) ), - vol.Optional(CONF_BACKUP_PATH, default="/"): str, - vol.Optional(CONF_VERIFY_SSL, default=True): bool, + probatio.Optional(CONF_BACKUP_PATH, default="/"): str, + probatio.Optional(CONF_VERIFY_SSL, default=True): bool, } ) diff --git a/homeassistant/components/webhook/__init__.py b/homeassistant/components/webhook/__init__.py index 897e997541f5a..fb307fa0e6f8e 100644 --- a/homeassistant/components/webhook/__init__.py +++ b/homeassistant/components/webhook/__init__.py @@ -11,7 +11,7 @@ from aiohttp import StreamReader from aiohttp.hdrs import METH_GET, METH_HEAD, METH_POST, METH_PUT from aiohttp.web import Request, Response -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.components.http import KEY_HASS, HomeAssistantView @@ -274,12 +274,12 @@ def websocket_list( @websocket_api.websocket_command( { - vol.Required("type"): "webhook/handle", - vol.Required("webhook_id"): str, - vol.Required("method"): vol.In(SUPPORTED_METHODS), - vol.Optional("body", default=""): str, - vol.Optional("headers", default={}): {str: str}, - vol.Optional("query", default=""): str, + probatio.Required("type"): "webhook/handle", + probatio.Required("webhook_id"): str, + probatio.Required("method"): probatio.In(SUPPORTED_METHODS), + probatio.Optional("body", default=""): str, + probatio.Optional("headers", default={}): {str: str}, + probatio.Optional("query", default=""): str, } ) @websocket_api.async_response diff --git a/homeassistant/components/webhook/trigger.py b/homeassistant/components/webhook/trigger.py index bba332f50d8cb..3cffd0e4da227 100644 --- a/homeassistant/components/webhook/trigger.py +++ b/homeassistant/components/webhook/trigger.py @@ -5,7 +5,7 @@ from typing import Any from aiohttp import hdrs, web -import voluptuous as vol +import probatio from homeassistant.const import CONF_PLATFORM, CONF_WEBHOOK_ID from homeassistant.core import CALLBACK_TYPE, HassJob, HomeAssistant, callback @@ -32,14 +32,14 @@ TRIGGER_SCHEMA = cv.TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_PLATFORM): "webhook", - vol.Required(CONF_WEBHOOK_ID): cv.template, - vol.Optional(CONF_ALLOWED_METHODS): vol.All( + probatio.Required(CONF_PLATFORM): "webhook", + probatio.Required(CONF_WEBHOOK_ID): cv.template, + probatio.Optional(CONF_ALLOWED_METHODS): probatio.All( cv.ensure_list, - [vol.All(vol.Upper, vol.In(SUPPORTED_METHODS))], - vol.Unique(), + [probatio.All(probatio.Upper, probatio.In(SUPPORTED_METHODS))], + probatio.Unique(), ), - vol.Optional(CONF_LOCAL_ONLY): bool, + probatio.Optional(CONF_LOCAL_ONLY): bool, } ) diff --git a/homeassistant/components/webmin/config_flow.py b/homeassistant/components/webmin/config_flow.py index 1e885cc71f72e..3f8153b2a3cae 100644 --- a/homeassistant/components/webmin/config_flow.py +++ b/homeassistant/components/webmin/config_flow.py @@ -6,7 +6,7 @@ from xmlrpc.client import Fault from aiohttp.client_exceptions import ClientConnectionError, ClientResponseError -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_HOST, @@ -57,20 +57,20 @@ async def validate_user_input( return user_input -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): selector.TextSelector(), - vol.Required(CONF_PORT, default=DEFAULT_PORT): selector.NumberSelector( + probatio.Required(CONF_HOST): selector.TextSelector(), + probatio.Required(CONF_PORT, default=DEFAULT_PORT): selector.NumberSelector( selector.NumberSelectorConfig( min=1, max=65535, mode=selector.NumberSelectorMode.BOX ) ), - vol.Required(CONF_USERNAME): selector.TextSelector(), - vol.Required(CONF_PASSWORD): selector.TextSelector( + probatio.Required(CONF_USERNAME): selector.TextSelector(), + probatio.Required(CONF_PASSWORD): selector.TextSelector( selector.TextSelectorConfig(type=selector.TextSelectorType.PASSWORD) ), - vol.Required(CONF_SSL, default=DEFAULT_SSL): selector.BooleanSelector(), - vol.Required( + probatio.Required(CONF_SSL, default=DEFAULT_SSL): selector.BooleanSelector(), + probatio.Required( CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL ): selector.BooleanSelector(), } diff --git a/homeassistant/components/webostv/config_flow.py b/homeassistant/components/webostv/config_flow.py index 8732ed7c5a423..66726a8a160db 100644 --- a/homeassistant/components/webostv/config_flow.py +++ b/homeassistant/components/webostv/config_flow.py @@ -5,7 +5,7 @@ from urllib.parse import urlparse from aiowebostv import WebOsClient, WebOsTvPairError -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigFlow, @@ -26,11 +26,11 @@ from .const import CONF_SOURCES, DEFAULT_NAME, DOMAIN, WEBOSTV_EXCEPTIONS from .helpers import get_sources -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): cv.string, + probatio.Required(CONF_HOST): cv.string, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) @@ -192,9 +192,9 @@ async def async_step_reconfigure( return self.async_show_form( step_id="reconfigure", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_HOST, default=reconfigure_entry.data.get(CONF_HOST) ): cv.string } @@ -234,9 +234,9 @@ async def async_step_init( if not sources: sources = sources_list - options_schema = vol.Schema( + options_schema = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_SOURCES, description={"suggested_value": sources}, ): cv.multi_select({source: source for source in sources_list}), diff --git a/homeassistant/components/webostv/device_trigger.py b/homeassistant/components/webostv/device_trigger.py index 9b4141a5b7dc8..95c3e5b0e5f50 100644 --- a/homeassistant/components/webostv/device_trigger.py +++ b/homeassistant/components/webostv/device_trigger.py @@ -1,6 +1,6 @@ """Provides device automations for control of LG webOS TV.""" -import voluptuous as vol +import probatio from homeassistant.components.device_automation import ( DEVICE_TRIGGER_BASE_SCHEMA, @@ -24,7 +24,7 @@ TRIGGER_TYPES = {TURN_ON_PLATFORM_TYPE} TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): vol.In(TRIGGER_TYPES), + probatio.Required(CONF_TYPE): probatio.In(TRIGGER_TYPES), } ) diff --git a/homeassistant/components/webostv/services.py b/homeassistant/components/webostv/services.py index 04cd10548ca08..ed4d4f4f50265 100644 --- a/homeassistant/components/webostv/services.py +++ b/homeassistant/components/webostv/services.py @@ -1,6 +1,6 @@ """LG webOS TV services.""" -import voluptuous as vol +import probatio from homeassistant.components.media_player import DOMAIN as MEDIA_PLAYER_DOMAIN from homeassistant.const import ATTR_COMMAND @@ -16,12 +16,12 @@ SERVICE_COMMAND = "command" SERVICE_SELECT_SOUND_OUTPUT = "select_sound_output" -BUTTON_SCHEMA: VolDictType = {vol.Required(ATTR_BUTTON): cv.string} +BUTTON_SCHEMA: VolDictType = {probatio.Required(ATTR_BUTTON): cv.string} COMMAND_SCHEMA: VolDictType = { - vol.Required(ATTR_COMMAND): cv.string, - vol.Optional(ATTR_PAYLOAD): dict, + probatio.Required(ATTR_COMMAND): cv.string, + probatio.Optional(ATTR_PAYLOAD): dict, } -SOUND_OUTPUT_SCHEMA: VolDictType = {vol.Required(ATTR_SOUND_OUTPUT): cv.string} +SOUND_OUTPUT_SCHEMA: VolDictType = {probatio.Required(ATTR_SOUND_OUTPUT): cv.string} SERVICES = ( ( diff --git a/homeassistant/components/webostv/triggers/turn_on.py b/homeassistant/components/webostv/triggers/turn_on.py index 34afcd892a9c9..78b02a3e00fb3 100644 --- a/homeassistant/components/webostv/triggers/turn_on.py +++ b/homeassistant/components/webostv/triggers/turn_on.py @@ -1,6 +1,6 @@ """LG webOS TV device turn on trigger.""" -import voluptuous as vol +import probatio from homeassistant.const import ( ATTR_DEVICE_ID, @@ -30,12 +30,14 @@ TRIGGER_TYPE_TURN_ON = "turn_on" -TRIGGER_SCHEMA = vol.All( +TRIGGER_SCHEMA = probatio.All( cv.TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_PLATFORM): PLATFORM_TYPE, - vol.Optional(ATTR_DEVICE_ID): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(ATTR_ENTITY_ID): cv.entity_ids, + probatio.Required(CONF_PLATFORM): PLATFORM_TYPE, + probatio.Optional(ATTR_DEVICE_ID): probatio.All( + cv.ensure_list, [cv.string] + ), + probatio.Optional(ATTR_ENTITY_ID): cv.entity_ids, }, ), cv.has_at_least_one_key(ATTR_ENTITY_ID, ATTR_DEVICE_ID), diff --git a/homeassistant/components/websocket_api/auth.py b/homeassistant/components/websocket_api/auth.py index f46606640f788..a4b73688a506d 100644 --- a/homeassistant/components/websocket_api/auth.py +++ b/homeassistant/components/websocket_api/auth.py @@ -4,8 +4,8 @@ from typing import TYPE_CHECKING, Any, Final from aiohttp.web import Request -import voluptuous as vol -from voluptuous.humanize import humanize_error +import probatio +from probatio.humanize import humanize_error from homeassistant.components.http.auth_util import async_user_not_allowed_do_auth from homeassistant.components.http.ban import process_success_login, process_wrong_login @@ -27,11 +27,11 @@ TYPE_AUTH_OK: Final = "auth_ok" TYPE_AUTH_REQUIRED: Final = "auth_required" -AUTH_MESSAGE_SCHEMA: Final = vol.Schema( +AUTH_MESSAGE_SCHEMA: Final = probatio.Schema( { - vol.Required("type"): TYPE_AUTH, - vol.Exclusive("api_password", "auth"): str, - vol.Exclusive("access_token", "auth"): str, + probatio.Required("type"): TYPE_AUTH, + probatio.Exclusive("api_password", "auth"): str, + probatio.Exclusive("access_token", "auth"): str, } ) @@ -86,7 +86,7 @@ async def async_handle(self, msg: JsonValueType) -> ActiveConnection: """Handle authentication.""" try: valid_msg = AUTH_MESSAGE_SCHEMA(msg) - except vol.Invalid as err: + except probatio.Invalid as err: error_msg = ( f"Auth message incorrectly formatted: {humanize_error(msg, err)}" ) diff --git a/homeassistant/components/websocket_api/commands.py b/homeassistant/components/websocket_api/commands.py index 0864b1bd9023f..3f2b8103c594a 100644 --- a/homeassistant/components/websocket_api/commands.py +++ b/homeassistant/components/websocket_api/commands.py @@ -7,7 +7,7 @@ import logging from typing import Any, cast -import voluptuous as vol +import probatio from homeassistant.auth.models import User from homeassistant.auth.permissions.const import POLICY_READ @@ -181,8 +181,8 @@ def _forward_events_unconditional( @callback @decorators.websocket_command( { - vol.Required("type"): "subscribe_events", - vol.Optional("event_type", default=MATCH_ALL): str, + probatio.Required("type"): "subscribe_events", + probatio.Optional("event_type", default=MATCH_ALL): str, } ) def handle_subscribe_events( @@ -223,7 +223,7 @@ def handle_subscribe_events( @callback @decorators.websocket_command( { - vol.Required("type"): "subscribe_bootstrap_integrations", + probatio.Required("type"): "subscribe_bootstrap_integrations", } ) def handle_subscribe_bootstrap_integrations( @@ -246,8 +246,8 @@ def forward_bootstrap_integrations(message: dict[str, Any]) -> None: @callback @decorators.websocket_command( { - vol.Required("type"): "unsubscribe_events", - vol.Required("subscription"): cv.positive_int, + probatio.Required("type"): "unsubscribe_events", + probatio.Required("subscription"): cv.positive_int, } ) def handle_unsubscribe_events( @@ -265,12 +265,12 @@ def handle_unsubscribe_events( @decorators.websocket_command( { - vol.Required("type"): "call_service", - vol.Required("domain"): str, - vol.Required("service"): str, - vol.Optional("target"): cv.ENTITY_SERVICE_FIELDS, - vol.Optional("service_data"): dict, - vol.Optional("return_response", default=False): bool, + probatio.Required("type"): "call_service", + probatio.Required("domain"): str, + probatio.Required("service"): str, + probatio.Optional("target"): cv.ENTITY_SERVICE_FIELDS, + probatio.Optional("service_data"): dict, + probatio.Optional("return_response", default=False): bool, } ) @decorators.async_response @@ -319,7 +319,7 @@ async def handle_call_service( "child_service": err.service, }, ) - except vol.Invalid as err: + except probatio.Invalid as err: connection.send_error(msg["id"], const.ERR_INVALID_FORMAT, str(err)) except ServiceValidationError as err: connection.logger.error(err) @@ -366,7 +366,7 @@ def _async_get_allowed_states( @callback -@decorators.websocket_command({vol.Required("type"): "get_states"}) +@decorators.websocket_command({probatio.Required("type"): "get_states"}) def handle_get_states( hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any] ) -> None: @@ -438,8 +438,8 @@ def _forward_entity_changes( @callback @decorators.websocket_command( { - vol.Required("type"): "subscribe_entities", - vol.Optional("entity_ids"): cv.entity_ids, + probatio.Required("type"): "subscribe_entities", + probatio.Optional("entity_ids"): cv.entity_ids, **INCLUDE_EXCLUDE_BASE_FILTER_SCHEMA.schema, } ) @@ -552,7 +552,9 @@ async def _async_get_all_condition_descriptions_json(hass: HomeAssistant) -> byt return json_payload -@decorators.websocket_command({vol.Required("type"): "condition_platforms/subscribe"}) +@decorators.websocket_command( + {probatio.Required("type"): "condition_platforms/subscribe"} +) @decorators.async_response async def handle_subscribe_condition_platforms( hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any] @@ -593,7 +595,7 @@ async def _async_get_all_service_descriptions_json(hass: HomeAssistant) -> bytes return json_payload -@decorators.websocket_command({vol.Required("type"): "get_services"}) +@decorators.websocket_command({probatio.Required("type"): "get_services"}) @decorators.async_response async def handle_get_services( hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any] @@ -624,7 +626,9 @@ async def _async_get_all_trigger_descriptions_json(hass: HomeAssistant) -> bytes return json_payload -@decorators.websocket_command({vol.Required("type"): "trigger_platforms/subscribe"}) +@decorators.websocket_command( + {probatio.Required("type"): "trigger_platforms/subscribe"} +) @decorators.async_response async def handle_subscribe_trigger_platforms( hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any] @@ -651,7 +655,7 @@ async def on_new_triggers(new_triggers: set[str]) -> None: @callback -@decorators.websocket_command({vol.Required("type"): "get_config"}) +@decorators.websocket_command({probatio.Required("type"): "get_config"}) def handle_get_config( hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any] ) -> None: @@ -665,7 +669,10 @@ def handle_get_config( @decorators.websocket_command( - {vol.Required("type"): "manifest/list", vol.Optional("integrations"): [str]} + { + probatio.Required("type"): "manifest/list", + probatio.Optional("integrations"): [str], + } ) @decorators.async_response async def handle_manifest_list( @@ -689,7 +696,7 @@ async def handle_manifest_list( @decorators.websocket_command( - {vol.Required("type"): "manifest/get", vol.Required("integration"): str} + {probatio.Required("type"): "manifest/get", probatio.Required("integration"): str} ) @decorators.async_response async def handle_manifest_get( @@ -705,7 +712,7 @@ async def handle_manifest_get( @callback -@decorators.websocket_command({vol.Required("type"): "integration/setup_info"}) +@decorators.websocket_command({probatio.Required("type"): "integration/setup_info"}) def handle_integration_setup_info( hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any] ) -> None: @@ -720,7 +727,7 @@ def handle_integration_setup_info( @callback -@decorators.websocket_command({vol.Required("type"): "ping"}) +@decorators.websocket_command({probatio.Required("type"): "ping"}) def handle_ping( hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any] ) -> None: @@ -730,7 +737,7 @@ def handle_ping( @callback @decorators.websocket_command( - {vol.Required("type"): "slugify", vol.Required("text"): str} + {probatio.Required("type"): "slugify", probatio.Required("text"): str} ) def handle_slugify( hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any] @@ -747,13 +754,13 @@ def _cached_template(template_str: str, hass: HomeAssistant) -> template.Templat @decorators.websocket_command( { - vol.Required("type"): "render_template", - vol.Required("template"): str, - vol.Optional("entity_ids"): cv.entity_ids, - vol.Optional("variables"): dict, - vol.Optional("timeout"): vol.Coerce(float), - vol.Optional("strict", default=False): bool, - vol.Optional("report_errors", default=False): bool, + probatio.Required("type"): "render_template", + probatio.Required("template"): str, + probatio.Optional("entity_ids"): cv.entity_ids, + probatio.Optional("variables"): dict, + probatio.Optional("timeout"): probatio.Coerce(float), + probatio.Optional("strict", default=False): bool, + probatio.Optional("report_errors", default=False): bool, } ) @decorators.async_response @@ -854,7 +861,7 @@ def _serialize_entity_sources( @callback -@decorators.websocket_command({vol.Required("type"): "entity/source"}) +@decorators.websocket_command({probatio.Required("type"): "entity/source"}) def handle_entity_source( hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any] ) -> None: @@ -877,10 +884,10 @@ def handle_entity_source( @callback @decorators.websocket_command( { - vol.Required("type"): "extract_from_target", - vol.Required("target"): cv.TARGET_FIELDS, - vol.Optional("expand_group", default=False): bool, - vol.Optional("primary_entities_only", default=True): bool, + probatio.Required("type"): "extract_from_target", + probatio.Required("target"): cv.TARGET_FIELDS, + probatio.Optional("expand_group", default=False): bool, + probatio.Optional("primary_entities_only", default=True): bool, } ) def handle_extract_from_target( @@ -913,9 +920,9 @@ def handle_extract_from_target( @decorators.websocket_command( { - vol.Required("type"): "get_triggers_for_target", - vol.Required("target"): cv.TARGET_FIELDS, - vol.Optional("expand_group", default=True): bool, + probatio.Required("type"): "get_triggers_for_target", + probatio.Required("target"): cv.TARGET_FIELDS, + probatio.Optional("expand_group", default=True): bool, } ) @decorators.async_response @@ -936,9 +943,9 @@ async def handle_get_triggers_for_target( @decorators.websocket_command( { - vol.Required("type"): "get_conditions_for_target", - vol.Required("target"): cv.TARGET_FIELDS, - vol.Optional("expand_group", default=True): bool, + probatio.Required("type"): "get_conditions_for_target", + probatio.Required("target"): cv.TARGET_FIELDS, + probatio.Optional("expand_group", default=True): bool, } ) @decorators.async_response @@ -959,9 +966,9 @@ async def handle_get_conditions_for_target( @decorators.websocket_command( { - vol.Required("type"): "get_services_for_target", - vol.Required("target"): cv.TARGET_FIELDS, - vol.Optional("expand_group", default=True): bool, + probatio.Required("type"): "get_services_for_target", + probatio.Required("target"): cv.TARGET_FIELDS, + probatio.Optional("expand_group", default=True): bool, } ) @decorators.async_response @@ -982,9 +989,9 @@ async def handle_get_services_for_target( @decorators.websocket_command( { - vol.Required("type"): "subscribe_trigger", - vol.Required("trigger"): cv.TRIGGER_SCHEMA, - vol.Optional("variables"): dict, + probatio.Required("type"): "subscribe_trigger", + probatio.Required("trigger"): cv.TRIGGER_SCHEMA, + probatio.Optional("variables"): dict, } ) @decorators.require_admin @@ -998,7 +1005,7 @@ async def handle_subscribe_trigger( # unexpected errors by the default websocket error handler. try: trigger_config = await async_validate_trigger_config(hass, msg["trigger"]) - except vol.Invalid as err: + except probatio.Invalid as err: connection.send_error(msg["id"], const.ERR_INVALID_FORMAT, str(err)) return except HomeAssistantError as err: @@ -1046,9 +1053,9 @@ def forward_triggers( @decorators.websocket_command( { - vol.Required("type"): "test_condition", - vol.Required("condition"): cv.CONDITION_SCHEMA, - vol.Optional("variables"): dict, + probatio.Required("type"): "test_condition", + probatio.Required("condition"): cv.CONDITION_SCHEMA, + probatio.Optional("variables"): dict, } ) @decorators.require_admin @@ -1064,7 +1071,7 @@ async def handle_test_condition( # Do static + dynamic validation of the condition config = await async_validate_condition_config(hass, msg["condition"]) condition = await async_condition_from_config(hass, config) - except vol.Invalid as err: + except probatio.Invalid as err: connection.send_error(msg["id"], const.ERR_INVALID_FORMAT, str(err)) return except HomeAssistantError as err: @@ -1110,8 +1117,8 @@ async def handle_test_condition( @decorators.websocket_command( { - vol.Required("type"): "subscribe_condition", - vol.Required("condition"): cv.CONDITION_SCHEMA, + probatio.Required("type"): "subscribe_condition", + probatio.Required("condition"): cv.CONDITION_SCHEMA, } ) @decorators.async_response @@ -1122,7 +1129,7 @@ async def handle_subscribe_condition( try: condition_config = await async_validate_condition_config(hass, msg["condition"]) condition = await async_condition_from_config(hass, condition_config) - except vol.Invalid as err: + except probatio.Invalid as err: connection.send_error(msg["id"], const.ERR_INVALID_FORMAT, str(err)) return except HomeAssistantError as err: @@ -1186,9 +1193,9 @@ def unsubscribe() -> None: @decorators.websocket_command( { - vol.Required("type"): "execute_script", - vol.Required("sequence"): cv.SCRIPT_SCHEMA, - vol.Optional("variables"): dict, + probatio.Required("type"): "execute_script", + probatio.Required("sequence"): cv.SCRIPT_SCHEMA, + probatio.Optional("variables"): dict, } ) @decorators.require_admin @@ -1237,9 +1244,9 @@ async def handle_execute_script( @callback @decorators.websocket_command( { - vol.Required("type"): "fire_event", - vol.Required("event_type"): str, - vol.Optional("event_data"): dict, + probatio.Required("type"): "fire_event", + probatio.Required("event_type"): str, + probatio.Optional("event_data"): dict, } ) @decorators.require_admin @@ -1255,10 +1262,10 @@ def handle_fire_event( @decorators.websocket_command( { - vol.Required("type"): "validate_config", - vol.Optional("triggers"): cv.match_all, - vol.Optional("conditions"): cv.match_all, - vol.Optional("actions"): cv.match_all, + probatio.Required("type"): "validate_config", + probatio.Optional("triggers"): cv.match_all, + probatio.Optional("conditions"): cv.match_all, + probatio.Optional("actions"): cv.match_all, } ) @decorators.async_response @@ -1286,7 +1293,7 @@ async def handle_validate_config( try: await validator(hass, schema(msg[key])) except ( - vol.Invalid, + probatio.Invalid, HomeAssistantError, ) as err: result[key] = {"valid": False, "error": str(err)} @@ -1299,8 +1306,8 @@ async def handle_validate_config( @callback @decorators.websocket_command( { - vol.Required("type"): "supported_features", - vol.Required("features"): {str: int}, + probatio.Required("type"): "supported_features", + probatio.Required("features"): {str: int}, } ) def handle_supported_features( @@ -1323,8 +1330,8 @@ async def handle_integration_descriptions( @decorators.websocket_command( { - vol.Required("type"): "integration/wait", - vol.Required("domain"): str, + probatio.Required("type"): "integration/wait", + probatio.Required("domain"): str, } ) @decorators.async_response diff --git a/homeassistant/components/websocket_api/connection.py b/homeassistant/components/websocket_api/connection.py index d4f824d20db74..cd6e042697303 100644 --- a/homeassistant/components/websocket_api/connection.py +++ b/homeassistant/components/websocket_api/connection.py @@ -5,8 +5,8 @@ from typing import TYPE_CHECKING, Any, Literal, override from aiohttp import web -import voluptuous as vol -from voluptuous.humanize import humanize_error +import probatio +from probatio.humanize import humanize_error from homeassistant.auth.models import RefreshToken, User from homeassistant.core import Context, HomeAssistant, callback @@ -83,9 +83,9 @@ def __init__( self.last_id = 0 self.can_coalesce = False self.supported_features: dict[str, float] = {} - self.handlers: dict[str, tuple[MessageHandler, vol.Schema | Literal[False]]] = ( - self.hass.data[const.DOMAIN] - ) + self.handlers: dict[ + str, tuple[MessageHandler, probatio.Schema | Literal[False]] + ] = self.hass.data[const.DOMAIN] self.binary_handlers: list[BinaryHandler | None] = [] current_connection.set(self) @@ -245,7 +245,7 @@ def async_handle(self, msg: JsonValueType) -> None: try: if schema is False: if len(msg) > 2: - raise vol.Invalid("extra keys not allowed") # noqa: TRY301 + raise probatio.Invalid("extra keys not allowed") # noqa: TRY301 handler(self.hass, self, msg) else: handler(self.hass, self, schema(msg)) @@ -294,7 +294,7 @@ def async_handle_exception(self, msg: dict[str, Any], err: Exception) -> None: if isinstance(err, Unauthorized): code = const.ERR_UNAUTHORIZED err_message = "Unauthorized" - elif isinstance(err, vol.Invalid): + elif isinstance(err, probatio.Invalid): code = const.ERR_INVALID_FORMAT err_message = humanize_error(msg, err) elif isinstance(err, TimeoutError): diff --git a/homeassistant/components/websocket_api/decorators.py b/homeassistant/components/websocket_api/decorators.py index 37ac60baba098..557f2b2876049 100644 --- a/homeassistant/components/websocket_api/decorators.py +++ b/homeassistant/components/websocket_api/decorators.py @@ -4,7 +4,7 @@ from functools import wraps from typing import TYPE_CHECKING, Any -import voluptuous as vol +import probatio from homeassistant.const import HASSIO_USER_NAME from homeassistant.core import HomeAssistant, callback @@ -129,12 +129,12 @@ def output_error(message_id: str, message: str) -> None: def websocket_command( - schema: VolDictType | vol.All, + schema: VolDictType | probatio.All, ) -> Callable[[const.WebSocketCommandHandler], const.WebSocketCommandHandler]: """Tag a function as a websocket command. - The schema must be either a dictionary where the keys are voluptuous markers, or - a voluptuous.All schema where the first item is a voluptuous Mapping schema. + The schema must be either a dictionary where the keys are probatio markers, or + a probatio.All schema where the first item is a probatio Mapping schema. """ if is_dict := isinstance(schema, dict): command = schema["type"] @@ -150,7 +150,7 @@ def decorate(func: const.WebSocketCommandHandler) -> const.WebSocketCommandHandl else: if TYPE_CHECKING: assert not isinstance(schema, dict) - extended_schema = vol.All( + extended_schema = probatio.All( schema.validators[0].extend( messages.BASE_COMMAND_MESSAGE_SCHEMA.schema ), diff --git a/homeassistant/components/websocket_api/messages.py b/homeassistant/components/websocket_api/messages.py index a6d3b54f42715..f1f543e225772 100644 --- a/homeassistant/components/websocket_api/messages.py +++ b/homeassistant/components/websocket_api/messages.py @@ -4,7 +4,7 @@ import logging from typing import Any, Final -import voluptuous as vol +import probatio from homeassistant.const import ( COMPRESSED_STATE_ATTRIBUTES, @@ -27,13 +27,15 @@ _LOGGER: Final = logging.getLogger(__name__) # Minimal requirements of a message -MINIMAL_MESSAGE_SCHEMA: Final = vol.Schema( - {vol.Required("id"): cv.positive_int, vol.Required("type"): cv.string}, - extra=vol.ALLOW_EXTRA, +MINIMAL_MESSAGE_SCHEMA: Final = probatio.Schema( + {probatio.Required("id"): cv.positive_int, probatio.Required("type"): cv.string}, + extra=probatio.ALLOW_EXTRA, ) # Base schema to extend by message handlers -BASE_COMMAND_MESSAGE_SCHEMA: Final = vol.Schema({vol.Required("id"): cv.positive_int}) +BASE_COMMAND_MESSAGE_SCHEMA: Final = probatio.Schema( + {probatio.Required("id"): cv.positive_int} +) STATE_DIFF_ADDITIONS = "+" STATE_DIFF_REMOVALS = "-" diff --git a/homeassistant/components/wemo/__init__.py b/homeassistant/components/wemo/__init__.py index 68cce36725917..9497854eb94fa 100644 --- a/homeassistant/components/wemo/__init__.py +++ b/homeassistant/components/wemo/__init__.py @@ -5,8 +5,8 @@ import logging from typing import Any +import probatio import pywemo -import voluptuous as vol from homeassistant import config_entries from homeassistant.config_entries import ConfigEntry @@ -54,7 +54,7 @@ def coerce_host_port(value: str) -> HostPortTuple: host, _, port_str = value.partition(":") if not host: - raise vol.Invalid("host cannot be empty") + raise probatio.Invalid("host cannot be empty") port = cv.port(port_str) if port_str else None @@ -65,18 +65,20 @@ def coerce_host_port(value: str) -> HostPortTuple: DEFAULT_DISCOVERY = True -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Optional(CONF_STATIC, default=[]): vol.Schema( - [vol.All(cv.string, coerce_host_port)] + probatio.Optional(CONF_STATIC, default=[]): probatio.Schema( + [probatio.All(cv.string, coerce_host_port)] ), - vol.Optional(CONF_DISCOVERY, default=DEFAULT_DISCOVERY): cv.boolean, + probatio.Optional( + CONF_DISCOVERY, default=DEFAULT_DISCOVERY + ): cv.boolean, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/wemo/config_flow.py b/homeassistant/components/wemo/config_flow.py index 7be2c7e0896d7..c1c85b61e7607 100644 --- a/homeassistant/components/wemo/config_flow.py +++ b/homeassistant/components/wemo/config_flow.py @@ -3,8 +3,8 @@ from dataclasses import fields from typing import Any, get_type_hints, override +import probatio import pywemo -import voluptuous as vol from homeassistant.config_entries import ConfigEntry, ConfigFlowResult, OptionsFlow from homeassistant.core import HomeAssistant, callback @@ -57,18 +57,18 @@ async def async_step_init( ) -def _schema_for_options(options: Options) -> vol.Schema: - """Return the Voluptuous schema for the Options instance. +def _schema_for_options(options: Options) -> probatio.Schema: + """Return the Probatio schema for the Options instance. All values are optional. The default value is set to the current value and the type hint is set to the value of the field type annotation. """ type_hints = get_type_hints(type(options)) - return vol.Schema( + return probatio.Schema( { - vol.Optional(field.name, default=getattr(options, field.name)): type_hints[ - field.name - ] + probatio.Optional( + field.name, default=getattr(options, field.name) + ): type_hints[field.name] for field in fields(options) } ) diff --git a/homeassistant/components/wemo/device_trigger.py b/homeassistant/components/wemo/device_trigger.py index 8444dd4cd1288..82b12dcb3af5e 100644 --- a/homeassistant/components/wemo/device_trigger.py +++ b/homeassistant/components/wemo/device_trigger.py @@ -1,7 +1,7 @@ """Triggers for WeMo devices.""" +import probatio from pywemo.subscribe import EVENT_TYPE_LONG_PRESS -import voluptuous as vol from homeassistant.components.device_automation import DEVICE_TRIGGER_BASE_SCHEMA from homeassistant.components.homeassistant.triggers import event as event_trigger @@ -17,7 +17,7 @@ TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): vol.In(TRIGGER_TYPES), + probatio.Required(CONF_TYPE): probatio.In(TRIGGER_TYPES), } ) diff --git a/homeassistant/components/wemo/fan.py b/homeassistant/components/wemo/fan.py index 138f5435ce57a..a6c08f3540295 100644 --- a/homeassistant/components/wemo/fan.py +++ b/homeassistant/components/wemo/fan.py @@ -5,8 +5,8 @@ import math from typing import Any, override +import probatio from pywemo import DesiredHumidity, FanMode, Humidifier -import voluptuous as vol from homeassistant.components.fan import FanEntity, FanEntityFeature from homeassistant.config_entries import ConfigEntry @@ -38,8 +38,8 @@ SPEED_RANGE = (FanMode.Minimum, FanMode.Maximum) # off is not included SET_HUMIDITY_SCHEMA: VolDictType = { - vol.Required(ATTR_TARGET_HUMIDITY): vol.All( - vol.Coerce(float), vol.Range(min=0, max=100) + probatio.Required(ATTR_TARGET_HUMIDITY): probatio.All( + probatio.Coerce(float), probatio.Range(min=0, max=100) ), } diff --git a/homeassistant/components/whirlpool/config_flow.py b/homeassistant/components/whirlpool/config_flow.py index 46f4801425ef0..05251d8b0375a 100644 --- a/homeassistant/components/whirlpool/config_flow.py +++ b/homeassistant/components/whirlpool/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override from aiohttp import ClientError -import voluptuous as vol +import probatio from whirlpool.appliancesmanager import AppliancesManager from whirlpool.auth import AccountLockedError as WhirlpoolAccountLocked, Auth from whirlpool.backendselector import BackendSelector @@ -20,19 +20,19 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): str, - vol.Required(CONF_PASSWORD): str, - vol.Required(CONF_REGION): vol.In(list(REGIONS_CONF_MAP)), - vol.Required(CONF_BRAND): vol.In(list(BRANDS_CONF_MAP)), + probatio.Required(CONF_USERNAME): str, + probatio.Required(CONF_PASSWORD): str, + probatio.Required(CONF_REGION): probatio.In(list(REGIONS_CONF_MAP)), + probatio.Required(CONF_BRAND): probatio.In(list(BRANDS_CONF_MAP)), } ) -REAUTH_SCHEMA = vol.Schema( +REAUTH_SCHEMA = probatio.Schema( { - vol.Required(CONF_PASSWORD): str, - vol.Required(CONF_BRAND): vol.In(list(BRANDS_CONF_MAP)), + probatio.Required(CONF_PASSWORD): str, + probatio.Required(CONF_BRAND): probatio.In(list(BRANDS_CONF_MAP)), } ) diff --git a/homeassistant/components/whois/config_flow.py b/homeassistant/components/whois/config_flow.py index b5ad9cc4fa525..f5338d10b64f4 100644 --- a/homeassistant/components/whois/config_flow.py +++ b/homeassistant/components/whois/config_flow.py @@ -3,7 +3,7 @@ from functools import partial from typing import Any, override -import voluptuous as vol +import probatio import whoisdomain from whoisdomain.exceptions import ( FailedParsingWhoisOutputError, @@ -68,9 +68,9 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_DOMAIN, default=user_input.get(CONF_DOMAIN, "") ): str, } diff --git a/homeassistant/components/wiffi/config_flow.py b/homeassistant/components/wiffi/config_flow.py index fce81c4e3e75b..af8fed7395e19 100644 --- a/homeassistant/components/wiffi/config_flow.py +++ b/homeassistant/components/wiffi/config_flow.py @@ -6,7 +6,7 @@ import errno from typing import Any, override -import voluptuous as vol +import probatio from wiffi import WiffiTcpServer from homeassistant.config_entries import ( @@ -69,10 +69,12 @@ async def async_step_user( @callback def _async_show_form(self, errors=None): """Show the config flow form to the user.""" - data_schema = {vol.Required(CONF_PORT, default=DEFAULT_PORT): int} + data_schema = {probatio.Required(CONF_PORT, default=DEFAULT_PORT): int} return self.async_show_form( - step_id="user", data_schema=vol.Schema(data_schema), errors=errors or {} + step_id="user", + data_schema=probatio.Schema(data_schema), + errors=errors or {}, ) @@ -88,9 +90,9 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_TIMEOUT, default=self.config_entry.options.get( CONF_TIMEOUT, DEFAULT_TIMEOUT diff --git a/homeassistant/components/wiim/config_flow.py b/homeassistant/components/wiim/config_flow.py index 27eaca93a53d6..171556463ab76 100644 --- a/homeassistant/components/wiim/config_flow.py +++ b/homeassistant/components/wiim/config_flow.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from wiim.discovery import async_probe_wiim_device from wiim.models import WiimProbeResult @@ -15,7 +15,7 @@ from .const import DOMAIN, LOGGER, UPNP_PORT -STEP_USER_DATA_SCHEMA = vol.Schema({vol.Required(CONF_HOST): str}) +STEP_USER_DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_HOST): str}) async def _async_probe_wiim_host(hass: HomeAssistant, host: str) -> WiimProbeResult: diff --git a/homeassistant/components/wilight/support.py b/homeassistant/components/wilight/support.py index c345c38a95aa4..01f08541674d3 100644 --- a/homeassistant/components/wilight/support.py +++ b/homeassistant/components/wilight/support.py @@ -1,10 +1,10 @@ -"""Support for config validation using voluptuous and Translate Trigger.""" +"""Support for config validation using probatio and Translate Trigger.""" import calendar import locale from typing import Any -import voluptuous as vol +import probatio def wilight_trigger(value: Any) -> str | None: @@ -46,7 +46,7 @@ def wilight_trigger(value: Any) -> str | None: if (step == 7) & result_2: return value - raise vol.Invalid(err_desc) + raise probatio.Invalid(err_desc) def wilight_to_hass_trigger(value: str | None) -> str | None: diff --git a/homeassistant/components/wilight/switch.py b/homeassistant/components/wilight/switch.py index ac326207719d0..8252b4ef1d212 100644 --- a/homeassistant/components/wilight/switch.py +++ b/homeassistant/components/wilight/switch.py @@ -2,9 +2,9 @@ from typing import Any, override +import probatio from pywilight.const import ITEM_SWITCH, SWITCH_PAUSE_VALVE, SWITCH_VALVE from pywilight.wilight_device import PyWiLightDevice -import voluptuous as vol from homeassistant.components.switch import SwitchEntity from homeassistant.core import HomeAssistant @@ -42,12 +42,14 @@ RANGE_TRIGGER_INDEX = 4 # Service call validation schemas -VALID_WATERING_TIME = vol.All( - vol.Coerce(int), vol.Range(min=1, max=RANGE_WATERING_TIME) +VALID_WATERING_TIME = probatio.All( + probatio.Coerce(int), probatio.Range(min=1, max=RANGE_WATERING_TIME) ) -VALID_PAUSE_TIME = vol.All(vol.Coerce(int), vol.Range(min=1, max=RANGE_PAUSE_TIME)) -VALID_TRIGGER_INDEX = vol.All( - vol.Coerce(int), vol.Range(min=1, max=RANGE_TRIGGER_INDEX) +VALID_PAUSE_TIME = probatio.All( + probatio.Coerce(int), probatio.Range(min=1, max=RANGE_PAUSE_TIME) +) +VALID_TRIGGER_INDEX = probatio.All( + probatio.Coerce(int), probatio.Range(min=1, max=RANGE_TRIGGER_INDEX) ) # Descriptions of the valve switch entities @@ -108,7 +110,7 @@ async def set_pause_time(entity, service: Any) -> None: platform.async_register_entity_service( SERVICE_SET_WATERING_TIME, { - vol.Required(ATTR_WATERING_TIME): VALID_WATERING_TIME, + probatio.Required(ATTR_WATERING_TIME): VALID_WATERING_TIME, }, set_watering_time, ) @@ -116,8 +118,8 @@ async def set_pause_time(entity, service: Any) -> None: platform.async_register_entity_service( SERVICE_SET_TRIGGER, { - vol.Required(ATTR_TRIGGER_INDEX): VALID_TRIGGER_INDEX, - vol.Required(ATTR_TRIGGER): wl_trigger, + probatio.Required(ATTR_TRIGGER_INDEX): VALID_TRIGGER_INDEX, + probatio.Required(ATTR_TRIGGER): wl_trigger, }, set_trigger, ) @@ -125,7 +127,7 @@ async def set_pause_time(entity, service: Any) -> None: platform.async_register_entity_service( SERVICE_SET_PAUSE_TIME, { - vol.Required(ATTR_PAUSE_TIME): VALID_PAUSE_TIME, + probatio.Required(ATTR_PAUSE_TIME): VALID_PAUSE_TIME, }, set_pause_time, ) diff --git a/homeassistant/components/wirelesstag/__init__.py b/homeassistant/components/wirelesstag/__init__.py index 9baeee476a29d..c3f55f3d56439 100644 --- a/homeassistant/components/wirelesstag/__init__.py +++ b/homeassistant/components/wirelesstag/__init__.py @@ -3,8 +3,8 @@ import logging from typing import TYPE_CHECKING +import probatio from requests.exceptions import ConnectTimeout, HTTPError -import voluptuous as vol from wirelesstagpy import SensorTag, WirelessTags from wirelesstagpy.binaryevent import BinaryEvent from wirelesstagpy.exceptions import WirelessTagsException @@ -39,16 +39,16 @@ DEFAULT_ENTITY_NAMESPACE = "wirelesstag" -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/wirelesstag/binary_sensor.py b/homeassistant/components/wirelesstag/binary_sensor.py index f95ea0aa7e676..9df587404abcc 100644 --- a/homeassistant/components/wirelesstag/binary_sensor.py +++ b/homeassistant/components/wirelesstag/binary_sensor.py @@ -2,7 +2,7 @@ from typing import override -import voluptuous as vol +import probatio from wirelesstagpy import SensorTag, constants as WT_CONSTANTS from homeassistant.components.binary_sensor import ( @@ -40,8 +40,8 @@ PLATFORM_SCHEMA = BINARY_SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_MONITORED_CONDITIONS, default=[]): vol.All( - cv.ensure_list, [vol.In(SENSOR_TYPES)] + probatio.Required(CONF_MONITORED_CONDITIONS, default=[]): probatio.All( + cv.ensure_list, [probatio.In(SENSOR_TYPES)] ) } ) diff --git a/homeassistant/components/wirelesstag/sensor.py b/homeassistant/components/wirelesstag/sensor.py index 061192248833d..f645a5dd9eff6 100644 --- a/homeassistant/components/wirelesstag/sensor.py +++ b/homeassistant/components/wirelesstag/sensor.py @@ -3,7 +3,7 @@ import logging from typing import override -import voluptuous as vol +import probatio from wirelesstagpy import SensorTag from homeassistant.components.sensor import ( @@ -66,8 +66,8 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_MONITORED_CONDITIONS, default=[]): vol.All( - cv.ensure_list, [vol.In(SENSOR_KEYS)] + probatio.Required(CONF_MONITORED_CONDITIONS, default=[]): probatio.All( + cv.ensure_list, [probatio.In(SENSOR_KEYS)] ) } ) diff --git a/homeassistant/components/wirelesstag/switch.py b/homeassistant/components/wirelesstag/switch.py index e4c892af15213..6ae604cca71f5 100644 --- a/homeassistant/components/wirelesstag/switch.py +++ b/homeassistant/components/wirelesstag/switch.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from wirelesstagpy import SensorTag from homeassistant.components.switch import ( @@ -48,8 +48,8 @@ PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_MONITORED_CONDITIONS, default=[]): vol.All( - cv.ensure_list, [vol.In(SWITCH_KEYS)] + probatio.Required(CONF_MONITORED_CONDITIONS, default=[]): probatio.All( + cv.ensure_list, [probatio.In(SWITCH_KEYS)] ) } ) diff --git a/homeassistant/components/wiz/config_flow.py b/homeassistant/components/wiz/config_flow.py index d288a302306bf..b5ff7f5165ec6 100644 --- a/homeassistant/components/wiz/config_flow.py +++ b/homeassistant/components/wiz/config_flow.py @@ -3,10 +3,10 @@ import logging from typing import Any, override +import probatio from pywizlight import wizlight from pywizlight.discovery import DiscoveredBulb from pywizlight.exceptions import WizLightConnectionError, WizLightTimeOutError -import voluptuous as vol from homeassistant.components import onboarding from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -147,7 +147,9 @@ async def async_step_pick_device( return self.async_abort(reason="no_devices_found") return self.async_show_form( step_id="pick_device", - data_schema=vol.Schema({vol.Required(CONF_DEVICE): vol.In(devices_name)}), + data_schema=probatio.Schema( + {probatio.Required(CONF_DEVICE): probatio.In(devices_name)} + ), ) @override @@ -190,6 +192,8 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Optional(CONF_HOST, default=""): str}), + data_schema=probatio.Schema( + {probatio.Optional(CONF_HOST, default=""): str} + ), errors=errors, ) diff --git a/homeassistant/components/wled/config_flow.py b/homeassistant/components/wled/config_flow.py index 18ad70266d95f..09777d5693a9e 100644 --- a/homeassistant/components/wled/config_flow.py +++ b/homeassistant/components/wled/config_flow.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from wled import WLED, Device, WLEDConnectionError, WLEDUnsupportedVersionError import yarl @@ -85,7 +85,7 @@ async def async_step_user( title=device.info.name, data={CONF_HOST: host}, ) - data_schema = vol.Schema({vol.Required(CONF_HOST): str}) + data_schema = probatio.Schema({probatio.Required(CONF_HOST): str}) if self.source == SOURCE_RECONFIGURE: entry = self._get_reconfigure_entry() data_schema = self.add_suggested_values_to_schema( @@ -175,9 +175,9 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_KEEP_MAIN_LIGHT, default=self.config_entry.options.get( CONF_KEEP_MAIN_LIGHT, DEFAULT_KEEP_MAIN_LIGHT diff --git a/homeassistant/components/wmspro/config_flow.py b/homeassistant/components/wmspro/config_flow.py index ccc71834a8f99..6fa6878e4ee1c 100644 --- a/homeassistant/components/wmspro/config_flow.py +++ b/homeassistant/components/wmspro/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, override import aiohttp -import voluptuous as vol +import probatio from wmspro.webcontrol import WebControlPro from homeassistant.config_entries import SOURCE_DHCP, ConfigFlow, ConfigFlowResult @@ -18,9 +18,9 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, + probatio.Required(CONF_HOST): str, } ) diff --git a/homeassistant/components/wmspro/services.py b/homeassistant/components/wmspro/services.py index 389ce0de4304b..454cb67266f2f 100644 --- a/homeassistant/components/wmspro/services.py +++ b/homeassistant/components/wmspro/services.py @@ -1,6 +1,6 @@ """Services for WMS WebControl pro.""" -import voluptuous as vol +import probatio from homeassistant.components.cover import ( ATTR_POSITION, @@ -27,11 +27,11 @@ def async_setup_services(hass: HomeAssistant) -> None: CoverEntityFeature.SET_POSITION | CoverEntityFeature.SET_TILT_POSITION ], schema={ - vol.Required(ATTR_POSITION): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) + probatio.Required(ATTR_POSITION): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) ), - vol.Required(ATTR_TILT_POSITION): vol.All( - vol.Coerce(int), vol.Range(min=0, max=100) + probatio.Required(ATTR_TILT_POSITION): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=100) ), }, ) diff --git a/homeassistant/components/wolflink/config_flow.py b/homeassistant/components/wolflink/config_flow.py index 02384f88b2d3e..f1ab64488fdb1 100644 --- a/homeassistant/components/wolflink/config_flow.py +++ b/homeassistant/components/wolflink/config_flow.py @@ -4,7 +4,7 @@ from typing import override from httpx import RequestError -import voluptuous as vol +import probatio from wolf_comm.token_auth import InvalidAuth from wolf_comm.wolf_client import FetchFailed, WolfClient @@ -15,8 +15,8 @@ _LOGGER = logging.getLogger(__name__) -USER_SCHEMA = vol.Schema( - {vol.Required(CONF_USERNAME): str, vol.Required(CONF_PASSWORD): str} +USER_SCHEMA = probatio.Schema( + {probatio.Required(CONF_USERNAME): str, probatio.Required(CONF_PASSWORD): str} ) diff --git a/homeassistant/components/workday/__init__.py b/homeassistant/components/workday/__init__.py index add884165c3ef..401f87ec0e229 100644 --- a/homeassistant/components/workday/__init__.py +++ b/homeassistant/components/workday/__init__.py @@ -4,7 +4,7 @@ from typing import cast from holidays import DateLike, HolidayBase -import voluptuous as vol +import probatio from homeassistant.components.binary_sensor import DOMAIN as BINARY_SENSOR_DOMAIN from homeassistant.config_entries import ConfigEntry @@ -47,7 +47,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: DOMAIN, SERVICE_CHECK_DATE, entity_domain=BINARY_SENSOR_DOMAIN, - schema={vol.Required(CHECK_DATE): cv.date}, + schema={probatio.Required(CHECK_DATE): cv.date}, func="check_date", supports_response=SupportsResponse.ONLY, ) diff --git a/homeassistant/components/workday/config_flow.py b/homeassistant/components/workday/config_flow.py index 5fde80f410be7..a514e2a1874fd 100644 --- a/homeassistant/components/workday/config_flow.py +++ b/homeassistant/components/workday/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from holidays import PUBLIC, HolidayBase, country_holidays, list_supported_countries -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigEntry, @@ -50,9 +50,9 @@ def add_province_and_language_to_schema( - schema: vol.Schema, + schema: probatio.Schema, country: str | None, -) -> vol.Schema: +) -> probatio.Schema: """Update schema with province from country.""" if not country: return schema @@ -66,7 +66,7 @@ def add_province_and_language_to_schema( if country_default_language := (_country.default_language): new_selectable_languages = list(_country.supported_languages) language_schema = { - vol.Optional( + probatio.Optional( CONF_LANGUAGE, default=country_default_language ): LanguageSelector( LanguageSelectorConfig( @@ -89,7 +89,7 @@ def add_province_and_language_to_schema( else: province_options = provinces province_schema = { - vol.Optional(CONF_PROVINCE): SelectSelector( + probatio.Optional(CONF_PROVINCE): SelectSelector( SelectSelectorConfig( options=province_options, mode=SelectSelectorMode.DROPDOWN, @@ -103,7 +103,7 @@ def add_province_and_language_to_schema( _categories = [x for x in _country.supported_categories if x != PUBLIC] if _categories: category_schema = { - vol.Optional(CONF_CATEGORY): SelectSelector( + probatio.Optional(CONF_CATEGORY): SelectSelector( SelectSelectorConfig( options=_categories, mode=SelectSelectorMode.DROPDOWN, @@ -113,7 +113,7 @@ def add_province_and_language_to_schema( ), } - return vol.Schema( + return probatio.Schema( { **DATA_SCHEMA_OPT.schema, **language_schema, @@ -167,9 +167,9 @@ def validate_custom_dates(user_input: dict[str, Any]) -> None: raise RemoveDatesError("Incorrect date or name") -DATA_SCHEMA_OPT = vol.Schema( +DATA_SCHEMA_OPT = probatio.Schema( { - vol.Optional(CONF_WORKDAYS, default=DEFAULT_WORKDAYS): SelectSelector( + probatio.Optional(CONF_WORKDAYS, default=DEFAULT_WORKDAYS): SelectSelector( SelectSelectorConfig( options=ALLOWED_DAYS, multiple=True, @@ -177,7 +177,7 @@ def validate_custom_dates(user_input: dict[str, Any]) -> None: translation_key="days", ) ), - vol.Optional(CONF_EXCLUDES, default=DEFAULT_EXCLUDES): SelectSelector( + probatio.Optional(CONF_EXCLUDES, default=DEFAULT_EXCLUDES): SelectSelector( SelectSelectorConfig( options=ALLOWED_DAYS, multiple=True, @@ -185,10 +185,10 @@ def validate_custom_dates(user_input: dict[str, Any]) -> None: translation_key="days", ) ), - vol.Optional(CONF_OFFSET, default=DEFAULT_OFFSET): NumberSelector( + probatio.Optional(CONF_OFFSET, default=DEFAULT_OFFSET): NumberSelector( NumberSelectorConfig(min=-10, max=10, step=1, mode=NumberSelectorMode.BOX) ), - vol.Optional(CONF_ADD_HOLIDAYS, default=[]): SelectSelector( + probatio.Optional(CONF_ADD_HOLIDAYS, default=[]): SelectSelector( SelectSelectorConfig( options=[], multiple=True, @@ -196,7 +196,7 @@ def validate_custom_dates(user_input: dict[str, Any]) -> None: mode=SelectSelectorMode.DROPDOWN, ) ), - vol.Optional(CONF_REMOVE_HOLIDAYS, default=[]): SelectSelector( + probatio.Optional(CONF_REMOVE_HOLIDAYS, default=[]): SelectSelector( SelectSelectorConfig( options=[], multiple=True, @@ -241,9 +241,9 @@ async def async_step_user( return await self.async_step_options() return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional(CONF_COUNTRY): CountrySelector( + probatio.Optional(CONF_COUNTRY): CountrySelector( CountrySelectorConfig( countries=list(supported_countries), ) @@ -367,7 +367,7 @@ async def async_step_init( return self.async_create_entry(data=combined_input) options = self.config_entry.options - schema: vol.Schema = await self.hass.async_add_executor_job( + schema: probatio.Schema = await self.hass.async_add_executor_job( add_province_and_language_to_schema, DATA_SCHEMA_OPT, options.get(CONF_COUNTRY), diff --git a/homeassistant/components/workday/repairs.py b/homeassistant/components/workday/repairs.py index 9c4e452771e55..a104acb33d6f3 100644 --- a/homeassistant/components/workday/repairs.py +++ b/homeassistant/components/workday/repairs.py @@ -3,7 +3,7 @@ from typing import Any, cast from holidays import list_supported_countries -import voluptuous as vol +import probatio from homeassistant.components.repairs import ( ConfirmRepairFlow, @@ -59,9 +59,9 @@ async def async_step_country( return self.async_show_form( step_id="country", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_COUNTRY): SelectSelector( + probatio.Required(CONF_COUNTRY): SelectSelector( SelectSelectorConfig( options=sorted( list_supported_countries(include_aliases=False) @@ -92,9 +92,9 @@ async def async_step_province( ] return self.async_show_form( step_id="province", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional(CONF_PROVINCE): SelectSelector( + probatio.Optional(CONF_PROVINCE): SelectSelector( SelectSelectorConfig( options=country_provinces, mode=SelectSelectorMode.DROPDOWN, @@ -154,9 +154,9 @@ async def async_step_fix_remove_holiday( value for value in remove_holidays if value != self.named_holiday ] new_schema = self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Optional(CONF_REMOVE_HOLIDAYS, default=[]): SelectSelector( + probatio.Optional(CONF_REMOVE_HOLIDAYS, default=[]): SelectSelector( SelectSelectorConfig( options=[], multiple=True, diff --git a/homeassistant/components/worldclock/config_flow.py b/homeassistant/components/worldclock/config_flow.py index e9b4ea4e557d4..fccf92fb17613 100644 --- a/homeassistant/components/worldclock/config_flow.py +++ b/homeassistant/components/worldclock/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, cast, override import zoneinfo -import voluptuous as vol +import probatio from homeassistant.const import CONF_TIME_ZONE from homeassistant.helpers.schema_config_entry_flow import ( @@ -42,16 +42,16 @@ async def validate_duplicate( return user_input -async def get_schema(handler: SchemaCommonFlowHandler) -> vol.Schema: +async def get_schema(handler: SchemaCommonFlowHandler) -> probatio.Schema: """Get available timezones.""" get_timezones: list[str] = list( await handler.parent_handler.hass.async_add_executor_job( zoneinfo.available_timezones ) ) - return vol.Schema( + return probatio.Schema( { - vol.Required(CONF_TIME_ZONE): SelectSelector( + probatio.Required(CONF_TIME_ZONE): SelectSelector( SelectSelectorConfig( options=get_timezones, mode=SelectSelectorMode.DROPDOWN, sort=True ) @@ -60,9 +60,11 @@ async def get_schema(handler: SchemaCommonFlowHandler) -> vol.Schema: ).extend(DATA_SCHEMA_OPTIONS.schema) -DATA_SCHEMA_OPTIONS = vol.Schema( +DATA_SCHEMA_OPTIONS = probatio.Schema( { - vol.Optional(CONF_TIME_FORMAT, default=DEFAULT_TIME_STR_FORMAT): SelectSelector( + probatio.Optional( + CONF_TIME_FORMAT, default=DEFAULT_TIME_STR_FORMAT + ): SelectSelector( SelectSelectorConfig( options=TIME_STR_OPTIONS, custom_value=True, diff --git a/homeassistant/components/worldtidesinfo/sensor.py b/homeassistant/components/worldtidesinfo/sensor.py index bcfad346d1efa..e1fa78cb911d2 100644 --- a/homeassistant/components/worldtidesinfo/sensor.py +++ b/homeassistant/components/worldtidesinfo/sensor.py @@ -5,8 +5,8 @@ import time from typing import Any, override +import probatio import requests -import voluptuous as vol from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -28,10 +28,10 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_API_KEY): cv.string, - vol.Optional(CONF_LATITUDE): cv.latitude, - vol.Optional(CONF_LONGITUDE): cv.longitude, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_API_KEY): cv.string, + probatio.Optional(CONF_LATITUDE): cv.latitude, + probatio.Optional(CONF_LONGITUDE): cv.longitude, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/worxlandroid/sensor.py b/homeassistant/components/worxlandroid/sensor.py index b1b8fef7e122e..184312d281f1c 100644 --- a/homeassistant/components/worxlandroid/sensor.py +++ b/homeassistant/components/worxlandroid/sensor.py @@ -5,7 +5,7 @@ from typing import override import aiohttp -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -26,10 +26,10 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_PIN): cv.string, - vol.Optional(CONF_ALLOW_UNREACHABLE, default=True): cv.boolean, - vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_PIN): cv.string, + probatio.Optional(CONF_ALLOW_UNREACHABLE, default=True): cv.boolean, + probatio.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, } ) diff --git a/homeassistant/components/ws66i/config_flow.py b/homeassistant/components/ws66i/config_flow.py index 70ec6a7b36c0f..bf74d5fe79663 100644 --- a/homeassistant/components/ws66i/config_flow.py +++ b/homeassistant/components/ws66i/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import Any, override +import probatio from pyws66i import WS66i, get_ws66i -import voluptuous as vol from homeassistant.config_entries import ( ConfigEntry, @@ -39,9 +39,9 @@ CONF_SOURCE_6, ] -OPTIONS_SCHEMA = {vol.Optional(source): str for source in SOURCES} +OPTIONS_SCHEMA = {probatio.Optional(source): str for source in SOURCES} -DATA_SCHEMA = vol.Schema({vol.Required(CONF_IP_ADDRESS): str}) +DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_IP_ADDRESS): str}) FIRST_ZONE = 11 @@ -136,8 +136,8 @@ def async_get_options_flow( @callback def _key_for_source( index: int, source: str, previous_sources: dict[str, str] -) -> vol.Required: - return vol.Required( +) -> probatio.Required: + return probatio.Required( source, description={"suggested_value": previous_sources[str(index)]} ) @@ -164,7 +164,7 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema(options), + data_schema=probatio.Schema(options), ) diff --git a/homeassistant/components/wsdot/config_flow.py b/homeassistant/components/wsdot/config_flow.py index ccae58bd91876..a4f449cb078e4 100644 --- a/homeassistant/components/wsdot/config_flow.py +++ b/homeassistant/components/wsdot/config_flow.py @@ -4,7 +4,7 @@ from types import MappingProxyType from typing import Any, override -import voluptuous as vol +import probatio import wsdot as wsdot_api from homeassistant.config_entries import ( @@ -57,9 +57,9 @@ async def async_step_user( return self.async_show_form( step_id=SOURCE_USER, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_API_KEY): str, + probatio.Required(CONF_API_KEY): str, } ), errors=errors, @@ -154,6 +154,6 @@ async def async_step_user( ) return self.async_show_form( step_id=SOURCE_USER, - data_schema=vol.Schema({vol.Required(CONF_NAME): names}), + data_schema=probatio.Schema({probatio.Required(CONF_NAME): names}), errors={}, ) diff --git a/homeassistant/components/wsdot/sensor.py b/homeassistant/components/wsdot/sensor.py index eee51da64ce64..1dd09c8f4f3f3 100644 --- a/homeassistant/components/wsdot/sensor.py +++ b/homeassistant/components/wsdot/sensor.py @@ -4,7 +4,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio import wsdot as wsdot_api from homeassistant.components.sensor import ( @@ -33,9 +33,12 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_API_KEY): cv.string, - vol.Required(CONF_TRAVEL_TIMES): [ - {vol.Required(CONF_ID): cv.string, vol.Optional(CONF_NAME): cv.string} + probatio.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_TRAVEL_TIMES): [ + { + probatio.Required(CONF_ID): cv.string, + probatio.Optional(CONF_NAME): cv.string, + } ], } ) diff --git a/homeassistant/components/wyoming/config_flow.py b/homeassistant/components/wyoming/config_flow.py index 35946b770c991..4be9a2efb49ed 100644 --- a/homeassistant/components/wyoming/config_flow.py +++ b/homeassistant/components/wyoming/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from urllib.parse import urlparse -import voluptuous as vol +import probatio from homeassistant.config_entries import SOURCE_HASSIO, ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST, CONF_PORT @@ -16,10 +16,10 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT): int, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT): int, } ) diff --git a/homeassistant/components/wyoming/websocket_api.py b/homeassistant/components/wyoming/websocket_api.py index 66fb2e1eafa25..9112e293ecb2c 100644 --- a/homeassistant/components/wyoming/websocket_api.py +++ b/homeassistant/components/wyoming/websocket_api.py @@ -3,7 +3,7 @@ import logging from typing import Any -import voluptuous as vol +import probatio from homeassistant.components import websocket_api from homeassistant.core import HomeAssistant, callback @@ -22,7 +22,7 @@ def async_register_websocket_api(hass: HomeAssistant) -> None: @callback @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required("type"): "wyoming/info"}) +@websocket_api.websocket_command({probatio.Required("type"): "wyoming/info"}) def websocket_info( hass: HomeAssistant, connection: websocket_api.connection.ActiveConnection, diff --git a/homeassistant/components/x10/light.py b/homeassistant/components/x10/light.py index a8546d1e1bbce..7c2928f387831 100644 --- a/homeassistant/components/x10/light.py +++ b/homeassistant/components/x10/light.py @@ -4,7 +4,7 @@ from subprocess import STDOUT, CalledProcessError, check_output from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.light import ( ATTR_BRIGHTNESS, @@ -22,9 +22,14 @@ PLATFORM_SCHEMA = LIGHT_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_DEVICES): vol.All( + probatio.Required(CONF_DEVICES): probatio.All( cv.ensure_list, - [{vol.Required(CONF_ID): cv.string, vol.Required(CONF_NAME): cv.string}], + [ + { + probatio.Required(CONF_ID): cv.string, + probatio.Required(CONF_NAME): cv.string, + } + ], ) } ) diff --git a/homeassistant/components/xbox/config_flow.py b/homeassistant/components/xbox/config_flow.py index a3a174b801da8..3c32e8e6b5341 100644 --- a/homeassistant/components/xbox/config_flow.py +++ b/homeassistant/components/xbox/config_flow.py @@ -4,10 +4,10 @@ import logging from typing import Any, override +import probatio from pythonxbox.api.client import XboxLiveClient from pythonxbox.authentication.manager import AuthenticationManager from pythonxbox.authentication.models import OAuth2TokenResponse -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -162,9 +162,9 @@ async def async_step_user( return self.async_show_form( step_id="user", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_XUID): SelectSelector( + probatio.Required(CONF_XUID): SelectSelector( SelectSelectorConfig(options=options) ) } diff --git a/homeassistant/components/xeoma/camera.py b/homeassistant/components/xeoma/camera.py index c536817ac4061..9bb2ca9131739 100644 --- a/homeassistant/components/xeoma/camera.py +++ b/homeassistant/components/xeoma/camera.py @@ -3,8 +3,8 @@ import logging from typing import override +import probatio from pyxeoma.xeoma import Xeoma, XeomaError -import voluptuous as vol from homeassistant.components.camera import ( PLATFORM_SCHEMA as CAMERA_PLATFORM_SCHEMA, @@ -25,24 +25,24 @@ CONF_VIEWER_PASSWORD = "viewer_password" CONF_VIEWER_USERNAME = "viewer_username" -CAMERAS_SCHEMA = vol.Schema( +CAMERAS_SCHEMA = probatio.Schema( { - vol.Required(CONF_IMAGE_NAME): cv.string, - vol.Optional(CONF_HIDE, default=False): cv.boolean, - vol.Optional(CONF_NAME): cv.string, + probatio.Required(CONF_IMAGE_NAME): cv.string, + probatio.Optional(CONF_HIDE, default=False): cv.boolean, + probatio.Optional(CONF_NAME): cv.string, }, required=False, ) PLATFORM_SCHEMA = CAMERA_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_CAMERAS): vol.Schema( - vol.All(cv.ensure_list, [CAMERAS_SCHEMA]) + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_CAMERAS): probatio.Schema( + probatio.All(cv.ensure_list, [CAMERAS_SCHEMA]) ), - vol.Optional(CONF_NEW_VERSION, default=True): cv.boolean, - vol.Optional(CONF_PASSWORD): cv.string, - vol.Optional(CONF_USERNAME): cv.string, + probatio.Optional(CONF_NEW_VERSION, default=True): cv.boolean, + probatio.Optional(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_USERNAME): cv.string, } ) diff --git a/homeassistant/components/xiaomi/camera.py b/homeassistant/components/xiaomi/camera.py index 6ca4064751d57..1bb2b472bab05 100644 --- a/homeassistant/components/xiaomi/camera.py +++ b/homeassistant/components/xiaomi/camera.py @@ -5,7 +5,7 @@ from typing import override from haffmpeg.camera import CameraMjpeg -import voluptuous as vol +import probatio from homeassistant.components import ffmpeg from homeassistant.components.camera import ( @@ -44,14 +44,14 @@ PLATFORM_SCHEMA = CAMERA_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_NAME): cv.string, - vol.Required(CONF_HOST): cv.template, - vol.Required(CONF_MODEL): vol.Any(MODEL_YI, MODEL_XIAOFANG), - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_PATH, default=DEFAULT_PATH): cv.string, - vol.Optional(CONF_USERNAME, default=DEFAULT_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_FFMPEG_ARGUMENTS, default=DEFAULT_ARGUMENTS): cv.string, + probatio.Required(CONF_NAME): cv.string, + probatio.Required(CONF_HOST): cv.template, + probatio.Required(CONF_MODEL): probatio.Any(MODEL_YI, MODEL_XIAOFANG), + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_PATH, default=DEFAULT_PATH): cv.string, + probatio.Optional(CONF_USERNAME, default=DEFAULT_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_FFMPEG_ARGUMENTS, default=DEFAULT_ARGUMENTS): cv.string, } ) diff --git a/homeassistant/components/xiaomi/device_tracker.py b/homeassistant/components/xiaomi/device_tracker.py index 1e2b8b0b624da..0877a702b12a2 100644 --- a/homeassistant/components/xiaomi/device_tracker.py +++ b/homeassistant/components/xiaomi/device_tracker.py @@ -4,8 +4,8 @@ import logging from typing import override +import probatio import requests -import voluptuous as vol from homeassistant.components.device_tracker import ( DOMAIN as DEVICE_TRACKER_DOMAIN, @@ -21,9 +21,9 @@ PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_USERNAME, default="admin"): cv.string, - vol.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_USERNAME, default="admin"): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, } ) diff --git a/homeassistant/components/xiaomi_aqara/__init__.py b/homeassistant/components/xiaomi_aqara/__init__.py index 936e038e3dd93..44e63a5f2df11 100644 --- a/homeassistant/components/xiaomi_aqara/__init__.py +++ b/homeassistant/components/xiaomi_aqara/__init__.py @@ -4,7 +4,7 @@ from dataclasses import dataclass, field import logging -import voluptuous as vol +import probatio from xiaomi_gateway import AsyncXiaomiGatewayMulticast, XiaomiGateway from homeassistant.components import persistent_notification @@ -47,19 +47,23 @@ SERVICE_ADD_DEVICE = "add_device" SERVICE_REMOVE_DEVICE = "remove_device" -SERVICE_SCHEMA_PLAY_RINGTONE = vol.Schema( +SERVICE_SCHEMA_PLAY_RINGTONE = probatio.Schema( { - vol.Required(ATTR_RINGTONE_ID): vol.All( - vol.Coerce(int), vol.NotIn([9, 14, 15, 16, 17, 18, 19]) + probatio.Required(ATTR_RINGTONE_ID): probatio.All( + probatio.Coerce(int), probatio.NotIn([9, 14, 15, 16, 17, 18, 19]) ), - vol.Optional(ATTR_RINGTONE_VOL): vol.All( - vol.Coerce(int), vol.Clamp(min=0, max=100) + probatio.Optional(ATTR_RINGTONE_VOL): probatio.All( + probatio.Coerce(int), probatio.Clamp(min=0, max=100) ), } ) -SERVICE_SCHEMA_REMOVE_DEVICE = vol.Schema( - {vol.Required(ATTR_DEVICE_ID): vol.All(cv.string, vol.Length(min=14, max=14))} +SERVICE_SCHEMA_REMOVE_DEVICE = probatio.Schema( + { + probatio.Required(ATTR_DEVICE_ID): probatio.All( + cv.string, probatio.Length(min=14, max=14) + ) + } ) CONFIG_SCHEMA = cv.config_entry_only_config_schema(DOMAIN) @@ -104,7 +108,7 @@ def remove_device_service(call: ServiceCall) -> None: gateway: XiaomiGateway = call.data[ATTR_GW_MAC] gateway.write_to_hub(gateway.sid, remove_device=device_id) - gateway_only_schema = _add_gateway_to_schema(hass, vol.Schema({})) + gateway_only_schema = _add_gateway_to_schema(hass, probatio.Schema({})) hass.services.register( DOMAIN, @@ -237,8 +241,10 @@ async def async_unload_entry( return unload_ok -def _add_gateway_to_schema(hass: HomeAssistant, schema: vol.Schema) -> vol.Schema: - """Extend a voluptuous schema with a gateway validator.""" +def _add_gateway_to_schema( + hass: HomeAssistant, schema: probatio.Schema +) -> probatio.Schema: + """Extend a probatio schema with a gateway validator.""" def gateway(sid: str) -> XiaomiGateway: """Convert sid to a gateway.""" @@ -249,7 +255,7 @@ def gateway(sid: str) -> XiaomiGateway: if entry_gateway.sid == sid: return entry_gateway - raise vol.Invalid(f"Unknown gateway sid {sid}") + raise probatio.Invalid(f"Unknown gateway sid {sid}") kwargs = {} gateways = [ @@ -260,4 +266,4 @@ def gateway(sid: str) -> XiaomiGateway: if len(gateways) == 1: kwargs["default"] = gateways[0].sid - return schema.extend({vol.Required(ATTR_GW_MAC, **kwargs): gateway}) + return schema.extend({probatio.Required(ATTR_GW_MAC, **kwargs): gateway}) diff --git a/homeassistant/components/xiaomi_aqara/config_flow.py b/homeassistant/components/xiaomi_aqara/config_flow.py index 6752767439d0a..fa42fbc56ce1a 100644 --- a/homeassistant/components/xiaomi_aqara/config_flow.py +++ b/homeassistant/components/xiaomi_aqara/config_flow.py @@ -4,7 +4,7 @@ from socket import gaierror from typing import Any, override -import voluptuous as vol +import probatio from xiaomi_gateway import MULTICAST_PORT, XiaomiGateway, XiaomiGatewayDiscovery from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -29,20 +29,20 @@ DEFAULT_INTERFACE = "any" -GATEWAY_CONFIG = vol.Schema( - {vol.Optional(CONF_INTERFACE, default=DEFAULT_INTERFACE): str} +GATEWAY_CONFIG = probatio.Schema( + {probatio.Optional(CONF_INTERFACE, default=DEFAULT_INTERFACE): str} ) CONFIG_HOST = { - vol.Optional(CONF_HOST): str, - vol.Optional(CONF_MAC): str, + probatio.Optional(CONF_HOST): str, + probatio.Optional(CONF_MAC): str, } GATEWAY_CONFIG_HOST = GATEWAY_CONFIG.extend(CONFIG_HOST) -GATEWAY_SETTINGS = vol.Schema( +GATEWAY_SETTINGS = probatio.Schema( { - vol.Optional(CONF_KEY): vol.All(str, vol.Length(min=16, max=16)), + probatio.Optional(CONF_KEY): probatio.All(str, probatio.Length(min=16, max=16)), # Name field is no longer allowed in config flow schemas # pylint: disable-next=home-assistant-config-flow-name-field - vol.Optional(CONF_NAME, default=DEFAULT_GATEWAY_NAME): str, + probatio.Optional(CONF_NAME, default=DEFAULT_GATEWAY_NAME): str, } ) @@ -153,9 +153,9 @@ async def async_step_select( self.sid = self.selected_gateway.sid return await self.async_step_settings() - select_schema = vol.Schema( + select_schema = probatio.Schema( { - vol.Required("select_ip"): vol.In( + probatio.Required("select_ip"): probatio.In( [gateway.ip_adress for gateway in self.gateways.values()] ) } diff --git a/homeassistant/components/xiaomi_ble/config_flow.py b/homeassistant/components/xiaomi_ble/config_flow.py index 88cf3ddb58dd4..352bc00662b50 100644 --- a/homeassistant/components/xiaomi_ble/config_flow.py +++ b/homeassistant/components/xiaomi_ble/config_flow.py @@ -5,7 +5,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from xiaomi_ble import ( XiaomiBluetoothDeviceData as DeviceData, XiaomiCloudException, @@ -146,7 +146,9 @@ async def async_step_get_encryption_key_legacy( return self.async_show_form( step_id="get_encryption_key_legacy", description_placeholders=self.context["title_placeholders"], - data_schema=vol.Schema({vol.Required("bindkey"): vol.All(str, vol.Strip)}), + data_schema=probatio.Schema( + {probatio.Required("bindkey"): probatio.All(str, probatio.Strip)} + ), errors=errors, ) @@ -180,7 +182,9 @@ async def async_step_get_encryption_key_4_5( return self.async_show_form( step_id="get_encryption_key_4_5", description_placeholders=self.context["title_placeholders"], - data_schema=vol.Schema({vol.Required("bindkey"): vol.All(str, vol.Strip)}), + data_schema=probatio.Schema( + {probatio.Required("bindkey"): probatio.All(str, probatio.Strip)} + ), errors=errors, ) @@ -221,12 +225,12 @@ async def async_step_cloud_auth( return self.async_show_form( step_id="cloud_auth", errors=errors, - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_USERNAME, default=user_input.get(CONF_USERNAME) ): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_PASSWORD): str, } ), description_placeholders={ @@ -329,7 +333,9 @@ async def async_step_user( } return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_ADDRESS): vol.In(titles)}), + data_schema=probatio.Schema( + {probatio.Required(CONF_ADDRESS): probatio.In(titles)} + ), ) async def async_step_reauth( diff --git a/homeassistant/components/xiaomi_ble/device_trigger.py b/homeassistant/components/xiaomi_ble/device_trigger.py index d605bd272ff2f..454392f5770e0 100644 --- a/homeassistant/components/xiaomi_ble/device_trigger.py +++ b/homeassistant/components/xiaomi_ble/device_trigger.py @@ -3,7 +3,7 @@ from dataclasses import dataclass from typing import Any -import voluptuous as vol +import probatio from homeassistant.components.device_automation import DEVICE_TRIGGER_BASE_SCHEMA from homeassistant.components.homeassistant.triggers import event as event_trigger @@ -300,8 +300,8 @@ async def async_validate_trigger_config( if model_data := _async_trigger_model_data(hass, device_id): schema = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): vol.In(model_data.event_types), - vol.Required(CONF_SUBTYPE): vol.In(model_data.triggers), + probatio.Required(CONF_TYPE): probatio.In(model_data.event_types), + probatio.Required(CONF_SUBTYPE): probatio.In(model_data.triggers), } ) return schema(config) # type: ignore[no-any-return] diff --git a/homeassistant/components/xiaomi_miio/config_flow.py b/homeassistant/components/xiaomi_miio/config_flow.py index d7d8176634c66..f44d830c12516 100644 --- a/homeassistant/components/xiaomi_miio/config_flow.py +++ b/homeassistant/components/xiaomi_miio/config_flow.py @@ -7,7 +7,7 @@ from micloud import MiCloud from micloud.micloudexception import MiCloudAccessDenied -import voluptuous as vol +import probatio from homeassistant.config_entries import ( ConfigFlow, @@ -42,18 +42,22 @@ _LOGGER = logging.getLogger(__name__) DEVICE_SETTINGS = { - vol.Required(CONF_TOKEN): vol.All(str, vol.Length(min=32, max=32)), + probatio.Required(CONF_TOKEN): probatio.All(str, probatio.Length(min=32, max=32)), } -DEVICE_CONFIG = vol.Schema({vol.Required(CONF_HOST): str}).extend(DEVICE_SETTINGS) -DEVICE_MODEL_CONFIG = vol.Schema({vol.Required(CONF_MODEL): vol.In(MODELS_ALL)}) -DEVICE_CLOUD_CONFIG = vol.Schema( +DEVICE_CONFIG = probatio.Schema({probatio.Required(CONF_HOST): str}).extend( + DEVICE_SETTINGS +) +DEVICE_MODEL_CONFIG = probatio.Schema( + {probatio.Required(CONF_MODEL): probatio.In(MODELS_ALL)} +) +DEVICE_CLOUD_CONFIG = probatio.Schema( { - vol.Optional(CONF_CLOUD_USERNAME): str, - vol.Optional(CONF_CLOUD_PASSWORD): str, - vol.Optional(CONF_CLOUD_COUNTRY, default=DEFAULT_CLOUD_COUNTRY): vol.In( - SERVER_COUNTRY_CODES - ), - vol.Optional(CONF_MANUAL, default=False): bool, + probatio.Optional(CONF_CLOUD_USERNAME): str, + probatio.Optional(CONF_CLOUD_PASSWORD): str, + probatio.Optional( + CONF_CLOUD_COUNTRY, default=DEFAULT_CLOUD_COUNTRY + ): probatio.In(SERVER_COUNTRY_CODES), + probatio.Optional(CONF_MANUAL, default=False): bool, } ) @@ -85,9 +89,9 @@ async def async_step_init( if not errors: return self.async_create_entry(title="", data=user_input) - settings_schema = vol.Schema( + settings_schema = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_CLOUD_SUBDEVICES, default=self.config_entry.options.get(CONF_CLOUD_SUBDEVICES, False), ): bool @@ -314,8 +318,8 @@ async def async_step_select( self.extract_cloud_info(cloud_device) return await self.async_step_connect() - select_schema = vol.Schema( - {vol.Required("select_device"): vol.In(list(self.cloud_devices))} + select_schema = probatio.Schema( + {probatio.Required("select_device"): probatio.In(list(self.cloud_devices))} ) return self.async_show_form( @@ -335,7 +339,7 @@ async def async_step_manual( return await self.async_step_connect() if self.host: - schema = vol.Schema(DEVICE_SETTINGS) + schema = probatio.Schema(DEVICE_SETTINGS) else: schema = DEVICE_CONFIG diff --git a/homeassistant/components/xiaomi_miio/device_tracker.py b/homeassistant/components/xiaomi_miio/device_tracker.py index aed465717fb5d..0cf1fa711c11b 100644 --- a/homeassistant/components/xiaomi_miio/device_tracker.py +++ b/homeassistant/components/xiaomi_miio/device_tracker.py @@ -4,7 +4,7 @@ from typing import override from miio import DeviceException, WifiRepeater -import voluptuous as vol +import probatio from homeassistant.components.device_tracker import ( DOMAIN as DEVICE_TRACKER_DOMAIN, @@ -20,8 +20,10 @@ PLATFORM_SCHEMA = DEVICE_TRACKER_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_TOKEN): vol.All(cv.string, vol.Length(min=32, max=32)), + probatio.Required(CONF_HOST): cv.string, + probatio.Required(CONF_TOKEN): probatio.All( + cv.string, probatio.Length(min=32, max=32) + ), } ) diff --git a/homeassistant/components/xiaomi_miio/remote.py b/homeassistant/components/xiaomi_miio/remote.py index ac01b2fb8e913..e8c562878da9e 100644 --- a/homeassistant/components/xiaomi_miio/remote.py +++ b/homeassistant/components/xiaomi_miio/remote.py @@ -7,7 +7,7 @@ from typing import Any, override from miio import ChuangmiIr, DeviceException -import voluptuous as vol +import probatio from homeassistant.components import persistent_notification from homeassistant.components.remote import ( @@ -43,24 +43,26 @@ DEFAULT_TIMEOUT = 10 DEFAULT_SLOT = 1 -COMMAND_SCHEMA = vol.Schema( - {vol.Required(CONF_COMMAND): vol.All(cv.ensure_list, [cv.string])} +COMMAND_SCHEMA = probatio.Schema( + {probatio.Required(CONF_COMMAND): probatio.All(cv.ensure_list, [cv.string])} ) PLATFORM_SCHEMA = REMOTE_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_NAME): cv.string, - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, - vol.Optional(CONF_SLOT, default=DEFAULT_SLOT): vol.All( - int, vol.Range(min=1, max=1000000) + probatio.Optional(CONF_NAME): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, + probatio.Optional(CONF_SLOT, default=DEFAULT_SLOT): probatio.All( + int, probatio.Range(min=1, max=1000000) ), - vol.Required(CONF_TOKEN): vol.All(str, vol.Length(min=32, max=32)), - vol.Optional(CONF_COMMANDS, default={}): cv.schema_with_slug_keys( + probatio.Required(CONF_TOKEN): probatio.All( + str, probatio.Length(min=32, max=32) + ), + probatio.Optional(CONF_COMMANDS, default={}): cv.schema_with_slug_keys( COMMAND_SCHEMA ), }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) @@ -159,9 +161,9 @@ async def async_service_learn_handler(entity, service): platform.async_register_entity_service( SERVICE_LEARN, { - vol.Optional(CONF_TIMEOUT, default=10): cv.positive_int, - vol.Optional(CONF_SLOT, default=1): vol.All( - int, vol.Range(min=1, max=1000000) + probatio.Optional(CONF_TIMEOUT, default=10): cv.positive_int, + probatio.Optional(CONF_SLOT, default=1): probatio.All( + int, probatio.Range(min=1, max=1000000) ), }, async_service_learn_handler, diff --git a/homeassistant/components/xiaomi_miio/services.py b/homeassistant/components/xiaomi_miio/services.py index 7ae0140202e85..d22d20ba97baf 100644 --- a/homeassistant/components/xiaomi_miio/services.py +++ b/homeassistant/components/xiaomi_miio/services.py @@ -3,7 +3,7 @@ import asyncio import logging -import voluptuous as vol +import probatio from homeassistant.components.vacuum import DOMAIN as VACUUM_DOMAIN from homeassistant.const import ATTR_ENTITY_ID, ATTR_MODE @@ -52,12 +52,18 @@ # Light Services ATTR_TIME_PERIOD = "time_period" -XIAOMI_MIIO_SERVICE_SCHEMA = vol.Schema({vol.Optional(ATTR_ENTITY_ID): cv.entity_ids}) +XIAOMI_MIIO_SERVICE_SCHEMA = probatio.Schema( + {probatio.Optional(ATTR_ENTITY_ID): cv.entity_ids} +) SERVICE_SCHEMA_SET_SCENE = XIAOMI_MIIO_SERVICE_SCHEMA.extend( - {vol.Required(ATTR_SCENE): vol.All(vol.Coerce(int), vol.Clamp(min=1, max=6))} + { + probatio.Required(ATTR_SCENE): probatio.All( + probatio.Coerce(int), probatio.Clamp(min=1, max=6) + ) + } ) SERVICE_SCHEMA_SET_DELAYED_TURN_OFF = XIAOMI_MIIO_SERVICE_SCHEMA.extend( - {vol.Required(ATTR_TIME_PERIOD): cv.positive_time_period} + {probatio.Required(ATTR_TIME_PERIOD): cv.positive_time_period} ) LIGHT_SERVICE_TO_METHOD = { SERVICE_SET_DELAYED_TURN_OFF: ServiceMethodDetails( @@ -82,12 +88,14 @@ # Switch Services ATTR_PRICE = "price" -SWITCH_SERVICE_SCHEMA = vol.Schema({vol.Optional(ATTR_ENTITY_ID): cv.entity_ids}) +SWITCH_SERVICE_SCHEMA = probatio.Schema( + {probatio.Optional(ATTR_ENTITY_ID): cv.entity_ids} +) SWITCH_SERVICE_SCHEMA_POWER_MODE = SWITCH_SERVICE_SCHEMA.extend( - {vol.Required(ATTR_MODE): vol.All(vol.In(["green", "normal"]))} + {probatio.Required(ATTR_MODE): probatio.All(probatio.In(["green", "normal"]))} ) SWITCH_SERVICE_SCHEMA_POWER_PRICE = SWITCH_SERVICE_SCHEMA.extend( - {vol.Required(ATTR_PRICE): cv.positive_float} + {probatio.Required(ATTR_PRICE): cv.positive_float} ) SWITCH_SERVICE_TO_METHOD = { SERVICE_SET_WIFI_LED_ON: ServiceMethodDetails(method="async_set_wifi_led_on"), @@ -104,9 +112,9 @@ # Fan Services ATTR_FEATURES = "features" -FAN_SERVICE_SCHEMA = vol.Schema({vol.Optional(ATTR_ENTITY_ID): cv.entity_ids}) +FAN_SERVICE_SCHEMA = probatio.Schema({probatio.Optional(ATTR_ENTITY_ID): cv.entity_ids}) FAN_SERVICE_SCHEMA_EXTRA_FEATURES = FAN_SERVICE_SCHEMA.extend( - {vol.Required(ATTR_FEATURES): cv.positive_int} + {probatio.Required(ATTR_FEATURES): cv.positive_int} ) FAN_SERVICE_TO_METHOD = { SERVICE_RESET_FILTER: ServiceMethodDetails(method="async_reset_filter"), @@ -150,13 +158,13 @@ def async_setup_services(hass: HomeAssistant) -> None: SERVICE_MOVE_REMOTE_CONTROL, entity_domain=VACUUM_DOMAIN, schema={ - vol.Optional(ATTR_RC_VELOCITY): vol.All( - vol.Coerce(float), vol.Clamp(min=-0.29, max=0.29) + probatio.Optional(ATTR_RC_VELOCITY): probatio.All( + probatio.Coerce(float), probatio.Clamp(min=-0.29, max=0.29) ), - vol.Optional(ATTR_RC_ROTATION): vol.All( - vol.Coerce(int), vol.Clamp(min=-179, max=179) + probatio.Optional(ATTR_RC_ROTATION): probatio.All( + probatio.Coerce(int), probatio.Clamp(min=-179, max=179) ), - vol.Optional(ATTR_RC_DURATION): cv.positive_int, + probatio.Optional(ATTR_RC_DURATION): cv.positive_int, }, func="async_remote_control_move", ) @@ -167,13 +175,13 @@ def async_setup_services(hass: HomeAssistant) -> None: SERVICE_MOVE_REMOTE_CONTROL_STEP, entity_domain=VACUUM_DOMAIN, schema={ - vol.Optional(ATTR_RC_VELOCITY): vol.All( - vol.Coerce(float), vol.Clamp(min=-0.29, max=0.29) + probatio.Optional(ATTR_RC_VELOCITY): probatio.All( + probatio.Coerce(float), probatio.Clamp(min=-0.29, max=0.29) ), - vol.Optional(ATTR_RC_ROTATION): vol.All( - vol.Coerce(int), vol.Clamp(min=-179, max=179) + probatio.Optional(ATTR_RC_ROTATION): probatio.All( + probatio.Coerce(int), probatio.Clamp(min=-179, max=179) ), - vol.Optional(ATTR_RC_DURATION): cv.positive_int, + probatio.Optional(ATTR_RC_DURATION): cv.positive_int, }, func="async_remote_control_move_step", ) @@ -184,21 +192,21 @@ def async_setup_services(hass: HomeAssistant) -> None: SERVICE_CLEAN_ZONE, entity_domain=VACUUM_DOMAIN, schema={ - vol.Required(ATTR_ZONE_ARRAY): vol.All( + probatio.Required(ATTR_ZONE_ARRAY): probatio.All( list, [ - vol.ExactSequence( + probatio.ExactSequence( [ - vol.Coerce(int), - vol.Coerce(int), - vol.Coerce(int), - vol.Coerce(int), + probatio.Coerce(int), + probatio.Coerce(int), + probatio.Coerce(int), + probatio.Coerce(int), ] ) ], ), - vol.Required(ATTR_ZONE_REPEATER): vol.All( - vol.Coerce(int), vol.Clamp(min=1, max=3) + probatio.Required(ATTR_ZONE_REPEATER): probatio.All( + probatio.Coerce(int), probatio.Clamp(min=1, max=3) ), }, func="async_clean_zone", @@ -210,8 +218,8 @@ def async_setup_services(hass: HomeAssistant) -> None: SERVICE_GOTO, entity_domain=VACUUM_DOMAIN, schema={ - vol.Required("x_coord"): vol.Coerce(int), - vol.Required("y_coord"): vol.Coerce(int), + probatio.Required("x_coord"): probatio.Coerce(int), + probatio.Required("y_coord"): probatio.Coerce(int), }, func="async_goto", ) @@ -220,7 +228,11 @@ def async_setup_services(hass: HomeAssistant) -> None: DOMAIN, SERVICE_CLEAN_SEGMENT, entity_domain=VACUUM_DOMAIN, - schema={vol.Required("segments"): vol.Any(vol.Coerce(int), [vol.Coerce(int)])}, + schema={ + probatio.Required("segments"): probatio.Any( + probatio.Coerce(int), [probatio.Coerce(int)] + ) + }, func="async_clean_segment", ) diff --git a/homeassistant/components/xiaomi_miio/typing.py b/homeassistant/components/xiaomi_miio/typing.py index 79c69b1b56514..45300bf82f47c 100644 --- a/homeassistant/components/xiaomi_miio/typing.py +++ b/homeassistant/components/xiaomi_miio/typing.py @@ -5,7 +5,7 @@ from miio import Device as MiioDevice from miio.gateway.gateway import Gateway -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigEntry from homeassistant.helpers.update_coordinator import DataUpdateCoordinator @@ -18,7 +18,7 @@ class ServiceMethodDetails(NamedTuple): """Details for SERVICE_TO_METHOD mapping.""" method: str - schema: vol.Schema | None = None + schema: probatio.Schema | None = None @dataclass diff --git a/homeassistant/components/xiaomi_tv/media_player.py b/homeassistant/components/xiaomi_tv/media_player.py index 8c24538553ff7..6c62de3872958 100644 --- a/homeassistant/components/xiaomi_tv/media_player.py +++ b/homeassistant/components/xiaomi_tv/media_player.py @@ -3,8 +3,8 @@ import logging from typing import override +import probatio import pymitv -import voluptuous as vol from homeassistant.components.media_player import ( PLATFORM_SCHEMA as MEDIA_PLAYER_PLATFORM_SCHEMA, @@ -25,8 +25,8 @@ # No host is needed for configuration, however it can be set. PLATFORM_SCHEMA = MEDIA_PLAYER_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_HOST): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_HOST): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/xmpp/notify.py b/homeassistant/components/xmpp/notify.py index bda93b9df26e8..8b9a297123ff5 100644 --- a/homeassistant/components/xmpp/notify.py +++ b/homeassistant/components/xmpp/notify.py @@ -9,6 +9,7 @@ import string from typing import Any, override +import probatio import requests import slixmpp from slixmpp.exceptions import IqError, IqTimeout, XMPPError @@ -18,7 +19,6 @@ UploadServiceNotFound, ) from slixmpp.xmlstream.xmlstream import NotConnectedError -import voluptuous as vol from homeassistant.components.notify import ( ATTR_DATA, @@ -57,13 +57,13 @@ PLATFORM_SCHEMA = NOTIFY_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_SENDER): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Required(CONF_RECIPIENT): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(CONF_RESOURCE, default=DEFAULT_RESOURCE): cv.string, - vol.Optional(CONF_ROOM, default=""): cv.string, - vol.Optional(CONF_TLS, default=True): cv.boolean, - vol.Optional(CONF_VERIFY, default=True): cv.boolean, + probatio.Required(CONF_SENDER): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_RECIPIENT): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(CONF_RESOURCE, default=DEFAULT_RESOURCE): cv.string, + probatio.Optional(CONF_ROOM, default=""): cv.string, + probatio.Optional(CONF_TLS, default=True): cv.boolean, + probatio.Optional(CONF_VERIFY, default=True): cv.boolean, } ) diff --git a/homeassistant/components/xs1/__init__.py b/homeassistant/components/xs1/__init__.py index 15fb9d021c648..c740724a3b10c 100644 --- a/homeassistant/components/xs1/__init__.py +++ b/homeassistant/components/xs1/__init__.py @@ -2,7 +2,7 @@ import logging -import voluptuous as vol +import probatio import xs1_api_client from homeassistant.const import ( @@ -24,19 +24,19 @@ SENSORS = "sensors" # define configuration parameters -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_PASSWORD): cv.string, - vol.Optional(CONF_PORT, default=80): cv.string, - vol.Optional(CONF_SSL, default=False): cv.boolean, - vol.Optional(CONF_USERNAME): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_PORT, default=80): cv.string, + probatio.Optional(CONF_SSL, default=False): cv.boolean, + probatio.Optional(CONF_USERNAME): cv.string, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) PLATFORMS = [Platform.CLIMATE, Platform.SENSOR, Platform.SWITCH] diff --git a/homeassistant/components/xthings_cloud/config_flow.py b/homeassistant/components/xthings_cloud/config_flow.py index 8d79615198206..b930c4d741996 100644 --- a/homeassistant/components/xthings_cloud/config_flow.py +++ b/homeassistant/components/xthings_cloud/config_flow.py @@ -7,7 +7,7 @@ XthingsCloudApiError, XthingsCloudAuthError, ) -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_EMAIL, CONF_PASSWORD, CONF_TOKEN @@ -83,10 +83,10 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_EMAIL): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_EMAIL): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, diff --git a/homeassistant/components/yale_smart_alarm/config_flow.py b/homeassistant/components/yale_smart_alarm/config_flow.py index ffcbec3d18519..e6bc4a6c8c442 100644 --- a/homeassistant/components/yale_smart_alarm/config_flow.py +++ b/homeassistant/components/yale_smart_alarm/config_flow.py @@ -3,7 +3,7 @@ from collections.abc import Mapping from typing import Any, override -import voluptuous as vol +import probatio from yalesmartalarmclient.client import YaleSmartAlarmClient from yalesmartalarmclient.exceptions import AuthenticationError @@ -25,23 +25,23 @@ YALE_BASE_ERRORS, ) -DATA_SCHEMA = vol.Schema( +DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Required(CONF_AREA_ID, default=DEFAULT_AREA_ID): cv.string, + probatio.Required(CONF_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_AREA_ID, default=DEFAULT_AREA_ID): cv.string, } ) -DATA_SCHEMA_AUTH = vol.Schema( +DATA_SCHEMA_AUTH = probatio.Schema( { - vol.Required(CONF_PASSWORD): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, } ) -OPTIONS_SCHEMA = vol.Schema( +OPTIONS_SCHEMA = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_LOCK_CODE_DIGITS, ): int, } diff --git a/homeassistant/components/yalexs_ble/config_flow.py b/homeassistant/components/yalexs_ble/config_flow.py index d2f08a8ca3925..1f1c069b53e7a 100644 --- a/homeassistant/components/yalexs_ble/config_flow.py +++ b/homeassistant/components/yalexs_ble/config_flow.py @@ -5,7 +5,7 @@ from typing import Any, Self, override from bleak_retry_connector import BleakError, BLEDevice -import voluptuous as vol +import probatio from yalexs_ble import ( AuthError, DisconnectedError, @@ -228,8 +228,8 @@ async def async_step_reauth_validate( return self.async_show_form( step_id="reauth_validate", - data_schema=vol.Schema( - {vol.Required(CONF_KEY): str, vol.Required(CONF_SLOT): int} + data_schema=probatio.Schema( + {probatio.Required(CONF_KEY): str, probatio.Required(CONF_SLOT): int} ), description_placeholders={ "address": reauth_entry.data[CONF_ADDRESS], @@ -278,10 +278,10 @@ async def async_step_key_slot( return self.async_show_form( step_id="key_slot", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_KEY): str, - vol.Required(CONF_SLOT): int, + probatio.Required(CONF_KEY): str, + probatio.Required(CONF_SLOT): int, } ), errors=errors, @@ -323,9 +323,9 @@ async def async_step_user( if not self._discovered_devices: return self.async_abort(reason="no_devices_found") - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Required(CONF_ADDRESS): vol.In( + probatio.Required(CONF_ADDRESS): probatio.In( { service_info.address: self._async_get_name_from_address( service_info.address @@ -383,9 +383,9 @@ async def async_step_device_options( return self.async_show_form( step_id="device_options", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_ALWAYS_CONNECTED, default=self.config_entry.options.get( CONF_ALWAYS_CONNECTED, False diff --git a/homeassistant/components/yamaha/media_player.py b/homeassistant/components/yamaha/media_player.py index 2bcbf732fc450..10d023e4c7e4f 100644 --- a/homeassistant/components/yamaha/media_player.py +++ b/homeassistant/components/yamaha/media_player.py @@ -3,10 +3,10 @@ import logging from typing import Any, override +import probatio import requests import rxv from rxv import RXV -import voluptuous as vol from homeassistant.components.media_player import ( PLATFORM_SCHEMA as MEDIA_PLAYER_PLATFORM_SCHEMA, @@ -72,16 +72,16 @@ PLATFORM_SCHEMA = MEDIA_PLAYER_PLATFORM_SCHEMA.extend( { - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_HOST): cv.string, - vol.Optional(CONF_SOURCE_IGNORE, default=[]): vol.All( + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_HOST): cv.string, + probatio.Optional(CONF_SOURCE_IGNORE, default=[]): probatio.All( cv.ensure_list, [cv.string] ), - vol.Optional(CONF_ZONE_IGNORE, default=[]): vol.All( + probatio.Optional(CONF_ZONE_IGNORE, default=[]): probatio.All( cv.ensure_list, [cv.string] ), - vol.Optional(CONF_SOURCE_NAMES, default={}): {cv.string: cv.string}, - vol.Optional(CONF_ZONE_NAMES, default={}): {cv.string: cv.string}, + probatio.Optional(CONF_SOURCE_NAMES, default={}): {cv.string: cv.string}, + probatio.Optional(CONF_ZONE_NAMES, default={}): {cv.string: cv.string}, } ) @@ -186,19 +186,22 @@ async def async_setup_platform( platform = entity_platform.async_get_current_platform() platform.async_register_entity_service( SERVICE_SELECT_SCENE, - {vol.Required(ATTR_SCENE): cv.string}, + {probatio.Required(ATTR_SCENE): cv.string}, "set_scene", ) # Register Service 'enable_output' platform.async_register_entity_service( SERVICE_ENABLE_OUTPUT, - {vol.Required(ATTR_ENABLED): cv.boolean, vol.Required(ATTR_PORT): cv.string}, + { + probatio.Required(ATTR_ENABLED): cv.boolean, + probatio.Required(ATTR_PORT): cv.string, + }, "enable_output", ) # Register Service 'menu_cursor' platform.async_register_entity_service( SERVICE_MENU_CURSOR, - {vol.Required(ATTR_CURSOR): vol.In(CURSOR_TYPE_MAP)}, + {probatio.Required(ATTR_CURSOR): probatio.In(CURSOR_TYPE_MAP)}, YamahaDeviceZone.menu_cursor.__name__, ) diff --git a/homeassistant/components/yamaha_musiccast/config_flow.py b/homeassistant/components/yamaha_musiccast/config_flow.py index 1630a8e8f4826..fefeea019ee48 100644 --- a/homeassistant/components/yamaha_musiccast/config_flow.py +++ b/homeassistant/components/yamaha_musiccast/config_flow.py @@ -6,7 +6,7 @@ from aiohttp import ClientConnectorError, DummyCookieJar from aiomusiccast import MusicCastConnectionException, MusicCastDevice -import voluptuous as vol +import probatio from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_HOST @@ -79,7 +79,7 @@ def _show_setup_form(self, errors: dict | None = None) -> ConfigFlowResult: """Show the setup form to the user.""" return self.async_show_form( step_id="user", - data_schema=vol.Schema({vol.Required(CONF_HOST): str}), + data_schema=probatio.Schema({probatio.Required(CONF_HOST): str}), errors=errors or {}, ) diff --git a/homeassistant/components/yandex_transport/sensor.py b/homeassistant/components/yandex_transport/sensor.py index 269b81b55dc41..42d778aad37af 100644 --- a/homeassistant/components/yandex_transport/sensor.py +++ b/homeassistant/components/yandex_transport/sensor.py @@ -5,7 +5,7 @@ from typing import Any from aioymaps import CaptchaError, NoSessionError, YandexMapsRequester -import voluptuous as vol +import probatio from homeassistant.components.sensor import ( PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, @@ -35,9 +35,11 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_STOP_ID): cv.string, - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_ROUTE, default=[]): vol.All(cv.ensure_list, [cv.string]), + probatio.Required(CONF_STOP_ID): cv.string, + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_ROUTE, default=[]): probatio.All( + cv.ensure_list, [cv.string] + ), } ) diff --git a/homeassistant/components/yandextts/tts.py b/homeassistant/components/yandextts/tts.py index f5e86f4518841..92d6c4d6b25d2 100644 --- a/homeassistant/components/yandextts/tts.py +++ b/homeassistant/components/yandextts/tts.py @@ -6,7 +6,7 @@ from typing import TYPE_CHECKING, Any, override import aiohttp -import voluptuous as vol +import probatio from homeassistant.components.tts import ( CONF_LANG, @@ -72,12 +72,20 @@ PLATFORM_SCHEMA = TTS_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_API_KEY): cv.string, - vol.Optional(CONF_LANG, default=DEFAULT_LANG): vol.In(SUPPORT_LANGUAGES), - vol.Optional(CONF_CODEC, default=DEFAULT_CODEC): vol.In(SUPPORT_CODECS), - vol.Optional(CONF_VOICE, default=DEFAULT_VOICE): vol.In(SUPPORT_VOICES), - vol.Optional(CONF_EMOTION, default=DEFAULT_EMOTION): vol.In(SUPPORTED_EMOTION), - vol.Optional(CONF_SPEED, default=DEFAULT_SPEED): vol.Range( + probatio.Required(CONF_API_KEY): cv.string, + probatio.Optional(CONF_LANG, default=DEFAULT_LANG): probatio.In( + SUPPORT_LANGUAGES + ), + probatio.Optional(CONF_CODEC, default=DEFAULT_CODEC): probatio.In( + SUPPORT_CODECS + ), + probatio.Optional(CONF_VOICE, default=DEFAULT_VOICE): probatio.In( + SUPPORT_VOICES + ), + probatio.Optional(CONF_EMOTION, default=DEFAULT_EMOTION): probatio.In( + SUPPORTED_EMOTION + ), + probatio.Optional(CONF_SPEED, default=DEFAULT_SPEED): probatio.Range( min=MIN_SPEED, max=MAX_SPEED ), } diff --git a/homeassistant/components/yardian/config_flow.py b/homeassistant/components/yardian/config_flow.py index 780bda5331cbe..7c9a9217a768d 100644 --- a/homeassistant/components/yardian/config_flow.py +++ b/homeassistant/components/yardian/config_flow.py @@ -3,13 +3,13 @@ import logging from typing import Any, override +import probatio from pyyardian import ( AsyncYardianClient, DeviceInfo, NetworkException, NotAuthorizedException, ) -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_ACCESS_TOKEN, CONF_HOST @@ -19,10 +19,10 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_ACCESS_TOKEN): str, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_ACCESS_TOKEN): str, } ) diff --git a/homeassistant/components/yardian/switch.py b/homeassistant/components/yardian/switch.py index 3f65146f34cf1..540497431b6c4 100644 --- a/homeassistant/components/yardian/switch.py +++ b/homeassistant/components/yardian/switch.py @@ -3,7 +3,7 @@ import asyncio from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.switch import SwitchEntity from homeassistant.core import HomeAssistant @@ -21,7 +21,7 @@ SERVICE_START_IRRIGATION = "start_irrigation" SERVICE_SCHEMA_START_IRRIGATION: VolDictType = { - vol.Required("duration"): cv.positive_int, + probatio.Required("duration"): cv.positive_int, } diff --git a/homeassistant/components/yeelight/__init__.py b/homeassistant/components/yeelight/__init__.py index fa1edc29826e2..27362d86b7b04 100644 --- a/homeassistant/components/yeelight/__init__.py +++ b/homeassistant/components/yeelight/__init__.py @@ -2,7 +2,7 @@ import logging -import voluptuous as vol +import probatio from yeelight import BulbException from yeelight.aio import AsyncBulb @@ -58,56 +58,58 @@ YEELIGHT_FLOW_TRANSITION_SCHEMA: VolDictType = { - vol.Optional(ATTR_COUNT, default=0): cv.positive_int, - vol.Optional(ATTR_ACTION, default=ACTION_RECOVER): vol.Any( + probatio.Optional(ATTR_COUNT, default=0): cv.positive_int, + probatio.Optional(ATTR_ACTION, default=ACTION_RECOVER): probatio.Any( ACTION_RECOVER, ACTION_OFF, ACTION_STAY ), - vol.Required(ATTR_TRANSITIONS): [ + probatio.Required(ATTR_TRANSITIONS): [ { - vol.Exclusive(YEELIGHT_RGB_TRANSITION, CONF_TRANSITION): vol.All( + probatio.Exclusive(YEELIGHT_RGB_TRANSITION, CONF_TRANSITION): probatio.All( cv.ensure_list, [cv.positive_int] ), - vol.Exclusive(YEELIGHT_HSV_TRANSACTION, CONF_TRANSITION): vol.All( - cv.ensure_list, [cv.positive_int] - ), - vol.Exclusive(YEELIGHT_TEMPERATURE_TRANSACTION, CONF_TRANSITION): vol.All( - cv.ensure_list, [cv.positive_int] - ), - vol.Exclusive(YEELIGHT_SLEEP_TRANSACTION, CONF_TRANSITION): vol.All( + probatio.Exclusive(YEELIGHT_HSV_TRANSACTION, CONF_TRANSITION): probatio.All( cv.ensure_list, [cv.positive_int] ), + probatio.Exclusive( + YEELIGHT_TEMPERATURE_TRANSACTION, CONF_TRANSITION + ): probatio.All(cv.ensure_list, [cv.positive_int]), + probatio.Exclusive( + YEELIGHT_SLEEP_TRANSACTION, CONF_TRANSITION + ): probatio.All(cv.ensure_list, [cv.positive_int]), } ], } -DEVICE_SCHEMA = vol.Schema( +DEVICE_SCHEMA = probatio.Schema( { - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_TRANSITION, default=DEFAULT_TRANSITION): cv.positive_int, - vol.Optional(CONF_MODE_MUSIC, default=False): cv.boolean, - vol.Optional(CONF_SAVE_ON_CHANGE, default=False): cv.boolean, - vol.Optional(CONF_NIGHTLIGHT_SWITCH_TYPE): vol.Any( + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Optional(CONF_TRANSITION, default=DEFAULT_TRANSITION): cv.positive_int, + probatio.Optional(CONF_MODE_MUSIC, default=False): cv.boolean, + probatio.Optional(CONF_SAVE_ON_CHANGE, default=False): cv.boolean, + probatio.Optional(CONF_NIGHTLIGHT_SWITCH_TYPE): probatio.Any( NIGHTLIGHT_SWITCH_TYPE_LIGHT ), - vol.Optional(CONF_MODEL): cv.string, + probatio.Optional(CONF_MODEL): cv.string, } ) -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( + DOMAIN: probatio.Schema( { - vol.Optional(CONF_DEVICES, default={}): {cv.string: DEVICE_SCHEMA}, - vol.Optional(CONF_CUSTOM_EFFECTS): [ + probatio.Optional(CONF_DEVICES, default={}): {cv.string: DEVICE_SCHEMA}, + probatio.Optional(CONF_CUSTOM_EFFECTS): [ { - vol.Required(CONF_NAME): cv.string, - vol.Required(CONF_FLOW_PARAMS): YEELIGHT_FLOW_TRANSITION_SCHEMA, + probatio.Required(CONF_NAME): cv.string, + probatio.Required( + CONF_FLOW_PARAMS + ): YEELIGHT_FLOW_TRANSITION_SCHEMA, } ], } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/yeelight/config_flow.py b/homeassistant/components/yeelight/config_flow.py index ac526265b528c..489edc81f39f4 100644 --- a/homeassistant/components/yeelight/config_flow.py +++ b/homeassistant/components/yeelight/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, Self, override from urllib.parse import urlparse -import voluptuous as vol +import probatio import yeelight from yeelight.aio import AsyncBulb from yeelight.main import get_known_models @@ -205,8 +205,12 @@ async def async_step_user( user_input = user_input or {} return self.async_show_form( step_id="user", - data_schema=vol.Schema( - {vol.Optional(CONF_HOST, default=user_input.get(CONF_HOST, "")): str} + data_schema=probatio.Schema( + { + probatio.Optional( + CONF_HOST, default=user_input.get(CONF_HOST, "") + ): str + } ), errors=errors, ) @@ -255,7 +259,9 @@ async def async_step_pick_device( return self.async_abort(reason="no_devices_found") return self.async_show_form( step_id="pick_device", - data_schema=vol.Schema({vol.Required(CONF_DEVICE): vol.In(devices_name)}), + data_schema=probatio.Schema( + {probatio.Required(CONF_DEVICE): probatio.In(devices_name)} + ), ) async def async_step_import(self, import_data: dict[str, Any]) -> ConfigFlowResult: @@ -328,19 +334,23 @@ async def async_step_init( if is_unknown_model or model != detected_model: schema_dict.update( { - vol.Optional(CONF_MODEL, default=model): vol.In(known_models), + probatio.Optional(CONF_MODEL, default=model): probatio.In( + known_models + ), } ) schema_dict.update( { - vol.Required( + probatio.Required( CONF_TRANSITION, default=options[CONF_TRANSITION] ): cv.positive_int, - vol.Required(CONF_MODE_MUSIC, default=options[CONF_MODE_MUSIC]): bool, - vol.Required( + probatio.Required( + CONF_MODE_MUSIC, default=options[CONF_MODE_MUSIC] + ): bool, + probatio.Required( CONF_SAVE_ON_CHANGE, default=options[CONF_SAVE_ON_CHANGE] ): bool, - vol.Required( + probatio.Required( CONF_NIGHTLIGHT_SWITCH, default=options[CONF_NIGHTLIGHT_SWITCH] ): bool, } @@ -348,7 +358,7 @@ async def async_step_init( return self.async_show_form( step_id="init", - data_schema=vol.Schema(schema_dict), + data_schema=probatio.Schema(schema_dict), ) diff --git a/homeassistant/components/yeelight/light.py b/homeassistant/components/yeelight/light.py index 2fb54accdc95d..5bf123414b789 100644 --- a/homeassistant/components/yeelight/light.py +++ b/homeassistant/components/yeelight/light.py @@ -5,7 +5,7 @@ import math from typing import Any, Concatenate, override -import voluptuous as vol +import probatio import yeelight from yeelight import Flow, RGBTransition, SleepTransition, flows from yeelight.aio import AsyncBulb @@ -162,46 +162,52 @@ EFFECT_TEA_TIME: flows.tea_time, } -VALID_BRIGHTNESS = vol.All(vol.Coerce(int), vol.Range(min=1, max=100)) +VALID_BRIGHTNESS = probatio.All(probatio.Coerce(int), probatio.Range(min=1, max=100)) SERVICE_SCHEMA_SET_MODE: VolDictType = { - vol.Required(ATTR_MODE): vol.In([mode.name.lower() for mode in PowerMode]) + probatio.Required(ATTR_MODE): probatio.In([mode.name.lower() for mode in PowerMode]) } -SERVICE_SCHEMA_SET_MUSIC_MODE: VolDictType = {vol.Required(ATTR_MODE_MUSIC): cv.boolean} +SERVICE_SCHEMA_SET_MUSIC_MODE: VolDictType = { + probatio.Required(ATTR_MODE_MUSIC): cv.boolean +} SERVICE_SCHEMA_START_FLOW = YEELIGHT_FLOW_TRANSITION_SCHEMA SERVICE_SCHEMA_SET_COLOR_SCENE: VolDictType = { - vol.Required(ATTR_RGB_COLOR): vol.All( - vol.Coerce(tuple), vol.ExactSequence((cv.byte, cv.byte, cv.byte)) + probatio.Required(ATTR_RGB_COLOR): probatio.All( + probatio.Coerce(tuple), probatio.ExactSequence((cv.byte, cv.byte, cv.byte)) ), - vol.Required(ATTR_BRIGHTNESS): VALID_BRIGHTNESS, + probatio.Required(ATTR_BRIGHTNESS): VALID_BRIGHTNESS, } SERVICE_SCHEMA_SET_HSV_SCENE: VolDictType = { - vol.Required(ATTR_HS_COLOR): vol.All( - vol.Coerce(tuple), - vol.ExactSequence( + probatio.Required(ATTR_HS_COLOR): probatio.All( + probatio.Coerce(tuple), + probatio.ExactSequence( ( - vol.All(vol.Coerce(float), vol.Range(min=0, max=359)), - vol.All(vol.Coerce(float), vol.Range(min=0, max=100)), + probatio.All(probatio.Coerce(float), probatio.Range(min=0, max=359)), + probatio.All(probatio.Coerce(float), probatio.Range(min=0, max=100)), ) ), ), - vol.Required(ATTR_BRIGHTNESS): VALID_BRIGHTNESS, + probatio.Required(ATTR_BRIGHTNESS): VALID_BRIGHTNESS, } SERVICE_SCHEMA_SET_COLOR_TEMP_SCENE: VolDictType = { - vol.Required(ATTR_KELVIN): vol.All(vol.Coerce(int), vol.Range(min=1700, max=6500)), - vol.Required(ATTR_BRIGHTNESS): VALID_BRIGHTNESS, + probatio.Required(ATTR_KELVIN): probatio.All( + probatio.Coerce(int), probatio.Range(min=1700, max=6500) + ), + probatio.Required(ATTR_BRIGHTNESS): VALID_BRIGHTNESS, } SERVICE_SCHEMA_SET_COLOR_FLOW_SCENE = YEELIGHT_FLOW_TRANSITION_SCHEMA SERVICE_SCHEMA_SET_AUTO_DELAY_OFF_SCENE: VolDictType = { - vol.Required(ATTR_MINUTES): vol.All(vol.Coerce(int), vol.Range(min=1, max=60)), - vol.Required(ATTR_BRIGHTNESS): VALID_BRIGHTNESS, + probatio.Required(ATTR_MINUTES): probatio.All( + probatio.Coerce(int), probatio.Range(min=1, max=60) + ), + probatio.Required(ATTR_BRIGHTNESS): VALID_BRIGHTNESS, } diff --git a/homeassistant/components/yeelightsunflower/light.py b/homeassistant/components/yeelightsunflower/light.py index 9ae044c6aa3c8..8af05dce7b5d4 100644 --- a/homeassistant/components/yeelightsunflower/light.py +++ b/homeassistant/components/yeelightsunflower/light.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio import yeelightsunflower from homeassistant.components.light import ( @@ -22,7 +22,9 @@ _LOGGER = logging.getLogger(__name__) -PLATFORM_SCHEMA = LIGHT_PLATFORM_SCHEMA.extend({vol.Required(CONF_HOST): cv.string}) +PLATFORM_SCHEMA = LIGHT_PLATFORM_SCHEMA.extend( + {probatio.Required(CONF_HOST): cv.string} +) def setup_platform( diff --git a/homeassistant/components/yi/camera.py b/homeassistant/components/yi/camera.py index 4c332a0658aba..c177cf2d3e09e 100644 --- a/homeassistant/components/yi/camera.py +++ b/homeassistant/components/yi/camera.py @@ -5,7 +5,7 @@ from aioftp import Client, StatusCodeError from haffmpeg.camera import CameraMjpeg -import voluptuous as vol +import probatio from homeassistant.components import ffmpeg from homeassistant.components.camera import ( @@ -41,13 +41,13 @@ PLATFORM_SCHEMA = CAMERA_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_NAME): cv.string, - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional(CONF_PATH, default=DEFAULT_PATH): cv.string, - vol.Optional(CONF_USERNAME, default=DEFAULT_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_FFMPEG_ARGUMENTS, default=DEFAULT_ARGUMENTS): cv.string, + probatio.Required(CONF_NAME): cv.string, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional(CONF_PATH, default=DEFAULT_PATH): cv.string, + probatio.Optional(CONF_USERNAME, default=DEFAULT_USERNAME): cv.string, + probatio.Required(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_FFMPEG_ARGUMENTS, default=DEFAULT_ARGUMENTS): cv.string, } ) diff --git a/homeassistant/components/yolink/device_trigger.py b/homeassistant/components/yolink/device_trigger.py index 41a8c68e3cb85..f3e565210e595 100644 --- a/homeassistant/components/yolink/device_trigger.py +++ b/homeassistant/components/yolink/device_trigger.py @@ -2,7 +2,7 @@ from typing import Any -import voluptuous as vol +import probatio from yolink.const import ATTR_DEVICE_SMART_REMOTER, ATTR_DEVICE_SWITCH from homeassistant.components.device_automation import DEVICE_TRIGGER_BASE_SCHEMA @@ -51,7 +51,7 @@ } TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( - {vol.Required(CONF_TYPE): vol.In(FLEX_BUTTONS_4)} + {probatio.Required(CONF_TYPE): probatio.In(FLEX_BUTTONS_4)} ) # YoLink Remotes YS3604/YS3614, Switch YS5708/YS5709 diff --git a/homeassistant/components/yolink/services.py b/homeassistant/components/yolink/services.py index 0f0d7b6037fbf..11e97cfb7b88f 100644 --- a/homeassistant/components/yolink/services.py +++ b/homeassistant/components/yolink/services.py @@ -1,6 +1,6 @@ """YoLink services.""" -import voluptuous as vol +import probatio from yolink.client_request import ClientRequest from homeassistant.config_entries import ConfigEntryState @@ -66,16 +66,16 @@ async def handle_speaker_hub_play_call(service_call: ServiceCall) -> None: hass.services.async_register( domain=DOMAIN, service=SERVICE_PLAY_ON_SPEAKER_HUB, - schema=vol.Schema( + schema=probatio.Schema( { - vol.Required(ATTR_TARGET_DEVICE): cv.string, - vol.Optional(ATTR_TONE): cv.string, - vol.Required(ATTR_TEXT_MESSAGE): cv.string, - vol.Optional(ATTR_VOLUME): vol.All( - vol.Coerce(int), vol.Range(min=0, max=15) + probatio.Required(ATTR_TARGET_DEVICE): cv.string, + probatio.Optional(ATTR_TONE): cv.string, + probatio.Required(ATTR_TEXT_MESSAGE): cv.string, + probatio.Optional(ATTR_VOLUME): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=15) ), - vol.Optional(ATTR_REPEAT, default=0): vol.All( - vol.Coerce(int), vol.Range(min=0, max=10) + probatio.Optional(ATTR_REPEAT, default=0): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=10) ), }, ), diff --git a/homeassistant/components/youless/config_flow.py b/homeassistant/components/youless/config_flow.py index 9880a55ea7681..24f56eae91272 100644 --- a/homeassistant/components/youless/config_flow.py +++ b/homeassistant/components/youless/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override from urllib.error import HTTPError, URLError -import voluptuous as vol +import probatio from youless_api import YoulessAPI from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -14,7 +14,7 @@ _LOGGER = logging.getLogger(__name__) -DATA_SCHEMA = vol.Schema({vol.Required(CONF_HOST): str}) +DATA_SCHEMA = probatio.Schema({probatio.Required(CONF_HOST): str}) class YoulessConfigFlow(ConfigFlow, domain=DOMAIN): diff --git a/homeassistant/components/youtube/config_flow.py b/homeassistant/components/youtube/config_flow.py index 12dfe5a8b31d4..f7bd39b449c6e 100644 --- a/homeassistant/components/youtube/config_flow.py +++ b/homeassistant/components/youtube/config_flow.py @@ -4,7 +4,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from youtubeaio.types import AuthScope, ForbiddenError from youtubeaio.youtube import YouTube @@ -176,9 +176,9 @@ async def async_step_channels( return self.async_abort(reason="no_subscriptions") return self.async_show_form( step_id="channels", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_CHANNELS): SelectSelector( + probatio.Required(CONF_CHANNELS): SelectSelector( SelectSelectorConfig(options=selectable_channels, multiple=True) ), } @@ -238,9 +238,9 @@ async def async_step_init( return self.async_show_form( step_id="init", data_schema=self.add_suggested_values_to_schema( - vol.Schema( + probatio.Schema( { - vol.Required(CONF_CHANNELS): SelectSelector( + probatio.Required(CONF_CHANNELS): SelectSelector( SelectSelectorConfig( options=selectable_channels, multiple=True ) diff --git a/homeassistant/components/zabbix/__init__.py b/homeassistant/components/zabbix/__init__.py index 6a4ab6cf558d2..a6cab4e4158df 100644 --- a/homeassistant/components/zabbix/__init__.py +++ b/homeassistant/components/zabbix/__init__.py @@ -12,7 +12,7 @@ from urllib.error import HTTPError from urllib.parse import urljoin -import voluptuous as vol +import probatio from zabbix_utils import ItemValue, Sender, ZabbixAPI from zabbix_utils.exceptions import APIRequestError, ProcessingError @@ -59,21 +59,23 @@ BATCH_TIMEOUT = 1 BATCH_BUFFER_SIZE = 100 -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { DOMAIN: INCLUDE_EXCLUDE_BASE_FILTER_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_PASSWORD): cv.string, - vol.Optional(CONF_PATH, default=DEFAULT_PATH): cv.string, - vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, - vol.Optional(CONF_USERNAME): cv.string, - vol.Optional(CONF_PUBLISH_STATES_HOST): cv.string, - vol.Optional(CONF_PUBLISH_STRING_STATES, default=False): cv.boolean, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_PATH, default=DEFAULT_PATH): cv.string, + probatio.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, + probatio.Optional(CONF_USERNAME): cv.string, + probatio.Optional(CONF_PUBLISH_STATES_HOST): cv.string, + probatio.Optional( + CONF_PUBLISH_STRING_STATES, default=False + ): cv.boolean, } ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/zabbix/sensor.py b/homeassistant/components/zabbix/sensor.py index 265ffd3d3dd5d..95234a469c59a 100644 --- a/homeassistant/components/zabbix/sensor.py +++ b/homeassistant/components/zabbix/sensor.py @@ -4,7 +4,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from zabbix_utils import ZabbixAPI from homeassistant.components.sensor import ( @@ -25,19 +25,19 @@ _CONF_HOSTIDS = "hostids" _CONF_INDIVIDUAL = "individual" -_ZABBIX_ID_LIST_SCHEMA = vol.Schema([int]) -_ZABBIX_TRIGGER_SCHEMA = vol.Schema( +_ZABBIX_ID_LIST_SCHEMA = probatio.Schema([int]) +_ZABBIX_TRIGGER_SCHEMA = probatio.Schema( { - vol.Optional(_CONF_HOSTIDS, default=[]): _ZABBIX_ID_LIST_SCHEMA, - vol.Optional(_CONF_INDIVIDUAL, default=False): cv.boolean, - vol.Optional(CONF_NAME): cv.string, + probatio.Optional(_CONF_HOSTIDS, default=[]): _ZABBIX_ID_LIST_SCHEMA, + probatio.Optional(_CONF_INDIVIDUAL, default=False): cv.boolean, + probatio.Optional(CONF_NAME): cv.string, } ) # SCAN_INTERVAL = 30 # PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( - {vol.Required(_CONF_TRIGGERS): vol.Any(_ZABBIX_TRIGGER_SCHEMA, None)} + {probatio.Required(_CONF_TRIGGERS): probatio.Any(_ZABBIX_TRIGGER_SCHEMA, None)} ) diff --git a/homeassistant/components/zamg/config_flow.py b/homeassistant/components/zamg/config_flow.py index 9c5832a399c08..37ec040ca7335 100644 --- a/homeassistant/components/zamg/config_flow.py +++ b/homeassistant/components/zamg/config_flow.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from zamg import ZamgData from zamg.exceptions import ZamgApiError, ZamgNoDataError @@ -41,9 +41,11 @@ async def async_step_user( LOGGER.debug("config_flow: closest station = %s", closest_station_id) user_input = {} - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required(CONF_STATION_ID, default=closest_station_id): vol.In( + probatio.Required( + CONF_STATION_ID, default=closest_station_id + ): probatio.In( { station: f"{stations[station][2]} ({station})" for station in stations diff --git a/homeassistant/components/zengge/light.py b/homeassistant/components/zengge/light.py index 987a69a31aa12..c81727e83ef98 100644 --- a/homeassistant/components/zengge/light.py +++ b/homeassistant/components/zengge/light.py @@ -1,6 +1,6 @@ """Support for Zengge lights.""" -import voluptuous as vol +import probatio from homeassistant.components.light import PLATFORM_SCHEMA as LIGHT_PLATFORM_SCHEMA from homeassistant.const import CONF_DEVICES, CONF_NAME @@ -9,11 +9,11 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType -DEVICE_SCHEMA = vol.Schema({vol.Optional(CONF_NAME): cv.string}) +DEVICE_SCHEMA = probatio.Schema({probatio.Optional(CONF_NAME): cv.string}) DOMAIN = "zengge" PLATFORM_SCHEMA = LIGHT_PLATFORM_SCHEMA.extend( - {vol.Optional(CONF_DEVICES, default={}): {cv.string: DEVICE_SCHEMA}} + {probatio.Optional(CONF_DEVICES, default={}): {cv.string: DEVICE_SCHEMA}} ) diff --git a/homeassistant/components/zeroconf/__init__.py b/homeassistant/components/zeroconf/__init__.py index 3ac49daad3dd7..6bdcf23695d97 100644 --- a/homeassistant/components/zeroconf/__init__.py +++ b/homeassistant/components/zeroconf/__init__.py @@ -6,7 +6,7 @@ import sys from typing import Any, cast -import voluptuous as vol +import probatio from zeroconf import InterfaceChoice, IPVersion from zeroconf.asyncio import AsyncServiceInfo @@ -48,20 +48,20 @@ # Dns label max length MAX_NAME_LEN = 63 -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.All( + DOMAIN: probatio.All( cv.deprecated(CONF_DEFAULT_INTERFACE), cv.deprecated(CONF_IPV6), - vol.Schema( + probatio.Schema( { - vol.Optional(CONF_DEFAULT_INTERFACE): cv.boolean, - vol.Optional(CONF_IPV6, default=DEFAULT_IPV6): cv.boolean, + probatio.Optional(CONF_DEFAULT_INTERFACE): cv.boolean, + probatio.Optional(CONF_IPV6, default=DEFAULT_IPV6): cv.boolean, } ), ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/zeroconf/websocket_api.py b/homeassistant/components/zeroconf/websocket_api.py index 41e5b719d7aee..52ce77d0c97fa 100644 --- a/homeassistant/components/zeroconf/websocket_api.py +++ b/homeassistant/components/zeroconf/websocket_api.py @@ -7,7 +7,7 @@ import logging from typing import Any, cast -import voluptuous as vol +import probatio from zeroconf import BadTypeInNameException, DNSPointer, Zeroconf, current_time_millis from zeroconf.asyncio import AsyncServiceInfo, IPVersion @@ -146,7 +146,7 @@ def _async_on_remove(self, name: str) -> None: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "zeroconf/subscribe_discovery", + probatio.Required("type"): "zeroconf/subscribe_discovery", } ) @websocket_api.async_response diff --git a/homeassistant/components/zestimate/sensor.py b/homeassistant/components/zestimate/sensor.py index 7fb34b4cd1525..b67116d56dbc8 100644 --- a/homeassistant/components/zestimate/sensor.py +++ b/homeassistant/components/zestimate/sensor.py @@ -4,8 +4,8 @@ import logging from typing import Any, override +import probatio import requests -import voluptuous as vol import xmltodict from homeassistant.components.sensor import ( @@ -37,9 +37,9 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_API_KEY): cv.string, - vol.Required(CONF_ZPID): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + probatio.Required(CONF_API_KEY): cv.string, + probatio.Required(CONF_ZPID): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, } ) diff --git a/homeassistant/components/zeversolar/config_flow.py b/homeassistant/components/zeversolar/config_flow.py index c513ed1042601..7e0e2b638a254 100644 --- a/homeassistant/components/zeversolar/config_flow.py +++ b/homeassistant/components/zeversolar/config_flow.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio import zeversolar from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -14,9 +14,9 @@ _LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): cv.string, + probatio.Required(CONF_HOST): cv.string, }, ) diff --git a/homeassistant/components/zha/__init__.py b/homeassistant/components/zha/__init__.py index 6b09a404b89ea..2ebb288472a2b 100644 --- a/homeassistant/components/zha/__init__.py +++ b/homeassistant/components/zha/__init__.py @@ -4,7 +4,7 @@ import logging from zoneinfo import ZoneInfo -import voluptuous as vol +import probatio from yarl import URL from zha.application.const import BAUD_RATES, RadioType from zha.application.gateway import Gateway @@ -62,23 +62,23 @@ warn_on_wrong_silabs_firmware, ) -DEVICE_CONFIG_SCHEMA_ENTRY = vol.Schema({vol.Optional(CONF_TYPE): cv.string}) +DEVICE_CONFIG_SCHEMA_ENTRY = probatio.Schema({probatio.Optional(CONF_TYPE): cv.string}) ZHA_CONFIG_SCHEMA = { - vol.Optional(CONF_BAUDRATE): cv.positive_int, - vol.Optional(CONF_DATABASE): cv.string, - vol.Optional(CONF_DEVICE_CONFIG, default={}): vol.Schema( + probatio.Optional(CONF_BAUDRATE): cv.positive_int, + probatio.Optional(CONF_DATABASE): cv.string, + probatio.Optional(CONF_DEVICE_CONFIG, default={}): probatio.Schema( {cv.string: DEVICE_CONFIG_SCHEMA_ENTRY} ), - vol.Optional(CONF_ENABLE_QUIRKS, default=True): cv.boolean, - vol.Optional(CONF_ZIGPY): dict, - vol.Optional(CONF_RADIO_TYPE): cv.enum(RadioType), - vol.Optional(CONF_USB_PATH): cv.string, - vol.Optional(CONF_CUSTOM_QUIRKS_PATH): cv.isdir, + probatio.Optional(CONF_ENABLE_QUIRKS, default=True): cv.boolean, + probatio.Optional(CONF_ZIGPY): dict, + probatio.Optional(CONF_RADIO_TYPE): cv.enum(RadioType), + probatio.Optional(CONF_USB_PATH): cv.string, + probatio.Optional(CONF_CUSTOM_QUIRKS_PATH): cv.isdir, } -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - DOMAIN: vol.Schema( - vol.All( + DOMAIN: probatio.Schema( + probatio.All( cv.deprecated(CONF_USB_PATH), cv.deprecated(CONF_BAUDRATE), cv.deprecated(CONF_RADIO_TYPE), @@ -86,7 +86,7 @@ ), ), }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) PLATFORMS = ( diff --git a/homeassistant/components/zha/config_flow.py b/homeassistant/components/zha/config_flow.py index a434c502a3cca..0a750c544d998 100644 --- a/homeassistant/components/zha/config_flow.py +++ b/homeassistant/components/zha/config_flow.py @@ -8,7 +8,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from zha.application.const import RadioType import zigpy.backups from zigpy.config import CONF_DEVICE, CONF_DEVICE_PATH @@ -96,12 +96,14 @@ LEGACY_ZEROCONF_ESPHOME_API_PORT = 6053 ZEROCONF_SERVICE_TYPE = "_zigbee-coordinator._tcp.local." -ZEROCONF_PROPERTIES_SCHEMA = vol.Schema( +ZEROCONF_PROPERTIES_SCHEMA = probatio.Schema( { - vol.Required("radio_type"): vol.All(str, vol.In([t.name for t in RadioType])), - vol.Required("serial_number"): str, + probatio.Required("radio_type"): probatio.All( + str, probatio.In([t.name for t in RadioType]) + ), + probatio.Required("serial_number"): str, }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) @@ -212,10 +214,10 @@ async def async_step_choose_serial_port( return await self.async_step_verify_radio() - default_path = self._radio_mgr.device_path or vol.UNDEFINED - schema = vol.Schema( + default_path = self._radio_mgr.device_path or probatio.UNDEFINED + schema = probatio.Schema( { - vol.Required( + probatio.Required( CONF_DEVICE_PATH, default=default_path ): SerialPortSelector( SerialPortSelectorConfig( @@ -241,18 +243,20 @@ async def async_step_manual_pick_radio_type( return await self.async_step_manual_port_config() # Preselect the current radio type - default: vol.Undefined | str = vol.UNDEFINED + default: probatio.Undefined | str = probatio.UNDEFINED if self._radio_mgr.radio_type is not None: default = self._radio_mgr.radio_type.description schema = { - vol.Required(CONF_RADIO_TYPE, default=default): vol.In(RadioType.list()) + probatio.Required(CONF_RADIO_TYPE, default=default): probatio.In( + RadioType.list() + ) } return self.async_show_form( step_id="manual_pick_radio_type", - data_schema=vol.Schema(schema), + data_schema=probatio.Schema(schema), ) async def async_step_manual_port_config( @@ -288,20 +292,20 @@ async def async_step_manual_port_config( return self.async_show_form( step_id="manual_port_config", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required( + probatio.Required( CONF_DEVICE_PATH, - default=self._radio_mgr.device_path or vol.UNDEFINED, + default=self._radio_mgr.device_path or probatio.UNDEFINED, ): str, - vol.Required( + probatio.Required( CONF_BAUDRATE, default=device_settings.get(CONF_BAUDRATE) or 115200, ): int, - vol.Required( + probatio.Required( CONF_FLOW_CONTROL, default=device_settings.get(CONF_FLOW_CONTROL) or "none", - ): vol.In(["hardware", "software", "none"]), + ): probatio.In(["hardware", "software", "none"]), } ), errors=errors, @@ -638,9 +642,9 @@ async def async_step_upload_manual_backup( return self.async_show_form( step_id="upload_manual_backup", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(UPLOADED_BACKUP_FILE): FileSelector( + probatio.Required(UPLOADED_BACKUP_FILE): FileSelector( FileSelectorConfig(accept=".json,application/json") ) } @@ -665,11 +669,11 @@ async def async_step_choose_automatic_backup( return self.async_show_form( step_id="choose_automatic_backup", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CHOOSE_AUTOMATIC_BACKUP, default=choices[0]): vol.In( - choices - ), + probatio.Required( + CHOOSE_AUTOMATIC_BACKUP, default=choices[0] + ): probatio.In(choices), } ), ) @@ -730,8 +734,8 @@ async def async_step_confirm_ezsp_ieee_overwrite( if user_input is None: return self.async_show_form( step_id="confirm_ezsp_ieee_overwrite", - data_schema=vol.Schema( - {vol.Required(OVERWRITE_COORDINATOR_IEEE, default=True): bool} + data_schema=probatio.Schema( + {probatio.Required(OVERWRITE_COORDINATOR_IEEE, default=True): bool} ), ) @@ -953,7 +957,7 @@ async def async_step_zeroconf( try: discovery_props = ZEROCONF_PROPERTIES_SCHEMA(discovery_info.properties) - except vol.Invalid: + except probatio.Invalid: return self.async_abort(reason="invalid_zeroconf_data") radio_type = self._radio_mgr.parse_radio_type(discovery_props["radio_type"]) @@ -984,7 +988,7 @@ async def async_step_hardware( """Handle hardware flow.""" try: discovery_data = HARDWARE_DISCOVERY_SCHEMA(data) - except vol.Invalid: + except probatio.Invalid: return self.async_abort(reason="invalid_hardware_data") name = discovery_data["name"] diff --git a/homeassistant/components/zha/device_action.py b/homeassistant/components/zha/device_action.py index 3c53271315617..92f78dbbf91f8 100644 --- a/homeassistant/components/zha/device_action.py +++ b/homeassistant/components/zha/device_action.py @@ -2,7 +2,7 @@ from typing import Any -import voluptuous as vol +import probatio from zhaquirks.inovelli.types import AllLEDEffectType, SingleLEDEffectType from zigpy.zcl.clusters.security import IasWd @@ -28,27 +28,35 @@ DEFAULT_ACTION_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_DOMAIN): DOMAIN, - vol.Required(CONF_TYPE): vol.In({ACTION_SQUAWK, ACTION_WARN}), + probatio.Required(CONF_DOMAIN): DOMAIN, + probatio.Required(CONF_TYPE): probatio.In({ACTION_SQUAWK, ACTION_WARN}), } ) INOVELLI_ALL_LED_EFFECT_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): INOVELLI_ALL_LED_EFFECT, - vol.Required(CONF_DOMAIN): DOMAIN, - vol.Required("effect_type"): AllLEDEffectType.__getitem__, - vol.Required("color"): vol.All(vol.Coerce(int), vol.Range(0, 255)), - vol.Required("level"): vol.All(vol.Coerce(int), vol.Range(0, 100)), - vol.Required("duration"): vol.All(vol.Coerce(int), vol.Range(1, 255)), + probatio.Required(CONF_TYPE): INOVELLI_ALL_LED_EFFECT, + probatio.Required(CONF_DOMAIN): DOMAIN, + probatio.Required("effect_type"): AllLEDEffectType.__getitem__, + probatio.Required("color"): probatio.All( + probatio.Coerce(int), probatio.Range(0, 255) + ), + probatio.Required("level"): probatio.All( + probatio.Coerce(int), probatio.Range(0, 100) + ), + probatio.Required("duration"): probatio.All( + probatio.Coerce(int), probatio.Range(1, 255) + ), } ) INOVELLI_INDIVIDUAL_LED_EFFECT_SCHEMA = INOVELLI_ALL_LED_EFFECT_SCHEMA.extend( { - vol.Required(CONF_TYPE): INOVELLI_INDIVIDUAL_LED_EFFECT, - vol.Required("effect_type"): SingleLEDEffectType.__getitem__, - vol.Required("led_number"): vol.All(vol.Coerce(int), vol.Range(0, 6)), + probatio.Required(CONF_TYPE): INOVELLI_INDIVIDUAL_LED_EFFECT, + probatio.Required("effect_type"): SingleLEDEffectType.__getitem__, + probatio.Required("led_number"): probatio.All( + probatio.Coerce(int), probatio.Range(0, 6) + ), } ) @@ -57,7 +65,7 @@ INOVELLI_INDIVIDUAL_LED_EFFECT: INOVELLI_INDIVIDUAL_LED_EFFECT_SCHEMA, } -ACTION_SCHEMA = vol.Any( +ACTION_SCHEMA = probatio.Any( INOVELLI_ALL_LED_EFFECT_SCHEMA, INOVELLI_INDIVIDUAL_LED_EFFECT_SCHEMA, DEFAULT_ACTION_SCHEMA, @@ -76,21 +84,39 @@ } DEVICE_ACTION_SCHEMAS = { - INOVELLI_ALL_LED_EFFECT: vol.Schema( + INOVELLI_ALL_LED_EFFECT: probatio.Schema( { - vol.Required("effect_type"): vol.In(AllLEDEffectType.__members__.keys()), - vol.Required("color"): vol.All(vol.Coerce(int), vol.Range(0, 255)), - vol.Required("level"): vol.All(vol.Coerce(int), vol.Range(0, 100)), - vol.Required("duration"): vol.All(vol.Coerce(int), vol.Range(1, 255)), + probatio.Required("effect_type"): probatio.In( + AllLEDEffectType.__members__.keys() + ), + probatio.Required("color"): probatio.All( + probatio.Coerce(int), probatio.Range(0, 255) + ), + probatio.Required("level"): probatio.All( + probatio.Coerce(int), probatio.Range(0, 100) + ), + probatio.Required("duration"): probatio.All( + probatio.Coerce(int), probatio.Range(1, 255) + ), } ), - INOVELLI_INDIVIDUAL_LED_EFFECT: vol.Schema( + INOVELLI_INDIVIDUAL_LED_EFFECT: probatio.Schema( { - vol.Required("led_number"): vol.All(vol.Coerce(int), vol.Range(0, 6)), - vol.Required("effect_type"): vol.In(SingleLEDEffectType.__members__.keys()), - vol.Required("color"): vol.All(vol.Coerce(int), vol.Range(0, 255)), - vol.Required("level"): vol.All(vol.Coerce(int), vol.Range(0, 100)), - vol.Required("duration"): vol.All(vol.Coerce(int), vol.Range(1, 255)), + probatio.Required("led_number"): probatio.All( + probatio.Coerce(int), probatio.Range(0, 6) + ), + probatio.Required("effect_type"): probatio.In( + SingleLEDEffectType.__members__.keys() + ), + probatio.Required("color"): probatio.All( + probatio.Coerce(int), probatio.Range(0, 255) + ), + probatio.Required("level"): probatio.All( + probatio.Coerce(int), probatio.Range(0, 100) + ), + probatio.Required("duration"): probatio.All( + probatio.Coerce(int), probatio.Range(1, 255) + ), } ), } @@ -146,7 +172,7 @@ async def async_get_actions( async def async_get_action_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List action capabilities.""" if (fields := DEVICE_ACTION_SCHEMAS.get(config[CONF_TYPE])) is None: return {} diff --git a/homeassistant/components/zha/device_trigger.py b/homeassistant/components/zha/device_trigger.py index 75d22ce28a1b0..dc7531142dcce 100644 --- a/homeassistant/components/zha/device_trigger.py +++ b/homeassistant/components/zha/device_trigger.py @@ -1,6 +1,6 @@ """Provides device automations for ZHA devices that emit events.""" -import voluptuous as vol +import probatio from zha.application.const import ZHA_EVENT from homeassistant.components.device_automation import ( @@ -22,7 +22,7 @@ DEVICE_IEEE = "device_ieee" TRIGGER_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( - {vol.Required(CONF_TYPE): str, vol.Required(CONF_SUBTYPE): str} + {probatio.Required(CONF_TYPE): str, probatio.Required(CONF_SUBTYPE): str} ) diff --git a/homeassistant/components/zha/helpers.py b/homeassistant/components/zha/helpers.py index 93ea0eaf56207..59665ff83c924 100644 --- a/homeassistant/components/zha/helpers.py +++ b/homeassistant/components/zha/helpers.py @@ -15,7 +15,7 @@ from typing import TYPE_CHECKING, Any, NamedTuple, cast, override from zoneinfo import ZoneInfo -import voluptuous as vol +import probatio from zha.application import Platform as ZhaPlatform from zha.application.const import ( ATTR_DEVICE_IEEE, @@ -1196,12 +1196,14 @@ def async_get_zha_device_proxy(hass: HomeAssistant, device_id: str) -> ZHADevice return zha_gateway_proxy.device_proxies[ieee] -def cluster_command_schema_to_vol_schema(schema: CommandSchema) -> vol.Schema: - """Convert a cluster command schema to a voluptuous schema.""" - return vol.Schema( +def cluster_command_schema_to_vol_schema(schema: CommandSchema) -> probatio.Schema: + """Convert a cluster command schema to a probatio schema.""" + return probatio.Schema( { ( - vol.Optional(field.name) if field.optional else vol.Required(field.name) + probatio.Optional(field.name) + if field.optional + else probatio.Required(field.name) ): schema_type_to_vol(field.type) for field in schema.fields } @@ -1209,20 +1211,21 @@ def cluster_command_schema_to_vol_schema(schema: CommandSchema) -> vol.Schema: def schema_type_to_vol(field_type: Any) -> Any: - """Convert a schema type to a voluptuous type.""" + """Convert a schema type to a probatio type.""" if issubclass(field_type, enum.Flag) and field_type.__members__: return cv.multi_select( [key.replace("_", " ") for key in field_type.__members__] ) if issubclass(field_type, enum.Enum) and field_type.__members__: - return vol.In([key.replace("_", " ") for key in field_type.__members__]) + return probatio.In([key.replace("_", " ") for key in field_type.__members__]) if ( issubclass(field_type, zigpy.types.FixedIntType) or issubclass(field_type, enum.Flag) or issubclass(field_type, enum.Enum) ): - return vol.All( - vol.Coerce(int), vol.Range(field_type.min_value, field_type.max_value) + return probatio.All( + probatio.Coerce(int), + probatio.Range(field_type.min_value, field_type.max_value), ) return str @@ -1315,33 +1318,37 @@ def async_add_entities( entities.clear() -CONF_ZHA_OPTIONS_SCHEMA = vol.Schema( +CONF_ZHA_OPTIONS_SCHEMA = probatio.Schema( { - vol.Optional(CONF_DEFAULT_LIGHT_TRANSITION, default=0): vol.All( - vol.Coerce(float), vol.Range(min=0, max=2**16 / 10) + probatio.Optional(CONF_DEFAULT_LIGHT_TRANSITION, default=0): probatio.All( + probatio.Coerce(float), probatio.Range(min=0, max=2**16 / 10) ), - vol.Required(CONF_ENABLE_ENHANCED_LIGHT_TRANSITION, default=False): cv.boolean, - vol.Required(CONF_ENABLE_LIGHT_TRANSITIONING_FLAG, default=True): cv.boolean, - vol.Required(CONF_GROUP_MEMBERS_ASSUME_STATE, default=True): cv.boolean, - vol.Required(CONF_ENABLE_IDENTIFY_ON_JOIN, default=True): cv.boolean, - vol.Optional( + probatio.Required( + CONF_ENABLE_ENHANCED_LIGHT_TRANSITION, default=False + ): cv.boolean, + probatio.Required( + CONF_ENABLE_LIGHT_TRANSITIONING_FLAG, default=True + ): cv.boolean, + probatio.Required(CONF_GROUP_MEMBERS_ASSUME_STATE, default=True): cv.boolean, + probatio.Required(CONF_ENABLE_IDENTIFY_ON_JOIN, default=True): cv.boolean, + probatio.Optional( CONF_CONSIDER_UNAVAILABLE_MAINS, default=CONF_DEFAULT_CONSIDER_UNAVAILABLE_MAINS, ): cv.positive_int, - vol.Optional( + probatio.Optional( CONF_CONSIDER_UNAVAILABLE_BATTERY, default=CONF_DEFAULT_CONSIDER_UNAVAILABLE_BATTERY, ): cv.positive_int, - vol.Required(CONF_ENABLE_MAINS_STARTUP_POLLING, default=True): cv.boolean, + probatio.Required(CONF_ENABLE_MAINS_STARTUP_POLLING, default=True): cv.boolean, }, - extra=vol.REMOVE_EXTRA, + extra=probatio.REMOVE_EXTRA, ) -CONF_ZHA_ALARM_SCHEMA = vol.Schema( +CONF_ZHA_ALARM_SCHEMA = probatio.Schema( { - vol.Required(CONF_ALARM_MASTER_CODE, default="1234"): cv.string, - vol.Required(CONF_ALARM_FAILED_TRIES, default=3): cv.positive_int, - vol.Required(CONF_ALARM_ARM_REQUIRES_CODE, default=False): cv.boolean, + probatio.Required(CONF_ALARM_MASTER_CODE, default="1234"): cv.string, + probatio.Required(CONF_ALARM_FAILED_TRIES, default=3): cv.positive_int, + probatio.Required(CONF_ALARM_ARM_REQUIRES_CODE, default=False): cv.boolean, } ) diff --git a/homeassistant/components/zha/lock.py b/homeassistant/components/zha/lock.py index 66294af2b7b3c..decdd3516ab2c 100644 --- a/homeassistant/components/zha/lock.py +++ b/homeassistant/components/zha/lock.py @@ -3,7 +3,7 @@ import functools from typing import Any, override -import voluptuous as vol +import probatio from homeassistant.components.lock import LockEntity from homeassistant.config_entries import ConfigEntry @@ -53,8 +53,8 @@ async def async_setup_entry( platform.async_register_entity_service( SERVICE_SET_LOCK_USER_CODE, { - vol.Required("code_slot"): vol.Coerce(int), - vol.Required("user_code"): cv.string, + probatio.Required("code_slot"): probatio.Coerce(int), + probatio.Required("user_code"): cv.string, }, "async_set_lock_user_code", ) @@ -62,7 +62,7 @@ async def async_setup_entry( platform.async_register_entity_service( SERVICE_ENABLE_LOCK_USER_CODE, { - vol.Required("code_slot"): vol.Coerce(int), + probatio.Required("code_slot"): probatio.Coerce(int), }, "async_enable_lock_user_code", ) @@ -70,7 +70,7 @@ async def async_setup_entry( platform.async_register_entity_service( SERVICE_DISABLE_LOCK_USER_CODE, { - vol.Required("code_slot"): vol.Coerce(int), + probatio.Required("code_slot"): probatio.Coerce(int), }, "async_disable_lock_user_code", ) @@ -78,7 +78,7 @@ async def async_setup_entry( platform.async_register_entity_service( SERVICE_CLEAR_LOCK_USER_CODE, { - vol.Required("code_slot"): vol.Coerce(int), + probatio.Required("code_slot"): probatio.Coerce(int), }, "async_clear_lock_user_code", ) diff --git a/homeassistant/components/zha/radio_manager.py b/homeassistant/components/zha/radio_manager.py index 6ef2e40138806..cbf196679f7df 100644 --- a/homeassistant/components/zha/radio_manager.py +++ b/homeassistant/components/zha/radio_manager.py @@ -11,7 +11,7 @@ from typing import Any, Self from bellows.config import CONF_USE_THREAD -import voluptuous as vol +import probatio from zha.application.const import RadioType from zigpy.application import ControllerApplication import zigpy.backups @@ -66,33 +66,37 @@ MIGRATION_RETRIES = 100 -DEVICE_SCHEMA = vol.Schema( +DEVICE_SCHEMA = probatio.Schema( { - vol.Required("path"): str, - vol.Optional("baudrate", default=115200): int, - vol.Optional("flow_control", default=None): vol.In( + probatio.Required("path"): str, + probatio.Optional("baudrate", default=115200): int, + probatio.Optional("flow_control", default=None): probatio.In( ["hardware", "software", None] ), } ) -HARDWARE_DISCOVERY_SCHEMA = vol.Schema( +HARDWARE_DISCOVERY_SCHEMA = probatio.Schema( { - vol.Required("name"): str, - vol.Required("port"): DEVICE_SCHEMA, - vol.Required("radio_type"): str, - vol.Optional("flow_strategy"): vol.All(str, vol.Coerce(ZigbeeFlowStrategy)), - vol.Optional("tx_power"): vol.All(vol.Coerce(int), vol.Range(min=0, max=10)), + probatio.Required("name"): str, + probatio.Required("port"): DEVICE_SCHEMA, + probatio.Required("radio_type"): str, + probatio.Optional("flow_strategy"): probatio.All( + str, probatio.Coerce(ZigbeeFlowStrategy) + ), + probatio.Optional("tx_power"): probatio.All( + probatio.Coerce(int), probatio.Range(min=0, max=10) + ), } ) -HARDWARE_MIGRATION_SCHEMA = vol.Schema( +HARDWARE_MIGRATION_SCHEMA = probatio.Schema( { - vol.Required("new_discovery_info"): HARDWARE_DISCOVERY_SCHEMA, - vol.Required("old_discovery_info"): vol.Schema( + probatio.Required("new_discovery_info"): HARDWARE_DISCOVERY_SCHEMA, + probatio.Required("old_discovery_info"): probatio.Schema( { - vol.Exclusive("hw", "discovery"): HARDWARE_DISCOVERY_SCHEMA, - vol.Exclusive("usb", "discovery"): UsbServiceInfo, + probatio.Exclusive("hw", "discovery"): HARDWARE_DISCOVERY_SCHEMA, + probatio.Exclusive("usb", "discovery"): UsbServiceInfo, } ), } diff --git a/homeassistant/components/zha/websocket_api.py b/homeassistant/components/zha/websocket_api.py index 9d16fc29eafa9..56c2c0fe7a3aa 100644 --- a/homeassistant/components/zha/websocket_api.py +++ b/homeassistant/components/zha/websocket_api.py @@ -4,7 +4,7 @@ import logging from typing import TYPE_CHECKING, Any, Literal, NamedTuple, cast -import voluptuous as vol +import probatio from zha.application.const import ( ATTR_ARGS, ATTR_ATTRIBUTE, @@ -130,7 +130,7 @@ SERVICE_ZIGBEE_BIND = "service_zigbee_bind" IEEE_SERVICE = "ieee_based_service" -IEEE_SCHEMA = vol.All(cv.string, EUI64.convert) +IEEE_SCHEMA = probatio.All(cv.string, EUI64.convert) def _ensure_list_if_present[_T](value: _T | None) -> list[_T] | list[Any] | None: @@ -141,107 +141,111 @@ def _ensure_list_if_present[_T](value: _T | None) -> list[_T] | list[Any] | None SERVICE_PERMIT_PARAMS: VolDictType = { - vol.Optional(ATTR_IEEE): IEEE_SCHEMA, - vol.Optional(ATTR_DURATION, default=60): vol.All( - vol.Coerce(int), vol.Range(0, 254) + probatio.Optional(ATTR_IEEE): IEEE_SCHEMA, + probatio.Optional(ATTR_DURATION, default=60): probatio.All( + probatio.Coerce(int), probatio.Range(0, 254) ), - vol.Inclusive(ATTR_SOURCE_IEEE, "install_code"): IEEE_SCHEMA, - vol.Inclusive(ATTR_INSTALL_CODE, "install_code"): vol.All( + probatio.Inclusive(ATTR_SOURCE_IEEE, "install_code"): IEEE_SCHEMA, + probatio.Inclusive(ATTR_INSTALL_CODE, "install_code"): probatio.All( cv.string, convert_install_code ), - vol.Exclusive(ATTR_QR_CODE, "install_code"): vol.All(cv.string, qr_to_install_code), + probatio.Exclusive(ATTR_QR_CODE, "install_code"): probatio.All( + cv.string, qr_to_install_code + ), } SERVICE_SCHEMAS: dict[str, VolSchemaType] = { - SERVICE_PERMIT: vol.Schema( - vol.All( + SERVICE_PERMIT: probatio.Schema( + probatio.All( cv.deprecated(ATTR_IEEE_ADDRESS, replacement_key=ATTR_IEEE), SERVICE_PERMIT_PARAMS, ) ), - IEEE_SERVICE: vol.Schema( - vol.All( + IEEE_SERVICE: probatio.Schema( + probatio.All( cv.deprecated(ATTR_IEEE_ADDRESS, replacement_key=ATTR_IEEE), - {vol.Required(ATTR_IEEE): IEEE_SCHEMA}, + {probatio.Required(ATTR_IEEE): IEEE_SCHEMA}, ) ), - SERVICE_SET_ZIGBEE_CLUSTER_ATTRIBUTE: vol.Schema( + SERVICE_SET_ZIGBEE_CLUSTER_ATTRIBUTE: probatio.Schema( { - vol.Required(ATTR_IEEE): IEEE_SCHEMA, - vol.Required(ATTR_ENDPOINT_ID): cv.positive_int, - vol.Required(ATTR_CLUSTER_ID): cv.positive_int, - vol.Optional(ATTR_CLUSTER_TYPE, default=CLUSTER_TYPE_IN): cv.string, - vol.Required(ATTR_ATTRIBUTE): vol.Any(cv.positive_int, str), - vol.Required(ATTR_VALUE): vol.Any(int, cv.boolean, cv.string), - vol.Optional(ATTR_MANUFACTURER): vol.All( - vol.Coerce(int), vol.Range(min=-1) + probatio.Required(ATTR_IEEE): IEEE_SCHEMA, + probatio.Required(ATTR_ENDPOINT_ID): cv.positive_int, + probatio.Required(ATTR_CLUSTER_ID): cv.positive_int, + probatio.Optional(ATTR_CLUSTER_TYPE, default=CLUSTER_TYPE_IN): cv.string, + probatio.Required(ATTR_ATTRIBUTE): probatio.Any(cv.positive_int, str), + probatio.Required(ATTR_VALUE): probatio.Any(int, cv.boolean, cv.string), + probatio.Optional(ATTR_MANUFACTURER): probatio.All( + probatio.Coerce(int), probatio.Range(min=-1) ), } ), - SERVICE_WARNING_DEVICE_SQUAWK: vol.Schema( + SERVICE_WARNING_DEVICE_SQUAWK: probatio.Schema( { - vol.Required(ATTR_IEEE): IEEE_SCHEMA, - vol.Optional( + probatio.Required(ATTR_IEEE): IEEE_SCHEMA, + probatio.Optional( ATTR_WARNING_DEVICE_MODE, default=SquawkMode.Armed ): cv.positive_int, - vol.Optional( + probatio.Optional( ATTR_WARNING_DEVICE_STROBE, default=Strobe.Strobe ): cv.positive_int, - vol.Optional( + probatio.Optional( ATTR_LEVEL, default=SirenLevel.High_level_sound ): cv.positive_int, } ), - SERVICE_WARNING_DEVICE_WARN: vol.Schema( + SERVICE_WARNING_DEVICE_WARN: probatio.Schema( { - vol.Required(ATTR_IEEE): IEEE_SCHEMA, - vol.Optional( + probatio.Required(ATTR_IEEE): IEEE_SCHEMA, + probatio.Optional( ATTR_WARNING_DEVICE_MODE, default=WarningMode.Emergency ): cv.positive_int, - vol.Optional( + probatio.Optional( ATTR_WARNING_DEVICE_STROBE, default=Strobe.Strobe ): cv.positive_int, - vol.Optional( + probatio.Optional( ATTR_LEVEL, default=SirenLevel.High_level_sound ): cv.positive_int, - vol.Optional(ATTR_WARNING_DEVICE_DURATION, default=5): cv.positive_int, - vol.Optional( + probatio.Optional(ATTR_WARNING_DEVICE_DURATION, default=5): cv.positive_int, + probatio.Optional( ATTR_WARNING_DEVICE_STROBE_DUTY_CYCLE, default=0x00 ): cv.positive_int, - vol.Optional( + probatio.Optional( ATTR_WARNING_DEVICE_STROBE_INTENSITY, default=StrobeLevel.High_level_strobe, ): cv.positive_int, } ), - SERVICE_ISSUE_ZIGBEE_CLUSTER_COMMAND: vol.All( - vol.Schema( + SERVICE_ISSUE_ZIGBEE_CLUSTER_COMMAND: probatio.All( + probatio.Schema( { - vol.Required(ATTR_IEEE): IEEE_SCHEMA, - vol.Required(ATTR_ENDPOINT_ID): cv.positive_int, - vol.Required(ATTR_CLUSTER_ID): cv.positive_int, - vol.Optional(ATTR_CLUSTER_TYPE, default=CLUSTER_TYPE_IN): cv.string, - vol.Required(ATTR_COMMAND): cv.positive_int, - vol.Required(ATTR_COMMAND_TYPE): cv.string, - vol.Exclusive(ATTR_ARGS, "attrs_params"): _ensure_list_if_present, - vol.Exclusive(ATTR_PARAMS, "attrs_params"): dict, - vol.Optional(ATTR_MANUFACTURER): vol.All( - vol.Coerce(int), vol.Range(min=-1) + probatio.Required(ATTR_IEEE): IEEE_SCHEMA, + probatio.Required(ATTR_ENDPOINT_ID): cv.positive_int, + probatio.Required(ATTR_CLUSTER_ID): cv.positive_int, + probatio.Optional( + ATTR_CLUSTER_TYPE, default=CLUSTER_TYPE_IN + ): cv.string, + probatio.Required(ATTR_COMMAND): cv.positive_int, + probatio.Required(ATTR_COMMAND_TYPE): cv.string, + probatio.Exclusive(ATTR_ARGS, "attrs_params"): _ensure_list_if_present, + probatio.Exclusive(ATTR_PARAMS, "attrs_params"): dict, + probatio.Optional(ATTR_MANUFACTURER): probatio.All( + probatio.Coerce(int), probatio.Range(min=-1) ), } ), cv.deprecated(ATTR_ARGS), cv.has_at_least_one_key(ATTR_ARGS, ATTR_PARAMS), ), - SERVICE_ISSUE_ZIGBEE_GROUP_COMMAND: vol.Schema( + SERVICE_ISSUE_ZIGBEE_GROUP_COMMAND: probatio.Schema( { - vol.Required(ATTR_GROUP): cv.positive_int, - vol.Required(ATTR_CLUSTER_ID): cv.positive_int, - vol.Optional(ATTR_CLUSTER_TYPE, default=CLUSTER_TYPE_IN): cv.string, - vol.Required(ATTR_COMMAND): cv.positive_int, - vol.Optional(ATTR_ARGS, default=[]): cv.ensure_list, - vol.Optional(ATTR_MANUFACTURER): vol.All( - vol.Coerce(int), vol.Range(min=-1) + probatio.Required(ATTR_GROUP): cv.positive_int, + probatio.Required(ATTR_CLUSTER_ID): cv.positive_int, + probatio.Optional(ATTR_CLUSTER_TYPE, default=CLUSTER_TYPE_IN): cv.string, + probatio.Required(ATTR_COMMAND): cv.positive_int, + probatio.Optional(ATTR_ARGS, default=[]): cv.ensure_list, + probatio.Optional(ATTR_MANUFACTURER): probatio.All( + probatio.Coerce(int), probatio.Range(min=-1) ), } ), @@ -287,27 +291,27 @@ def _cv_zigpy_network_backup(value: dict[str, Any]) -> zigpy.backups.NetworkBack try: return zigpy.backups.NetworkBackup.from_dict(value) except ValueError as err: - raise vol.Invalid(str(err)) from err + raise probatio.Invalid(str(err)) from err -GROUP_MEMBER_SCHEMA = vol.All( - vol.Schema( +GROUP_MEMBER_SCHEMA = probatio.All( + probatio.Schema( { - vol.Required(ATTR_IEEE): IEEE_SCHEMA, - vol.Required(ATTR_ENDPOINT_ID): vol.Coerce(int), + probatio.Required(ATTR_IEEE): IEEE_SCHEMA, + probatio.Required(ATTR_ENDPOINT_ID): probatio.Coerce(int), } ), _cv_group_member, ) -CLUSTER_BINDING_SCHEMA = vol.All( - vol.Schema( +CLUSTER_BINDING_SCHEMA = probatio.All( + probatio.Schema( { - vol.Required(ATTR_NAME): cv.string, - vol.Required(ATTR_TYPE): cv.string, - vol.Required(ATTR_ID): vol.Coerce(int), - vol.Required(ATTR_ENDPOINT_ID): vol.Coerce(int), + probatio.Required(ATTR_NAME): cv.string, + probatio.Required(ATTR_TYPE): cv.string, + probatio.Required(ATTR_ID): probatio.Coerce(int), + probatio.Required(ATTR_ENDPOINT_ID): probatio.Coerce(int), } ), _cv_cluster_binding, @@ -317,7 +321,7 @@ def _cv_zigpy_network_backup(value: dict[str, Any]) -> zigpy.backups.NetworkBack @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required("type"): "zha/devices/permit", + probatio.Required("type"): "zha/devices/permit", **SERVICE_PERMIT_PARAMS, } ) @@ -369,7 +373,7 @@ def async_cleanup() -> None: @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required(TYPE): "zha/devices"}) +@websocket_api.websocket_command({probatio.Required(TYPE): "zha/devices"}) @websocket_api.async_response async def websocket_get_devices( hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any] @@ -399,7 +403,7 @@ def _get_entity_original_name( @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required(TYPE): "zha/devices/groupable"}) +@websocket_api.websocket_command({probatio.Required(TYPE): "zha/devices/groupable"}) @websocket_api.async_response async def websocket_get_groupable_devices( hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any] @@ -438,7 +442,7 @@ async def websocket_get_groupable_devices( @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required(TYPE): "zha/groups"}) +@websocket_api.websocket_command({probatio.Required(TYPE): "zha/groups"}) @websocket_api.async_response async def websocket_get_groups( hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any] @@ -452,8 +456,8 @@ async def websocket_get_groups( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zha/device", - vol.Required(ATTR_IEEE): IEEE_SCHEMA, + probatio.Required(TYPE): "zha/device", + probatio.Required(ATTR_IEEE): IEEE_SCHEMA, } ) @websocket_api.async_response @@ -479,8 +483,8 @@ async def websocket_get_device( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zha/group", - vol.Required(GROUP_ID): cv.positive_int, + probatio.Required(TYPE): "zha/group", + probatio.Required(GROUP_ID): cv.positive_int, } ) @websocket_api.async_response @@ -506,10 +510,12 @@ async def websocket_get_group( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zha/group/add", - vol.Required(GROUP_NAME): cv.string, - vol.Optional(GROUP_ID): cv.positive_int, - vol.Optional(ATTR_MEMBERS): vol.All(cv.ensure_list, [GROUP_MEMBER_SCHEMA]), + probatio.Required(TYPE): "zha/group/add", + probatio.Required(GROUP_NAME): cv.string, + probatio.Optional(GROUP_ID): cv.positive_int, + probatio.Optional(ATTR_MEMBERS): probatio.All( + cv.ensure_list, [GROUP_MEMBER_SCHEMA] + ), } ) @websocket_api.async_response @@ -533,8 +539,8 @@ async def websocket_add_group( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zha/group/remove", - vol.Required(GROUP_IDS): vol.All(cv.ensure_list, [cv.positive_int]), + probatio.Required(TYPE): "zha/group/remove", + probatio.Required(GROUP_IDS): probatio.All(cv.ensure_list, [cv.positive_int]), } ) @websocket_api.async_response @@ -560,9 +566,11 @@ async def websocket_remove_groups( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zha/group/members/add", - vol.Required(GROUP_ID): cv.positive_int, - vol.Required(ATTR_MEMBERS): vol.All(cv.ensure_list, [GROUP_MEMBER_SCHEMA]), + probatio.Required(TYPE): "zha/group/members/add", + probatio.Required(GROUP_ID): cv.positive_int, + probatio.Required(ATTR_MEMBERS): probatio.All( + cv.ensure_list, [GROUP_MEMBER_SCHEMA] + ), } ) @websocket_api.async_response @@ -592,9 +600,11 @@ async def websocket_add_group_members( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zha/group/members/remove", - vol.Required(GROUP_ID): cv.positive_int, - vol.Required(ATTR_MEMBERS): vol.All(cv.ensure_list, [GROUP_MEMBER_SCHEMA]), + probatio.Required(TYPE): "zha/group/members/remove", + probatio.Required(GROUP_ID): cv.positive_int, + probatio.Required(ATTR_MEMBERS): probatio.All( + cv.ensure_list, [GROUP_MEMBER_SCHEMA] + ), } ) @websocket_api.async_response @@ -624,8 +634,8 @@ async def websocket_remove_group_members( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zha/devices/reconfigure", - vol.Required(ATTR_IEEE): IEEE_SCHEMA, + probatio.Required(TYPE): "zha/devices/reconfigure", + probatio.Required(ATTR_IEEE): IEEE_SCHEMA, } ) @websocket_api.async_response @@ -666,7 +676,7 @@ def async_cleanup() -> None: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zha/topology/update", + probatio.Required(TYPE): "zha/topology/update", } ) @websocket_api.async_response @@ -681,8 +691,8 @@ async def websocket_update_topology( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zha/devices/clusters", - vol.Required(ATTR_IEEE): IEEE_SCHEMA, + probatio.Required(TYPE): "zha/devices/clusters", + probatio.Required(ATTR_IEEE): IEEE_SCHEMA, } ) @websocket_api.async_response @@ -722,11 +732,11 @@ async def websocket_device_clusters( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zha/devices/clusters/attributes", - vol.Required(ATTR_IEEE): IEEE_SCHEMA, - vol.Required(ATTR_ENDPOINT_ID): int, - vol.Required(ATTR_CLUSTER_ID): int, - vol.Required(ATTR_CLUSTER_TYPE): str, + probatio.Required(TYPE): "zha/devices/clusters/attributes", + probatio.Required(ATTR_IEEE): IEEE_SCHEMA, + probatio.Required(ATTR_ENDPOINT_ID): int, + probatio.Required(ATTR_CLUSTER_ID): int, + probatio.Required(ATTR_CLUSTER_TYPE): str, } ) @websocket_api.async_response @@ -767,11 +777,11 @@ async def websocket_device_cluster_attributes( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zha/devices/clusters/commands", - vol.Required(ATTR_IEEE): IEEE_SCHEMA, - vol.Required(ATTR_ENDPOINT_ID): int, - vol.Required(ATTR_CLUSTER_ID): int, - vol.Required(ATTR_CLUSTER_TYPE): str, + probatio.Required(TYPE): "zha/devices/clusters/commands", + probatio.Required(ATTR_IEEE): IEEE_SCHEMA, + probatio.Required(ATTR_ENDPOINT_ID): int, + probatio.Required(ATTR_CLUSTER_ID): int, + probatio.Required(ATTR_CLUSTER_TYPE): str, } ) @websocket_api.async_response @@ -837,13 +847,13 @@ async def websocket_device_cluster_commands( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zha/devices/clusters/attributes/value", - vol.Required(ATTR_IEEE): IEEE_SCHEMA, - vol.Required(ATTR_ENDPOINT_ID): int, - vol.Required(ATTR_CLUSTER_ID): int, - vol.Required(ATTR_CLUSTER_TYPE): str, - vol.Required(ATTR_ATTRIBUTE): int, - vol.Optional(ATTR_MANUFACTURER): cv.positive_int, + probatio.Required(TYPE): "zha/devices/clusters/attributes/value", + probatio.Required(ATTR_IEEE): IEEE_SCHEMA, + probatio.Required(ATTR_ENDPOINT_ID): int, + probatio.Required(ATTR_CLUSTER_ID): int, + probatio.Required(ATTR_CLUSTER_TYPE): str, + probatio.Required(ATTR_ATTRIBUTE): int, + probatio.Optional(ATTR_MANUFACTURER): cv.positive_int, } ) @websocket_api.async_response @@ -894,8 +904,8 @@ async def websocket_read_zigbee_cluster_attributes( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zha/devices/bindable", - vol.Required(ATTR_IEEE): IEEE_SCHEMA, + probatio.Required(TYPE): "zha/devices/bindable", + probatio.Required(ATTR_IEEE): IEEE_SCHEMA, } ) @websocket_api.async_response @@ -928,9 +938,9 @@ async def websocket_get_bindable_devices( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zha/devices/bind", - vol.Required(ATTR_SOURCE_IEEE): IEEE_SCHEMA, - vol.Required(ATTR_TARGET_IEEE): IEEE_SCHEMA, + probatio.Required(TYPE): "zha/devices/bind", + probatio.Required(ATTR_SOURCE_IEEE): IEEE_SCHEMA, + probatio.Required(ATTR_TARGET_IEEE): IEEE_SCHEMA, } ) @websocket_api.async_response @@ -957,9 +967,9 @@ async def websocket_bind_devices( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zha/devices/unbind", - vol.Required(ATTR_SOURCE_IEEE): IEEE_SCHEMA, - vol.Required(ATTR_TARGET_IEEE): IEEE_SCHEMA, + probatio.Required(TYPE): "zha/devices/unbind", + probatio.Required(ATTR_SOURCE_IEEE): IEEE_SCHEMA, + probatio.Required(ATTR_TARGET_IEEE): IEEE_SCHEMA, } ) @websocket_api.async_response @@ -986,10 +996,12 @@ async def websocket_unbind_devices( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zha/groups/bind", - vol.Required(ATTR_SOURCE_IEEE): IEEE_SCHEMA, - vol.Required(GROUP_ID): cv.positive_int, - vol.Required(BINDINGS): vol.All(cv.ensure_list, [CLUSTER_BINDING_SCHEMA]), + probatio.Required(TYPE): "zha/groups/bind", + probatio.Required(ATTR_SOURCE_IEEE): IEEE_SCHEMA, + probatio.Required(GROUP_ID): cv.positive_int, + probatio.Required(BINDINGS): probatio.All( + cv.ensure_list, [CLUSTER_BINDING_SCHEMA] + ), } ) @websocket_api.async_response @@ -1010,10 +1022,12 @@ async def websocket_bind_group( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zha/groups/unbind", - vol.Required(ATTR_SOURCE_IEEE): IEEE_SCHEMA, - vol.Required(GROUP_ID): cv.positive_int, - vol.Required(BINDINGS): vol.All(cv.ensure_list, [CLUSTER_BINDING_SCHEMA]), + probatio.Required(TYPE): "zha/groups/unbind", + probatio.Required(ATTR_SOURCE_IEEE): IEEE_SCHEMA, + probatio.Required(GROUP_ID): cv.positive_int, + probatio.Required(BINDINGS): probatio.All( + cv.ensure_list, [CLUSTER_BINDING_SCHEMA] + ), } ) @websocket_api.async_response @@ -1080,7 +1094,7 @@ async def async_binding_operation( @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required(TYPE): "zha/configuration"}) +@websocket_api.websocket_command({probatio.Required(TYPE): "zha/configuration"}) @websocket_api.async_response async def websocket_get_configuration( hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any] @@ -1093,7 +1107,7 @@ def custom_serializer(schema: Any) -> Any: """Serialize additional types for the field-list serializer.""" if schema is cv_boolean: return {"type": "bool"} - if schema is vol.Schema: + if schema is probatio.Schema: return to_field_list(schema, custom_serializer=custom_serializer) return cv.custom_serializer(schema) @@ -1122,8 +1136,8 @@ def custom_serializer(schema: Any) -> Any: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zha/configuration/update", - vol.Required("data"): ZHA_CONFIG_SCHEMAS, + probatio.Required(TYPE): "zha/configuration/update", + probatio.Required("data"): ZHA_CONFIG_SCHEMAS, } ) @websocket_api.async_response @@ -1169,7 +1183,7 @@ async def websocket_update_zha_configuration( @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required(TYPE): "zha/network/settings"}) +@websocket_api.websocket_command({probatio.Required(TYPE): "zha/network/settings"}) @websocket_api.async_response async def websocket_get_network_settings( hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any] @@ -1189,7 +1203,7 @@ async def websocket_get_network_settings( @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required(TYPE): "zha/network/backups/list"}) +@websocket_api.websocket_command({probatio.Required(TYPE): "zha/network/backups/list"}) @websocket_api.async_response async def websocket_list_network_backups( hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any] @@ -1205,7 +1219,9 @@ async def websocket_list_network_backups( @websocket_api.require_admin -@websocket_api.websocket_command({vol.Required(TYPE): "zha/network/backups/create"}) +@websocket_api.websocket_command( + {probatio.Required(TYPE): "zha/network/backups/create"} +) @websocket_api.async_response async def websocket_create_network_backup( hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any] @@ -1228,9 +1244,9 @@ async def websocket_create_network_backup( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zha/network/backups/restore", - vol.Required("backup"): _cv_zigpy_network_backup, - vol.Optional("ezsp_force_write_eui64", default=False): cv.boolean, + probatio.Required(TYPE): "zha/network/backups/restore", + probatio.Required("backup"): _cv_zigpy_network_backup, + probatio.Optional("ezsp_force_write_eui64", default=False): cv.boolean, } ) @websocket_api.async_response @@ -1259,8 +1275,10 @@ async def websocket_restore_network_backup( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zha/network/change_channel", - vol.Required(ATTR_NEW_CHANNEL): vol.Any("auto", vol.Range(11, 26)), + probatio.Required(TYPE): "zha/network/change_channel", + probatio.Required(ATTR_NEW_CHANNEL): probatio.Any( + "auto", probatio.Range(11, 26) + ), } ) @websocket_api.async_response diff --git a/homeassistant/components/zhong_hong/climate.py b/homeassistant/components/zhong_hong/climate.py index 3af5dff40ccb0..c31547529a187 100644 --- a/homeassistant/components/zhong_hong/climate.py +++ b/homeassistant/components/zhong_hong/climate.py @@ -2,7 +2,7 @@ from typing import Any, override -import voluptuous as vol +import probatio from zhong_hong_hvac.hvac import HVAC as ZhongHongHVAC from homeassistant.components.climate import ( @@ -55,9 +55,9 @@ PLATFORM_SCHEMA = CLIMATE_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional( + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional( CONF_GATEWAY_ADDRESS, default=DEFAULT_GATEWAY_ADDRESS ): cv.positive_int, } diff --git a/homeassistant/components/zhong_hong/config_flow.py b/homeassistant/components/zhong_hong/config_flow.py index 485b88a56fc40..623436a1347d0 100644 --- a/homeassistant/components/zhong_hong/config_flow.py +++ b/homeassistant/components/zhong_hong/config_flow.py @@ -3,7 +3,7 @@ from functools import partial from typing import Any, override -import voluptuous as vol +import probatio from zhong_hong_hvac.hub import ZhongHongGateway from homeassistant.config_entries import ConfigFlow, ConfigFlowResult @@ -19,11 +19,11 @@ LOGGER, ) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, - vol.Optional( + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + probatio.Optional( CONF_GATEWAY_ADDRESS, default=DEFAULT_GATEWAY_ADDRESS ): cv.positive_int, } diff --git a/homeassistant/components/ziggo_mediabox_xl/media_player.py b/homeassistant/components/ziggo_mediabox_xl/media_player.py index 2c226f0b3bf47..52f71b55310dd 100644 --- a/homeassistant/components/ziggo_mediabox_xl/media_player.py +++ b/homeassistant/components/ziggo_mediabox_xl/media_player.py @@ -4,7 +4,7 @@ import socket from typing import override -import voluptuous as vol +import probatio from ziggo_mediabox_xl import ZiggoMediaboxXL from homeassistant.components.media_player import ( @@ -24,7 +24,7 @@ DATA_KNOWN_DEVICES = "ziggo_mediabox_xl_known_devices" PLATFORM_SCHEMA = MEDIA_PLAYER_PLATFORM_SCHEMA.extend( - {vol.Required(CONF_HOST): cv.string, vol.Optional(CONF_NAME): cv.string} + {probatio.Required(CONF_HOST): cv.string, probatio.Optional(CONF_NAME): cv.string} ) diff --git a/homeassistant/components/zimi/config_flow.py b/homeassistant/components/zimi/config_flow.py index 8baa72db314fa..b29b02462b057 100644 --- a/homeassistant/components/zimi/config_flow.py +++ b/homeassistant/components/zimi/config_flow.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from zcc import ( ControlPoint, ControlPointCannotConnectError, @@ -29,10 +29,10 @@ _LOGGER = logging.getLogger(__name__) DEFAULT_PORT = 5003 -STEP_MANUAL_DATA_SCHEMA = vol.Schema( +STEP_MANUAL_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): str, - vol.Required(CONF_PORT, default=DEFAULT_PORT): int, + probatio.Required(CONF_HOST): str, + probatio.Required(CONF_PORT, default=DEFAULT_PORT): int, } ) @@ -92,9 +92,9 @@ async def async_step_selection( for description in self.api_descriptions ] - available_schema = vol.Schema( + available_schema = probatio.Schema( { - vol.Required( + probatio.Required( SELECTED_HOST_AND_PORT, default=available_options[0]["value"] ): SelectSelector( SelectSelectorConfig( diff --git a/homeassistant/components/zinvolt/config_flow.py b/homeassistant/components/zinvolt/config_flow.py index 96dc18dbcf4bf..b50099a1d0b53 100644 --- a/homeassistant/components/zinvolt/config_flow.py +++ b/homeassistant/components/zinvolt/config_flow.py @@ -4,7 +4,7 @@ from typing import Any, override import jwt -import voluptuous as vol +import probatio from zinvolt import ZinvoltClient from zinvolt.exceptions import ZinvoltAuthenticationError, ZinvoltError @@ -52,10 +52,10 @@ async def async_step_user( return self.async_show_form( step_id="user", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required(CONF_EMAIL): str, - vol.Required(CONF_PASSWORD): str, + probatio.Required(CONF_EMAIL): str, + probatio.Required(CONF_PASSWORD): str, } ), errors=errors, diff --git a/homeassistant/components/zone/__init__.py b/homeassistant/components/zone/__init__.py index 78a220b06f055..d89292b15ec6d 100644 --- a/homeassistant/components/zone/__init__.py +++ b/homeassistant/components/zone/__init__.py @@ -6,7 +6,7 @@ import sys from typing import Any, Self, cast, override -import voluptuous as vol +import probatio from homeassistant import config_entries from homeassistant.const import ( # noqa: F401 @@ -66,22 +66,22 @@ ICON_IMPORT = "mdi:import" CREATE_FIELDS: VolDictType = { - vol.Required(CONF_NAME): cv.string, - vol.Required(CONF_LATITUDE): cv.latitude, - vol.Required(CONF_LONGITUDE): cv.longitude, - vol.Optional(CONF_RADIUS, default=DEFAULT_RADIUS): vol.Coerce(float), - vol.Optional(CONF_PASSIVE, default=DEFAULT_PASSIVE): cv.boolean, - vol.Optional(CONF_ICON): cv.icon, + probatio.Required(CONF_NAME): cv.string, + probatio.Required(CONF_LATITUDE): cv.latitude, + probatio.Required(CONF_LONGITUDE): cv.longitude, + probatio.Optional(CONF_RADIUS, default=DEFAULT_RADIUS): probatio.Coerce(float), + probatio.Optional(CONF_PASSIVE, default=DEFAULT_PASSIVE): cv.boolean, + probatio.Optional(CONF_ICON): cv.icon, } UPDATE_FIELDS: VolDictType = { - vol.Optional(CONF_NAME): cv.string, - vol.Optional(CONF_LATITUDE): cv.latitude, - vol.Optional(CONF_LONGITUDE): cv.longitude, - vol.Optional(CONF_RADIUS): vol.Coerce(float), - vol.Optional(CONF_PASSIVE): cv.boolean, - vol.Optional(CONF_ICON): cv.icon, + probatio.Optional(CONF_NAME): cv.string, + probatio.Optional(CONF_LATITUDE): cv.latitude, + probatio.Optional(CONF_LONGITUDE): cv.longitude, + probatio.Optional(CONF_RADIUS): probatio.Coerce(float), + probatio.Optional(CONF_PASSIVE): cv.boolean, + probatio.Optional(CONF_ICON): cv.icon, } @@ -90,20 +90,20 @@ def empty_value(value: Any) -> Any: if isinstance(value, dict) and len(value) == 0: return [] - raise vol.Invalid("Not a default value") + raise probatio.Invalid("Not a default value") -CONFIG_SCHEMA = vol.Schema( +CONFIG_SCHEMA = probatio.Schema( { - vol.Optional(DOMAIN, default=[]): vol.Any( - vol.All(cv.ensure_list, [vol.Schema(CREATE_FIELDS)]), + probatio.Optional(DOMAIN, default=[]): probatio.Any( + probatio.All(cv.ensure_list, [probatio.Schema(CREATE_FIELDS)]), empty_value, ) }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ) -RELOAD_SERVICE_SCHEMA = vol.Schema({}) +RELOAD_SERVICE_SCHEMA = probatio.Schema({}) STORAGE_KEY = DOMAIN STORAGE_VERSION = 1 @@ -306,8 +306,8 @@ def in_zone(zone: State, latitude: float, longitude: float, radius: float = 0) - class ZoneStorageCollection(collection.DictStorageCollection): """Zone collection stored in storage.""" - CREATE_SCHEMA = vol.Schema(CREATE_FIELDS) - UPDATE_SCHEMA = vol.Schema(UPDATE_FIELDS) + CREATE_SCHEMA = probatio.Schema(CREATE_FIELDS) + UPDATE_SCHEMA = probatio.Schema(UPDATE_FIELDS) @override async def _process_create_data(self, data: dict) -> dict: diff --git a/homeassistant/components/zone/condition.py b/homeassistant/components/zone/condition.py index ae00b0bff5999..106bbdda580fb 100644 --- a/homeassistant/components/zone/condition.py +++ b/homeassistant/components/zone/condition.py @@ -2,7 +2,7 @@ from typing import Any, Unpack, cast, override -import voluptuous as vol +import probatio from homeassistant.components.device_tracker import ( DOMAIN as DEVICE_TRACKER_DOMAIN, @@ -45,11 +45,11 @@ from .const import DOMAIN from .helpers import get_in_zones_attribute -_OPTIONS_SCHEMA_DICT: dict[vol.Marker, Any] = { - vol.Required(CONF_ENTITY_ID): cv.entity_ids, - vol.Required("zone"): cv.entity_ids, +_OPTIONS_SCHEMA_DICT: dict[probatio.Marker, Any] = { + probatio.Required(CONF_ENTITY_ID): cv.entity_ids, + probatio.Required("zone"): cv.entity_ids, } -_CONDITION_SCHEMA = vol.Schema({CONF_OPTIONS: _OPTIONS_SCHEMA_DICT}) +_CONDITION_SCHEMA = probatio.Schema({CONF_OPTIONS: _OPTIONS_SCHEMA_DICT}) def zone( @@ -186,8 +186,8 @@ def _async_check(self, **kwargs: Unpack[ConditionCheckParams]) -> bool: _ZONE_CONDITION_SCHEMA = ENTITY_STATE_CONDITION_SCHEMA_ANY_ALL.extend( { - vol.Required(CONF_OPTIONS): { - vol.Required(CONF_ZONE): cv.entity_domain(DOMAIN), + probatio.Required(CONF_OPTIONS): { + probatio.Required(CONF_ZONE): cv.entity_domain(DOMAIN), }, } ) @@ -232,11 +232,11 @@ def is_valid_state(self, entity_state: State) -> bool: return not self._in_target_zone(entity_state) -_OCCUPANCY_CONDITION_SCHEMA = vol.Schema( +_OCCUPANCY_CONDITION_SCHEMA = probatio.Schema( { - vol.Required(CONF_OPTIONS, default={}): { - vol.Required(CONF_ZONE): cv.entity_domain(DOMAIN), - vol.Optional(CONF_FOR): cv.positive_time_period, + probatio.Required(CONF_OPTIONS, default={}): { + probatio.Required(CONF_ZONE): cv.entity_domain(DOMAIN), + probatio.Optional(CONF_FOR): cv.positive_time_period, }, } ) diff --git a/homeassistant/components/zone/trigger.py b/homeassistant/components/zone/trigger.py index c23a3bb6f3c96..fefb0447208c3 100644 --- a/homeassistant/components/zone/trigger.py +++ b/homeassistant/components/zone/trigger.py @@ -3,7 +3,7 @@ import logging from typing import TYPE_CHECKING, Any, cast, override -import voluptuous as vol +import probatio from homeassistant.const import ( CONF_ENTITY_ID, @@ -69,23 +69,25 @@ def _state_has_zone_info(state: State) -> bool: ) -_LEGACY_OPTIONS_SCHEMA: dict[vol.Marker, Any] = { - vol.Required(CONF_ENTITY_ID): cv.entity_ids_or_uuids, - vol.Required(CONF_ZONE): cv.entity_id, - vol.Required(CONF_EVENT, default=DEFAULT_EVENT): vol.Any(EVENT_ENTER, EVENT_LEAVE), +_LEGACY_OPTIONS_SCHEMA: dict[probatio.Marker, Any] = { + probatio.Required(CONF_ENTITY_ID): cv.entity_ids_or_uuids, + probatio.Required(CONF_ZONE): cv.entity_id, + probatio.Required(CONF_EVENT, default=DEFAULT_EVENT): probatio.Any( + EVENT_ENTER, EVENT_LEAVE + ), } -_LEGACY_TRIGGER_OPTIONS_SCHEMA = vol.Schema( +_LEGACY_TRIGGER_OPTIONS_SCHEMA = probatio.Schema( { - vol.Required(CONF_OPTIONS): _LEGACY_OPTIONS_SCHEMA, + probatio.Required(CONF_OPTIONS): _LEGACY_OPTIONS_SCHEMA, }, ) # New-style zone trigger schema _ZONE_TRIGGER_SCHEMA = ENTITY_STATE_TRIGGER_SCHEMA_WITH_BEHAVIOR.extend( { - vol.Required(CONF_OPTIONS): { - vol.Required(CONF_ZONE): cv.entity_domain(DOMAIN), + probatio.Required(CONF_OPTIONS): { + probatio.Required(CONF_ZONE): cv.entity_domain(DOMAIN), }, } ) @@ -242,11 +244,11 @@ def is_valid_state( return not self._in_target_zone(state) -_OCCUPANCY_TRIGGER_SCHEMA = vol.Schema( +_OCCUPANCY_TRIGGER_SCHEMA = probatio.Schema( { - vol.Required(CONF_OPTIONS, default={}): { - vol.Required(CONF_ZONE): cv.entity_domain(DOMAIN), - vol.Optional(CONF_FOR): cv.positive_time_period, + probatio.Required(CONF_OPTIONS, default={}): { + probatio.Required(CONF_ZONE): cv.entity_domain(DOMAIN), + probatio.Optional(CONF_FOR): cv.positive_time_period, }, } ) diff --git a/homeassistant/components/zoneminder/__init__.py b/homeassistant/components/zoneminder/__init__.py index 27b69a8d62dca..94249c1e6aa7f 100644 --- a/homeassistant/components/zoneminder/__init__.py +++ b/homeassistant/components/zoneminder/__init__.py @@ -2,8 +2,8 @@ import logging +import probatio from requests.exceptions import ConnectionError as RequestsConnectionError -import voluptuous as vol from zoneminder.zm import ZoneMinder from homeassistant.const import ( @@ -33,20 +33,21 @@ DEFAULT_TIMEOUT = 10 DEFAULT_VERIFY_SSL = True -HOST_CONFIG_SCHEMA = vol.Schema( +HOST_CONFIG_SCHEMA = probatio.Schema( { - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_PASSWORD): cv.string, - vol.Optional(CONF_PATH, default=DEFAULT_PATH): cv.string, - vol.Optional(CONF_PATH_ZMS, default=DEFAULT_PATH_ZMS): cv.string, - vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, - vol.Optional(CONF_USERNAME): cv.string, - vol.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, + probatio.Required(CONF_HOST): cv.string, + probatio.Optional(CONF_PASSWORD): cv.string, + probatio.Optional(CONF_PATH, default=DEFAULT_PATH): cv.string, + probatio.Optional(CONF_PATH_ZMS, default=DEFAULT_PATH_ZMS): cv.string, + probatio.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, + probatio.Optional(CONF_USERNAME): cv.string, + probatio.Optional(CONF_VERIFY_SSL, default=DEFAULT_VERIFY_SSL): cv.boolean, } ) -CONFIG_SCHEMA = vol.Schema( - {DOMAIN: vol.All(cv.ensure_list, [HOST_CONFIG_SCHEMA])}, extra=vol.ALLOW_EXTRA +CONFIG_SCHEMA = probatio.Schema( + {DOMAIN: probatio.All(cv.ensure_list, [HOST_CONFIG_SCHEMA])}, + extra=probatio.ALLOW_EXTRA, ) diff --git a/homeassistant/components/zoneminder/sensor.py b/homeassistant/components/zoneminder/sensor.py index 46edbf7eb0e74..98af24b4d6123 100644 --- a/homeassistant/components/zoneminder/sensor.py +++ b/homeassistant/components/zoneminder/sensor.py @@ -2,7 +2,7 @@ import logging -import voluptuous as vol +import probatio from zoneminder.monitor import Monitor, TimePeriod from zoneminder.zm import ZoneMinder @@ -53,11 +53,11 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { - vol.Optional( + probatio.Optional( CONF_INCLUDE_ARCHIVED, default=DEFAULT_INCLUDE_ARCHIVED ): cv.boolean, - vol.Optional(CONF_MONITORED_CONDITIONS, default=["all"]): vol.All( - cv.ensure_list, [vol.In(SENSOR_KEYS)] + probatio.Optional(CONF_MONITORED_CONDITIONS, default=["all"]): probatio.All( + cv.ensure_list, [probatio.In(SENSOR_KEYS)] ), } ) diff --git a/homeassistant/components/zoneminder/services.py b/homeassistant/components/zoneminder/services.py index 53847213c85a5..59447c8385633 100644 --- a/homeassistant/components/zoneminder/services.py +++ b/homeassistant/components/zoneminder/services.py @@ -2,7 +2,7 @@ import logging -import voluptuous as vol +import probatio from homeassistant.const import ATTR_ID, ATTR_NAME from homeassistant.core import HomeAssistant, ServiceCall, callback @@ -13,8 +13,8 @@ _LOGGER = logging.getLogger(__name__) SERVICE_SET_RUN_STATE = "set_run_state" -SET_RUN_STATE_SCHEMA = vol.Schema( - {vol.Required(ATTR_ID): cv.string, vol.Required(ATTR_NAME): cv.string} +SET_RUN_STATE_SCHEMA = probatio.Schema( + {probatio.Required(ATTR_ID): cv.string, probatio.Required(ATTR_NAME): cv.string} ) diff --git a/homeassistant/components/zoneminder/switch.py b/homeassistant/components/zoneminder/switch.py index c934a96f58863..83cb2c3dfc727 100644 --- a/homeassistant/components/zoneminder/switch.py +++ b/homeassistant/components/zoneminder/switch.py @@ -3,7 +3,7 @@ import logging from typing import Any, override -import voluptuous as vol +import probatio from zoneminder.monitor import Monitor, MonitorState from zoneminder.zm import ZoneMinder @@ -24,8 +24,8 @@ PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend( { - vol.Required(CONF_COMMAND_ON): cv.string, - vol.Required(CONF_COMMAND_OFF): cv.string, + probatio.Required(CONF_COMMAND_ON): cv.string, + probatio.Required(CONF_COMMAND_OFF): cv.string, } ) diff --git a/homeassistant/components/zonneplan/config_flow.py b/homeassistant/components/zonneplan/config_flow.py index 1ebcce4cc97ad..4cb55d2d76645 100644 --- a/homeassistant/components/zonneplan/config_flow.py +++ b/homeassistant/components/zonneplan/config_flow.py @@ -4,6 +4,7 @@ import logging from typing import Any, override +import probatio from pyzonneplan import ( OtpChallenge, Zonneplan, @@ -11,7 +12,6 @@ ZonneplanInvalidOtpError, ZonneplanTimeoutError, ) -import voluptuous as vol from homeassistant.config_entries import ( SOURCE_REAUTH, @@ -31,16 +31,16 @@ LOGGER = logging.getLogger(__name__) -STEP_USER_DATA_SCHEMA = vol.Schema( +STEP_USER_DATA_SCHEMA = probatio.Schema( { - vol.Required(CONF_EMAIL): TextSelector( + probatio.Required(CONF_EMAIL): TextSelector( TextSelectorConfig(type=TextSelectorType.EMAIL, autocomplete="username") ), } ) -STEP_OTP_DATA_SCHEMA = vol.Schema( +STEP_OTP_DATA_SCHEMA = probatio.Schema( { - vol.Required("otp"): TextSelector( + probatio.Required("otp"): TextSelector( TextSelectorConfig(type=TextSelectorType.NUMBER) ) } diff --git a/homeassistant/components/zwave_js/api.py b/homeassistant/components/zwave_js/api.py index 0b5cdbcfb846f..877dbd225314f 100644 --- a/homeassistant/components/zwave_js/api.py +++ b/homeassistant/components/zwave_js/api.py @@ -9,7 +9,7 @@ from typing import TYPE_CHECKING, Any, Concatenate, Literal, cast from aiohttp import web, web_exceptions, web_request -import voluptuous as vol +import probatio from zwave_js_server.client import Client from zwave_js_server.const import ( CommandClass, @@ -198,62 +198,62 @@ # Helper schemas -PLANNED_PROVISIONING_ENTRY_SCHEMA = vol.All( - vol.Schema( +PLANNED_PROVISIONING_ENTRY_SCHEMA = probatio.All( + probatio.Schema( { - vol.Required(DSK): str, - vol.Required(SECURITY_CLASSES): vol.All( + probatio.Required(DSK): str, + probatio.Required(SECURITY_CLASSES): probatio.All( cv.ensure_list, - [vol.Coerce(SecurityClass)], + [probatio.Coerce(SecurityClass)], ), - vol.Optional(STATUS, default=ProvisioningEntryStatus.ACTIVE): vol.Coerce( - ProvisioningEntryStatus - ), - vol.Optional(REQUESTED_SECURITY_CLASSES): vol.All( - cv.ensure_list, [vol.Coerce(SecurityClass)] + probatio.Optional( + STATUS, default=ProvisioningEntryStatus.ACTIVE + ): probatio.Coerce(ProvisioningEntryStatus), + probatio.Optional(REQUESTED_SECURITY_CLASSES): probatio.All( + cv.ensure_list, [probatio.Coerce(SecurityClass)] ), }, # Provisioning entries can have extra keys for SmartStart - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ), ProvisioningEntry.from_dict, ) -QR_PROVISIONING_INFORMATION_SCHEMA = vol.All( - vol.Schema( +QR_PROVISIONING_INFORMATION_SCHEMA = probatio.All( + probatio.Schema( { - vol.Required(VERSION): vol.Coerce(QRCodeVersion), - vol.Required(SECURITY_CLASSES): vol.All( + probatio.Required(VERSION): probatio.Coerce(QRCodeVersion), + probatio.Required(SECURITY_CLASSES): probatio.All( cv.ensure_list, - [vol.Coerce(SecurityClass)], + [probatio.Coerce(SecurityClass)], ), - vol.Required(DSK): str, - vol.Required(GENERIC_DEVICE_CLASS): int, - vol.Required(SPECIFIC_DEVICE_CLASS): int, - vol.Required(INSTALLER_ICON_TYPE): int, - vol.Required(MANUFACTURER_ID): int, - vol.Required(PRODUCT_TYPE): int, - vol.Required(PRODUCT_ID): int, - vol.Required(APPLICATION_VERSION): str, - vol.Optional(MAX_INCLUSION_REQUEST_INTERVAL): vol.Any(int, None), - vol.Optional(UUID): vol.Any(str, None), - vol.Optional(SUPPORTED_PROTOCOLS): vol.All( + probatio.Required(DSK): str, + probatio.Required(GENERIC_DEVICE_CLASS): int, + probatio.Required(SPECIFIC_DEVICE_CLASS): int, + probatio.Required(INSTALLER_ICON_TYPE): int, + probatio.Required(MANUFACTURER_ID): int, + probatio.Required(PRODUCT_TYPE): int, + probatio.Required(PRODUCT_ID): int, + probatio.Required(APPLICATION_VERSION): str, + probatio.Optional(MAX_INCLUSION_REQUEST_INTERVAL): probatio.Any(int, None), + probatio.Optional(UUID): probatio.Any(str, None), + probatio.Optional(SUPPORTED_PROTOCOLS): probatio.All( cv.ensure_list, - [vol.Coerce(Protocols)], - ), - vol.Optional(STATUS, default=ProvisioningEntryStatus.ACTIVE): vol.Coerce( - ProvisioningEntryStatus + [probatio.Coerce(Protocols)], ), - vol.Optional(REQUESTED_SECURITY_CLASSES): vol.All( - cv.ensure_list, [vol.Coerce(SecurityClass)] + probatio.Optional( + STATUS, default=ProvisioningEntryStatus.ACTIVE + ): probatio.Coerce(ProvisioningEntryStatus), + probatio.Optional(REQUESTED_SECURITY_CLASSES): probatio.All( + cv.ensure_list, [probatio.Coerce(SecurityClass)] ), }, - extra=vol.ALLOW_EXTRA, + extra=probatio.ALLOW_EXTRA, ), QRProvisioningInformation.from_dict, ) -QR_CODE_STRING_SCHEMA = vol.All(str, vol.Length(min=MINIMUM_QR_STRING_LENGTH)) +QR_CODE_STRING_SCHEMA = probatio.All(str, probatio.Length(min=MINIMUM_QR_STRING_LENGTH)) async def _async_get_entry( @@ -493,9 +493,9 @@ def async_register_api(hass: HomeAssistant) -> None: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/network_status", - vol.Exclusive(DEVICE_ID, "id"): str, - vol.Exclusive(ENTRY_ID, "id"): str, + probatio.Required(TYPE): "zwave_js/network_status", + probatio.Exclusive(DEVICE_ID, "id"): str, + probatio.Exclusive(ENTRY_ID, "id"): str, } ) @websocket_api.async_response @@ -567,8 +567,8 @@ async def websocket_network_status( @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/subscribe_node_status", - vol.Required(DEVICE_ID): str, + probatio.Required(TYPE): "zwave_js/subscribe_node_status", + probatio.Required(DEVICE_ID): str, } ) @websocket_api.async_response @@ -608,8 +608,8 @@ def async_cleanup() -> None: @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/node_status", - vol.Required(DEVICE_ID): str, + probatio.Required(TYPE): "zwave_js/node_status", + probatio.Required(DEVICE_ID): str, } ) @websocket_api.async_response @@ -627,8 +627,8 @@ async def websocket_node_status( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/network_neighbors", - vol.Required(ENTRY_ID): str, + probatio.Required(TYPE): "zwave_js/network_neighbors", + probatio.Required(ENTRY_ID): str, } ) @websocket_api.async_response @@ -703,8 +703,8 @@ async def read_network_neighbors() -> tuple[bool, bool, dict[int, list[int]]]: @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/node_metadata", - vol.Required(DEVICE_ID): str, + probatio.Required(TYPE): "zwave_js/node_metadata", + probatio.Required(DEVICE_ID): str, } ) @websocket_api.async_response @@ -733,8 +733,8 @@ async def websocket_node_metadata( @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/node_alerts", - vol.Required(DEVICE_ID): str, + probatio.Required(TYPE): "zwave_js/node_alerts", + probatio.Required(DEVICE_ID): str, } ) @websocket_api.async_response @@ -793,11 +793,13 @@ async def websocket_node_alerts( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/add_node", - vol.Required(ENTRY_ID): str, - vol.Optional(INCLUSION_STRATEGY, default=InclusionStrategy.DEFAULT): vol.All( - vol.Coerce(int), - vol.In( + probatio.Required(TYPE): "zwave_js/add_node", + probatio.Required(ENTRY_ID): str, + probatio.Optional( + INCLUSION_STRATEGY, default=InclusionStrategy.DEFAULT + ): probatio.All( + probatio.Coerce(int), + probatio.In( [ strategy.value for strategy in InclusionStrategy @@ -805,15 +807,15 @@ async def websocket_node_alerts( ] ), ), - vol.Optional(FORCE_SECURITY): bool, - vol.Exclusive( + probatio.Optional(FORCE_SECURITY): bool, + probatio.Exclusive( PLANNED_PROVISIONING_ENTRY, "options" ): PLANNED_PROVISIONING_ENTRY_SCHEMA, - vol.Exclusive( + probatio.Exclusive( QR_PROVISIONING_INFORMATION, "options" ): QR_PROVISIONING_INFORMATION_SCHEMA, - vol.Exclusive(QR_CODE_STRING, "options"): QR_CODE_STRING_SCHEMA, - vol.Exclusive(DSK, "options"): str, + probatio.Exclusive(QR_CODE_STRING, "options"): QR_CODE_STRING_SCHEMA, + probatio.Exclusive(DSK, "options"): str, } ) @websocket_api.async_response @@ -1003,8 +1005,8 @@ def device_registered(device: dr.DeviceEntry) -> None: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/cancel_secure_bootstrap_s2", - vol.Required(ENTRY_ID): str, + probatio.Required(TYPE): "zwave_js/cancel_secure_bootstrap_s2", + probatio.Required(ENTRY_ID): str, } ) @websocket_api.async_response @@ -1026,8 +1028,8 @@ async def websocket_cancel_secure_bootstrap_s2( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/subscribe_s2_inclusion", - vol.Required(ENTRY_ID): str, + probatio.Required(TYPE): "zwave_js/subscribe_s2_inclusion", + probatio.Required(ENTRY_ID): str, } ) @websocket_api.async_response @@ -1074,13 +1076,13 @@ def handle_requested_grant(event: dict) -> None: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/grant_security_classes", - vol.Required(ENTRY_ID): str, - vol.Required(SECURITY_CLASSES): vol.All( + probatio.Required(TYPE): "zwave_js/grant_security_classes", + probatio.Required(ENTRY_ID): str, + probatio.Required(SECURITY_CLASSES): probatio.All( cv.ensure_list, - [vol.Coerce(SecurityClass)], + [probatio.Coerce(SecurityClass)], ), - vol.Optional(CLIENT_SIDE_AUTH, default=False): bool, + probatio.Optional(CLIENT_SIDE_AUTH, default=False): bool, } ) @websocket_api.async_response @@ -1106,9 +1108,9 @@ async def websocket_grant_security_classes( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/validate_dsk_and_enter_pin", - vol.Required(ENTRY_ID): str, - vol.Required(PIN): str, + probatio.Required(TYPE): "zwave_js/validate_dsk_and_enter_pin", + probatio.Required(ENTRY_ID): str, + probatio.Required(PIN): str, } ) @websocket_api.async_response @@ -1130,8 +1132,8 @@ async def websocket_validate_dsk_and_enter_pin( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/subscribe_new_devices", - vol.Required(ENTRY_ID): str, + probatio.Required(TYPE): "zwave_js/subscribe_new_devices", + probatio.Required(ENTRY_ID): str, } ) @websocket_api.async_response @@ -1173,12 +1175,14 @@ def device_registered(device: dr.DeviceEntry) -> None: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/provision_smart_start_node", - vol.Required(ENTRY_ID): str, - vol.Required(QR_PROVISIONING_INFORMATION): QR_PROVISIONING_INFORMATION_SCHEMA, - vol.Optional(PROTOCOL): vol.Coerce(Protocols), - vol.Optional(DEVICE_NAME): str, - vol.Optional(AREA_ID): str, + probatio.Required(TYPE): "zwave_js/provision_smart_start_node", + probatio.Required(ENTRY_ID): str, + probatio.Required( + QR_PROVISIONING_INFORMATION + ): QR_PROVISIONING_INFORMATION_SCHEMA, + probatio.Optional(PROTOCOL): probatio.Coerce(Protocols), + probatio.Optional(DEVICE_NAME): str, + probatio.Optional(AREA_ID): str, } ) @websocket_api.async_response @@ -1265,10 +1269,10 @@ async def websocket_provision_smart_start_node( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/unprovision_smart_start_node", - vol.Required(ENTRY_ID): str, - vol.Exclusive(DSK, "input"): str, - vol.Exclusive(NODE_ID, "input"): int, + probatio.Required(TYPE): "zwave_js/unprovision_smart_start_node", + probatio.Required(ENTRY_ID): str, + probatio.Exclusive(DSK, "input"): str, + probatio.Exclusive(NODE_ID, "input"): int, } ) @websocket_api.async_response @@ -1285,7 +1289,7 @@ async def websocket_unprovision_smart_start_node( """Unprovision a smart start node.""" try: cv.has_at_least_one_key(DSK, NODE_ID)(msg) - except vol.Invalid as err: + except probatio.Invalid as err: connection.send_error( msg[ID], ERR_INVALID_FORMAT, @@ -1317,8 +1321,8 @@ async def websocket_unprovision_smart_start_node( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/get_provisioning_entries", - vol.Required(ENTRY_ID): str, + probatio.Required(TYPE): "zwave_js/get_provisioning_entries", + probatio.Required(ENTRY_ID): str, } ) @websocket_api.async_response @@ -1340,9 +1344,9 @@ async def websocket_get_provisioning_entries( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/parse_qr_code_string", - vol.Required(ENTRY_ID): str, - vol.Required(QR_CODE_STRING): QR_CODE_STRING_SCHEMA, + probatio.Required(TYPE): "zwave_js/parse_qr_code_string", + probatio.Required(ENTRY_ID): str, + probatio.Required(QR_CODE_STRING): QR_CODE_STRING_SCHEMA, } ) @websocket_api.async_response @@ -1366,9 +1370,9 @@ async def websocket_parse_qr_code_string( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/try_parse_dsk_from_qr_code_string", - vol.Required(ENTRY_ID): str, - vol.Required(QR_CODE_STRING): str, + probatio.Required(TYPE): "zwave_js/try_parse_dsk_from_qr_code_string", + probatio.Required(ENTRY_ID): str, + probatio.Required(QR_CODE_STRING): str, } ) @websocket_api.async_response @@ -1392,12 +1396,12 @@ async def websocket_try_parse_dsk_from_qr_code_string( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/lookup_device", - vol.Required(ENTRY_ID): str, - vol.Required(MANUFACTURER_ID): int, - vol.Required(PRODUCT_TYPE): int, - vol.Required(PRODUCT_ID): int, - vol.Optional(APPLICATION_VERSION): str, + probatio.Required(TYPE): "zwave_js/lookup_device", + probatio.Required(ENTRY_ID): str, + probatio.Required(MANUFACTURER_ID): int, + probatio.Required(PRODUCT_TYPE): int, + probatio.Required(PRODUCT_ID): int, + probatio.Optional(APPLICATION_VERSION): str, } ) @websocket_api.async_response @@ -1427,9 +1431,9 @@ async def websocket_lookup_device( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/supports_feature", - vol.Required(ENTRY_ID): str, - vol.Required(FEATURE): vol.Coerce(ZwaveFeature), + probatio.Required(TYPE): "zwave_js/supports_feature", + probatio.Required(ENTRY_ID): str, + probatio.Required(FEATURE): probatio.Coerce(ZwaveFeature), } ) @websocket_api.async_response @@ -1454,8 +1458,8 @@ async def websocket_supports_feature( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/stop_inclusion", - vol.Required(ENTRY_ID): str, + probatio.Required(TYPE): "zwave_js/stop_inclusion", + probatio.Required(ENTRY_ID): str, } ) @websocket_api.async_response @@ -1481,8 +1485,8 @@ async def websocket_stop_inclusion( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/stop_exclusion", - vol.Required(ENTRY_ID): str, + probatio.Required(TYPE): "zwave_js/stop_exclusion", + probatio.Required(ENTRY_ID): str, } ) @websocket_api.async_response @@ -1508,9 +1512,9 @@ async def websocket_stop_exclusion( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/remove_node", - vol.Required(ENTRY_ID): str, - vol.Optional(STRATEGY): vol.Coerce(ExclusionStrategy), + probatio.Required(TYPE): "zwave_js/remove_node", + probatio.Required(ENTRY_ID): str, + probatio.Optional(STRATEGY): probatio.Coerce(ExclusionStrategy), } ) @websocket_api.async_response @@ -1571,11 +1575,13 @@ def node_removed(event: dict) -> None: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/replace_failed_node", - vol.Required(DEVICE_ID): str, - vol.Optional(INCLUSION_STRATEGY, default=InclusionStrategy.DEFAULT): vol.All( - vol.Coerce(int), - vol.In( + probatio.Required(TYPE): "zwave_js/replace_failed_node", + probatio.Required(DEVICE_ID): str, + probatio.Optional( + INCLUSION_STRATEGY, default=InclusionStrategy.DEFAULT + ): probatio.All( + probatio.Coerce(int), + probatio.In( [ strategy.value for strategy in InclusionStrategy @@ -1583,14 +1589,14 @@ def node_removed(event: dict) -> None: ] ), ), - vol.Optional(FORCE_SECURITY): bool, - vol.Exclusive( + probatio.Optional(FORCE_SECURITY): bool, + probatio.Exclusive( PLANNED_PROVISIONING_ENTRY, "options" ): PLANNED_PROVISIONING_ENTRY_SCHEMA, - vol.Exclusive( + probatio.Exclusive( QR_PROVISIONING_INFORMATION, "options" ): QR_PROVISIONING_INFORMATION_SCHEMA, - vol.Exclusive(QR_CODE_STRING, "options"): QR_CODE_STRING_SCHEMA, + probatio.Exclusive(QR_CODE_STRING, "options"): QR_CODE_STRING_SCHEMA, } ) @websocket_api.async_response @@ -1767,8 +1773,8 @@ def device_registered(device: dr.DeviceEntry) -> None: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/remove_failed_node", - vol.Required(DEVICE_ID): str, + probatio.Required(TYPE): "zwave_js/remove_failed_node", + probatio.Required(DEVICE_ID): str, } ) @websocket_api.async_response @@ -1811,8 +1817,8 @@ def node_removed(event: dict) -> None: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/begin_rebuilding_routes", - vol.Required(ENTRY_ID): str, + probatio.Required(TYPE): "zwave_js/begin_rebuilding_routes", + probatio.Required(ENTRY_ID): str, } ) @websocket_api.async_response @@ -1839,8 +1845,8 @@ async def websocket_begin_rebuilding_routes( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/subscribe_rebuild_routes_progress", - vol.Required(ENTRY_ID): str, + probatio.Required(TYPE): "zwave_js/subscribe_rebuild_routes_progress", + probatio.Required(ENTRY_ID): str, } ) @websocket_api.async_response @@ -1896,8 +1902,8 @@ def forward_event(key: str, event: dict) -> None: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/stop_rebuilding_routes", - vol.Required(ENTRY_ID): str, + probatio.Required(TYPE): "zwave_js/stop_rebuilding_routes", + probatio.Required(ENTRY_ID): str, } ) @websocket_api.async_response @@ -1923,8 +1929,8 @@ async def websocket_stop_rebuilding_routes( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/rebuild_node_routes", - vol.Required(DEVICE_ID): str, + probatio.Required(TYPE): "zwave_js/rebuild_node_routes", + probatio.Required(DEVICE_ID): str, } ) @websocket_api.async_response @@ -1951,8 +1957,8 @@ async def websocket_rebuild_node_routes( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/refresh_node_info", - vol.Required(DEVICE_ID): str, + probatio.Required(TYPE): "zwave_js/refresh_node_info", + probatio.Required(DEVICE_ID): str, }, ) @websocket_api.async_response @@ -2015,8 +2021,8 @@ def forward_progress(event: dict) -> None: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/refresh_node_values", - vol.Required(DEVICE_ID): str, + probatio.Required(TYPE): "zwave_js/refresh_node_values", + probatio.Required(DEVICE_ID): str, }, ) @websocket_api.async_response @@ -2036,9 +2042,9 @@ async def websocket_refresh_node_values( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/refresh_node_cc_values", - vol.Required(DEVICE_ID): str, - vol.Required(COMMAND_CLASS_ID): int, + probatio.Required(TYPE): "zwave_js/refresh_node_cc_values", + probatio.Required(DEVICE_ID): str, + probatio.Required(COMMAND_CLASS_ID): int, }, ) @websocket_api.async_response @@ -2068,12 +2074,12 @@ async def websocket_refresh_node_cc_values( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/set_config_parameter", - vol.Required(DEVICE_ID): str, - vol.Required(PROPERTY): int, - vol.Optional(ENDPOINT, default=0): int, - vol.Optional(PROPERTY_KEY): int, - vol.Required(VALUE): vol.Any(int, BITMASK_SCHEMA), + probatio.Required(TYPE): "zwave_js/set_config_parameter", + probatio.Required(DEVICE_ID): str, + probatio.Required(PROPERTY): int, + probatio.Optional(ENDPOINT, default=0): int, + probatio.Optional(PROPERTY_KEY): int, + probatio.Required(VALUE): probatio.Any(int, BITMASK_SCHEMA), } ) @websocket_api.async_response @@ -2121,8 +2127,8 @@ async def websocket_set_config_parameter( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/get_config_parameters", - vol.Required(DEVICE_ID): str, + probatio.Required(TYPE): "zwave_js/get_config_parameters", + probatio.Required(DEVICE_ID): str, } ) @websocket_api.async_response @@ -2165,12 +2171,14 @@ async def websocket_get_config_parameters( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/set_raw_config_parameter", - vol.Required(DEVICE_ID): str, - vol.Required(PROPERTY): int, - vol.Required(VALUE): int, - vol.Required(VALUE_SIZE): vol.All(vol.Coerce(int), vol.Range(min=1, max=4)), - vol.Required(VALUE_FORMAT): vol.Coerce(ConfigurationValueFormat), + probatio.Required(TYPE): "zwave_js/set_raw_config_parameter", + probatio.Required(DEVICE_ID): str, + probatio.Required(PROPERTY): int, + probatio.Required(VALUE): int, + probatio.Required(VALUE_SIZE): probatio.All( + probatio.Coerce(int), probatio.Range(min=1, max=4) + ), + probatio.Required(VALUE_FORMAT): probatio.Coerce(ConfigurationValueFormat), } ) @websocket_api.async_response @@ -2201,8 +2209,8 @@ async def websocket_set_raw_config_parameter( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/subscribe_config_parameter_updates", - vol.Required(DEVICE_ID): str, + probatio.Required(TYPE): "zwave_js/subscribe_config_parameter_updates", + probatio.Required(DEVICE_ID): str, } ) @websocket_api.async_response @@ -2241,9 +2249,9 @@ def forward_values(event: dict) -> None: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/get_raw_config_parameter", - vol.Required(DEVICE_ID): str, - vol.Required(PROPERTY): int, + probatio.Required(TYPE): "zwave_js/get_raw_config_parameter", + probatio.Required(DEVICE_ID): str, + probatio.Required(PROPERTY): int, } ) @websocket_api.async_response @@ -2271,15 +2279,15 @@ async def websocket_get_raw_config_parameter( def filename_is_present_if_logging_to_file(obj: dict) -> dict: """Validate that filename is provided if log_to_file is True.""" if obj.get(LOG_TO_FILE, False) and FILENAME not in obj: - raise vol.Invalid("`filename` must be provided if logging to file") + raise probatio.Invalid("`filename` must be provided if logging to file") return obj @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/subscribe_log_updates", - vol.Required(ENTRY_ID): str, + probatio.Required(TYPE): "zwave_js/subscribe_log_updates", + probatio.Required(ENTRY_ID): str, } ) @websocket_api.async_response @@ -2346,20 +2354,20 @@ def log_config_updates(event: dict) -> None: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/update_log_config", - vol.Required(ENTRY_ID): str, - vol.Required(CONFIG): vol.All( - vol.Schema( + probatio.Required(TYPE): "zwave_js/update_log_config", + probatio.Required(ENTRY_ID): str, + probatio.Required(CONFIG): probatio.All( + probatio.Schema( { - vol.Optional(ENABLED): cv.boolean, - vol.Optional(LEVEL): vol.All( + probatio.Optional(ENABLED): cv.boolean, + probatio.Optional(LEVEL): probatio.All( str, - vol.Lower, - vol.Coerce(LogLevel), + probatio.Lower, + probatio.Coerce(LogLevel), ), - vol.Optional(LOG_TO_FILE): cv.boolean, - vol.Optional(FILENAME): str, - vol.Optional(FORCE_CONSOLE): cv.boolean, + probatio.Optional(LOG_TO_FILE): cv.boolean, + probatio.Optional(FILENAME): str, + probatio.Optional(FORCE_CONSOLE): cv.boolean, } ), cv.has_at_least_one_key( @@ -2390,8 +2398,8 @@ async def websocket_update_log_config( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/get_log_config", - vol.Required(ENTRY_ID): str, + probatio.Required(TYPE): "zwave_js/get_log_config", + probatio.Required(ENTRY_ID): str, }, ) @websocket_api.async_response @@ -2415,9 +2423,9 @@ async def websocket_get_log_config( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/update_data_collection_preference", - vol.Required(ENTRY_ID): str, - vol.Required(OPTED_IN): bool, + probatio.Required(TYPE): "zwave_js/update_data_collection_preference", + probatio.Required(ENTRY_ID): str, + probatio.Required(OPTED_IN): bool, }, ) @websocket_api.async_response @@ -2451,8 +2459,8 @@ async def websocket_update_data_collection_preference( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/data_collection_status", - vol.Required(ENTRY_ID): str, + probatio.Required(TYPE): "zwave_js/data_collection_status", + probatio.Required(ENTRY_ID): str, }, ) @websocket_api.async_response @@ -2478,8 +2486,8 @@ async def websocket_data_collection_status( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/abort_firmware_update", - vol.Required(DEVICE_ID): str, + probatio.Required(TYPE): "zwave_js/abort_firmware_update", + probatio.Required(DEVICE_ID): str, } ) @websocket_api.async_response @@ -2499,8 +2507,8 @@ async def websocket_abort_firmware_update( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/is_node_firmware_update_in_progress", - vol.Required(DEVICE_ID): str, + probatio.Required(TYPE): "zwave_js/is_node_firmware_update_in_progress", + probatio.Required(DEVICE_ID): str, } ) @websocket_api.async_response @@ -2545,8 +2553,8 @@ def _get_driver_firmware_update_progress_dict( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/subscribe_firmware_update_status", - vol.Required(DEVICE_ID): str, + probatio.Required(TYPE): "zwave_js/subscribe_firmware_update_status", + probatio.Required(DEVICE_ID): str, } ) @websocket_api.async_response @@ -2664,8 +2672,8 @@ def forward_driver_finished(event: dict) -> None: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/get_node_firmware_update_capabilities", - vol.Required(DEVICE_ID): str, + probatio.Required(TYPE): "zwave_js/get_node_firmware_update_capabilities", + probatio.Required(DEVICE_ID): str, } ) @websocket_api.async_response @@ -2685,8 +2693,8 @@ async def websocket_get_node_firmware_update_capabilities( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/is_any_ota_firmware_update_in_progress", - vol.Required(ENTRY_ID): str, + probatio.Required(TYPE): "zwave_js/is_any_ota_firmware_update_in_progress", + probatio.Required(ENTRY_ID): str, } ) @websocket_api.async_response @@ -2775,8 +2783,8 @@ async def post(self, request: web.Request, device_id: str) -> web.Response: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/check_for_config_updates", - vol.Required(ENTRY_ID): str, + probatio.Required(TYPE): "zwave_js/check_for_config_updates", + probatio.Required(ENTRY_ID): str, } ) @websocket_api.async_response @@ -2804,8 +2812,8 @@ async def websocket_check_for_config_updates( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/install_config_update", - vol.Required(ENTRY_ID): str, + probatio.Required(TYPE): "zwave_js/install_config_update", + probatio.Required(ENTRY_ID): str, } ) @websocket_api.async_response @@ -2844,8 +2852,8 @@ def _get_controller_statistics_dict( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/subscribe_controller_statistics", - vol.Required(ENTRY_ID): str, + probatio.Required(TYPE): "zwave_js/subscribe_controller_statistics", + probatio.Required(ENTRY_ID): str, } ) @websocket_api.async_response @@ -2953,8 +2961,8 @@ def _get_route_statistics_dict( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/subscribe_node_statistics", - vol.Required(DEVICE_ID): str, + probatio.Required(TYPE): "zwave_js/subscribe_node_statistics", + probatio.Required(DEVICE_ID): str, } ) @websocket_api.async_response @@ -3008,8 +3016,8 @@ def forward_stats(event: dict) -> None: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/hard_reset_controller", - vol.Required(ENTRY_ID): str, + probatio.Required(TYPE): "zwave_js/hard_reset_controller", + probatio.Required(ENTRY_ID): str, } ) @websocket_api.async_response @@ -3076,8 +3084,8 @@ def _handle_device_added(device: dr.DeviceEntry) -> None: @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/node_capabilities", - vol.Required(DEVICE_ID): str, + probatio.Required(TYPE): "zwave_js/node_capabilities", + probatio.Required(DEVICE_ID): str, } ) @websocket_api.async_response @@ -3107,15 +3115,15 @@ async def websocket_node_capabilities( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/invoke_cc_api", - vol.Required(DEVICE_ID): str, - vol.Required(ATTR_COMMAND_CLASS): vol.All( - vol.Coerce(int), vol.Coerce(CommandClass) + probatio.Required(TYPE): "zwave_js/invoke_cc_api", + probatio.Required(DEVICE_ID): str, + probatio.Required(ATTR_COMMAND_CLASS): probatio.All( + probatio.Coerce(int), probatio.Coerce(CommandClass) ), - vol.Optional(ATTR_ENDPOINT): vol.Coerce(int), - vol.Required(ATTR_METHOD_NAME): cv.string, - vol.Required(ATTR_PARAMETERS): list, - vol.Optional(ATTR_WAIT_FOR_RESULT): cv.boolean, + probatio.Optional(ATTR_ENDPOINT): probatio.Coerce(int), + probatio.Required(ATTR_METHOD_NAME): cv.string, + probatio.Required(ATTR_PARAMETERS): list, + probatio.Optional(ATTR_WAIT_FOR_RESULT): cv.boolean, } ) @websocket_api.async_response @@ -3155,8 +3163,8 @@ async def websocket_invoke_cc_api( @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/backup_nvm", - vol.Required(ENTRY_ID): str, + probatio.Required(TYPE): "zwave_js/backup_nvm", + probatio.Required(ENTRY_ID): str, } ) @websocket_api.async_response @@ -3216,9 +3224,9 @@ def forward_progress(event: dict) -> None: @websocket_api.require_admin @websocket_api.websocket_command( { - vol.Required(TYPE): "zwave_js/restore_nvm", - vol.Required(ENTRY_ID): str, - vol.Required("data"): str, + probatio.Required(TYPE): "zwave_js/restore_nvm", + probatio.Required(ENTRY_ID): str, + probatio.Required("data"): str, } ) @websocket_api.async_response diff --git a/homeassistant/components/zwave_js/condition.py b/homeassistant/components/zwave_js/condition.py index aeafd5a052af0..c6a345f2d10e2 100644 --- a/homeassistant/components/zwave_js/condition.py +++ b/homeassistant/components/zwave_js/condition.py @@ -5,7 +5,7 @@ from dataclasses import dataclass, field from typing import TYPE_CHECKING, Any, Unpack, override -import voluptuous as vol +import probatio from zwave_js_server.const import CommandClass from zwave_js_server.model.node import Node as ZwaveNode @@ -45,43 +45,47 @@ CONF_STATUS = "status" # Conditions compare against state labels, so strings must be kept as given -_CONDITION_VALUE_SCHEMA = vol.Any(bool, int, float, dict, cv.string) +_CONDITION_VALUE_SCHEMA = probatio.Any(bool, int, float, dict, cv.string) -_BASE_SCHEMA_DICT: dict[vol.Marker, Any] = { - vol.Required(ATTR_DEVICE_ID): vol.All(cv.ensure_list, [cv.string]), - vol.Required(ATTR_BEHAVIOR, default=BEHAVIOR_ANY): vol.In( +_BASE_SCHEMA_DICT: dict[probatio.Marker, Any] = { + probatio.Required(ATTR_DEVICE_ID): probatio.All(cv.ensure_list, [cv.string]), + probatio.Required(ATTR_BEHAVIOR, default=BEHAVIOR_ANY): probatio.In( [BEHAVIOR_ANY, BEHAVIOR_ALL] ), } -_NODE_STATUS_OPTIONS_SCHEMA_DICT: dict[vol.Marker, Any] = { +_NODE_STATUS_OPTIONS_SCHEMA_DICT: dict[probatio.Marker, Any] = { **_BASE_SCHEMA_DICT, - vol.Required(CONF_STATUS): vol.In(NODE_STATUSES), + probatio.Required(CONF_STATUS): probatio.In(NODE_STATUSES), } -_VALUE_OPTIONS_SCHEMA_DICT: dict[vol.Marker, Any] = { +_VALUE_OPTIONS_SCHEMA_DICT: dict[probatio.Marker, Any] = { **_BASE_SCHEMA_DICT, - vol.Required(ATTR_COMMAND_CLASS): COMMAND_CLASS_SCHEMA, - vol.Required(ATTR_PROPERTY): vol.Any(vol.Coerce(int), cv.string), - vol.Optional(ATTR_ENDPOINT): vol.Coerce(int), - vol.Optional(ATTR_PROPERTY_KEY): vol.Any(vol.Coerce(int), cv.string), - vol.Required(ATTR_VALUE): _CONDITION_VALUE_SCHEMA, + probatio.Required(ATTR_COMMAND_CLASS): COMMAND_CLASS_SCHEMA, + probatio.Required(ATTR_PROPERTY): probatio.Any(probatio.Coerce(int), cv.string), + probatio.Optional(ATTR_ENDPOINT): probatio.Coerce(int), + probatio.Optional(ATTR_PROPERTY_KEY): probatio.Any(probatio.Coerce(int), cv.string), + probatio.Required(ATTR_VALUE): _CONDITION_VALUE_SCHEMA, } -_CONFIG_PARAMETER_OPTIONS_SCHEMA_DICT: dict[vol.Marker, Any] = { +_CONFIG_PARAMETER_OPTIONS_SCHEMA_DICT: dict[probatio.Marker, Any] = { **_BASE_SCHEMA_DICT, - vol.Required(ATTR_CONFIG_PARAMETER): vol.Coerce(int), - vol.Optional(ATTR_CONFIG_PARAMETER_BITMASK): vol.Any( - vol.Coerce(int), BITMASK_SCHEMA + probatio.Required(ATTR_CONFIG_PARAMETER): probatio.Coerce(int), + probatio.Optional(ATTR_CONFIG_PARAMETER_BITMASK): probatio.Any( + probatio.Coerce(int), BITMASK_SCHEMA ), - vol.Optional(ATTR_ENDPOINT, default=0): vol.Coerce(int), - vol.Required(ATTR_VALUE): _CONDITION_VALUE_SCHEMA, + probatio.Optional(ATTR_ENDPOINT, default=0): probatio.Coerce(int), + probatio.Required(ATTR_VALUE): _CONDITION_VALUE_SCHEMA, } -def _condition_schema(options_schema_dict: dict[vol.Marker, Any]) -> vol.Schema: +def _condition_schema( + options_schema_dict: dict[probatio.Marker, Any], +) -> probatio.Schema: """Return the condition schema for an options schema dict.""" - return vol.Schema({vol.Required(CONF_OPTIONS, default={}): options_schema_dict}) + return probatio.Schema( + {probatio.Required(CONF_OPTIONS, default={}): options_schema_dict} + ) @dataclass(slots=True) @@ -111,8 +115,8 @@ def _async_resolve_nodes( class _ZwaveNodeCondition(Condition): """Base for conditions evaluated per Z-Wave node.""" - options_schema_dict: dict[vol.Marker, Any] - _schema: vol.Schema + options_schema_dict: dict[probatio.Marker, Any] + _schema: probatio.Schema @classmethod @override @@ -138,7 +142,7 @@ async def async_validate_config( resolved = _async_resolve_nodes(hass, device_ids) if not resolved.nodes: - raise vol.Invalid("No nodes found for the given devices") + raise probatio.Invalid("No nodes found for the given devices") cls._validate_nodes(resolved.nodes, config[CONF_OPTIONS]) return config @@ -201,16 +205,18 @@ def _validate_nodes(cls, nodes: set[ZwaveNode], options: dict[str, Any]) -> None for node in nodes: try: get_zwave_value_from_config(node, value_config) - except vol.Invalid: + except probatio.Invalid: continue return - raise vol.Invalid(f"No targeted node has {cls._value_description(options)}") + raise probatio.Invalid( + f"No targeted node has {cls._value_description(options)}" + ) @override def _node_matches(self, node: ZwaveNode) -> bool: try: value = get_zwave_value_from_config(node, self._value_config(self._options)) - except vol.Invalid: + except probatio.Invalid: return False return value_matches_state(value, self._options[ATTR_VALUE]) diff --git a/homeassistant/components/zwave_js/config_flow.py b/homeassistant/components/zwave_js/config_flow.py index 9467d570680ab..3c67c4a67f8dd 100644 --- a/homeassistant/components/zwave_js/config_flow.py +++ b/homeassistant/components/zwave_js/config_flow.py @@ -10,8 +10,8 @@ from typing import Any, Self, cast, override from awesomeversion import AwesomeVersion +import probatio from propcache.api import cached_property -import voluptuous as vol from zwave_js_server.client import Client from zwave_js_server.exceptions import BaseZwaveJSServerError, FailedCommand from zwave_js_server.model.driver import Driver @@ -127,18 +127,20 @@ def to_dict(self) -> dict[str, str | None]: """Return the keys as add-on config options or config entry data.""" return asdict(self) - def get_schema(self, *, suggested: bool = False) -> dict[vol.Optional, type[str]]: + def get_schema( + self, *, suggested: bool = False + ) -> dict[probatio.Optional, type[str]]: """Return a data schema dict for the keys, prefilled from these keys.""" if suggested: return { - vol.Optional( + probatio.Optional( field.name, description={"suggested_value": getattr(self, field.name)}, ): str for field in fields(self) } return { - vol.Optional(field.name, default=getattr(self, field.name)): str + probatio.Optional(field.name, default=getattr(self, field.name)): str for field in fields(self) } @@ -146,7 +148,9 @@ def get_schema(self, *, suggested: bool = False) -> dict[vol.Optional, type[str] CONF_ADDON_RF_REGION = "rf_region" EXAMPLE_SERVER_URL = "ws://localhost:3000" -ON_SUPERVISOR_SCHEMA = vol.Schema({vol.Optional(CONF_USE_ADDON, default=True): bool}) +ON_SUPERVISOR_SCHEMA = probatio.Schema( + {probatio.Optional(CONF_USE_ADDON, default=True): bool} +) MIN_MIGRATION_SDK_VERSION = AwesomeVersion("6.61") # Flags the flow that owns the shared add-on config. Kept in the flow @@ -202,16 +206,18 @@ def get_schema(self, *, suggested: bool = False) -> dict[vol.Optional, type[str] } -def get_manual_schema(user_input: dict[str, Any]) -> vol.Schema: +def get_manual_schema(user_input: dict[str, Any]) -> probatio.Schema: """Return a schema for the manual step.""" default_url = user_input.get(CONF_URL, DEFAULT_URL) - return vol.Schema({vol.Required(CONF_URL, default=default_url): str}) + return probatio.Schema({probatio.Required(CONF_URL, default=default_url): str}) -def get_on_supervisor_schema(user_input: dict[str, Any]) -> vol.Schema: +def get_on_supervisor_schema(user_input: dict[str, Any]) -> probatio.Schema: """Return a schema for the on Supervisor step.""" default_use_addon = user_input[CONF_USE_ADDON] - return vol.Schema({vol.Required(CONF_USE_ADDON, default=default_use_addon): bool}) + return probatio.Schema( + {probatio.Required(CONF_USE_ADDON, default=default_use_addon): bool} + ) async def validate_input(hass: HomeAssistant, user_input: dict) -> VersionInfo: @@ -834,9 +840,9 @@ async def async_step_rf_region( ) return await self.async_step_start_addon() - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required("rf_region"): selector.SelectSelector( + probatio.Required("rf_region"): selector.SelectSelector( selector.SelectSelectorConfig( options=RF_REGIONS, mode=selector.SelectSelectorMode.DROPDOWN, @@ -932,12 +938,12 @@ async def async_step_configure_addon_user( _LOGGER.error("Failed to get USB ports: %s", err) return self.async_abort(reason="usb_ports_failed") - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_USB_PATH, description={"suggested_value": self.usb_path} - ): vol.In(ports), - vol.Optional( + ): probatio.In(ports), + probatio.Optional( CONF_SOCKET_PATH, description={"suggested_value": self.socket_path or ""}, ): str, @@ -1028,9 +1034,9 @@ async def async_step_network_type( return self.async_show_form( step_id="network_type", - data_schema=vol.Schema( + data_schema=probatio.Schema( { - vol.Required("network_type", default=""): vol.In( + probatio.Required("network_type", default=""): probatio.In( [NETWORK_TYPE_NEW, NETWORK_TYPE_EXISTING] ) } @@ -1054,7 +1060,7 @@ async def async_step_configure_security_keys( } return await self.async_step_start_addon() - data_schema = vol.Schema(default_keys.get_schema()) + data_schema = probatio.Schema(default_keys.get_schema()) return self.async_show_form( step_id="configure_security_keys", data_schema=data_schema @@ -1506,12 +1512,12 @@ async def async_step_configure_addon_reconfigure( **ports, } - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Optional( + probatio.Optional( CONF_USB_PATH, description={"suggested_value": usb_path} - ): vol.In(ports), - vol.Optional( + ): probatio.In(ports), + probatio.Optional( CONF_SOCKET_PATH, description={"suggested_value": socket_path} ): str, **default_keys.get_schema(suggested=True), @@ -1560,10 +1566,10 @@ async def async_step_choose_serial_port( **ports, } - data_schema = vol.Schema( + data_schema = probatio.Schema( { - vol.Optional(CONF_USB_PATH): vol.In(ports), - vol.Optional(CONF_SOCKET_PATH): str, + probatio.Optional(CONF_USB_PATH): probatio.In(ports), + probatio.Optional(CONF_SOCKET_PATH): str, } ) return self.async_show_form( diff --git a/homeassistant/components/zwave_js/config_validation.py b/homeassistant/components/zwave_js/config_validation.py index 77c09dae2aced..08e20651efd72 100644 --- a/homeassistant/components/zwave_js/config_validation.py +++ b/homeassistant/components/zwave_js/config_validation.py @@ -2,25 +2,25 @@ from typing import Any -import voluptuous as vol +import probatio from zwave_js_server.const import CommandClass from homeassistant.helpers import config_validation as cv # Validates that a bitmask is provided in hex form and converts it to decimal # int equivalent since that's what the library uses -BITMASK_SCHEMA = vol.All( +BITMASK_SCHEMA = probatio.All( cv.string, - vol.Lower, - vol.Match( + probatio.Lower, + probatio.Match( r"^(0x)?[0-9a-f]+$", msg="Must provide an integer (e.g. 255) or a bitmask in hex form (e.g. 0xff)", ), lambda value: int(value, 16), ) -COMMAND_CLASS_SCHEMA = vol.All( - vol.Coerce(int), vol.In([cc.value for cc in CommandClass]) +COMMAND_CLASS_SCHEMA = probatio.All( + probatio.Coerce(int), probatio.In([cc.value for cc in CommandClass]) ) @@ -34,15 +34,15 @@ def boolean(value: Any) -> bool: return True if value in ("false", "no", "off", "disable"): return False - raise vol.Invalid(f"invalid boolean value {value}") + raise probatio.Invalid(f"invalid boolean value {value}") -VALUE_SCHEMA = vol.Any( +VALUE_SCHEMA = probatio.Any( boolean, int, float, - vol.Coerce(int), - vol.Coerce(float), + probatio.Coerce(int), + probatio.Coerce(float), BITMASK_SCHEMA, cv.string, dict, diff --git a/homeassistant/components/zwave_js/device_action.py b/homeassistant/components/zwave_js/device_action.py index ceaf50e9c003a..2f0db418b6e90 100644 --- a/homeassistant/components/zwave_js/device_action.py +++ b/homeassistant/components/zwave_js/device_action.py @@ -4,7 +4,7 @@ import re from typing import Any -import voluptuous as vol +import probatio from zwave_js_server.const import CommandClass from zwave_js_server.const.command_class.lock import ATTR_CODE_SLOT, ATTR_USERCODE from zwave_js_server.const.command_class.meter import CC_SPECIFIC_METER_TYPE @@ -68,68 +68,70 @@ CLEAR_LOCK_USERCODE_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): SERVICE_CLEAR_LOCK_USERCODE, - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(ATTR_CODE_SLOT): vol.Coerce(int), + probatio.Required(CONF_TYPE): SERVICE_CLEAR_LOCK_USERCODE, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(ATTR_CODE_SLOT): probatio.Coerce(int), } ) PING_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): SERVICE_PING, + probatio.Required(CONF_TYPE): SERVICE_PING, } ) REFRESH_VALUE_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): SERVICE_REFRESH_VALUE, - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Optional(ATTR_REFRESH_ALL_VALUES, default=False): cv.boolean, + probatio.Required(CONF_TYPE): SERVICE_REFRESH_VALUE, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Optional(ATTR_REFRESH_ALL_VALUES, default=False): cv.boolean, } ) RESET_METER_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): SERVICE_RESET_METER, - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Optional(ATTR_METER_TYPE): vol.Coerce(int), - vol.Optional(ATTR_VALUE): vol.Coerce(int), + probatio.Required(CONF_TYPE): SERVICE_RESET_METER, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Optional(ATTR_METER_TYPE): probatio.Coerce(int), + probatio.Optional(ATTR_VALUE): probatio.Coerce(int), } ) SET_CONFIG_PARAMETER_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): SERVICE_SET_CONFIG_PARAMETER, - vol.Required(ATTR_ENDPOINT, default=0): vol.Coerce(int), - vol.Required(ATTR_CONFIG_PARAMETER): vol.Any(int, str), - vol.Required(ATTR_CONFIG_PARAMETER_BITMASK): vol.Any(None, int, str), - vol.Required(ATTR_VALUE): vol.Coerce(int), - vol.Required(CONF_SUBTYPE): cv.string, + probatio.Required(CONF_TYPE): SERVICE_SET_CONFIG_PARAMETER, + probatio.Required(ATTR_ENDPOINT, default=0): probatio.Coerce(int), + probatio.Required(ATTR_CONFIG_PARAMETER): probatio.Any(int, str), + probatio.Required(ATTR_CONFIG_PARAMETER_BITMASK): probatio.Any(None, int, str), + probatio.Required(ATTR_VALUE): probatio.Coerce(int), + probatio.Required(CONF_SUBTYPE): cv.string, } ) SET_LOCK_USERCODE_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): SERVICE_SET_LOCK_USERCODE, - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, - vol.Required(ATTR_CODE_SLOT): vol.Coerce(int), - vol.Required(ATTR_USERCODE): cv.string, + probatio.Required(CONF_TYPE): SERVICE_SET_LOCK_USERCODE, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(ATTR_CODE_SLOT): probatio.Coerce(int), + probatio.Required(ATTR_USERCODE): cv.string, } ) SET_VALUE_SCHEMA = cv.DEVICE_ACTION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): SERVICE_SET_VALUE, - vol.Required(ATTR_COMMAND_CLASS): COMMAND_CLASS_SCHEMA, - vol.Required(ATTR_PROPERTY): vol.Any(int, str), - vol.Optional(ATTR_PROPERTY_KEY): vol.Any(vol.Coerce(int), cv.string), - vol.Optional(ATTR_ENDPOINT): vol.Coerce(int), - vol.Required(ATTR_VALUE): VALUE_SCHEMA, - vol.Optional(ATTR_WAIT_FOR_RESULT, default=False): cv.boolean, + probatio.Required(CONF_TYPE): SERVICE_SET_VALUE, + probatio.Required(ATTR_COMMAND_CLASS): COMMAND_CLASS_SCHEMA, + probatio.Required(ATTR_PROPERTY): probatio.Any(int, str), + probatio.Optional(ATTR_PROPERTY_KEY): probatio.Any( + probatio.Coerce(int), cv.string + ), + probatio.Optional(ATTR_ENDPOINT): probatio.Coerce(int), + probatio.Required(ATTR_VALUE): VALUE_SCHEMA, + probatio.Optional(ATTR_WAIT_FOR_RESULT, default=False): cv.boolean, } ) -_ACTION_SCHEMA = vol.Any( +_ACTION_SCHEMA = probatio.Any( CLEAR_LOCK_USERCODE_SCHEMA, PING_SCHEMA, REFRESH_VALUE_SCHEMA, @@ -283,7 +285,7 @@ async def async_call_action_from_config( async def async_get_action_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List action capabilities.""" action_type = config[CONF_TYPE] node = async_get_node_from_device_id(hass, config[CONF_DEVICE_ID]) @@ -291,46 +293,46 @@ async def async_get_action_capabilities( # Add additional fields to the automation action UI if action_type == SERVICE_CLEAR_LOCK_USERCODE: return { - "extra_fields": vol.Schema( + "extra_fields": probatio.Schema( { - vol.Required(ATTR_CODE_SLOT): cv.string, + probatio.Required(ATTR_CODE_SLOT): cv.string, } ) } if action_type == SERVICE_SET_LOCK_USERCODE: return { - "extra_fields": vol.Schema( + "extra_fields": probatio.Schema( { - vol.Required(ATTR_CODE_SLOT): cv.string, - vol.Required(ATTR_USERCODE): cv.string, + probatio.Required(ATTR_CODE_SLOT): cv.string, + probatio.Required(ATTR_USERCODE): cv.string, } ) } if action_type == SERVICE_RESET_METER: return { - "extra_fields": vol.Schema( + "extra_fields": probatio.Schema( { - vol.Optional(ATTR_VALUE): cv.string, + probatio.Optional(ATTR_VALUE): cv.string, } ) } if action_type == SERVICE_REFRESH_VALUE: return { - "extra_fields": vol.Schema( + "extra_fields": probatio.Schema( { - vol.Optional(ATTR_REFRESH_ALL_VALUES): cv.boolean, + probatio.Optional(ATTR_REFRESH_ALL_VALUES): cv.boolean, } ) } if action_type == SERVICE_SET_VALUE: return { - "extra_fields": vol.Schema( + "extra_fields": probatio.Schema( { - vol.Required(ATTR_COMMAND_CLASS): vol.In( + probatio.Required(ATTR_COMMAND_CLASS): probatio.In( { str(CommandClass(cc.id).value): cc.name for cc in sorted( @@ -338,11 +340,11 @@ async def async_get_action_capabilities( ) } ), - vol.Required(ATTR_PROPERTY): cv.string, - vol.Optional(ATTR_PROPERTY_KEY): cv.string, - vol.Optional(ATTR_ENDPOINT): cv.string, - vol.Required(ATTR_VALUE): cv.string, - vol.Optional(ATTR_WAIT_FOR_RESULT): cv.boolean, + probatio.Required(ATTR_PROPERTY): cv.string, + probatio.Optional(ATTR_PROPERTY_KEY): cv.string, + probatio.Optional(ATTR_ENDPOINT): cv.string, + probatio.Required(ATTR_VALUE): cv.string, + probatio.Optional(ATTR_WAIT_FOR_RESULT): cv.boolean, } ) } @@ -358,6 +360,10 @@ async def async_get_action_capabilities( value_schema = get_value_state_schema(node.values[value_id]) if value_schema is None: return {} - return {"extra_fields": vol.Schema({vol.Required(ATTR_VALUE): value_schema})} + return { + "extra_fields": probatio.Schema( + {probatio.Required(ATTR_VALUE): value_schema} + ) + } return {} diff --git a/homeassistant/components/zwave_js/device_condition.py b/homeassistant/components/zwave_js/device_condition.py index 3d04d613fc25d..972c8b263aada 100644 --- a/homeassistant/components/zwave_js/device_condition.py +++ b/homeassistant/components/zwave_js/device_condition.py @@ -1,6 +1,6 @@ """Provide the device conditions for Z-Wave JS.""" -import voluptuous as vol +import probatio from zwave_js_server.const import CommandClass from homeassistant.components.device_automation import InvalidDeviceAutomationConfig @@ -45,28 +45,30 @@ NODE_STATUS_CONDITION_SCHEMA = cv.DEVICE_CONDITION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): NODE_STATUS_TYPE, - vol.Required(CONF_STATUS): vol.In(NODE_STATUSES), + probatio.Required(CONF_TYPE): NODE_STATUS_TYPE, + probatio.Required(CONF_STATUS): probatio.In(NODE_STATUSES), } ) CONFIG_PARAMETER_CONDITION_SCHEMA = cv.DEVICE_CONDITION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): CONFIG_PARAMETER_TYPE, - vol.Required(CONF_VALUE_ID): cv.string, - vol.Required(CONF_SUBTYPE): cv.string, - vol.Optional(ATTR_VALUE): vol.Coerce(int), + probatio.Required(CONF_TYPE): CONFIG_PARAMETER_TYPE, + probatio.Required(CONF_VALUE_ID): cv.string, + probatio.Required(CONF_SUBTYPE): cv.string, + probatio.Optional(ATTR_VALUE): probatio.Coerce(int), } ) VALUE_CONDITION_SCHEMA = cv.DEVICE_CONDITION_BASE_SCHEMA.extend( { - vol.Required(CONF_TYPE): VALUE_TYPE, - vol.Required(ATTR_COMMAND_CLASS): COMMAND_CLASS_SCHEMA, - vol.Required(ATTR_PROPERTY): vol.Any(vol.Coerce(int), cv.string), - vol.Optional(ATTR_PROPERTY_KEY): vol.Any(vol.Coerce(int), cv.string), - vol.Optional(ATTR_ENDPOINT): vol.Coerce(int), - vol.Required(ATTR_VALUE): VALUE_SCHEMA, + probatio.Required(CONF_TYPE): VALUE_TYPE, + probatio.Required(ATTR_COMMAND_CLASS): COMMAND_CLASS_SCHEMA, + probatio.Required(ATTR_PROPERTY): probatio.Any(probatio.Coerce(int), cv.string), + probatio.Optional(ATTR_PROPERTY_KEY): probatio.Any( + probatio.Coerce(int), cv.string + ), + probatio.Optional(ATTR_ENDPOINT): probatio.Coerce(int), + probatio.Required(ATTR_VALUE): VALUE_SCHEMA, } ) @@ -77,11 +79,12 @@ } -CONDITION_TYPE_SCHEMA = vol.Schema( - {vol.Required(CONF_TYPE): vol.In(TYPE_SCHEMA_MAP)}, extra=vol.ALLOW_EXTRA +CONDITION_TYPE_SCHEMA = probatio.Schema( + {probatio.Required(CONF_TYPE): probatio.In(TYPE_SCHEMA_MAP)}, + extra=probatio.ALLOW_EXTRA, ) -CONDITION_SCHEMA = vol.All( +CONDITION_SCHEMA = probatio.All( remove_keys_with_empty_values, CONDITION_TYPE_SCHEMA, check_type_schema_map(TYPE_SCHEMA_MAP), @@ -112,7 +115,7 @@ async def async_validate_condition_config( try: node = async_get_node_from_device_id(hass, config[CONF_DEVICE_ID]) get_zwave_value_from_config(node, config) - except vol.Invalid as err: + except probatio.Invalid as err: raise InvalidDeviceAutomationConfig(err.msg) from err return config @@ -199,7 +202,7 @@ def test_value(hass: HomeAssistant, variables: TemplateVarsType) -> bool: async def async_get_condition_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List condition capabilities.""" device_id = config[CONF_DEVICE_ID] node = async_get_node_from_device_id(hass, device_id) @@ -210,15 +213,19 @@ async def async_get_condition_capabilities( value_schema = get_value_state_schema(node.values[value_id]) if value_schema is None: return {} - return {"extra_fields": vol.Schema({vol.Required(ATTR_VALUE): value_schema})} + return { + "extra_fields": probatio.Schema( + {probatio.Required(ATTR_VALUE): value_schema} + ) + } if config[CONF_TYPE] == VALUE_TYPE: # Only show command classes on this node and exclude Configuration CC since it # is already covered return { - "extra_fields": vol.Schema( + "extra_fields": probatio.Schema( { - vol.Required(ATTR_COMMAND_CLASS): vol.In( + probatio.Required(ATTR_COMMAND_CLASS): probatio.In( { str(CommandClass(cc.id).value): cc.name for cc in sorted( @@ -227,18 +234,18 @@ async def async_get_condition_capabilities( if cc.id != CommandClass.CONFIGURATION } ), - vol.Required(ATTR_PROPERTY): cv.string, - vol.Optional(ATTR_PROPERTY_KEY): cv.string, - vol.Optional(ATTR_ENDPOINT): cv.string, - vol.Required(ATTR_VALUE): cv.string, + probatio.Required(ATTR_PROPERTY): cv.string, + probatio.Optional(ATTR_PROPERTY_KEY): cv.string, + probatio.Optional(ATTR_ENDPOINT): cv.string, + probatio.Required(ATTR_VALUE): cv.string, } ) } if config[CONF_TYPE] == NODE_STATUS_TYPE: return { - "extra_fields": vol.Schema( - {vol.Required(CONF_STATUS): vol.In(NODE_STATUSES)} + "extra_fields": probatio.Schema( + {probatio.Required(CONF_STATUS): probatio.In(NODE_STATUSES)} ) } diff --git a/homeassistant/components/zwave_js/device_trigger.py b/homeassistant/components/zwave_js/device_trigger.py index a54f7b9df759d..16dbe1dc268ae 100644 --- a/homeassistant/components/zwave_js/device_trigger.py +++ b/homeassistant/components/zwave_js/device_trigger.py @@ -3,7 +3,7 @@ import asyncio from typing import Any -import voluptuous as vol +import probatio from zwave_js_server.const import CommandClass from homeassistant.components.device_automation import ( @@ -89,54 +89,54 @@ # Event based trigger schemas BASE_EVENT_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(ATTR_COMMAND_CLASS): COMMAND_CLASS_SCHEMA, + probatio.Required(ATTR_COMMAND_CLASS): COMMAND_CLASS_SCHEMA, } ) NOTIFICATION_NOTIFICATION_SCHEMA = BASE_EVENT_SCHEMA.extend( { - vol.Required(CONF_TYPE): NOTIFICATION_NOTIFICATION, - vol.Optional(f"{ATTR_TYPE}."): vol.Coerce(int), - vol.Optional(ATTR_LABEL): cv.string, - vol.Optional(ATTR_EVENT): vol.Coerce(int), - vol.Optional(ATTR_EVENT_LABEL): cv.string, + probatio.Required(CONF_TYPE): NOTIFICATION_NOTIFICATION, + probatio.Optional(f"{ATTR_TYPE}."): probatio.Coerce(int), + probatio.Optional(ATTR_LABEL): cv.string, + probatio.Optional(ATTR_EVENT): probatio.Coerce(int), + probatio.Optional(ATTR_EVENT_LABEL): cv.string, } ) ENTRY_CONTROL_NOTIFICATION_SCHEMA = BASE_EVENT_SCHEMA.extend( { - vol.Required(CONF_TYPE): ENTRY_CONTROL_NOTIFICATION, - vol.Optional(ATTR_EVENT_TYPE): vol.Coerce(int), - vol.Optional(ATTR_DATA_TYPE): vol.Coerce(int), + probatio.Required(CONF_TYPE): ENTRY_CONTROL_NOTIFICATION, + probatio.Optional(ATTR_EVENT_TYPE): probatio.Coerce(int), + probatio.Optional(ATTR_DATA_TYPE): probatio.Coerce(int), } ) BASE_VALUE_NOTIFICATION_EVENT_SCHEMA = BASE_EVENT_SCHEMA.extend( { - vol.Required(ATTR_PROPERTY): vol.Any(int, str), - vol.Optional(ATTR_PROPERTY_KEY): vol.Any(int, str), - vol.Required(ATTR_ENDPOINT): vol.Coerce(int), - vol.Optional(ATTR_VALUE): vol.Coerce(int), - vol.Required(CONF_SUBTYPE): cv.string, + probatio.Required(ATTR_PROPERTY): probatio.Any(int, str), + probatio.Optional(ATTR_PROPERTY_KEY): probatio.Any(int, str), + probatio.Required(ATTR_ENDPOINT): probatio.Coerce(int), + probatio.Optional(ATTR_VALUE): probatio.Coerce(int), + probatio.Required(CONF_SUBTYPE): cv.string, } ) BASIC_VALUE_NOTIFICATION_SCHEMA = BASE_VALUE_NOTIFICATION_EVENT_SCHEMA.extend( { - vol.Required(CONF_TYPE): BASIC_VALUE_NOTIFICATION, + probatio.Required(CONF_TYPE): BASIC_VALUE_NOTIFICATION, } ) CENTRAL_SCENE_VALUE_NOTIFICATION_SCHEMA = BASE_VALUE_NOTIFICATION_EVENT_SCHEMA.extend( { - vol.Required(CONF_TYPE): CENTRAL_SCENE_VALUE_NOTIFICATION, + probatio.Required(CONF_TYPE): CENTRAL_SCENE_VALUE_NOTIFICATION, } ) SCENE_ACTIVATION_VALUE_NOTIFICATION_SCHEMA = ( BASE_VALUE_NOTIFICATION_EVENT_SCHEMA.extend( { - vol.Required(CONF_TYPE): SCENE_ACTIVATION_VALUE_NOTIFICATION, + probatio.Required(CONF_TYPE): SCENE_ACTIVATION_VALUE_NOTIFICATION, } ) ) @@ -144,41 +144,45 @@ # State based trigger schemas BASE_STATE_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, + probatio.Required(CONF_ENTITY_ID): cv.entity_id_or_uuid, } ) NODE_STATUS_SCHEMA = BASE_STATE_SCHEMA.extend( { - vol.Required(CONF_TYPE): NODE_STATUS, - vol.Optional(state.CONF_FROM): vol.In(NODE_STATUSES), - vol.Optional(state.CONF_TO): vol.In(NODE_STATUSES), - vol.Optional(state.CONF_FOR): cv.positive_time_period_dict, + probatio.Required(CONF_TYPE): NODE_STATUS, + probatio.Optional(state.CONF_FROM): probatio.In(NODE_STATUSES), + probatio.Optional(state.CONF_TO): probatio.In(NODE_STATUSES), + probatio.Optional(state.CONF_FOR): cv.positive_time_period_dict, } ) # zwave_js.value_updated based trigger schemas BASE_VALUE_UPDATED_SCHEMA = DEVICE_TRIGGER_BASE_SCHEMA.extend( { - vol.Required(ATTR_COMMAND_CLASS): COMMAND_CLASS_SCHEMA, - vol.Required(ATTR_PROPERTY): vol.Any(int, str), - vol.Optional(ATTR_PROPERTY_KEY): vol.Any(None, vol.Coerce(int), str), - vol.Optional(ATTR_ENDPOINT, default=0): vol.Any(None, vol.Coerce(int)), - vol.Optional(ATTR_FROM): VALUE_SCHEMA, - vol.Optional(ATTR_TO): VALUE_SCHEMA, + probatio.Required(ATTR_COMMAND_CLASS): COMMAND_CLASS_SCHEMA, + probatio.Required(ATTR_PROPERTY): probatio.Any(int, str), + probatio.Optional(ATTR_PROPERTY_KEY): probatio.Any( + None, probatio.Coerce(int), str + ), + probatio.Optional(ATTR_ENDPOINT, default=0): probatio.Any( + None, probatio.Coerce(int) + ), + probatio.Optional(ATTR_FROM): VALUE_SCHEMA, + probatio.Optional(ATTR_TO): VALUE_SCHEMA, } ) CONFIG_PARAMETER_VALUE_UPDATED_SCHEMA = BASE_VALUE_UPDATED_SCHEMA.extend( { - vol.Required(CONF_TYPE): CONFIG_PARAMETER_VALUE_UPDATED, - vol.Required(CONF_SUBTYPE): cv.string, + probatio.Required(CONF_TYPE): CONFIG_PARAMETER_VALUE_UPDATED, + probatio.Required(CONF_SUBTYPE): cv.string, } ) VALUE_VALUE_UPDATED_SCHEMA = BASE_VALUE_UPDATED_SCHEMA.extend( { - vol.Required(CONF_TYPE): VALUE_VALUE_UPDATED, + probatio.Required(CONF_TYPE): VALUE_VALUE_UPDATED, } ) @@ -194,11 +198,12 @@ } -TRIGGER_TYPE_SCHEMA = vol.Schema( - {vol.Required(CONF_TYPE): vol.In(TYPE_SCHEMA_MAP)}, extra=vol.ALLOW_EXTRA +TRIGGER_TYPE_SCHEMA = probatio.Schema( + {probatio.Required(CONF_TYPE): probatio.In(TYPE_SCHEMA_MAP)}, + extra=probatio.ALLOW_EXTRA, ) -TRIGGER_SCHEMA = vol.All( +TRIGGER_SCHEMA = probatio.All( remove_keys_with_empty_values, TRIGGER_TYPE_SCHEMA, check_type_schema_map(TYPE_SCHEMA_MAP), @@ -230,7 +235,7 @@ async def async_validate_trigger_config( try: node = async_get_node_from_device_id(hass, config[CONF_DEVICE_ID]) get_zwave_value_from_config(node, config) - except vol.Invalid as err: + except probatio.Invalid as err: raise InvalidDeviceAutomationConfig(err.msg) from err return config @@ -482,7 +487,7 @@ def run_action( async def async_get_trigger_capabilities( hass: HomeAssistant, config: ConfigType -) -> dict[str, vol.Schema]: +) -> dict[str, probatio.Schema]: """List trigger capabilities.""" trigger_type = config[CONF_TYPE] @@ -491,33 +496,33 @@ async def async_get_trigger_capabilities( # Add additional fields to the automation trigger UI if trigger_type == NOTIFICATION_NOTIFICATION: return { - "extra_fields": vol.Schema( + "extra_fields": probatio.Schema( { - vol.Optional(f"{ATTR_TYPE}."): cv.string, - vol.Optional(ATTR_LABEL): cv.string, - vol.Optional(ATTR_EVENT): cv.string, - vol.Optional(ATTR_EVENT_LABEL): cv.string, + probatio.Optional(f"{ATTR_TYPE}."): cv.string, + probatio.Optional(ATTR_LABEL): cv.string, + probatio.Optional(ATTR_EVENT): cv.string, + probatio.Optional(ATTR_EVENT_LABEL): cv.string, } ) } if trigger_type == ENTRY_CONTROL_NOTIFICATION: return { - "extra_fields": vol.Schema( + "extra_fields": probatio.Schema( { - vol.Optional(ATTR_EVENT_TYPE): cv.string, - vol.Optional(ATTR_DATA_TYPE): cv.string, + probatio.Optional(ATTR_EVENT_TYPE): cv.string, + probatio.Optional(ATTR_DATA_TYPE): cv.string, } ) } if trigger_type == NODE_STATUS: return { - "extra_fields": vol.Schema( + "extra_fields": probatio.Schema( { - vol.Optional(state.CONF_FROM): vol.In(NODE_STATUSES), - vol.Optional(state.CONF_TO): vol.In(NODE_STATUSES), - vol.Optional(state.CONF_FOR): cv.positive_time_period_dict, + probatio.Optional(state.CONF_FROM): probatio.In(NODE_STATUSES), + probatio.Optional(state.CONF_TO): probatio.In(NODE_STATUSES), + probatio.Optional(state.CONF_FOR): cv.positive_time_period_dict, } ) } @@ -533,17 +538,21 @@ async def async_get_trigger_capabilities( if not value_schema: return {} - return {"extra_fields": vol.Schema({vol.Optional(ATTR_VALUE): value_schema})} + return { + "extra_fields": probatio.Schema( + {probatio.Optional(ATTR_VALUE): value_schema} + ) + } if trigger_type == CONFIG_PARAMETER_VALUE_UPDATED: value_schema = get_value_state_schema(get_zwave_value_from_config(node, config)) if not value_schema: return {} return { - "extra_fields": vol.Schema( + "extra_fields": probatio.Schema( { - vol.Optional(ATTR_FROM): value_schema, - vol.Optional(ATTR_TO): value_schema, + probatio.Optional(ATTR_FROM): value_schema, + probatio.Optional(ATTR_TO): value_schema, } ) } @@ -552,9 +561,9 @@ async def async_get_trigger_capabilities( # Only show command classes on this node and exclude Configuration CC since it # is already covered return { - "extra_fields": vol.Schema( + "extra_fields": probatio.Schema( { - vol.Required(ATTR_COMMAND_CLASS): vol.In( + probatio.Required(ATTR_COMMAND_CLASS): probatio.In( { str(CommandClass(cc.id).value): cc.name for cc in sorted( @@ -563,11 +572,11 @@ async def async_get_trigger_capabilities( if cc.id != CommandClass.CONFIGURATION } ), - vol.Required(ATTR_PROPERTY): cv.string, - vol.Optional(ATTR_PROPERTY_KEY): cv.string, - vol.Optional(ATTR_ENDPOINT): cv.string, - vol.Optional(ATTR_FROM): cv.string, - vol.Optional(ATTR_TO): cv.string, + probatio.Required(ATTR_PROPERTY): cv.string, + probatio.Optional(ATTR_PROPERTY_KEY): cv.string, + probatio.Optional(ATTR_ENDPOINT): cv.string, + probatio.Optional(ATTR_FROM): cv.string, + probatio.Optional(ATTR_TO): cv.string, } ) } diff --git a/homeassistant/components/zwave_js/helpers.py b/homeassistant/components/zwave_js/helpers.py index d6d19a1959042..15f836c054817 100644 --- a/homeassistant/components/zwave_js/helpers.py +++ b/homeassistant/components/zwave_js/helpers.py @@ -7,7 +7,7 @@ from typing import Any, cast import aiohttp -import voluptuous as vol +import probatio from zwave_js_server.const import ( LOG_LEVEL_MAP, CommandClass, @@ -480,7 +480,7 @@ def get_zwave_value_from_config(node: ZwaveNode, config: ConfigType) -> ZwaveVal property_key, ) if value_id not in node.values: - raise vol.Invalid(f"Value {value_id} can't be found on node {node}") + raise probatio.Invalid(f"Value {value_id} can't be found on node {node}") return node.values[value_id] @@ -544,7 +544,7 @@ def remove_keys_with_empty_values(config: ConfigType) -> ConfigType: def check_type_schema_map( - schema_map: dict[str, vol.Schema], + schema_map: dict[str, probatio.Schema], ) -> Callable[[ConfigType], ConfigType]: """Check type specific schema against config.""" @@ -566,7 +566,7 @@ def copy_available_params( def get_value_state_schema( value: ZwaveValue, -) -> VolSchemaType | vol.Coerce | vol.In | None: +) -> VolSchemaType | probatio.Coerce | probatio.In | None: """Return device automation schema for a config entry.""" if isinstance(value, ConfigurationValue): min_ = value.metadata.min @@ -575,22 +575,26 @@ def get_value_state_schema( ConfigurationValueType.RANGE, ConfigurationValueType.MANUAL_ENTRY, ): - return vol.All(vol.Coerce(int), vol.Range(min=min_, max=max_)) + return probatio.All( + probatio.Coerce(int), probatio.Range(min=min_, max=max_) + ) if value.configuration_value_type == ConfigurationValueType.BOOLEAN: - return vol.Coerce(bool) + return probatio.Coerce(bool) if value.configuration_value_type == ConfigurationValueType.ENUMERATED: - return vol.In({str(int(k)): v for k, v in value.metadata.states.items()}) + return probatio.In( + {str(int(k)): v for k, v in value.metadata.states.items()} + ) return None if value.metadata.states: - return vol.In({str(int(k)): v for k, v in value.metadata.states.items()}) + return probatio.In({str(int(k)): v for k, v in value.metadata.states.items()}) - return vol.All( - vol.Coerce(int), - vol.Range(min=value.metadata.min, max=value.metadata.max), + return probatio.All( + probatio.Coerce(int), + probatio.Range(min=value.metadata.min, max=value.metadata.max), ) diff --git a/homeassistant/components/zwave_js/sensor.py b/homeassistant/components/zwave_js/sensor.py index ddb8b5df63f57..ec9bc6c13bc1d 100644 --- a/homeassistant/components/zwave_js/sensor.py +++ b/homeassistant/components/zwave_js/sensor.py @@ -5,7 +5,7 @@ from enum import IntEnum from typing import Any, cast, override -import voluptuous as vol +import probatio from zwave_js_server.const import CommandClass, RssiError from zwave_js_server.const.command_class.energy_production import ( CC_SPECIFIC_PARAMETER, @@ -730,8 +730,8 @@ def async_add_statistics_sensors(node: ZwaveNode) -> None: platform.async_register_entity_service( SERVICE_RESET_METER, { - vol.Optional(ATTR_METER_TYPE): vol.Coerce(int), - vol.Optional(ATTR_VALUE): vol.Coerce(int), + probatio.Optional(ATTR_METER_TYPE): probatio.Coerce(int), + probatio.Optional(ATTR_VALUE): probatio.Coerce(int), }, "async_reset_meter", ) diff --git a/homeassistant/components/zwave_js/services.py b/homeassistant/components/zwave_js/services.py index f958ef62e7573..eafda9ce28e07 100644 --- a/homeassistant/components/zwave_js/services.py +++ b/homeassistant/components/zwave_js/services.py @@ -6,7 +6,7 @@ import math from typing import Any -import voluptuous as vol +import probatio from zwave_js_server.client import Client as ZwaveClient from zwave_js_server.const import SET_VALUE_SUCCESS, CommandClass, CommandStatus from zwave_js_server.const.command_class.lock import ( @@ -57,12 +57,12 @@ type _NodeOrEndpointType = ZwaveNode | Endpoint -UNIT16_SCHEMA = vol.All(vol.Coerce(int), vol.Range(min=0, max=65535)) +UNIT16_SCHEMA = probatio.All(probatio.Coerce(int), probatio.Range(min=0, max=65535)) TARGET_VALIDATORS = { - vol.Optional(ATTR_AREA_ID): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(ATTR_DEVICE_ID): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(ATTR_ENTITY_ID): cv.entity_ids, + probatio.Optional(ATTR_AREA_ID): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(ATTR_DEVICE_ID): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(ATTR_ENTITY_ID): cv.entity_ids, } @@ -77,7 +77,7 @@ def async_setup_services(hass: HomeAssistant) -> None: @callback def _async_register_credential_services(hass: HomeAssistant) -> None: """Register lock-entity credential platform services.""" - uint16_id = vol.All(vol.Coerce(int), vol.Range(min=1, max=65535)) + uint16_id = probatio.All(probatio.Coerce(int), probatio.Range(min=1, max=65535)) async_register_platform_entity_service( hass, @@ -86,18 +86,20 @@ def _async_register_credential_services(hass: HomeAssistant) -> None: admin_only=True, entity_domain=LOCK_DOMAIN, schema={ - vol.Optional(const.ATTR_USER_ID): uint16_id, - vol.Optional(const.ATTR_USER_NAME): cv.string, - vol.Optional(const.ATTR_USER_TYPE): vol.In(USER_TYPE_REVERSE_MAP.keys()), - vol.Optional(const.ATTR_CREDENTIAL_RULE): vol.In( + probatio.Optional(const.ATTR_USER_ID): uint16_id, + probatio.Optional(const.ATTR_USER_NAME): cv.string, + probatio.Optional(const.ATTR_USER_TYPE): probatio.In( + USER_TYPE_REVERSE_MAP.keys() + ), + probatio.Optional(const.ATTR_CREDENTIAL_RULE): probatio.In( CREDENTIAL_RULE_REVERSE_MAP.keys() ), - vol.Optional(const.ATTR_USER_ACTIVE): cv.boolean, - vol.Inclusive(const.ATTR_CREDENTIAL_TYPE, "credential"): vol.In( + probatio.Optional(const.ATTR_USER_ACTIVE): cv.boolean, + probatio.Inclusive(const.ATTR_CREDENTIAL_TYPE, "credential"): probatio.In( const.WRITABLE_CREDENTIAL_TYPES ), - vol.Optional(const.ATTR_CREDENTIAL_SLOT): uint16_id, - vol.Inclusive(const.ATTR_CREDENTIAL_DATA, "credential"): cv.string, + probatio.Optional(const.ATTR_CREDENTIAL_SLOT): uint16_id, + probatio.Inclusive(const.ATTR_CREDENTIAL_DATA, "credential"): cv.string, }, func="async_set_user", supports_response=SupportsResponse.ONLY, @@ -109,7 +111,7 @@ def _async_register_credential_services(hass: HomeAssistant) -> None: "delete_user", admin_only=True, entity_domain=LOCK_DOMAIN, - schema={vol.Required(const.ATTR_USER_ID): uint16_id}, + schema={probatio.Required(const.ATTR_USER_ID): uint16_id}, func="async_delete_user", ) @@ -150,12 +152,12 @@ def _async_register_credential_services(hass: HomeAssistant) -> None: admin_only=True, entity_domain=LOCK_DOMAIN, schema={ - vol.Required(const.ATTR_USER_ID): uint16_id, - vol.Required(const.ATTR_CREDENTIAL_TYPE): vol.In( + probatio.Required(const.ATTR_USER_ID): uint16_id, + probatio.Required(const.ATTR_CREDENTIAL_TYPE): probatio.In( const.WRITABLE_CREDENTIAL_TYPES ), - vol.Required(const.ATTR_CREDENTIAL_DATA): cv.string, - vol.Optional(const.ATTR_CREDENTIAL_SLOT): uint16_id, + probatio.Required(const.ATTR_CREDENTIAL_DATA): cv.string, + probatio.Optional(const.ATTR_CREDENTIAL_SLOT): uint16_id, }, func="async_set_credential", supports_response=SupportsResponse.ONLY, @@ -168,11 +170,11 @@ def _async_register_credential_services(hass: HomeAssistant) -> None: admin_only=True, entity_domain=LOCK_DOMAIN, schema={ - vol.Required(const.ATTR_USER_ID): uint16_id, - vol.Required(const.ATTR_CREDENTIAL_TYPE): vol.In( + probatio.Required(const.ATTR_USER_ID): uint16_id, + probatio.Required(const.ATTR_CREDENTIAL_TYPE): probatio.In( const.WRITABLE_CREDENTIAL_TYPES ), - vol.Required(const.ATTR_CREDENTIAL_SLOT): uint16_id, + probatio.Required(const.ATTR_CREDENTIAL_SLOT): uint16_id, }, func="async_delete_credential", ) @@ -183,7 +185,7 @@ def _async_register_credential_services(hass: HomeAssistant) -> None: "delete_all_credentials", admin_only=True, entity_domain=LOCK_DOMAIN, - schema={vol.Required(const.ATTR_USER_ID): uint16_id}, + schema={probatio.Required(const.ATTR_USER_ID): uint16_id}, func="async_delete_all_credentials", ) @@ -196,7 +198,7 @@ def parameter_name_does_not_need_bitmask( isinstance(val[const.ATTR_CONFIG_PARAMETER], str) and const.ATTR_CONFIG_PARAMETER_BITMASK in val ): - raise vol.Invalid( + raise probatio.Invalid( "Don't include a bitmask when a parameter name is specified", path=[const.ATTR_CONFIG_PARAMETER, const.ATTR_CONFIG_PARAMETER_BITMASK], ) @@ -206,7 +208,7 @@ def parameter_name_does_not_need_bitmask( def check_base_2(val: int) -> int: """Check if value is a power of 2.""" if not math.log2(val).is_integer(): - raise vol.Invalid("Value must be a power of 2.") + raise probatio.Invalid("Value must be a power of 2.") return val @@ -214,7 +216,7 @@ def broadcast_command(val: dict[str, Any]) -> dict[str, Any]: """Validate that the service call is for a broadcast command.""" if val.get(const.ATTR_BROADCAST): return val - raise vol.Invalid( + raise probatio.Invalid( "Either `broadcast` must be set to True or multiple devices/entities must be " "specified" ) @@ -326,7 +328,9 @@ def get_nodes_from_service_data(val: dict[str, Any]) -> dict[str, Any]: def has_at_least_one_node(val: dict[str, Any]) -> dict[str, Any]: """Validate that at least one node is specified.""" if not val.get(const.ATTR_NODES): - raise vol.Invalid(f"No {const.DOMAIN} nodes found for given targets") + raise probatio.Invalid( + f"No {const.DOMAIN} nodes found for given targets" + ) return val @callback @@ -345,14 +349,14 @@ def validate_multicast_nodes(val: dict[str, Any]) -> dict[str, Any]: and not nodes and len(self._hass.config_entries.async_entries(const.DOMAIN)) > 1 ): - raise vol.Invalid( + raise probatio.Invalid( "You must include at least one entity or device in the service call" ) first_node = next((node for node in nodes), None) if first_node and not all(node.client.driver is not None for node in nodes): - raise vol.Invalid(f"Driver not ready for all nodes: {nodes}") + raise probatio.Invalid(f"Driver not ready for all nodes: {nodes}") # If any nodes don't have matching home IDs, we can't run the command # because we can't multicast across multiple networks @@ -366,7 +370,7 @@ def validate_multicast_nodes(val: dict[str, Any]) -> dict[str, Any]: if node.client.driver is not None ) ): - raise vol.Invalid( + raise probatio.Invalid( "Multicast commands only work on devices in the same network" ) @@ -389,7 +393,9 @@ def validate_entities(val: dict[str, Any]) -> dict[str, Any]: val[ATTR_ENTITY_ID] = list(set(val[ATTR_ENTITY_ID]) - set(invalid_entities)) if not val[ATTR_ENTITY_ID]: - raise vol.Invalid(f"No {const.DOMAIN} entities found in service call") + raise probatio.Invalid( + f"No {const.DOMAIN} entities found in service call" + ) return val @@ -397,26 +403,30 @@ def validate_entities(val: dict[str, Any]) -> dict[str, Any]: const.DOMAIN, const.SERVICE_SET_CONFIG_PARAMETER, self.async_set_config_parameter, - schema=vol.Schema( - vol.All( + schema=probatio.Schema( + probatio.All( { **TARGET_VALIDATORS, - vol.Optional(const.ATTR_ENDPOINT, default=0): vol.Coerce(int), - vol.Required(const.ATTR_CONFIG_PARAMETER): vol.Any( - vol.Coerce(int), cv.string - ), - vol.Optional(const.ATTR_CONFIG_PARAMETER_BITMASK): vol.Any( - vol.Coerce(int), BITMASK_SCHEMA - ), - vol.Required(const.ATTR_CONFIG_VALUE): vol.Any( - vol.Coerce(int), BITMASK_SCHEMA, cv.string + probatio.Optional( + const.ATTR_ENDPOINT, default=0 + ): probatio.Coerce(int), + probatio.Required(const.ATTR_CONFIG_PARAMETER): probatio.Any( + probatio.Coerce(int), cv.string ), - vol.Inclusive(const.ATTR_VALUE_SIZE, "raw"): vol.All( - vol.Coerce(int), vol.Range(min=1, max=4), check_base_2 + probatio.Optional( + const.ATTR_CONFIG_PARAMETER_BITMASK + ): probatio.Any(probatio.Coerce(int), BITMASK_SCHEMA), + probatio.Required(const.ATTR_CONFIG_VALUE): probatio.Any( + probatio.Coerce(int), BITMASK_SCHEMA, cv.string ), - vol.Inclusive(const.ATTR_VALUE_FORMAT, "raw"): vol.Coerce( - ConfigurationValueFormat + probatio.Inclusive(const.ATTR_VALUE_SIZE, "raw"): probatio.All( + probatio.Coerce(int), + probatio.Range(min=1, max=4), + check_base_2, ), + probatio.Inclusive( + const.ATTR_VALUE_FORMAT, "raw" + ): probatio.Coerce(ConfigurationValueFormat), }, cv.has_at_least_one_key( ATTR_DEVICE_ID, ATTR_ENTITY_ID, ATTR_AREA_ID @@ -435,18 +445,24 @@ def validate_entities(val: dict[str, Any]) -> dict[str, Any]: const.DOMAIN, const.SERVICE_BULK_SET_PARTIAL_CONFIG_PARAMETERS, self.async_bulk_set_partial_config_parameters, - schema=vol.Schema( - vol.All( + schema=probatio.Schema( + probatio.All( { **TARGET_VALIDATORS, - vol.Optional(const.ATTR_ENDPOINT, default=0): vol.Coerce(int), - vol.Required(const.ATTR_CONFIG_PARAMETER): vol.Coerce(int), - vol.Required(const.ATTR_CONFIG_VALUE): vol.Any( - vol.Coerce(int), + probatio.Optional( + const.ATTR_ENDPOINT, default=0 + ): probatio.Coerce(int), + probatio.Required(const.ATTR_CONFIG_PARAMETER): probatio.Coerce( + int + ), + probatio.Required(const.ATTR_CONFIG_VALUE): probatio.Any( + probatio.Coerce(int), { - vol.Any( - vol.Coerce(int), BITMASK_SCHEMA, cv.string - ): vol.Any(vol.Coerce(int), BITMASK_SCHEMA, cv.string) + probatio.Any( + probatio.Coerce(int), BITMASK_SCHEMA, cv.string + ): probatio.Any( + probatio.Coerce(int), BITMASK_SCHEMA, cv.string + ) }, ), }, @@ -463,11 +479,11 @@ def validate_entities(val: dict[str, Any]) -> dict[str, Any]: const.DOMAIN, const.SERVICE_REFRESH_VALUE, self.async_poll_value, - schema=vol.Schema( - vol.All( + schema=probatio.Schema( + probatio.All( { - vol.Required(ATTR_ENTITY_ID): cv.entity_ids, - vol.Optional( + probatio.Required(ATTR_ENTITY_ID): cv.entity_ids, + probatio.Optional( const.ATTR_REFRESH_ALL_VALUES, default=False ): cv.boolean, }, @@ -480,21 +496,25 @@ def validate_entities(val: dict[str, Any]) -> dict[str, Any]: const.DOMAIN, const.SERVICE_SET_VALUE, self.async_set_value, - schema=vol.Schema( - vol.All( + schema=probatio.Schema( + probatio.All( { **TARGET_VALIDATORS, - vol.Required(const.ATTR_COMMAND_CLASS): vol.Coerce(int), - vol.Required(const.ATTR_PROPERTY): vol.Any( - vol.Coerce(int), str + probatio.Required(const.ATTR_COMMAND_CLASS): probatio.Coerce( + int + ), + probatio.Required(const.ATTR_PROPERTY): probatio.Any( + probatio.Coerce(int), str ), - vol.Optional(const.ATTR_PROPERTY_KEY): vol.Any( - vol.Coerce(int), str + probatio.Optional(const.ATTR_PROPERTY_KEY): probatio.Any( + probatio.Coerce(int), str ), - vol.Optional(const.ATTR_ENDPOINT): vol.Coerce(int), - vol.Required(const.ATTR_VALUE): VALUE_SCHEMA, - vol.Optional(const.ATTR_WAIT_FOR_RESULT): cv.boolean, - vol.Optional(const.ATTR_OPTIONS): {cv.string: VALUE_SCHEMA}, + probatio.Optional(const.ATTR_ENDPOINT): probatio.Coerce(int), + probatio.Required(const.ATTR_VALUE): VALUE_SCHEMA, + probatio.Optional(const.ATTR_WAIT_FOR_RESULT): cv.boolean, + probatio.Optional(const.ATTR_OPTIONS): { + cv.string: VALUE_SCHEMA + }, }, cv.has_at_least_one_key( ATTR_DEVICE_ID, ATTR_ENTITY_ID, ATTR_AREA_ID @@ -509,23 +529,29 @@ def validate_entities(val: dict[str, Any]) -> dict[str, Any]: const.DOMAIN, const.SERVICE_MULTICAST_SET_VALUE, self.async_multicast_set_value, - schema=vol.Schema( - vol.All( + schema=probatio.Schema( + probatio.All( { **TARGET_VALIDATORS, - vol.Optional(const.ATTR_BROADCAST, default=False): cv.boolean, - vol.Required(const.ATTR_COMMAND_CLASS): vol.Coerce(int), - vol.Required(const.ATTR_PROPERTY): vol.Any( - vol.Coerce(int), str + probatio.Optional( + const.ATTR_BROADCAST, default=False + ): cv.boolean, + probatio.Required(const.ATTR_COMMAND_CLASS): probatio.Coerce( + int + ), + probatio.Required(const.ATTR_PROPERTY): probatio.Any( + probatio.Coerce(int), str ), - vol.Optional(const.ATTR_PROPERTY_KEY): vol.Any( - vol.Coerce(int), str + probatio.Optional(const.ATTR_PROPERTY_KEY): probatio.Any( + probatio.Coerce(int), str ), - vol.Optional(const.ATTR_ENDPOINT): vol.Coerce(int), - vol.Required(const.ATTR_VALUE): VALUE_SCHEMA, - vol.Optional(const.ATTR_OPTIONS): {cv.string: VALUE_SCHEMA}, + probatio.Optional(const.ATTR_ENDPOINT): probatio.Coerce(int), + probatio.Required(const.ATTR_VALUE): VALUE_SCHEMA, + probatio.Optional(const.ATTR_OPTIONS): { + cv.string: VALUE_SCHEMA + }, }, - vol.Any( + probatio.Any( cv.has_at_least_one_key( ATTR_DEVICE_ID, ATTR_ENTITY_ID, ATTR_AREA_ID ), @@ -541,8 +567,8 @@ def validate_entities(val: dict[str, Any]) -> dict[str, Any]: const.DOMAIN, const.SERVICE_PING, self.async_ping, - schema=vol.Schema( - vol.All( + schema=probatio.Schema( + probatio.All( TARGET_VALIDATORS, cv.has_at_least_one_key( ATTR_DEVICE_ID, ATTR_ENTITY_ID, ATTR_AREA_ID @@ -557,16 +583,16 @@ def validate_entities(val: dict[str, Any]) -> dict[str, Any]: const.DOMAIN, const.SERVICE_INVOKE_CC_API, self.async_invoke_cc_api, - schema=vol.Schema( - vol.All( + schema=probatio.Schema( + probatio.All( { **TARGET_VALIDATORS, - vol.Required(const.ATTR_COMMAND_CLASS): vol.All( - vol.Coerce(int), vol.Coerce(CommandClass) + probatio.Required(const.ATTR_COMMAND_CLASS): probatio.All( + probatio.Coerce(int), probatio.Coerce(CommandClass) ), - vol.Optional(const.ATTR_ENDPOINT): vol.Coerce(int), - vol.Required(const.ATTR_METHOD_NAME): cv.string, - vol.Required(const.ATTR_PARAMETERS): list, + probatio.Optional(const.ATTR_ENDPOINT): probatio.Coerce(int), + probatio.Required(const.ATTR_METHOD_NAME): cv.string, + probatio.Required(const.ATTR_PARAMETERS): list, }, cv.has_at_least_one_key( ATTR_DEVICE_ID, ATTR_ENTITY_ID, ATTR_AREA_ID @@ -584,14 +610,16 @@ def validate_entities(val: dict[str, Any]) -> dict[str, Any]: const.DOMAIN, const.SERVICE_REFRESH_NOTIFICATIONS, self.async_refresh_notifications, - schema=vol.Schema( - vol.All( + schema=probatio.Schema( + probatio.All( { **TARGET_VALIDATORS, - vol.Required(const.ATTR_NOTIFICATION_TYPE): vol.All( - vol.Coerce(int), vol.Coerce(NotificationType) + probatio.Required(const.ATTR_NOTIFICATION_TYPE): probatio.All( + probatio.Coerce(int), probatio.Coerce(NotificationType) ), - vol.Optional(const.ATTR_NOTIFICATION_EVENT): vol.Coerce(int), + probatio.Optional( + const.ATTR_NOTIFICATION_EVENT + ): probatio.Coerce(int), }, cv.has_at_least_one_key( ATTR_DEVICE_ID, ATTR_ENTITY_ID, ATTR_AREA_ID @@ -609,7 +637,7 @@ def validate_entities(val: dict[str, Any]) -> dict[str, Any]: admin_only=True, entity_domain=LOCK_DOMAIN, schema={ - vol.Optional(ATTR_CODE_SLOT): vol.Coerce(int), + probatio.Optional(ATTR_CODE_SLOT): probatio.Coerce(int), }, func="async_get_lock_usercode", supports_response=SupportsResponse.ONLY, @@ -622,8 +650,8 @@ def validate_entities(val: dict[str, Any]) -> dict[str, Any]: admin_only=True, entity_domain=LOCK_DOMAIN, schema={ - vol.Required(ATTR_CODE_SLOT): vol.Coerce(int), - vol.Required(ATTR_USERCODE): cv.string, + probatio.Required(ATTR_CODE_SLOT): probatio.Coerce(int), + probatio.Required(ATTR_USERCODE): cv.string, }, func="async_set_lock_usercode", ) @@ -635,7 +663,7 @@ def validate_entities(val: dict[str, Any]) -> dict[str, Any]: admin_only=True, entity_domain=LOCK_DOMAIN, schema={ - vol.Required(ATTR_CODE_SLOT): vol.Coerce(int), + probatio.Required(ATTR_CODE_SLOT): probatio.Coerce(int), }, func="async_clear_lock_usercode", ) @@ -647,17 +675,17 @@ def validate_entities(val: dict[str, Any]) -> dict[str, Any]: admin_only=True, entity_domain=LOCK_DOMAIN, schema={ - vol.Required(const.ATTR_OPERATION_TYPE): vol.All( + probatio.Required(const.ATTR_OPERATION_TYPE): probatio.All( cv.string, - vol.Upper, - vol.In(["TIMED", "CONSTANT"]), + probatio.Upper, + probatio.In(["TIMED", "CONSTANT"]), lambda x: OperationType[x], ), - vol.Optional(const.ATTR_LOCK_TIMEOUT): UNIT16_SCHEMA, - vol.Optional(const.ATTR_AUTO_RELOCK_TIME): UNIT16_SCHEMA, - vol.Optional(const.ATTR_HOLD_AND_RELEASE_TIME): UNIT16_SCHEMA, - vol.Optional(const.ATTR_TWIST_ASSIST): vol.Coerce(bool), - vol.Optional(const.ATTR_BLOCK_TO_BLOCK): vol.Coerce(bool), + probatio.Optional(const.ATTR_LOCK_TIMEOUT): UNIT16_SCHEMA, + probatio.Optional(const.ATTR_AUTO_RELOCK_TIME): UNIT16_SCHEMA, + probatio.Optional(const.ATTR_HOLD_AND_RELEASE_TIME): UNIT16_SCHEMA, + probatio.Optional(const.ATTR_TWIST_ASSIST): probatio.Coerce(bool), + probatio.Optional(const.ATTR_BLOCK_TO_BLOCK): probatio.Coerce(bool), }, func="async_set_lock_configuration", ) diff --git a/homeassistant/components/zwave_js/triggers/event.py b/homeassistant/components/zwave_js/triggers/event.py index 7dcf1972033f1..fdb979af67b0e 100644 --- a/homeassistant/components/zwave_js/triggers/event.py +++ b/homeassistant/components/zwave_js/triggers/event.py @@ -4,8 +4,8 @@ import functools from typing import Any, override +import probatio from pydantic import ValidationError -import voluptuous as vol from zwave_js_server.model.controller import CONTROLLER_EVENT_MODEL_MAP from zwave_js_server.model.driver import DRIVER_EVENT_MODEL_MAP, Driver from zwave_js_server.model.node import NODE_EVENT_MODEL_MAP @@ -55,17 +55,17 @@ def validate_event_source_targets(obj: dict) -> dict: """Validate that the targets match the event source.""" if obj[ATTR_EVENT_SOURCE] == "node": if ATTR_DEVICE_ID not in obj and ATTR_ENTITY_ID not in obj: - raise vol.Invalid( + raise probatio.Invalid( f"Node event triggers must contain {ATTR_DEVICE_ID} or " f"{ATTR_ENTITY_ID}." ) return obj if ATTR_CONFIG_ENTRY_ID not in obj: - raise vol.Invalid( + raise probatio.Invalid( f"Non node event triggers must contain {ATTR_CONFIG_ENTRY_ID}." ) if ATTR_DEVICE_ID in obj or ATTR_ENTITY_ID in obj: - raise vol.Invalid( + raise probatio.Invalid( f"Non node event triggers must not contain {ATTR_DEVICE_ID} or " f"{ATTR_ENTITY_ID}." ) @@ -78,11 +78,11 @@ def validate_event_name(obj: dict) -> dict: event_name = obj[ATTR_EVENT] # the keys to the event source's model map are the event names if event_source == "controller": - vol.In(CONTROLLER_EVENT_MODEL_MAP)(event_name) + probatio.In(CONTROLLER_EVENT_MODEL_MAP)(event_name) elif event_source == "driver": - vol.In(DRIVER_EVENT_MODEL_MAP)(event_name) + probatio.In(DRIVER_EVENT_MODEL_MAP)(event_name) else: - vol.In(NODE_EVENT_MODEL_MAP)(event_name) + probatio.In(NODE_EVENT_MODEL_MAP)(event_name) return obj @@ -106,23 +106,23 @@ def validate_event_data(obj: dict) -> dict: # Filter out required field errors if keys can be missing, and if there are # still errors, raise an exception if [error for error in exc.errors() if error["type"] != "missing"]: - raise vol.MultipleInvalid from exc + raise probatio.MultipleInvalid from exc return obj _OPTIONS_SCHEMA_DICT = { - vol.Optional(ATTR_CONFIG_ENTRY_ID): str, - vol.Optional(ATTR_DEVICE_ID): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(ATTR_ENTITY_ID): cv.entity_ids, - vol.Required(ATTR_EVENT_SOURCE): vol.In(["controller", "driver", "node"]), - vol.Required(ATTR_EVENT): cv.string, - vol.Optional(ATTR_EVENT_DATA): dict, - vol.Optional(ATTR_PARTIAL_DICT_MATCH, default=False): bool, + probatio.Optional(ATTR_CONFIG_ENTRY_ID): str, + probatio.Optional(ATTR_DEVICE_ID): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(ATTR_ENTITY_ID): cv.entity_ids, + probatio.Required(ATTR_EVENT_SOURCE): probatio.In(["controller", "driver", "node"]), + probatio.Required(ATTR_EVENT): cv.string, + probatio.Optional(ATTR_EVENT_DATA): dict, + probatio.Optional(ATTR_PARTIAL_DICT_MATCH, default=False): bool, } -_CONFIG_SCHEMA = vol.Schema( +_CONFIG_SCHEMA = probatio.Schema( { - vol.Required(CONF_OPTIONS): vol.All( + probatio.Required(CONF_OPTIONS): probatio.All( _OPTIONS_SCHEMA_DICT, validate_event_name, validate_event_data, @@ -166,7 +166,7 @@ async def async_validate_config( if ATTR_CONFIG_ENTRY_ID in options: entry_id = options[ATTR_CONFIG_ENTRY_ID] if hass.config_entries.async_get_entry(entry_id) is None: - raise vol.Invalid(f"Config entry '{entry_id}' not found") + raise probatio.Invalid(f"Config entry '{entry_id}' not found") if async_bypass_dynamic_config_validation(hass, options): return config @@ -174,7 +174,7 @@ async def async_validate_config( if options[ATTR_EVENT_SOURCE] == "node" and not async_get_nodes_from_targets( hass, options ): - raise vol.Invalid( + raise probatio.Invalid( f"No nodes found for given {ATTR_DEVICE_ID}s or {ATTR_ENTITY_ID}s." ) diff --git a/homeassistant/components/zwave_js/triggers/value_updated.py b/homeassistant/components/zwave_js/triggers/value_updated.py index 32cdaf9544dfe..e8db1b0f65a45 100644 --- a/homeassistant/components/zwave_js/triggers/value_updated.py +++ b/homeassistant/components/zwave_js/triggers/value_updated.py @@ -4,7 +4,7 @@ import functools from typing import Any, override -import voluptuous as vol +import probatio from zwave_js_server.const import CommandClass from zwave_js_server.model.driver import Driver from zwave_js_server.model.value import Value, get_value_id_str @@ -56,21 +56,25 @@ ATTR_TO = "to" _OPTIONS_SCHEMA_DICT = { - vol.Optional(ATTR_DEVICE_ID): vol.All(cv.ensure_list, [cv.string]), - vol.Optional(ATTR_ENTITY_ID): cv.entity_ids, - vol.Required(ATTR_COMMAND_CLASS): vol.All( - vol.Coerce(int), vol.In({cc.value: cc.name for cc in CommandClass}) + probatio.Optional(ATTR_DEVICE_ID): probatio.All(cv.ensure_list, [cv.string]), + probatio.Optional(ATTR_ENTITY_ID): cv.entity_ids, + probatio.Required(ATTR_COMMAND_CLASS): probatio.All( + probatio.Coerce(int), probatio.In({cc.value: cc.name for cc in CommandClass}) + ), + probatio.Required(ATTR_PROPERTY): probatio.Any(probatio.Coerce(int), cv.string), + probatio.Optional(ATTR_ENDPOINT): probatio.Coerce(int), + probatio.Optional(ATTR_PROPERTY_KEY): probatio.Any(probatio.Coerce(int), cv.string), + probatio.Optional(ATTR_FROM, default=MATCH_ALL): probatio.Any( + VALUE_SCHEMA, [VALUE_SCHEMA] + ), + probatio.Optional(ATTR_TO, default=MATCH_ALL): probatio.Any( + VALUE_SCHEMA, [VALUE_SCHEMA] ), - vol.Required(ATTR_PROPERTY): vol.Any(vol.Coerce(int), cv.string), - vol.Optional(ATTR_ENDPOINT): vol.Coerce(int), - vol.Optional(ATTR_PROPERTY_KEY): vol.Any(vol.Coerce(int), cv.string), - vol.Optional(ATTR_FROM, default=MATCH_ALL): vol.Any(VALUE_SCHEMA, [VALUE_SCHEMA]), - vol.Optional(ATTR_TO, default=MATCH_ALL): vol.Any(VALUE_SCHEMA, [VALUE_SCHEMA]), } -_CONFIG_SCHEMA = vol.Schema( +_CONFIG_SCHEMA = probatio.Schema( { - vol.Required(CONF_OPTIONS): vol.All( + probatio.Required(CONF_OPTIONS): probatio.All( _OPTIONS_SCHEMA_DICT, cv.has_at_least_one_key(ATTR_ENTITY_ID, ATTR_DEVICE_ID), ), @@ -89,7 +93,7 @@ async def async_validate_trigger_config( return config if not async_get_nodes_from_targets(hass, options): - raise vol.Invalid( + raise probatio.Invalid( f"No nodes found for given {ATTR_DEVICE_ID}s or {ATTR_ENTITY_ID}s." ) return config diff --git a/homeassistant/components/zwave_me/config_flow.py b/homeassistant/components/zwave_me/config_flow.py index 13b8445711081..1598606d57a09 100644 --- a/homeassistant/components/zwave_me/config_flow.py +++ b/homeassistant/components/zwave_me/config_flow.py @@ -3,8 +3,8 @@ import logging from typing import override +import probatio from url_normalize import url_normalize -import voluptuous as vol from homeassistant.config_entries import ConfigFlow, ConfigFlowResult from homeassistant.const import CONF_TOKEN, CONF_URL @@ -43,16 +43,16 @@ async def async_step_user( "remote_url": "wss://87.250.250.242:8083", } if self.url is None: - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required(CONF_URL): str, - vol.Required(CONF_TOKEN): str, + probatio.Required(CONF_URL): str, + probatio.Required(CONF_TOKEN): str, } ) else: - schema = vol.Schema( + schema = probatio.Schema( { - vol.Required(CONF_TOKEN): str, + probatio.Required(CONF_TOKEN): str, } ) From e9fbcdb49cbd19e34bb69eeea44bded271f1600f Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Sun, 13 Sep 2026 18:26:36 +0200 Subject: [PATCH 04/10] Ban voluptuous imports in favour of probatio (#182120) --- pyproject.toml | 1 + script/ruff.toml | 1 + tests/components/mcp_server/test_http.py | 12 +++++++----- tests/ruff.toml | 1 + 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index a24618011d919..a16e180b02b90 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -848,6 +848,7 @@ mark-parentheses = false "async_timeout".msg = "use asyncio.timeout instead" "pytz".msg = "use zoneinfo instead" "tests".msg = "You should not import tests" +"voluptuous".msg = "use probatio instead" "__future__.annotations".msg = "It should not be needed because Home Assistant requires Python 3.14+" [tool.ruff.lint.isort] diff --git a/script/ruff.toml b/script/ruff.toml index a14712ec142fa..357c771387206 100644 --- a/script/ruff.toml +++ b/script/ruff.toml @@ -9,3 +9,4 @@ forced-separate = [ [lint.flake8-tidy-imports.banned-api] "async_timeout".msg = "use asyncio.timeout instead" "pytz".msg = "use zoneinfo instead" +"voluptuous".msg = "use probatio instead" diff --git a/tests/components/mcp_server/test_http.py b/tests/components/mcp_server/test_http.py index f81a7b5fa7558..51b2777f6932e 100644 --- a/tests/components/mcp_server/test_http.py +++ b/tests/components/mcp_server/test_http.py @@ -14,8 +14,8 @@ import mcp.client.sse import mcp.client.streamable_http from mcp.shared.exceptions import McpError +import probatio import pytest -import voluptuous as vol from homeassistant.components.conversation import DOMAIN as CONVERSATION_DOMAIN from homeassistant.components.homeassistant.exposed_entities import async_expose_entity @@ -87,7 +87,7 @@ class _StubTool(llm.Tool): name = "test_tool" - def __init__(self, parameters: vol.Schema) -> None: + def __init__(self, parameters: probatio.Schema) -> None: """Initialize the stub tool.""" self.parameters = parameters @@ -638,12 +638,14 @@ async def test_mcp_tools_list( ("parameters", "expected_required"), [ pytest.param( - vol.Schema({vol.Required("name"): str, vol.Optional("area"): str}), + probatio.Schema( + {probatio.Required("name"): str, probatio.Optional("area"): str} + ), ["name"], id="required-and-optional", ), pytest.param( - vol.Schema({vol.Optional("area"): str}), + probatio.Schema({probatio.Optional("area"): str}), None, id="optional-only", ), @@ -655,7 +657,7 @@ async def test_mcp_tools_list_required_parameters( mcp_url: str, mcp_client: MCPClientFactory, hass_supervisor_access_token: str, - parameters: vol.Schema, + parameters: probatio.Schema, expected_required: list[str] | None, ) -> None: """Test the tools list advertises the required tool parameters.""" diff --git a/tests/ruff.toml b/tests/ruff.toml index d12fe8caead89..be9ad1ccf6495 100644 --- a/tests/ruff.toml +++ b/tests/ruff.toml @@ -16,6 +16,7 @@ extend-ignore = [ [lint.flake8-tidy-imports.banned-api] "async_timeout".msg = "use asyncio.timeout instead" "pytz".msg = "use zoneinfo instead" +"voluptuous".msg = "use probatio instead" "syrupy.SnapshotAssertion".msg = "use syrupy.assertion.SnapshotAssertion instead" [lint.isort] From 7e3015fb60b655bf072723e9d257662fdc092675 Mon Sep 17 00:00:00 2001 From: Michael Davie Date: Sun, 13 Sep 2026 12:48:05 -0400 Subject: [PATCH 05/10] Bump env-canada to 0.20.0 (#182115) Co-authored-by: Claude Sonnet 5 --- homeassistant/components/environment_canada/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/environment_canada/manifest.json b/homeassistant/components/environment_canada/manifest.json index 54ac2c8e7b13e..6dd499bf45621 100644 --- a/homeassistant/components/environment_canada/manifest.json +++ b/homeassistant/components/environment_canada/manifest.json @@ -7,5 +7,5 @@ "integration_type": "service", "iot_class": "cloud_polling", "loggers": ["env_canada"], - "requirements": ["env-canada==0.19.2"] + "requirements": ["env-canada==0.20.0"] } diff --git a/requirements_all.txt b/requirements_all.txt index d0d38d5fa88eb..346b2e64050f1 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -962,7 +962,7 @@ enocean-async==0.4.2 enturclient==0.2.4 # homeassistant.components.environment_canada -env-canada==0.19.2 +env-canada==0.20.0 # homeassistant.components.season ephem==4.1.6 From b78faee3a883cd0d7f34e32e43445221ce332776 Mon Sep 17 00:00:00 2001 From: Tomer <57483589+tomer-w@users.noreply.github.com> Date: Sun, 13 Sep 2026 20:39:14 +0300 Subject: [PATCH 06/10] Bump victron-mqtt to 2026.9.4 (#182128) --- homeassistant/components/victron_gx/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/victron_gx/manifest.json b/homeassistant/components/victron_gx/manifest.json index 82460492c8223..9017243c05f84 100644 --- a/homeassistant/components/victron_gx/manifest.json +++ b/homeassistant/components/victron_gx/manifest.json @@ -7,7 +7,7 @@ "integration_type": "hub", "iot_class": "local_push", "quality_scale": "platinum", - "requirements": ["victron-mqtt==2026.9.2"], + "requirements": ["victron-mqtt==2026.9.4"], "ssdp": [ { "X_MqttOnLan": "1", diff --git a/requirements_all.txt b/requirements_all.txt index 346b2e64050f1..f5f6a7d6307ee 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -3391,7 +3391,7 @@ viaggiatreno_ha==0.2.4 victron-ble-ha-parser==0.7.0 # homeassistant.components.victron_gx -victron-mqtt==2026.9.2 +victron-mqtt==2026.9.4 # homeassistant.components.victron_remote_monitoring victron-vrm==0.1.12 From 969cc4877698d0e104fb3703427cd2902ff178d6 Mon Sep 17 00:00:00 2001 From: Allen Porter Date: Sun, 13 Sep 2026 11:05:06 -0700 Subject: [PATCH 07/10] Make Nest climate turn_on idempotent (#182086) --- homeassistant/components/nest/climate.py | 7 ++ tests/components/nest/test_climate.py | 85 ++++++++++++++++++++++++ 2 files changed, 92 insertions(+) diff --git a/homeassistant/components/nest/climate.py b/homeassistant/components/nest/climate.py index e664fa2f9ed13..3a3ccb3f1b6be 100644 --- a/homeassistant/components/nest/climate.py +++ b/homeassistant/components/nest/climate.py @@ -297,6 +297,13 @@ async def async_set_hvac_mode(self, hvac_mode: HVACMode) -> None: f"Error setting {self.entity_id} HVAC mode to {hvac_mode}: {err}" ) from err + @override + async def async_turn_on(self) -> None: + """Turn the entity on.""" + if self.hvac_mode != HVACMode.OFF: + return + await super().async_turn_on() + @override async def async_set_temperature(self, **kwargs: Any) -> None: """Set new target temperature.""" diff --git a/tests/components/nest/test_climate.py b/tests/components/nest/test_climate.py index d9d411dd6ae91..fcfa32ce528bd 100644 --- a/tests/components/nest/test_climate.py +++ b/tests/components/nest/test_climate.py @@ -23,17 +23,20 @@ ATTR_PRESET_MODES, ATTR_TARGET_TEMP_HIGH, ATTR_TARGET_TEMP_LOW, + DOMAIN as CLIMATE_DOMAIN, FAN_LOW, FAN_OFF, FAN_ON, PRESET_ECO, PRESET_NONE, PRESET_SLEEP, + SERVICE_TURN_ON, ClimateEntityFeature, HVACAction, HVACMode, ) from homeassistant.const import ( + ATTR_ENTITY_ID, ATTR_SUPPORTED_FEATURES, ATTR_TEMPERATURE, STATE_UNAVAILABLE, @@ -501,6 +504,88 @@ async def test_thermostat_set_hvac_mode( assert thermostat.attributes[ATTR_HVAC_ACTION] == HVACAction.HEATING +@pytest.mark.parametrize( + ("sdm_mode", "expected_mode"), + [ + ("COOL", HVACMode.COOL), + ("HEAT", HVACMode.HEAT), + ("HEATCOOL", HVACMode.HEAT_COOL), + ], +) +async def test_thermostat_turn_on_already_on( + hass: HomeAssistant, + setup_platform: PlatformSetup, + auth: FakeAuth, + create_device: CreateDevice, + sdm_mode: str, + expected_mode: HVACMode, +) -> None: + """Test calling turn_on on a thermostat that is already running.""" + create_device.create( + { + "sdm.devices.traits.ThermostatHvac": {"status": "OFF"}, + "sdm.devices.traits.ThermostatMode": { + "availableModes": ["HEAT", "COOL", "HEATCOOL", "OFF"], + "mode": sdm_mode, + }, + } + ) + await setup_platform() + + thermostat = hass.states.get("climate.my_thermostat") + assert thermostat is not None + assert thermostat.state == expected_mode + + await hass.services.async_call( + CLIMATE_DOMAIN, + SERVICE_TURN_ON, + {ATTR_ENTITY_ID: "climate.my_thermostat"}, + blocking=True, + ) + + assert auth.method is None + thermostat = hass.states.get("climate.my_thermostat") + assert thermostat is not None + assert thermostat.state == expected_mode + + +async def test_thermostat_turn_on_from_off( + hass: HomeAssistant, + setup_platform: PlatformSetup, + auth: FakeAuth, + create_device: CreateDevice, +) -> None: + """Test calling turn_on on a thermostat that is off.""" + create_device.create( + { + "sdm.devices.traits.ThermostatHvac": {"status": "OFF"}, + "sdm.devices.traits.ThermostatMode": { + "availableModes": ["HEAT", "COOL", "HEATCOOL", "OFF"], + "mode": "OFF", + }, + } + ) + await setup_platform() + + thermostat = hass.states.get("climate.my_thermostat") + assert thermostat is not None + assert thermostat.state == HVACMode.OFF + + await hass.services.async_call( + CLIMATE_DOMAIN, + SERVICE_TURN_ON, + {ATTR_ENTITY_ID: "climate.my_thermostat"}, + blocking=True, + ) + + assert auth.method == "post" + assert auth.url == DEVICE_COMMAND + assert auth.json == { + "command": "sdm.devices.commands.ThermostatMode.SetMode", + "params": {"mode": "HEATCOOL"}, + } + + async def test_thermostat_invalid_hvac_mode( hass: HomeAssistant, setup_platform: PlatformSetup, From bf73d45dc9e5312040aee141092b264596f53419 Mon Sep 17 00:00:00 2001 From: Ronald van der Meer Date: Sun, 13 Sep 2026 20:40:26 +0200 Subject: [PATCH 08/10] Bump python-duco-connectivity to 0.17.0 (#182118) --- homeassistant/components/duco/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/duco/manifest.json b/homeassistant/components/duco/manifest.json index 1e4b65190bb59..0a15c01438e27 100644 --- a/homeassistant/components/duco/manifest.json +++ b/homeassistant/components/duco/manifest.json @@ -13,7 +13,7 @@ "iot_class": "local_polling", "loggers": ["duco_connectivity"], "quality_scale": "platinum", - "requirements": ["python-duco-connectivity==0.16.0"], + "requirements": ["python-duco-connectivity==0.17.0"], "zeroconf": [ { "name": "duco [[][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][]].*", diff --git a/requirements_all.txt b/requirements_all.txt index f5f6a7d6307ee..7723c0ffaac7e 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2714,7 +2714,7 @@ python-digitalocean==1.13.2 python-dropbox-api==0.1.4 # homeassistant.components.duco -python-duco-connectivity==0.16.0 +python-duco-connectivity==0.17.0 # homeassistant.components.ecobee python-ecobee-api==0.4.1 From d761d1a26ad0eaec50fca4c5b07bc4b15957c4d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 13 Sep 2026 20:40:45 +0200 Subject: [PATCH 09/10] Bump python-roborock to 7.7.1 (#182134) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ludovic BOUÉ <938089+lboue@users.noreply.github.com> Co-authored-by: Claude Sonnet 5 --- homeassistant/components/roborock/manifest.json | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/roborock/manifest.json b/homeassistant/components/roborock/manifest.json index 75caa58ba36a5..2d593b865f1f2 100644 --- a/homeassistant/components/roborock/manifest.json +++ b/homeassistant/components/roborock/manifest.json @@ -20,7 +20,7 @@ "loggers": ["roborock"], "quality_scale": "silver", "requirements": [ - "python-roborock==7.4.2", + "python-roborock==7.7.1", "vacuum-map-parser-roborock==0.1.5" ] } diff --git a/requirements_all.txt b/requirements_all.txt index 7723c0ffaac7e..c7d42576de91a 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2811,7 +2811,7 @@ python-rabbitair==0.0.8 python-ripple-api==0.0.3 # homeassistant.components.roborock -python-roborock==7.4.2 +python-roborock==7.7.1 # homeassistant.components.smarttub python-smarttub==0.0.47 From 09e3474f91be03d4ac5a70a698474986fc759bcf Mon Sep 17 00:00:00 2001 From: Hmmbob <33529490+hmmbob@users.noreply.github.com> Date: Sun, 13 Sep 2026 22:00:07 +0200 Subject: [PATCH 10/10] Add Roborock Q10 position, zone cleaning, and goto support (#177780) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ludovic BOUÉ --- .../components/roborock/strings.json | 6 + homeassistant/components/roborock/vacuum.py | 45 +++++- tests/components/roborock/test_vacuum.py | 151 +++++++++++++++++- 3 files changed, 195 insertions(+), 7 deletions(-) diff --git a/homeassistant/components/roborock/strings.json b/homeassistant/components/roborock/strings.json index a914ef16720f2..4c2d8c9dd96e4 100644 --- a/homeassistant/components/roborock/strings.json +++ b/homeassistant/components/roborock/strings.json @@ -731,6 +731,12 @@ "invalid_fan_speed": { "message": "Invalid fan speed: {fan_speed}" }, + "invalid_q10_coordinate": { + "message": "Coordinates ({x}, {y}) are not valid for this vacuum" + }, + "invalid_q10_zone": { + "message": "The zone coordinates are not valid for this vacuum" + }, "invalid_user_agreement": { "message": "User agreement must be accepted again. Open your Roborock app and accept the agreement." }, diff --git a/homeassistant/components/roborock/vacuum.py b/homeassistant/components/roborock/vacuum.py index ee8ba8bb49687..bd4607d9449da 100644 --- a/homeassistant/components/roborock/vacuum.py +++ b/homeassistant/components/roborock/vacuum.py @@ -9,6 +9,7 @@ YXDeviceState, YXFanLevel, ) +from roborock.data.b01_q10.b01_q10_containers import Q10RoborockPoint from roborock.exceptions import RoborockException from roborock.roborock_typing import RoborockCommand @@ -779,14 +780,50 @@ async def get_maps(self) -> ServiceResponse: async def get_vacuum_current_position(self) -> ServiceResponse: """Get the current position of the vacuum from the map.""" - raise ServiceNotSupported(DOMAIN, "get_vacuum_current_position", self.entity_id) + if (position := self.coordinator.api.map.robot_position) is None: + raise HomeAssistantError( + translation_domain=DOMAIN, + translation_key="position_not_found", + ) + return {"x": position.x, "y": position.y} async def async_set_vacuum_goto_position(self, x: int, y: int) -> None: - """Set the vacuum to go to a specific position.""" - raise ServiceNotSupported(DOMAIN, "set_vacuum_goto_position", self.entity_id) + """Move the Q10 to a position using the library goto operation.""" + try: + await self.coordinator.api.vacuum.goto_position(Q10RoborockPoint(x, y)) + except ValueError as err: + raise ServiceValidationError( + translation_domain=DOMAIN, + translation_key="invalid_q10_coordinate", + translation_placeholders={"x": str(x), "y": str(y)}, + ) from err + except RoborockException as err: + raise HomeAssistantError( + translation_domain=DOMAIN, + translation_key="command_failed", + translation_placeholders={"command": "set_vacuum_goto_position"}, + ) from err async def async_set_vacuum_zoned_cleaning( self, x1: int, y1: int, x2: int, y2: int, repeats: int ) -> None: """Clean the specified zone.""" - raise ServiceNotSupported(DOMAIN, "set_vacuum_zoned_cleaning", self.entity_id) + try: + # Home Assistant defines repeats as additional passes, while Q10 + # carries the total clean count. + await self.coordinator.api.vacuum.clean_zone( + Q10RoborockPoint(x1, y1), + Q10RoborockPoint(x2, y2), + clean_count=repeats + 1, + ) + except ValueError as err: + raise ServiceValidationError( + translation_domain=DOMAIN, + translation_key="invalid_q10_zone", + ) from err + except RoborockException as err: + raise HomeAssistantError( + translation_domain=DOMAIN, + translation_key="command_failed", + translation_placeholders={"command": "set_vacuum_zoned_cleaning"}, + ) from err diff --git a/tests/components/roborock/test_vacuum.py b/tests/components/roborock/test_vacuum.py index 68069d850196c..796d13d7081fb 100644 --- a/tests/components/roborock/test_vacuum.py +++ b/tests/components/roborock/test_vacuum.py @@ -8,6 +8,7 @@ from roborock import RoborockException from roborock.data import WorkStatusMapping from roborock.data.b01_q10.b01_q10_code_mappings import B01_Q10_DP, YXFanLevel +from roborock.data.b01_q10.b01_q10_containers import Q10RoborockPoint from roborock.roborock_typing import RoborockCommand from syrupy.assertion import SnapshotAssertion from vacuum_map_parser_base.map_data import Point @@ -299,7 +300,6 @@ async def test_goto( "entity_id", [ Q7_ENTITY_ID, - Q10_ENTITY_ID, ], ) async def test_goto_not_supported( @@ -349,7 +349,6 @@ async def test_zoned_cleaning( "entity_id", [ Q7_ENTITY_ID, - Q10_ENTITY_ID, ], ) async def test_zoned_cleaning_not_supported( @@ -447,7 +446,6 @@ async def test_get_current_position_no_robot_position( "entity_id", [ Q7_ENTITY_ID, - Q10_ENTITY_ID, ], ) async def test_get_current_position_not_supported( @@ -928,10 +926,155 @@ def fake_q10_vacuum_api_fixture( api.vacuum.return_to_dock.side_effect = send_message_exception api.vacuum.set_fan_level.side_effect = send_message_exception api.vacuum.clean_segments.side_effect = send_message_exception + api.vacuum.clean_zone.side_effect = send_message_exception + api.vacuum.goto_position.side_effect = send_message_exception api.command.send.side_effect = send_message_exception return api +async def test_q10_get_current_position( + hass: HomeAssistant, + setup_entry: MockConfigEntry, + q10_vacuum_api: Mock, +) -> None: + """Test returning the Q10 position in common Roborock coordinates.""" + q10_vacuum_api.map.robot_position = Q10RoborockPoint(x=30020, y=28705) + + response = await hass.services.async_call( + DOMAIN, + GET_VACUUM_CURRENT_POSITION_SERVICE_NAME, + {ATTR_ENTITY_ID: Q10_ENTITY_ID}, + blocking=True, + return_response=True, + ) + + assert response == {Q10_ENTITY_ID: {"x": 30020, "y": 28705}} + + +async def test_q10_get_current_position_not_available( + hass: HomeAssistant, + setup_entry: MockConfigEntry, + q10_vacuum_api: Mock, +) -> None: + """Test the Q10 position service before a trace has been received.""" + q10_vacuum_api.map.robot_position = None + + with pytest.raises(HomeAssistantError, match="Robot position not found"): + await hass.services.async_call( + DOMAIN, + GET_VACUUM_CURRENT_POSITION_SERVICE_NAME, + {ATTR_ENTITY_ID: Q10_ENTITY_ID}, + blocking=True, + return_response=True, + ) + + +async def test_q10_zoned_cleaning( + hass: HomeAssistant, + setup_entry: MockConfigEntry, + q10_vacuum_api: Mock, +) -> None: + """Test that Q10 zoned cleaning uses the native zone task.""" + await hass.services.async_call( + DOMAIN, + SET_VACUUM_ZONED_CLEANING_SERVICE_NAME, + { + ATTR_ENTITY_ID: Q10_ENTITY_ID, + "x1": 28580, + "y1": 21365, + "x2": 27425, + "y2": 22815, + "repeats": 1, + }, + blocking=True, + ) + + assert q10_vacuum_api.vacuum.clean_zone.call_args == call( + Q10RoborockPoint(28580, 21365), + Q10RoborockPoint(27425, 22815), + clean_count=2, + ) + + +async def test_q10_goto( + hass: HomeAssistant, + setup_entry: MockConfigEntry, + q10_vacuum_api: Mock, +) -> None: + """Test that Q10 goto delegates the complete operation to the library.""" + q10_vacuum_api.map.robot_position = Q10RoborockPoint(x=25500, y=25500) + + await hass.services.async_call( + DOMAIN, + SET_VACUUM_GOTO_POSITION_SERVICE_NAME, + {ATTR_ENTITY_ID: Q10_ENTITY_ID, "x": 29900, "y": 28650}, + blocking=True, + ) + + assert q10_vacuum_api.vacuum.goto_position.call_args == call( + Q10RoborockPoint(29900, 28650) + ) + + +@pytest.mark.parametrize( + ("service", "service_data", "api_method", "error", "expected_exception"), + [ + pytest.param( + SET_VACUUM_GOTO_POSITION_SERVICE_NAME, + {"x": 29900, "y": 28650}, + "goto_position", + ValueError("invalid coordinate"), + ServiceValidationError, + id="goto-validation", + ), + pytest.param( + SET_VACUUM_GOTO_POSITION_SERVICE_NAME, + {"x": 29900, "y": 28650}, + "goto_position", + RoborockException(), + HomeAssistantError, + id="goto-command", + ), + pytest.param( + SET_VACUUM_ZONED_CLEANING_SERVICE_NAME, + {"x1": 28582, "y1": 21363, "x2": 27425, "y2": 22816, "repeats": 1}, + "clean_zone", + ValueError("invalid zone"), + ServiceValidationError, + id="zone-validation", + ), + pytest.param( + SET_VACUUM_ZONED_CLEANING_SERVICE_NAME, + {"x1": 28582, "y1": 21363, "x2": 27425, "y2": 22816, "repeats": 1}, + "clean_zone", + RoborockException(), + HomeAssistantError, + id="zone-command", + ), + ], +) +async def test_q10_targeted_action_errors( + hass: HomeAssistant, + setup_entry: MockConfigEntry, + q10_vacuum_api: Mock, + service: str, + service_data: dict[str, Any], + api_method: str, + error: Exception, + expected_exception: type[Exception], +) -> None: + """Test validation and command failures for Q10 targeted actions.""" + getattr(q10_vacuum_api.vacuum, api_method).side_effect = error + + with pytest.raises(expected_exception): + await hass.services.async_call( + DOMAIN, + service, + {ATTR_ENTITY_ID: Q10_ENTITY_ID, **service_data}, + blocking=True, + ) + + async def test_q10_registry_entries( hass: HomeAssistant, entity_registry: er.EntityRegistry, @@ -1044,6 +1187,7 @@ async def test_q10_send_command( blocking=True, ) assert q10_vacuum_api.command.send.call_count == 1 + q10_vacuum_api.vacuum.cancel_goto.assert_not_called() async def test_q10_send_command_invalid( @@ -1062,6 +1206,7 @@ async def test_q10_send_command_invalid( {ATTR_ENTITY_ID: Q10_ENTITY_ID, "command": "INVALID_COMMAND"}, blocking=True, ) + q10_vacuum_api.vacuum.cancel_goto.assert_not_called() @pytest.mark.parametrize(