diff --git a/CODEOWNERS b/CODEOWNERS index 43e14c41d8bfe3..46e9d80844b243 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/auth/mfa_modules/__init__.py b/homeassistant/auth/mfa_modules/__init__.py index da1e52bf98ab1e..786527563ba39c 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 be635685a2ccc3..15b6c55d3c4639 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 30aa0a31e3f3bc..1475040097c350 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 e5963b911f8cb2..0ddfe11d261ae9 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 b525423691fc4b..aeab7ff8193d4f 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 0c9f3eac5b9802..6c081d272ae796 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 d1e9512f34f018..85dceec452be3d 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 f20e34547cf598..484b2a8367c2a4 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 43134737e061d4..c1a7653ab9e3fc 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 5c35fd7e0e4ab8..ba2397314f38d3 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 c63935a130794f..2940e95ce78f3e 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 0c606c38d0802a..bb07500f82ef04 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/components/abode/config_flow.py b/homeassistant/components/abode/config_flow.py index 0be9749ca8689d..14fc2758200fca 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 a650507959e35e..6e716ab5fe602f 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 a52c5a009f8026..dc0a4794433dab 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 62c66335e2a31b..a4a628276c5142 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 df334a276f3022..1c2d88b4b38c94 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 dfb6bd033d6ad7..123ac4634214b0 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 6b66cc9ca10fb9..b45205db11fe9d 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 ec806e3558fb7c..bd32ac1c82833c 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 dc526e15cec6ad..7c4c91a2800adb 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 da34bd36e2c794..06728a5ea6dad0 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 b2ec6148c425a4..26e3cc637d5f40 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 acb146f66fab75..381c07e04c6230 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 12a5a25cc82a78..345ae0b03e2def 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 e170f207bf4701..5f9db6f3212110 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 d92d0ffecea040..8ccd8a638020a7 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 060a9a39921904..bc20b4795641cb 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 6f823673a30936..2bb510fb1c2c8f 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 27e5f0d6ae2321..a1954b639f552c 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 ebcc4a699b7812..8021652cbad303 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 7d2ca59483f73d..7c0ba3c8d6f75d 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 50d399a0ba1120..ea354bef1ee471 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 781e682308e1ca..473e9756ee30e9 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 523fb898548758..03dbb8e7c5abc2 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 c20b6cf1fb5435..831e140c353e5e 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 ba6aa63415beae..d616895bfe723f 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 a29d186537baf7..f05057e30bb6fa 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 dfc77f1c108fba..4db174aa0f03b6 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 52405c53b0547c..f364275d3effdc 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 510e64f34a50cf..97d80d60600b48 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 9940c7fee5e24a..239606cd679244 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 3e135c397815e7..be23e10e521999 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 291af1a499bda0..26420387b974ee 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 08327e640d6f88..69ad22d124b1bd 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 33bcb41775b912..41bc21c19dfe65 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 fa850efab24f96..bb95c65fa244b6 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 7ac53279fa0540..aecf230a8b2b7d 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 393dbe7fb8a1c4..cc01067794d0f0 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 a4a4401f03a616..b61838789db8bd 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 34beb3b06ad9e6..9b6dcdc0abfc98 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 07447c9af7ca95..b26209c34e68be 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 aab8b5348bc483..3906df256469c7 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 37bf272511fde0..a5867e8d7f6b7f 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 ffee0082e7d38c..371dcdc644b1b4 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 299de8a6bf6567..f20dfd2b83d891 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 ccf0c4593efd7d..47697c414cceee 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 fece5f4d30f596..150b75166e5844 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 b1265fcc224471..8bb005ac1b4506 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 d2287be60bffee..b055e946dc8b8a 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 cff0684bd76097..a2bcaf328fa09a 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 33e5f1dd234a11..10bd279f05b8e9 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 7347b3419a9393..d667791f0e6105 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 1b82f8358d1e73..1864708bf81dff 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 a755e61fe73627..686be03c0d3b32 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 fa145d1232e4fa..5b9190a0703936 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 c9d87b1edd22fa..07856d678ccc8f 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 204619b79499bc..968cf6b1b93252 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 1328bdd1aa3303..e33d47dcbef569 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 b0f05d405f57a7..c49d166cac35c6 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 f936d4a3d3c2b7..3ad10521fc6328 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 bd40336ad9dc6b..3409d3cde8bbb4 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 6bcbfbcb934388..f3425bc353b7b3 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 361fbb0d85e03e..693b858c1560d4 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 2f3cef093e57c6..581a6192d41487 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 187f3f299cc6ca..24930d0d5a7932 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 2cbf3497d1d98f..14afacd66c161d 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 0396399811a7fa..683fcf01851f37 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 81344b1e841615..17ffdcdc2750c0 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 51913f2f762779..6387470693aef8 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 b55f8bd5ccee6a..4db81221833ffc 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 1788235f84919d..121ea0e9672f0d 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 d1a48698b65dfa..08855f580563b9 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 66c1bb0e711dbf..5d9580b60adee2 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 971e663f6101fb..0fb501d7580658 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 84968b88722bce..3c58cdd967d015 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 dd7dfbb17f57f6..9121b259e6b1fa 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 7baecd07347f59..dc29978ce54e4c 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 7f079e17c9892c..87a4340016f1ac 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 d16dd8a9bd6000..a7dc921eab1a20 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 70f48a549efe66..d31fff60c7fefd 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 c8f8d50a6a18e8..76a2d868d93226 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 623d55e3f5c715..18462e669f30eb 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 5b1d1611122440..a66f75403c21c1 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 397e05160c6e0a..6670c095e17b57 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 6dcdd577a9520f..32d56e244bb16f 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 3fb6dc52fe6d0f..99dfd79cb979b9 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 a646e10c4d5279..a1841936ee90af 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 728726c0b005be..e31e30f6edcc58 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 534c9824cc6741..964a1196cd59a9 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 baeabf2519b48b..5898b0865f6cc6 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 ddba8fbd23b458..01f6fe2925ccc6 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 016dd3b4ca5484..401da031bcccc3 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 9e7b3f893e0d0e..0da295c51559a9 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 0cac2fc1a5343b..52ed7e3bc9492d 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 1fa435d4470251..26c44a18a10cd8 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 bd75c31610b30b..d1da89c977c034 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 9d9786f4138bc0..9cb467e1331094 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 cbe3b9cde45ef3..500c61693f65b8 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 7e7ec8505fda89..d720ba01fe2bae 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 0eb28be205b850..314f7fa30984b0 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 0b44005d42077c..e2919496ecbbb4 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 af99e65bd97677..7021c53aa239b4 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 25d75719ea810f..f35016dca52840 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 80f712eb02fbb8..980a630f5cc694 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 bc6fee8a72d041..c829309ebc5f79 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 b1d4857659c040..3e4aaf9bf1092e 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 0ad020df7a3a1e..81547264e29ec9 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 12b726df9a9553..67eaa325ed1088 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 a332d91b26cdc9..7d05877d4ec6be 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 a1fd10f07ab6c8..c353f9ad192648 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 f365a7bc9dd130..9a2919c1e177ba 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 18f512d2f21906..679b080d758c99 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 aa3f9b135ed19a..8b2a56dd5cc242 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 90bbbc258d6ac5..98c6de988e52ce 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 fa94297d292a97..dd41bcc35a8a67 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 1720eef1f10807..1d7a7422deb690 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 6e622fe2a9010b..a80942292d7bc4 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 4829c18eb7cd46..4ce55c5d3d600a 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 331f9274e0941c..e1decbfd3c8dba 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 6e0bc549fd6c18..170e552ef4047d 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 a19508f3918eca..68d2551a965f75 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 256c97586b4cc4..5e5383961986be 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 b4bac8dd3d7636..9cf80728504bf9 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 e67374cd123625..77a76f1e26aa80 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 a353b62338fcb0..1a0aa849cafe1b 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 a4ef48b0ef0390..2339564342d348 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 c99f8f1a028004..d1aabb45288663 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 04eb622f5f5fa9..ee8ab17b29a08c 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 4b01794771a15f..793e70d016fc4c 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 7464b1a183d436..985ab9b1db72a4 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 9f6e03f88d297d..33cb350b47dc3d 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 60952df3ce6b6a..30f5bde597ae4f 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 c417572cfb5972..6cc4862fef35f9 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 0b3120bf4982cf..cb3c93274296c3 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 5a047c708bf256..875da527c5ef02 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 711e9196916dd5..1f3b2c2822dc6f 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 94b8b0883e476a..3aabcdc71c8717 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 682ae6805538c7..ee54df66f50590 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 dc5a56ec1d8700..49bbf5659b1e3b 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 db00a6d978b73c..21b75f5d18aef8 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 acc2466cfafeca..74a0a4fa95a965 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 5fff3e1f629aa7..9662dda0afaaa4 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 7fd5847ea67a1a..3e04fadf685fe4 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 a01d6259640248..1fd1fce5df2786 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 db98053306ac8a..e79016bcb8447e 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 5435c8c11cedf1..f20fa5d362e3c9 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 4c0e6a0486ccdf..6bc31f2790cfa3 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 8b9622edc71943..b9c200424411dc 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 5eb55667de33b8..9e726fa4fe13c6 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 59f9dbded70fa1..6b91618ea193c9 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 03c450d39b9ce3..14767114bb23ce 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 1829a0a5ab0a46..7e5c1f514043e5 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 803aff97197a4b..f9958ae0a0467e 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 f499a679a0d532..a072700a2b0dfd 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 21f8aff7e324cc..8db2abee1f3c72 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 0f2a4d6db3bb0b..8e61ce693906c1 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 f5f0caf492dec0..8a0ee2a0a29f0e 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 fb1a7d9bc2b4a6..e864d1d50eee1e 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 5c0f8c395c7f58..e388ffb755e0c9 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 a93c60a2002dad..b75c2df7609007 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 816c23628bf076..2c1c31c42e26ff 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 ed6879baecc554..132825db9ff2fe 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 aab9e7b44b86ec..e42aeca63659f7 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 8a43fcfff5cb1c..ce675b8bbe0c11 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 2261df212b9f58..6f03a2b0ebf271 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 380a83028bed20..89207bf6134a79 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 3af1acfa0147c0..d0b2640051c65b 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 6aaa4091e07dfb..410bb92a118f79 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 054cdc3452c9f1..e3eb1eb12ba4cc 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 b2152811f2a280..a3dc5d4bf88cb4 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 b0dc9519e15802..69c976626b6813 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 64fa9f841c170c..b0e01e3596fe81 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 a406e238fcf2f0..19500aef8a7c43 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 af87f973b46bb0..e20940b0fe8213 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 bbc39a620284a7..be434fe84bd985 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 cc76b947ea521e..ef7709a9d1e993 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 7ada33bfa5add0..9ea264acc28c5b 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 b0f917e98598de..98289742b6f454 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 818b3b7b60a4cd..b34bb8fe9c45e0 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 062bdaf4666e67..a1a6ab22e2bdc7 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 058f6f3d6f9279..9ca7748953c81d 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 be2fb5272bbdbe..1d885615bc8454 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 7b84835f4a8384..4427d810eba987 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 eb6f7a8b31ccd0..0f7926b952aaa7 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 7f36c29755b801..f73e10bb207af6 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 3b47ba73b87f96..08bec4c8d263d6 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 546dd669cd0a5d..f84d5a64f3902a 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 eab2ad5eae3217..e7f034ba8f29fe 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 7f562cd3bed9a9..b6b3bc84228a08 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 d8ba5488920951..c2c70a99be2f50 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 62a547b33720b7..593cdce2bd9e60 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 c5a6ac7caf0ca2..cab0c22a8b010a 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 2685cad5d60739..fe3f0ca7976746 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 b1cf9d852a193e..d51f89498886be 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 20d4fa743f141e..55f7c8f4eaf0b0 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 e6e725982be9a3..59258a114bfe96 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 a717cde4087fa9..b1b406b998099f 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 2b1994ca94e05f..f8aaad00fd1c7a 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 4adc6a089c20c8..5b321e3a9c1a93 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 46ebe0a8f37105..64da00f308f440 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 26ce58443d4287..a55725a8c1970c 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 975a98136db7cb..b2ad09e16bcba3 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 78ed4401782ec4..daadff2ea1cb7a 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 5df6cc08e4faf1..935206bfec4153 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 f609d02e25cea3..0fabb010dc50ca 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 3c2c47c4f49793..8000eaad1a2a1d 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 9da1fee63a089c..693f447dfc2deb 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 a2aef95803e6d4..9cf891e5578456 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 557ed76408d3bb..dc48881004aa52 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 64cf62119b20fc..f0b340fecf478f 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 c092ae1854a651..bba58cd46105f2 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 13018a057378ee..654fa2bb4ff4a3 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 89c8e9e16a7628..b717e16e950197 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 c345acd3a3933f..c0d2d7a2fd2060 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 fb39e1a8d6875d..0f099ed3243957 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 8b5c5c7c6fe4c9..f0c5bc868d3b9a 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 00c89834806a0d..d4389b895a5f41 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 665f31a0b4c7e2..41fef492800f23 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 64d6ae7661f0a7..c56ccc7e700526 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 198992a47dbb49..84ab798cfcb1d6 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 d899d2573c422d..0584deac160fa2 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 c3120f52a69c71..432dc02c211f0c 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 1d12383f686bc3..cd4b52dd067469 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 f07e81f0fa8af7..b990bd2500ff34 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 7de4d5f4610f1f..6e06b9e7ed1c54 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 81d859b2a97808..203385abe172ab 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 6285b67580816c..77a84ef21b25fd 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 e8a42366b9b7c6..cb8c5daaaa492b 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 4f0e2565217526..61d7d6d7f3d003 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 68e4f16182e957..39ed1bc4d9f828 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 a5303bd6423f45..db2b30fca3b7d8 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 a5eed75138d2f0..00eac9ace8a735 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 1ff5ee7c955f91..6ddb545eacb3da 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 275a429fdc8951..730b1c61dad54e 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 81d5957e2db639..e20d2aace54156 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 e96684c1cc8856..ba9f02e9878389 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 de236c40b9e8cc..0b990c7fbf7332 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 e3a659b5aaabbb..2c7fcf2fe24415 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 d95a49c3638501..a5950373eec52c 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 5af9bc5d1ea7be..0d8db3f2c27203 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 fe7a8b57357a8a..5e5452b197b204 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 0043c61ecb6100..962e58e32ccd12 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 47b34cc5a8df62..339fe9273deff5 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 65b626488fafbe..86726567a2843d 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 824cab95c5cc75..5ea45379a15e0b 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 5335694b4f977e..3ea3f1336efbe7 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 35f29d58f88107..e0f66c65248cb8 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 0872a42c3e7dbb..cea60a11da7d50 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 1ca65433668095..dbf1767d3d37b7 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 fd744a36735bd5..d631603908bcba 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 657c54795f9eea..62b11e2b6e9795 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 b28f7a748e1c94..5d9be30787fca0 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 8f5f9230621904..6a4e59ca7828d8 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 55902a317eee7e..c4e43121da2d0e 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 5d7a99cf408800..509515e4cd8935 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 f9fb41303c0c0a..553f6fcd77bbcc 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 550f2cc316664f..3bf95a00be0e9b 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 4241685b26d475..5c608794350634 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 15572bf0d535ed..f92279d132aae8 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 2479fe652c3723..8b6552fe3f983a 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 ab7b2a84e9e7a1..9fa1b952978b3c 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 27268928823831..a55bff279cf4c7 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 10eaa42e175d05..66795b09c40a78 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 94accda30fbdb8..5c61815b3eb7ba 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 d5f7c843abd52d..5f79bd3cdcf974 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 9709337994197c..2b23cd2b2ef9b1 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 a4545193979f8a..bfa91dd47678f3 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 f60a3fca245366..c7e4f87b741473 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 aacb3b966caba3..50d69047ff24d1 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 e891601c0dc501..a4d9ab7fa61a02 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 74f1c34d8224fc..b128b86eb9049a 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 f596838aac80b1..ec1e039361407e 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 02dd833160f911..2b7732c038e2ba 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 f5d9879db6a54f..4d47b45a685020 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 3ebfcc711c63cd..0e7d03fa479664 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 31ac35cb756c80..d8bbb7b5c14b09 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 17952f35e3a94e..569d04810c40f0 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 66949f2c9ab848..2b76b5c026e4cc 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 029a6fd58d96bc..35a187cbc6a38d 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 d7bdf90324c9da..7a4a23b61cc2a7 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 a7f7213ef9159b..53a970b885270d 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 8c3f7b854989f5..74a0edd36915a9 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 a7cd60b21834a0..8b2f25d7ab357a 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 05b294f96d8302..72c180020fdd6f 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 311d5a3eda3c5a..4eed49bd76778a 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 c88e586d55e842..37d3ffead7ba9f 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 05e807afa38520..2ca846564d3d0f 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 265f6f9240e609..639e74ad76693f 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 d7c16d5da098b9..f8d73b49f2a6e8 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 97b1df9f5e5b14..f93cc8c1d7911e 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 bf2d29bce2a726..f7f9dbf72ad97c 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 2f96f1aedae216..a1a2e8cb0f487d 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 07b34045b1d821..b5c4f7df94504e 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 cc05867a003324..14fd29fcd037f2 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 4ed32cac834505..0e10121ea0639a 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 9f07fd329a8063..337ca73cd04939 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 58e4b649997979..88f7ca39fd88e6 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 51375b82617e68..76c6cfd7dedd30 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 2d0215c9ce7008..811a5e66de2c76 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 2ae5ac4cb657dd..b4a7cc757d639f 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 bf7692f57d9328..afe5f47131fffd 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 1c14f99f942970..71ddcb890c7a9c 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 9f2ea8c6dfceeb..510bffe13cd964 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 4c5985a78a6ef2..60839929b571c7 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 9f35980ea0f785..2cb77c59cf32e3 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 697042a1063b6a..c65c3e8c3f9969 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 22860440758a3c..0c0de9f9f491b0 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 126d16c92b1320..d89092c3eb7b28 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 437eb92e336c60..f0f0cf738b2944 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 3fd227d1156f7e..fe13d4f1780d12 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 aa37ed5cbf234d..2d391e2c1bd5ce 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 8c405c12dc9282..695a8c8f3ff997 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 b9535d392ef99c..b236e6d407d18e 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 2867d88130d432..afdbbfdffe9ec1 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 a3886ad2d9cb03..145f71fc98668e 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 b34b50df0f6d53..264015d605cf96 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 a7b8ab2fa12121..c54c0e68b47eb9 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 f297cb47fd0503..ffc9e32c3ed600 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 b97f3cf32cf939..3634b0000be2cb 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 d7cf67404fdc09..ec75f3b53790a6 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 8e9c1ddbad8be8..b045eb704bf589 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 d7f3a575799cbf..2411f721247d0f 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 fe9278873c4f77..7bfbac89e47ff0 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 1c68977b47ad36..3f96e40a78b8a6 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 9fff34b0261297..5ca77b4b722978 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 dda36c81aef8e7..e505d21bb35595 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 b3ce65c208d6ca..ac71be8448abfd 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 da6fbaf9969ed9..098039e8496acd 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 44cad0fc68ad79..b25c633afa6403 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 70be0f6b425d2a..5927bfe923811a 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 cf0a3c55b3492f..154303c4abb17d 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 c0b9458c282a88..7c4ed84b8f0e17 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 c927f54d3bf032..76b35ac4c05f02 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 1e72d876c8fd76..69aef4b273c242 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 bf3a323afa5e31..688986f241f3b9 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 0ef820a024de35..c02168aa951a81 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 ed151cbdfd5565..ffa0b6dd89959c 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 18450fee7f823a..f4064ef060bbcf 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 4f91de1441f8c5..6371f6e8976287 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 2d5d72c0aaddfa..eab8a7f4161654 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 2a7681cc2c3474..dc7202bc1629be 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 a14b5a0dc1b23e..263f8c78bc6143 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 f2ae911225fba1..24a3326ad7fffb 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 6fdf2f52f45b5b..1e57c724309eeb 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 0a147ccb0865cf..cce42eeaf8e1a5 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 3b4781af172f89..d7bb732bc80468 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 865979cfb964fc..1f971e52265663 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 9130accf24ca35..45b851ea1b1a83 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 87f059fdae09f5..00be22039c8932 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 9107164ac2cc95..d05d7e78c1910f 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 57f48ddf85597c..1389a4586ce9f3 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 79466204de8275..156e2c6b6ac159 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/duco/manifest.json b/homeassistant/components/duco/manifest.json index 1e4b65190bb594..0a15c01438e279 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/homeassistant/components/dunehd/config_flow.py b/homeassistant/components/dunehd/config_flow.py index 130b08c2762554..21f95b52f94479 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 31b45d9e7b210a..1c293281ff35f1 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 d6f67b68bc0910..1a4702049e8805 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 01d23164eb6147..b2fe73746f8f9f 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 623736cf02a05e..d3793586d03bb7 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 024cc3f91777bb..050df45e371286 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 e5ad9c374af398..4b8ded65b78d30 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 da14053ff33d0c..a2a7bc1b4cba70 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 8b36667c92d598..cac7a2482a6a4f 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 68fde9248bf8b3..126c46d8368292 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 ad7cb7f5cea0b2..f92ece95e40ffd 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 56352312262a9b..63d456c8692d7c 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 edd948a59319c5..fd9cd7d76af165 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 0648dfb56bf489..3462c61e4806b2 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 fdc0009cddbb8d..663087ae51e2f8 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 1264f2f2b67604..3ee7cf6691bd89 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 86cdabe32055a8..bd413ee76f46c8 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 8dbc11c8cf6650..6193b8ada62a95 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 3d8919f254b12f..46aa55624dc436 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 38af7e236ba9dd..c37461f9221abf 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 1790492e33d29c..0dd997f60a37b0 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 805ec1e8dc60fb..99e77d4bfa0092 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 4d0d0ee7e1deac..40f13c0046b364 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 ec86ea7c99a413..365aa1cb198794 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 40ff29c0aab548..21092ea6b57722 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 dc94bb79a4e0f7..4ad269eadfcdec 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 078291eb020ced..9d84f95dd484b2 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 6ec5b677cedfb4..b61dedb436fd20 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 41dd47eb1bc82e..4d14b531a36ac3 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 02a49e0d1d66b7..eb0116e2dddf48 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 4ec4749cf4e7ea..058bb10803e994 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 f5ffec5a8e0466..e5bb46a9d823a3 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 74774a09de20a9..6a7c1f15f5d951 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 e85a9a303b6cc7..c22eb97c13e601 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 eea9e6bc846dfd..f80518b5ab4728 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 70b48ecf0c8ed2..9a3d13b9f6cf51 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 14cebf21df981d..a420c17a688eff 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 5ad9df46f7f36f..7b5cff22dbb726 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 e8d6bce79aa6b7..c6e9e9d9323688 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 3bdaeffffa0558..f005dd999dfca3 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 97f08c786f4019..7a88e858fa6525 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 7067d6649338a2..50338fb0887305 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 0e214728c82d13..73bf1c05e9c150 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 38f21e344521f1..aa8a6933be7a72 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 5394a797272bd7..33bae18b97eb66 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 c5057531252e29..bc1b34fb528d52 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 014a23cea0a2df..5ea6748b59cf1c 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 7fcf9235c96561..5c190f82f0083b 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 e8c3a00f09833c..1ceff544154684 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 3e7ed956eaaca9..020db0a24d5b49 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 c8d1e4ab6df160..17b2e227d0c413 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 4fccd3beec17cb..a60620f638224d 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 cd3698c1108f1a..b4f33ad7f07f5d 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 127e0ef5af97c3..6daf477a43befd 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 6d984a49a16875..180218147a4c29 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 fa3b371636ba00..3661d6e7ba6817 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 12f1f47620c293..69646f41f8281e 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 0dd4368de9693e..bc747f842ad853 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 ef1b90519e114e..247395361e80fb 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 d591fbf47123d7..0dd18eb5d611eb 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 a7ee93ac5e2ba9..c1fd65a65181e0 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 d7a3d6a3df83fe..2e65374f7b5149 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 2b82e115a6e42e..0c9e686b77ebb9 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 b86d3508992fa2..ea37debac01689 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 304f1c5e80192c..d97327a5ec4085 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 b9d2e90a43d721..d4bf09d49e28ad 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 a317cfb121bf3f..8ea1b2617f6bf8 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 9d128f61c95775..ab2e2abd5dab04 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 dbbf1472dcba58..4f8863ffbf5b35 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 ec62553d632d1d..f6e9fadb9303c8 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 f9c1732866e1ac..96375d54afc3de 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/manifest.json b/homeassistant/components/environment_canada/manifest.json index 54ac2c8e7b13e4..6dd499bf456215 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/homeassistant/components/environment_canada/services.py b/homeassistant/components/environment_canada/services.py index 23e8b3b8ffea8d..1d7f6ad138a9f6 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 f0e8ecd449ddb4..86d8e0195310bf 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 92fb0ded5adbea..51be0daeb94b1e 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 11784734a00656..3b64d20f9b5079 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 250bb03e75c3b2..c3d2080b72ffd5 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 9c0c42dc785a3b..5b567fe6d6686b 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 fd92118fa6322b..2f7a6bdbd72059 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 ac6277c5120401..2c52fdab869500 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 daeed5a05e3cad..7387933a90c04b 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 0182cacf9cfb70..94ad3438c1e2ee 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 b3d26692353843..d32ca29f21a14d 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 3392556d9b166e..4c009704d3248c 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 38014b20bf80db..8926d35b7016d9 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 753eda3ad3bce4..67400904ac5350 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 2a25c410a64d3f..271bb7718e7a2e 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 4fb37b4f5b7c7d..363060432b7f58 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 57f905030499fc..adb86a9e62d24e 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 3eb4e4a995b363..277a8c9445f13e 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 658c661ddbc1b9..f140bdd7667a53 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 c3f4ab94986c6f..3c666bea27e9f2 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 730f5e6c00925a..ab331ca3998e28 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 5d8e4c67b0a3cc..06ca497a29ad7c 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 718e03b1352fab..7ad77eb56b17f6 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 3ab854e9992ba3..f2928f4e8fedfc 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 6286b7c51df5be..5717e0928b7f4e 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 b34a7d5b5cfe0a..7bc8648d9dcc0f 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 9080eeb567dad9..1506c389959b3f 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 7ec23fa4ac2796..08b78acba3daaf 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 adb0b5d9c71600..00bbd4c7a7bd3c 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 659bb452235e27..97448903a35c47 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 58a95dca030fb6..6a578c687d9e8f 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 fee4764dcd4e94..6ec41af6c110ee 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 c02120475e848b..e6198a043f699a 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 c3522e84e9eb90..6bcc65b90d8320 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 ef088a4bba98ba..c648af7b1e97cb 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 e7d99d7a938a39..1c3498736389b9 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 62044af3cbd596..5779aeeedda699 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 7c7c652e42f94d..bd36bf4184e18a 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 512d8981591295..c04369e71f58d6 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 ff3d91acfa5742..7c52ae53d6cb14 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 535a1dab3122ed..66afebac0505e9 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 9cc54f0c3fd8f1..5858d9d664393a 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 424ddca0910c9f..0fec27c8970bb6 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 f4353a57bb5d97..74e6e7ecbbeb58 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 9e4033148cf01d..6bafefb68f5b77 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 e884d0362e3ce9..2545da9d171861 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 2e6588b90ddca0..ae7d8ca4da81f4 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 c179b349d79a55..6f721609c12d6e 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 f968847249836b..6b381b73ac20a7 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 ca2a0dc6a98d13..04bc61856d8f84 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 161405a5491757..c1afe9e3b7f4ce 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 f3684930bef0a8..d3cd0026c563fc 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 320b0ea35a0f55..d64ca3f0e8c14e 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 45cae2769674c2..e19c78723d8d12 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 cd49c1f50ca5a3..b9e1a50e123bca 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 6883565aabe7ab..3537529af70653 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 aa05610fb79880..b5537ea4b0fc30 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 340581564e0ed2..cb38d269e2f0d4 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 532e4351c2f4b8..39a8f95935779b 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 493cd025251690..84ca43b123e7a9 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 c2ceec6da2c26b..f53b1e57322fdc 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 5ade4ac41a0ebc..fb8aa7cd3689f4 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 04729ac80673a5..e62a611eab9818 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 3b6f7b4aa9167e..e9c93b9b005b42 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 ffe6d512882f1e..dcba434db62e90 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 dfa2095105c8a6..5a7240ec3c3aa3 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 43a7f49264cc4a..c46f140f9d8fd9 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 833ab6fcb388bb..dfb5875bb39fb3 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 194d2e8b35272f..87fb093eddc2f1 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 3a55700a1f7882..a6883cb979669e 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 4bb227ff89afe6..9dfa354bd45512 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 10b9ac1ca9ea6e..239b7ceaf5e66a 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 0b7c7935dd5b3b..bbb3cfc1ad83c7 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 ac53c9f1a88b54..1821c245f85c2a 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 c4501be1710115..3973921fddacb8 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 a98ca998b5f473..13c355a00129d9 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 9b32aa8c21250e..8200ce81c53371 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 79312d77f162d4..1b6e97adffc8ec 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 0cd2144015903d..8faea069e962bd 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 284f38c17e2767..7b33d839493e28 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 cfe8f18742873b..4afa6c195a3719 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 bab46a55e9e4fd..c705b195ad152c 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 25effac073d260..9e347710943887 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 dcf785cfac4c10..f237052ce21194 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 54e28d3aea0efa..3a4a20c25039ee 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 460ad163f61dcc..f67a08b521d588 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 75f9c3ec5580ba..7ee577431fddca 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 a68bf01cefa967..93c4bfc764546d 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 0c5289993f64d1..cc42ae81231290 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 e553817613df25..b5012cb0b40a4c 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 ea8d1055c8239d..0401a26642ce35 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 25087d19bc415d..57713ef4295993 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 246750f8d6d6c5..bd1d780b3b734e 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 f237198a95997a..9a2fa8270cc40a 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 6e80b63402a0e9..b8ee6f43bb6381 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 e60ef66ac7f35b..9ecfc8089f1531 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 18cd5788b92ac9..aa8dfe0d84d94e 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 e3acf6563bebb0..272099b3fb172e 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 34ad70b1309963..a04ad5aeee7db5 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 0e61abaee0c0bb..6d95f5cf63e8d6 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 593faf1c6f15ab..f40884f7e8c98b 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 2f146aad8d4abf..298b4dddfa1cd7 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 2324b581dffa26..3b5687c577fc79 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 5b7fa2c507c942..0284c35f08c3a0 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 bbfdd7042340d7..5bb9bff2b6a7af 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 b9de9eff332fc2..1253f1545f1f7a 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 84a929181fe21c..822edfa5f1ecbb 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 926a4ee2f3ed4f..471252d200a1ff 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 7830ed23728489..1e646ea8edd026 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 9ebe4b4677807d..03e6510e49d733 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 6a3425c62f84f5..926ac5e786cf0e 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 2262d5ad6bfd0c..a8e9baf5b316e1 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 704aa908818c5d..5068121ef89c3b 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 c2198627d8e796..050e95c673d155 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 4686833a3da10b..6fb27a00c55655 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 bdd4cb6942697d..ca27cba02641d2 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 4f50a4d7df3f23..3f0013cb352b8a 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 b6c5c456b9ec7d..e779fb368fa712 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 121892ec3efb7a..6a999ef2e39586 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 f21b0bd2276fa3..621b7eb8d6cfff 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 d22ec6c6c83345..d24c699d96b4ef 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 208e5c55e22d57..38681ed5130349 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 5c638c3bff0117..845ca23a995011 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 500ce5745c24aa..c461b1f48fe686 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 959093c279e77f..6690bc13539795 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 6ced8af8bc6a68..f5c4e7021cc07d 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 a1522862dca082..ddff671cd66a84 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 751e7f918c0234..6232735bd76256 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 380ea31d852519..99a75ec1b43a6e 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 e52607820f2279..3a027fee113def 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 34e2f62af85508..3cb42556913840 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 007cb3ec2e5fd4..12796168df5b01 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 fdd6d4f454952e..e79c5e48e27023 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 de065735aebc2b..76ea46ae94d566 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 e03b125f3a614c..a5ea3bd7ce17eb 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 203b959e213051..20738ee9271764 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 9a8604e449d295..8ab40c0fd2a2dc 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 1257d677321f0b..27e45c9e81c68f 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 d01933da22bcb9..eb40465137dfbc 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 301c6cf8baf08f..15bda36c7334fb 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 c0e32f4f3c38d5..15c904cf41c074 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 c7ee25f4869cb7..e730951f4d431b 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 70a955dfa54d1b..203f4131fca3ed 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 460c57d86bb80a..18b79cbd089ef4 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 e0ec33c7a0be0b..d2059a498a39cf 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 23c07192810663..fb28c0e06c49f0 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 bb1b053ec8aa07..9a473575170acf 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 a3018e45dbc351..fd710e0f6e241d 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 8dae604a1cc494..e4a9b6e872c5cf 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 a1a89582dfc339..d0098a771fbff1 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 f578a8da7ab1e3..1d44f817fcf455 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 be0ef46295951f..cfbe08a8fe7767 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 3421ab4072f218..6e7600bbccf35e 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 2cb88d6bd958a9..44fbdea810f528 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 e6aee974cb2046..13233063290bb2 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 9e1b04ed411ef4..1eb34402577730 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 5faf6bdc13e4f7..0147bf28cacbce 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 00381a5b856783..87b2291735b0ba 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 90bf56fb55664b..f5c028debe15f7 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 c3ae0c0382cfcd..d9e0d0d1bc0cb2 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 90a46040845150..fcc3b31b5df783 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 3ed79125561f05..46f791677b2992 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 22ac5b62aea4be..da3ec4dc34030e 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 54568dbbf17023..359bd67daf1432 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 33b3266d4ae32b..bf5fdcae00d7a8 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 4b3868cb143672..2e44874cb32440 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 37493ed24fad39..ea6ef761572959 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 61672748fc9a74..c9b3151b038aaa 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 0e8260fa99ee1d..89811ec5a9f285 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 f3623c4b986f73..f43c9877ac1524 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 6b95dca6eeda6e..7510a3fa384951 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 7cb68028d6432e..bb67a92cb33684 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 eb129fcdfe0864..160498bb7bdf3a 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 7dd37af2b2afbf..a6f352fc8c9dad 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 9e8ccb293070d4..06112fe5c46994 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 3800589fbfe372..4c454bf6e53546 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 2303242dab4d01..b860825d78f847 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 14f1ad6ac3475d..8a7bf00de14184 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 2877d60d8a096f..b9a2ddaaab3e01 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 1cf5a8dbf42975..e240ad24b4bfe9 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 e554fc4c2d9908..1421082277c64c 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 f0fab28356c383..27e60110921dc7 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 134af6b9953bf3..bfd653d63df6eb 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 f6bd811af9f1b8..0ffa616fb6998d 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 d9524fb46c74ce..3d10cc32a2f250 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 b80c2ce89f0cab..5288937b4f1964 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 142cac59453ea7..1dfccce5276f46 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 3ebe10306126c6..a14e7a8a1d52e2 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 b8e6ff0599c452..e694eb9501fd88 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 1218941b856d07..37f7c4593c7273 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 e17550cb5d37e9..bb5dfbadf590e1 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 f394883e1f00ac..15a3808887493b 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 f6aa293e013da4..71ecbd09850e52 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 a34294f2c6b12b..8246fc99926f60 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 ac7605ce8d496e..6f7841ba3fb512 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 1233f5d3c96519..422d39b4c71ecf 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 9008d164257dad..fff301fd6dfa55 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 f1f27c862bc3b4..589c1bd4e6bbc9 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 557b5ffbe0ee2f..e456f0536ad513 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 c64fe7db79fab6..03065b0b4c852a 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 4f4b64b1c6c339..163e5a34b99c0b 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 079e63454caf6f..04ff8843ee90ad 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 3f945f75c32193..26b51eb003dbb5 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 9a019578fcecd6..9ab0f55d3d4b1d 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 079bb0b4e0cbdb..1403854d31542f 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 b6d1849c11990b..621de9d8218a47 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 140596319b3947..4f920bf40097a7 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 0f103a97306285..946d87120323be 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 a726db3ecaeebd..295aedb4b37608 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 3959dbee6f5845..01ed4d449058f1 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 822ca31a08ea37..70758119a8726b 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 aa6ab2389783d4..560de4d39df3a5 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 545fb040c52407..3e444acb3ee5b3 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 1d73b93c89e573..851767bc089108 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 c4455e7461c5fa..8db73b74bbcfac 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 1dee74fa35cb57..8fb4f2491f4bb9 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 23c43427959239..ec21c943a629f8 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 565ad85bca39a5..fae478d336c922 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 095fee5b89e3d3..8681b0c39884a2 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 d03958ae707e8e..d72bb8f5ecbc64 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 0da9538f6a67d4..70b29e7f1c5a9a 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 973a05319a5a95..d8bd3b3ce2c6ae 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 330a682de95c55..16312897366a87 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 e057c6e84cd27d..b49fbca3e9d0ab 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 60a394cc0197d0..a38a5967dc4c53 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 1f244bac305f78..6e79df7afd5e8c 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 be6f8f0785d5bc..0f7af956c31e1a 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 f55535d9be054f..6ffbd99005f515 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 73c36851b3557d..1789202bbf95fd 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 522319ac2abb36..69c867d19aa98e 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 897416b156b6af..f66e1c5d93d6dd 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 fc0dbd6a19bada..4607cdb4fba6f3 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 5e66be54232e3b..cf60e4e615189a 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 dc1f37a2360c30..4a76eaa707141e 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 8351819b62bb9a..c2fbd6a3976b81 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 06f1369fb9843b..bca51041bc0796 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 010f20a0c5a46c..5ad125d18bad88 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 4f96b25d281e70..3a84d07009c80e 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 906674dc8ca4b8..229fe3e0493202 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 0ca943d3c3f726..0c80dcc58e4990 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 93ece015a192cf..7a831bd6528687 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 9bd9ce1fb3c6de..86a1d9b2e5859a 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 44e1c4e3d0ab98..88e666dd7c8a4c 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 bee67611e6aabe..de061599e31595 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 ca08767f938651..25826276c6df2e 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 6c5ef2e1920377..74dbd1a49386c6 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 be54b3f1721a07..243d52d12b6d29 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 5acce6ec11f772..b84545770c9cda 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 2d2dd801496f58..8b99b700e22303 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 af77641b0b9733..ad6fd4e334ea94 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 eb50ccca8d18f2..4205c56657a5be 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 4c64fdb5f42d7b..5b3f2f5ac15499 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 0cb44ab07f9579..5f1b1fedccb398 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 45656d0b8325ab..aaf82b8c27fd28 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 dca09ab1b8a701..5f3c64918d149d 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 275afc294c1d46..71f4bf11da1289 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 324a380d35c178..4a59fba653450a 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 627073d47b04d8..acd8d9fbeb98dd 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 0a4a31f500b782..d2d6ea07fcf8c9 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 4ba2fda7c3f066..ab99c8b94703b7 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 5f48b6baa9b84d..5caceec2f9f649 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 b0c8535892bdde..a71eff1079872e 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 a367f8ed16a197..8054f2ad93de38 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 6ec55721e6f835..9b43ffb9fec1b1 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 9967c88f65a2c0..3c66c098c4d5c8 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 7068664713a708..5d0fab11046100 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 845351e225fd4b..13075ad9c35902 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 0a8bab9643e350..989b7ba12f90b9 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 e24a1b9213e908..953d73c8e2ac7c 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 3b6148af46e73e..a172e77e365596 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 b2f196e017a083..60114efb926102 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 2cfa6379a0f38b..cbc45ee5ad0a54 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 d85ded19b016e3..c9f6cab2c88845 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 03f350883c8019..2b35afec5ae12e 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 b2cc982b747b6a..20c41b015e05fd 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 5a6f8559feee10..7bc9d62584665f 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 aee3966e9ed10b..2797accc6d79a3 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 2916848e05bf56..d597ae7ff7c96f 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 d013e87cd0abcb..3a77cf6b7833ff 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 5f020fe4a79c14..00681795359e39 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 8d73c050e89a2b..08f03eac5dc75e 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 16589d25ad6160..70896638bc44bf 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 9ac568fb106353..5b2d72505bb6b1 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 de53286c730c94..752f634dd16347 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 cdb216bbc36265..486744d862df9a 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 6eea849300b1a7..9edf74104b2e8b 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 55ddc6eb30449f..f48de0d3f15311 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 3e2124e129a3ad..b4bdfdbadd0758 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 193f3f54d3ca48..4ca2d16fdf87ce 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 bfd2fe00844a0c..aff95e34716312 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 70ed62260155ac..6f3bcf2b4d3368 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 3b01529de6b5a0..3de9c85e253ecb 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 49beba29c4842e..9cef61882a82b9 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 28e2d350f69959..15271f4b7e932b 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 9e1cfa70054300..df0bdc64cfd4be 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 58e263fd1603c9..bd41af4ff8d00d 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 094f1ec2187537..0e5a822039955c 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 7d536575381123..00e16fdb7f99ef 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 590801a574c823..87d9dd30f7df31 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 112982e2251afe..d8ca079a122334 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 1c30139bd8929c..56f708a9c1963b 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 9bbb8e10742c8b..85988ca919de3c 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 e4f4572d62a9f7..c1eb52f134525b 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 386ca08fb10fc9..c5a9aedb7a6174 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 8df2425f1d0266..49eb80cd4477ff 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 f0610d6bc1d11f..3e41bc1c902d85 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 c3de04fba4289d..e596943566cf39 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 1b68e5d7e4dd80..c4e0354540f552 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 56d99987d89f9b..c35639089703d6 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 ef1efc933490ea..aed9de17176de8 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 607ce2195593a0..24ced8070f66db 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 b4e2d8cd71de76..3e2f5ba3bcf9cf 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 5af98d7db14352..a873d98f4b9152 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 e5ee44de4c217e..87e2f437355bfb 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 c5939c70afb548..6043c57e038e0d 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 0fded758890eae..56b0ab3ebc385e 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 9b711875167487..fea4a0872defb0 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 fd2a31f557f18e..1b91ee4e36ec3a 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 f6b1766e297e1c..b84cd69791854e 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 6b4a4e8af1105d..0fbbe2ebeb2ce4 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 8ddcc0521de21f..852b31b41eafb5 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 166c6d4b6fcbe8..e5855529babcf8 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 51d6d49cba17aa..1cd0d37e1c6d1b 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 54676212120992..8e0bb4e247b6f9 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 0cfe18083de447..a0c2b7b5f91fc3 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 fc3114ac383327..ea3d8dc499fb6e 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 5c83cb88e14c53..516fa2d4106245 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 d38b605dc24c04..32bfe0870f9908 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 8eddc540357d07..383d05196816fd 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 0c48427f7d620b..2746c091f6bf08 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 0c39db2b92362c..42f27eeaa1862e 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 4824fdf975b763..9fa9f8399ea89e 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 f94c6da499c568..209d02fc329650 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 fb11066fbb097a..bcab3ad3238097 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 7246c325dd23a9..8dddefc847b240 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 cb3a45be38e819..c19c04aafa2dea 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 3091014f8c36b1..a3edb4be62cf4e 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 38698a6334707a..54954dc26da531 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 940bb7e464c8b3..72c87acc420240 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 68e18e3d1d0f58..68f908dd8f5809 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 5eb8eac146281c..40c7a6b403c73b 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 9d581badd1ac52..bb48401c912076 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 8558f203d12a1e..1a0ad931042d27 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 f82490d2555936..ad58ddf2ed2589 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 ac220c1a24b644..7e6f503331198c 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 577f703c3a3a3e..85edc766502553 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 759172329c8fdf..b8fab130cee6d9 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 e2a438b45c4e37..1ff522f8da38e4 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 0588643f82c980..22c2144c143c00 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 f7f1683e056863..9472164dfd6bbd 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 894ae2da6a22be..9e63c3d432c73c 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 13cb9039cd68aa..8575ec5d56d0c3 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 e4361b6d9d393d..cb2c481dd9a8ff 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 b445f8be9abd3f..6af837f9320b1a 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 dbb5ac7e496449..897cf40cd0aa29 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 34908d365a3e3c..afee262c957dbf 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 050b951eadd98e..5ed14070dde382 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 a54137142e898c..9b4524cf9b0c23 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 e130f3a88baf37..3e845029c581c3 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 eca6bf75a0bd37..d2b6e640aa4b14 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 86f65c053d86c9..17db62a2fb4275 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 3c4f0940e9aeff..7d7fe07baf102d 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 339ae5e15ef4c8..edcff546d8199e 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 40fd45f2322ccf..08c51ccf4dcce6 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 d1bd889da03169..682eb872f4b5d1 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 7c86a2ef924000..6d555d1f999aa3 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 e6ea6160ffdf4e..e3f8b2d224ad5f 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 cee957cf147039..8acd54136047c1 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 9be84498dbf73a..afa9a92e112db6 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 e75c270026f3b6..513561c2bc13e1 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 15fa4bd257f4da..94d293ee48e414 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 abfe8e82261e78..8cc29bcf5b0360 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 688331a08c57b5..623cfbc70a5a9e 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 399544f4072bfd..20dff9a90ee8e6 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 efd203f3e6d709..af1466baeef376 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 5a4dfeaaade7ec..3f21524c1afe40 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 fde36f3b930a86..c3fec39feb9a4b 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 e6ad19a5ca185b..f77385b33f4b75 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 6da0a0e93453aa..9fd897b9b6739d 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 78b80dec72cad4..707f07c0e73108 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 dbac353bfe80a1..44d71723833b3f 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 02ad22ab0aab28..26c38325770357 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 030fa13a4aed4a..e73b694d5f876c 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 edd5845b6e5786..fd68cb302f9f44 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 9b7f6c5db0f1b5..88e43a62f58aa2 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 c4f8dd63c9eca2..9992463a82bae2 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 c45c7e485677af..ca9e6c420ce97e 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 bc92cccbab6f67..17004e56d35530 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 08714282a9d65e..f672e7185002af 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 89b5748a714f76..dc85294d3ebdb8 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 d7e74b9eaca870..c1cfce08e7b3d8 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 573baad21450a0..b0a48c92a19fcd 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 432f7b87c0471a..44bd2d5bdef358 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 99cfea8153216c..740c22a48ab045 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 67fcfbe482c44e..d128e2ed83d264 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 89503d8877cdd3..0c132e937faaff 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 c716c358797a8d..0357e5c416a05b 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 72bf593c80eaa3..7b8b8ab0681952 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 2c372cf1a25ae6..6ed70942346a0e 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 943e439c619397..8f76d3ae1a23ff 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 956133ce44ad2e..23aa42e5e06300 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 d3739aad0e4d45..d306bd411f1470 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 9e66629ae823e8..40e6a7a7e360ea 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 abf9d13485df83..8f640303f9897d 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 351e44caf5202f..fde512266a7b3c 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 9e2d51ab6d8c0c..0a4e9867352ae7 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 7729aa107035f3..1ff7110a4fbaa4 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 8ffbf66ecf4a14..8bd706eb65ff94 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 58865754f5692c..b5a923ed17a5aa 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 ef863010700862..86b8c569c7b809 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 6ebcbd1ba01301..a777f33f3a5bac 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 4cd03a8e965392..e5517145702f70 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 833fc824689a98..44b1830181da5f 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 56cac0e1cc0351..1297258c1ee6c8 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 2d44c6e84aa8dc..78e4a71f3b5819 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 f2b85cb97f0a1b..5a93ecfd1050b3 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 c612f26714d4d9..c86ce853acdfd4 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 66bbcc850f4bcb..5f89df8c228522 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 d637eb55188806..0bebe89eded80e 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 4a3b90e4becd8b..c2fec8c679fed7 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 c6bb4134a364a2..5a80850e175f38 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 3341abd209abf1..a3b5d168f565e9 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 3cf259456ffece..dd76188646b398 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 8b9f52a9dafc48..21529cde03970c 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 d556868badea7b..0a8341832c80bc 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 2fe6f70e45f911..b0f127067fb4cc 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 fcb3eadcf65d9c..4716cc97e9f862 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 2e1139603d1300..c62e823bf37c58 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 9333639220412a..de49dfc16cf5a5 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 1ca53b7c0cc85d..25ab84114cc18c 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 ccfbb8349319b3..034ede7bd345f8 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 60861e0168e98b..7f999f2d3dadbb 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 e51c40017f7c04..ef416bbb1c620f 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 edf74d2ef2b99f..1490c5297542c7 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 ec65d509d2428b..e76622e00cdfb5 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 235d4e4343c27f..2c2d3529d62efc 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 a072b6edeff3eb..dca97cd6eb00ec 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 25a543b785bfce..10eda1c7c2b197 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 8a59dade157d45..3e030554375b01 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 ee47b637aac73b..878799f362c119 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 0c6c85bac609df..a5e73b01ca1e0a 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 e8cfd397e27925..5feaf299355476 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 7efe485d58ccf5..0bb9ba37167cb9 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 3d9fb886d9edfe..1e8d6ffb64fab7 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 c7536555432e3e..dc035e9f45637e 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 fcc6044dd7759a..d1e2f28a7afde5 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 4db077c4a654d5..4734bac408e36c 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 1d182f07222d9c..136d3ba69a7e4a 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 ebdd7a32206b6e..0e5cfa35c23f66 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 441a04dfee8541..b0fad10d4d2c31 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 a19d5dee89aee3..66842da7d99574 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 fcedbdd106c6ee..49c3c327626a87 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 58a2bb2d6db555..001f186ee725c9 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 26285913a9388c..a43b9c6d02fd57 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 9ae95fe60954f1..5a39e065001eba 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 da7488b5615cf0..5dd4a202686419 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 a24568caedc7ac..15896bd14eeea2 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 118ed89797e58b..c203152faa13bc 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 1cf9aee2300421..d4b0a4b1bec24c 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 e410afa1e1c773..2f2cd89802487f 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 c41c2dc051eb80..a9987cd7979f01 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 b5280074be7127..5bf35f7ada7137 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 e59762d1b1e606..b480dcce18071c 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 2cc54a32bfe234..3b8e9a94116d3a 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 33340818866150..bd544c17b04aef 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 85fea780dd32ad..f0243c0ddead84 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 069fd537027d4c..130855e5a3f050 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 050d8079204c70..983f8142e2688b 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 8c04593b5f7211..cc28041a57c954 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 e9eb5c6ea02b13..23251e58a47106 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 f920c8bfe0a0d0..c621fefe2e7955 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 76a9aa14fd54f6..968d51759c3d40 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 63af9ca9e1e287..8b89a71783aae9 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 d71cbac2c4f31d..642e187a036954 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 8a54a0bd22ebf9..545c978c481337 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 2f0e2edfc70fa1..888cbd63449564 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 a15c085b29537a..04bf97da7dc349 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 443c28e0d0f37f..03a1da0b63392a 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 bd44820fde92ec..55d63a885e2448 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 acef5fec0d4630..05b5c8a609ea59 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 9acafdd494e45a..a9faac8d0d29c9 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 39d276f02c63a9..1760409857e792 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 d59c849f8f0884..c675e83a722b3e 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 dcf606e5daa384..2f74412ffda810 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 374f6cc19a2178..ac6c0a77e851de 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 708be0f8ec5a0e..e812a7d1dd12bb 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 24cd15238cdaeb..6436690fc458af 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 786855fb65573c..42aac42fe5eb2f 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 177bf7e24ed745..529dbffafcc7a3 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 3ddc7f6237b7d1..9c69ef98b41b3e 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 2e39ddadb34c2c..6d2fde8fb8b84f 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 d26bf3d5203e8e..e9b8c4b782133f 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 8c7e42c29ed59f..cea4e54438d7ff 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 1f3ea9afcf0866..5a9910f93baa43 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 186a35458c7580..f6021afccd153d 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 889c93df71a49b..a1fab0c016bf10 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 f6ece70b46485f..e8416e7a239f4a 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 5003f008effa2b..55460a81b862e0 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 1a3e90da96c80d..831e7f7b275b6b 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 29f22cf630e298..388d61bf633917 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 37662500c1153a..661849f258fc05 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 37ba8f6759e046..5b37e9888377bb 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 e10325df637b98..dd41d21b3e64d7 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 f1f45bc7ed453f..c970fae2b342ee 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 d3b28d9c801c69..c956f7acd0842f 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 34576a4ee1efe5..4eec3d0ce9dc3e 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 db828d1e834739..30c3d2775e0ea1 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 79ecc481702f42..8c64c74e2fc3e6 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 820cbe71956f0d..aed0fd7c829a42 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 e63b0051567d82..7ab83f80d5a300 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 d20dc5cd680a16..605c8c8096eae9 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 c25a19a36ca578..77a722d7ba163a 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 13b53e38e07e41..3b8b920aae7020 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 e3898ebfc6e6e1..92a80977d54875 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 1d020616bbe7de..74d6e30f8af65d 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 0691fdb68d0b73..9914819b21315c 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 9f0a2add5c019b..70a8aa7a0a73c2 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 1a02378b16b7e5..8b468f29acab80 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 b79946b57b47ee..9b42415119e574 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 3217fb89854c05..ed043829492473 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 2ea38ca3a803cb..2d0edd4fff69f5 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 d1137e173bff12..12b8dd25353b53 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 c5c8a191ab1f98..251d9629adcda9 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 510ba0402f1278..db0f124621b1f8 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 27319fc99cf342..fc1ef06ac9e078 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 88f54701e4efd5..5231c0cc15b4c1 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 e10e46714d323e..9c158043f48996 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 f6725a5d7c84d0..6da52295a1b712 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 23f9b809f49318..fef08f16cb312c 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 8c2620f80e0aa2..77999e4e5d089d 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 379d2ce094eb3e..1b33f4ea8b901d 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 722f1c0bf016d8..39c98b928e3469 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 4579e0695eb0a6..e5aca5cae6b5cd 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 16f0d62664f376..7e255bcb44bbf9 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 057d2401e2be69..449e56662c846b 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 c908c74c9e83cc..6b791e87bd503f 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 3489c3303be49c..4a7e412fd1f420 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 e4faa8bf1d45d6..2cf5b36ed47db4 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 f6f196bbce4b56..888b03fe1fe70b 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 616b6d21cc38a6..8128ada4b5ba49 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 b576174e8789d1..54f32ea3435bf9 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 428b15e5f76a27..1b7e69c9798159 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 401e00a93b3125..0404f924234470 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 0ff7ba675abda1..5ae2043affe556 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 b46b8be84a34c2..03665f034709db 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 d2fd6810029436..33d7dd02567c83 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 dea4a572608d7c..51c87380732738 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 25502937470093..e2dadf9b70e5b8 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 5e3221d6829b83..29006905918dec 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 ee57c07fa752e5..79e3d9a0986e75 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 20ca33ebc03d82..8df90e876e0ed7 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 4e79a00fed0e11..f70163232c24dd 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 ca077e27c9e806..b9c14afd0d4034 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 b11c02639aa97a..f3bea5f3d58e45 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 38f0e4685d786c..f0e0c3f1117c37 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 3806efb0242a11..ff6ad96804e61e 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 edb20ca3976659..c12cfd3ad32785 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 9e3579935fd34f..74f7876bd1dbb5 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 00a27d01987b4a..bef72780d2b6ea 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 d6b97e9080b9b7..360d212c0a7fc5 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 79fa9d6fb9a03c..580f417ce19192 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 db001867523c46..c82b3bfe48000f 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 42be559b05429e..f3c1debd3bba60 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 239e8994b381d3..1f86163b1a5396 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 01396db8d3e9e2..168b6b22f390af 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 f5b2573183aef6..7c5e53a23de961 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 0acec90fae88bf..b866184a300c19 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 49fb54b225ae45..9f60ea95808b1e 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 5154af015064df..6df9f77e036427 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 d592391446ba0c..9e9506eba8fc1b 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 d0b576631bcc30..1bc69f4e59ec3b 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 47edc627651923..7071a013472d49 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 9a9268e73d1992..f32bc72e327d05 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 b54463a10fc270..aa9d381c9ee183 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 253c3de486a6fa..dfb0dda5541cc4 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 6886c892a31c44..bbe960877d8d5f 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 50c7c302263ddd..e82c1713609975 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 8587282b68ea24..6151880106b3c6 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 49864eb9bb2f64..68e6468be0a4ae 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 05f83e831ca2ac..19a1dfd3f57825 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 876b22f06901fa..4f99a9ef24e20d 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 9e3c21e352a117..cac52c2ccdc840 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 50088f22d971bd..0e472dc2440d26 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 33643704863999..15e3c4c95c879c 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 d8838f218269bd..37e0e14d43278d 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 8b09ca37d3fd12..54edc49361a306 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 2da1798bb777fa..bf2e43ae401657 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/midea/manifest.json b/homeassistant/components/midea/manifest.json index e91c9d4e386bf2..943d3453e69c37 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": [ { diff --git a/homeassistant/components/miele/services.py b/homeassistant/components/miele/services.py index 40a8a188d4a76b..05a3a34b9bafdb 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 13eac98cce5b30..64dd8c077e8fad 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 45e76fbff4dcfd..087eae4e191189 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 a973fc59416b98..297022a1025485 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 98128b773bf9c5..b763546442143b 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 972237a6b6eaf3..26b7b3c65ed775 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 fd849195c466c1..c966eed987bc4f 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 e35d4e79142544..e69b6aae8c03fb 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 989d5e1c62a8d5..2cfee389f553bd 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 905ebf9bf1e242..f7a66856fccfaf 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 f99806343a9ca9..e2587fadb408c3 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 0109609760f175..5b8bf3ca5fb225 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 6fd82748b85844..5ac11c37ddebf3 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 e8580d695dc7bc..b9b3e01e87bcf8 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 ce6d1774bfc2aa..4e60eee6f15dc5 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 8851b1d640dba6..c99a0af6ce320c 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 bec862f910f904..cf792bb959e0b8 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 04ebb786bfc2f6..16b37e5f1bb57b 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 18963d91c2687b..3bc59892b87542 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 9e992b5babd50e..13b903c30c5256 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 030a5107d2238b..4e1c9b30c19040 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 275404171e430b..8e4dcf35a65e3a 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 f7d39982963412..8a9c172d0084d5 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 2abb1963e7f473..b4a709194efa74 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 c322e000ad1444..868a6a27fbdcdf 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 57d388327ea2df..01acf38b79e4a3 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 6efb06e9c67bdd..527cb019958677 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 f2d2042942afd7..88d4c9c8664998 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 e072bcb1bedfc0..7677d0b9cd2b55 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 bcfc40d61322a4..981c367eccccfe 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 ba3ba413bc877d..fc62cae1a67f39 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 0487342ab27dce..5fc6dec52be141 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 ed383a44927d27..59f02f9012843c 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 df2d01d96b704d..8236571540a810 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 81749cca18c5f8..a20620ab0394b2 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 0c5ee510c78a67..1cdbb725f6c575 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 4a8fef2b3ee133..a86c7a6ec2fdbf 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 174436020f9aba..d714463430a921 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 f4c0cac52c4168..c2dc40bee04e6e 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 7165a006b7eace..069798d456d400 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 5e1e7f9b9f5361..77a382ed18146d 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 cbc045d63cd732..0f003399a3b0e8 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 34b543bce7cace..7771e822c7a3da 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 b80df4b75365f1..b44b170b63479e 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 1060f68c302fe9..71cc43a1589bc3 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 863b90ce6ccfb8..1270068cca1fca 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 e12d760d6d79d4..7c72f2446139b1 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 7d5cea73e0307e..dcdb200d932a12 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 24f8475473f8e8..4d3dbb1f5d657c 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 f40d2d5fc04a44..9de17c29beff2c 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 685585f0def09e..6bb5727bd5e156 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 3ad9f1e744c947..3e36188920e84f 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 c0872ae89cddc1..e22c96118d30d8 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 32346971138ba7..1cfbca7b7b8675 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 80f086364566ca..776f6b79aca9a0 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 6fff361c60b269..5bea75150bf203 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 26e0cd66143d22..7e8849a448306b 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 290f067e0187b3..76d221212a245c 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 e794f7f910aadc..9ca67b8138fdaa 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 54ac398d0270cc..c0a148741ab7d5 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 8cf181e7699d4c..33411b6587f230 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 a903943e2d1a25..4ed272f86539a2 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 f6464790f0bf4e..d7a6bb3367690d 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 95fc8ece1e2bcd..8eecdd091b6bdd 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 49e52912ddae60..519a5c168137a6 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 365c76a0f62eb2..2c4d2a7b5d1867 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 f98345914a2c52..d795e3f77f45fe 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 82c0388965c07f..f3e5315f62d97f 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 f686f63b10c939..b912bfa8b7a00b 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 5ec5857bab07bb..141028c37e3087 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 6f235dd87e6174..39b3e08359dc58 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 baec7dd40e5386..7432742cf11e83 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 40d18499443ea7..cec5b0222b90a8 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 4b608be5d30cde..66cfec2b281608 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 80766f89499b47..3936c73ce9ea4f 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 a936363fac766a..5814b4f5266473 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 b5c6f52cbdff55..1a51c26069528f 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 159e684c41f245..9edcb999da48b8 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 07439681f2c187..357b4cb565bc35 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 2921d726f54667..b7b53ca38bf05c 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 b1284f6f1c5b0d..9fe49b5a7f5253 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 aef1ea39b2ba80..b5b528ced533b8 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 fd1f4ce3f4852e..b4236a24728d63 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 b27b1a78708fdd..00dbedfeb665a9 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 c96708d6fec312..b4ac6cc2f16ee7 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 4844e5843a8a0c..aabef575e12a87 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 5ec31989f3e550..9cd40fd53aa9e3 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 3143edc5d4993a..00bceac10e5216 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 714f3ef51b9bc2..41b98a107b948a 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 b4a89b143aa949..cbe4a1fb02d553 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 f4f4fe4caf205c..d7fc1c7b60bdcb 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 1be1fa8d611eba..bc1c95fe10fe71 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 4223a8b605fea0..d6315610573eb7 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 1f48c357cab3d6..03cd20cc7edbc9 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 20602e03f81c46..a28e6bb5e2950a 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 1d5312ff34a0ad..10f769114a5d7b 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 7b3d216f87cb3a..3f4026560bcff2 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 9a08fa2c73ab73..a2b1674a58ff74 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 623f856ba0c6be..ebaa4f45805237 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 e0ff26ed3f5b94..ea4a00bae4e32d 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 7fdec56e03d459..a98b16db719843 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 38d86f7c155d5b..1e59eeae906870 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 631c2132afcc2d..140202c06b331d 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 87adaa3ac82e9c..b110002c076d73 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 45d362792b6233..2540d59c11591b 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 0ee97e66aed89a..78811ab00af3a7 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 111699a36afa73..4a790014dc7d3b 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 cc0ed3b3135215..efc09765e1c913 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 466826d75d7bbe..8ef361d482617a 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 0b739065f021f0..24d1b6a320f58a 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 17106008eddfa3..cbad3067311d21 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 58ac6051c8ac64..00127b10ee218b 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 d666fca9c6beb3..c67a77f350dc1c 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 0796365954a04b..2055253d44a570 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 53038402233df1..34612872b6bf41 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 bd8ddf7d2739bc..0723354f4d8a1e 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 df4a1d6d9eb9df..a3a701ce5a9648 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 f70b1a0b579e0f..67bcecf394ec5c 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 184c83e1eb5d09..0f60954f2c0851 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 d6b6ff0dcdfe17..ac29eed137788d 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 debe7f4c16ee56..e5d6965e6045fe 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 3116cce3926fc6..91d7bfd95e6f2d 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 48ab8dca7aa207..ade71988200d61 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 a2550bc07d16c1..179e7fcca30654 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 112e2f3db72c22..820f4f50733a03 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/climate.py b/homeassistant/components/nest/climate.py index e664fa2f9ed133..3a3ccb3f1b6bec 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/homeassistant/components/nest/config_flow.py b/homeassistant/components/nest/config_flow.py index ec019b398cf583..47d46439a41a0b 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 7ce87379e03c4c..2936bb36d0315c 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 0cb97f5a0a541d..7fee3bd2e0afdb 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 9ae69c6a243510..8017e5a5716d15 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 563d1cef8dc958..dbb1d72c7069ae 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 3693bb76105cac..8131ad8ad894f5 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 9e2b8d2ec94f6b..7f39fc73c9e672 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 5094db183e2265..418073b1fc6096 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 c1bd1023fa1b13..8c5ff7884a1f8a 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 4733e5019cd829..1169fe8749bad7 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 45b3e41189aafa..7bf76ea63b7939 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 3e0d2cac164e30..2f1ac03616ab74 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 d70cbba382d20e..9e84fcb03087bc 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 4e313392dc4c31..26959d91d57f1f 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 91e89f62364b02..fcc49804789a84 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 6912e7ae039231..653f320ecac068 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 3b5a29962e87bf..778c64802e6cf9 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 0c6178a5407926..4bd2532e13f63a 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 304e4672da1cdf..00fbb9079a03d5 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 07d8527ec059f0..a9e71160652bf4 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 8b72fc85669039..e703af51c16f98 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 ced39ec9cc6c46..68c7c3ae20a3ca 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 5e6990dc4c1952..3e2bcffeafb160 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 21672e6b9ae6eb..2286ce2b9e768f 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 13743a5dd0c9e2..e30ea1a22f265a 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 7e2555bd914b97..2b5c2e66a720b1 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 b268030dc1aae6..52388fdd83d0a2 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 8603959e09730d..23a801d9cc89e3 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 38558634a8a7f1..7a866f45ef4cf5 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 b086ca47d9304d..7b7d6797b0182c 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 45ca5f61ac5431..14f0c0165252f1 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 5a7d21bcd6c7ef..ac9a467c35b92b 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 42a4d973c00265..82e9c8a5a045ff 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 7d9c70d6d601da..b563cbf6c86c4c 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 3a5a87213c51ee..3e2f0e41415545 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 c23177ddf94cde..166344d8c14f29 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 4f842993be6c4f..2cb734ed37b776 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 51b52f4e4a6e8a..53baf9b08ea307 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 413d1088823163..bc2f54d2774dd5 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 e796ba0e870000..b096b05b295607 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 70a287d7db448f..06bb1d0dc843ae 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 8d4f44e2cae096..92cafcb8bd8f0e 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 30b5a128ab2d9a..d65e74ae6ae783 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 76cfd9be4ff8c3..3503e80e68eb6b 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 daee8caaf7d892..99556399fa8fed 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 94c6e263632a13..b795a21e29774a 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 83d6dadde25843..3641b5d31d15d0 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 2adf00aac53fba..5f3ab031f694e1 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 76e7371bc4771e..35c30053a47a8e 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 3c988e4f454d4c..5e0bed63b50f57 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 6f8f59d4cafd94..0106c26a7dbf84 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 b5fe790851f56c..562d34666b4731 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 497b218796183c..b2e487c4f8ccba 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 f2d538b83e9a8f..c5971a819d57ad 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 5093bcde73044c..157f620d89e692 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 c00e2ff2090bb1..f823bcbf98bb4a 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 ce424b9344e9b9..a20acb15732544 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 04728c18935ed8..525a99b86c21cf 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 e67720a5858cc2..c843ab10cbc3f5 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 59be04345e4c24..5717653a951223 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 10bb64c9f07b29..45755c4c38a1d6 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 f4c229e721dec0..2b8150e2398fb6 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 3cfadbe87d646f..6c62ec8b90c6b3 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 31855522c3491a..8cca6d85a44301 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 0c8104149a5b6a..6b0e5b7cd830fb 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 23d073f7c0c6e1..7669f68c935fb0 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 8b8ef243b1e998..d3ff6c24ef5cd9 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 39b0d5a0eaec45..4a3b94f567623e 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 0b5464c4f010a6..2b67ce60a124e0 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 49587d0be2bc9b..2d61982583878e 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 dd0e908b7227d6..60a59301d0ffc2 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 24e9003d5cbcae..d7786be5b597b2 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 b13b896e525a0d..d6a54371dcfd8f 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 2f9948f704b9d6..ea943391f25dd3 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 108956303f3a6f..fa799f212c7de5 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 bfb905cdf564a8..a4d5ff43038dc1 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 8ef639ba62a969..a6a82c9761b064 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 62307521fd3e6a..38136e1761927a 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 19f79bff7a0f61..a9ae28c75206f3 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 a6113b6610170a..2b756d33430810 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 c3a51bacce2448..ad7df406714694 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 9dc3eab60a3725..ed879627ffb489 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 7e38f907095462..20b644b35e184b 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 13a395769f0d89..84e8e73ee0ea38 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 2801f4266df1c5..7440972a652338 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 3e6a95f139dbd4..97764b5086a0db 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 fdd69d2f5fd65a..84c37fa9e456b7 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 065165c3a78be2..fcf1dae2b91abb 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 3f0f1c23251f56..88e67b13c8e524 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 9a82b2b94bb38d..8f131b88fe56f2 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 1fe85ba9c4e640..c3e435662d2d63 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 66454c8a3f1ba0..fbf3abc33564c3 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 931d130cd1eab4..1a021761f2c243 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 47340f2902bcef..0d5d64d9c95afc 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 bbaade6e9b2e1b..faa02092e1c2cb 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 2030b1e97bfd21..f97d0b142720f6 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 3121843a618d12..c36bf437b01288 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 9156fa18955c5c..df599ed68894c5 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 615d1865a7080c..6198a8e04fe294 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 8b051b6896549c..0be02290373912 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 4fabade0c2e1a9..971d0076860d21 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 383df7d70fd727..7f2506ec9b3a0a 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 c8c451f80dd014..0af019e9ca2c2f 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 aac20577b43706..03d60ee101752b 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 9ecb72b2c5373b..ead33df3ce9ab0 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 405b50182da119..d6f6deea81ec44 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 0234255817d652..e1f685af7a1c3d 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 d6f59d0902b189..1cbdcc12691d29 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 ab705357488529..dc135e7e612e36 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 8862421b56b073..d1bbabf97698da 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 2ced23b8264faa..c448bd9b46c1a7 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 5866564b71f0f5..c09507e839bdf7 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 2a0dcdb68a1021..70577ae451596c 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 475fb41175ffec..2d36f8c2f28672 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 73d6151e882e29..98359ef4e76a0c 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 3eb06c25018351..5952c103e373f7 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 2029a019a7c250..4378a5c10e452e 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 b9236385e4f1a7..3d6651293fcc0b 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 c52609427b219f..74bb5ffa0b77c9 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 891a72955f94a4..4798f69c399ded 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 136d90545e89c7..605382276a00cc 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 82fd0d5b3a37ea..c623d778249112 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 efcffa819f8940..905a18d186928b 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 35258ba71efb08..126508f5745d6b 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 9b779e0085890f..8409ebbad52460 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 13d0e3e10c3823..56af861b0e81f8 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 efb4c8deb1db7b..6b66c9af7ac5df 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 9f6c6151874207..851f747664854e 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 2bcd0da8f16c50..5827bbd150d5d3 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 068dc0334e53fc..351f000efc140f 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 1718d534b23c1e..5dc09bf3cd1d3e 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 94a00e155f89be..bd2d16a8ad6485 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 6c11e9ea401785..617bd6e6522e35 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 f32fa307e59859..de8ac405f26d37 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 c53b1b87161fe5..87b84392f17bcc 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 9405b21ea6dd80..c02507bf940c9e 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 d3970fcfc73629..6a8d38f7f3c098 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 f4fd53b5bbd01b..86bf59affa420c 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 5edab3dc942a11..b0b34c4eaf8275 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 336fe87475e806..b17daf08258987 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 64e4e2dbd64626..55d399a6396aa2 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 919758b74750da..c78b6da20f5dff 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 463bf82ebb63da..64ea718fe48f2c 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 4f010e55cff851..742e4c2344b5c9 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 0a67ede14b64b7..4cb9ca487bb985 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 a76490ccb01ac2..9f34ead6527d8e 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 ef2876d68f198a..0eac845b6e43c5 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 bef880a6647d7f..72e8499cc9f4ab 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 827f3e12cf5a5a..c77f467875682b 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 985da4db560916..1fced5ea194338 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 7b16c662079b74..08bb99fb42d4fd 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 cd2195079a9d39..77e4d34a29e1fc 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 e30a98fa00d0cf..ef9de1468820a0 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 d02bd2f2659ecb..817b359700d08a 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 fb9a92b5ca70a0..353025c9821242 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 3b4d390e025b97..85908832d68e24 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 6515f70ba4e1e2..02835f65fd4a07 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 e5723c08eb7afc..5d5602c5b77372 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 de6cc4c2b2cc4a..bb6573318aefca 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 9e2e4d6d6f26fe..943750c8eb58b8 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 03ee261bcb11cd..d242f9cbd8155c 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 630bf23162beba..bcc1d3bbb1f708 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 23b9c76cb5dee6..efb0d647039606 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 d48dfd53927bff..05cacbedc9541a 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 2cb83de66884be..7b5a2f3712d2fb 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 7ba0a06fe1dcad..3616d8ba648aae 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 6b49adbfcf6bb4..9bd6ef0346201f 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 f8a801c03ff168..e89d53be3afb7d 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 c1ac3d161d03b9..30990d58b61848 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 b8965831809eb2..a1104d70f33c4b 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 dc79ae09883e6b..c1c9aa4120c656 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 a7832e70719a17..72a67879d0e170 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 864166e594ad1b..b6ef5a060638d4 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 38a0c20fd64774..ad61827594b9c3 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 68f68ad90b7d1b..2793c629096234 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 ce60f85b043236..41e142d0727891 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 20c6fb24a2059b..d3c8706669693c 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 94240cf0138d50..0a85612a08056c 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 1fb44858b067d6..882c3daab35086 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 9ad2286f1b7cd6..bd94f2bc560e4c 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 082dfeca3ab244..e66e1ff68aaf7c 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 543dcb80fc308c..999b92a04dc8df 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 964e5a19f8694d..c3d970739576db 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 b0e1c11d7ced9a..af1c55ca89c40c 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 8aa037d7b386f6..9fe473538c3e81 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 f191998e7cec7a..527cbf973c70d6 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 94ddda9304d7dc..d9f4387af157ec 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 fba973d6ba5531..9ee08b703749f7 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 8fc147fdaf1003..2843d8a8abd112 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 6971f32da65e92..e060365922f975 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 2da8e4121b9727..b65c8f55821499 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 f019633ed04cfa..bb28e3f790ff8b 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 34c217d4f4fd5f..c2cd77d8d63195 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 95db83388c6df7..17bbe73ed3a85b 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 fd684692660f03..5c1b93abb61f4b 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 d747c7b79aa19b..b97a117634b3b0 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 7a324faf508f8c..611ca71d263012 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 8dd4c5ac027bf2..8c45fd6908f2d2 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 51321eb0488180..db03bd7333cc2a 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 71b0803c32e77f..26fe7fa56354cd 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 6a1a91b7fb205d..5106f2425e29ff 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 7f5d103480960f..0318506b97d34a 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 f8ee8076fb32ac..a816c0cdc37e67 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 9e30e5355bf309..f724737a341fe2 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 dd655fd3fd70b5..8d1c1ce8da610f 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 307f12c6c924eb..9070173407e2fd 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 148ad763ccf131..86a6cbe7485056 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 272a338f879bf7..0f35ab7af56e9a 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 64f4e19a783a75..6e8cf8f2e730ed 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 518ab03a541b34..782f9ffe530dec 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 2d990759c527b7..0848e19b97a557 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 e836da8ebab59c..705c45ab54f4f9 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 1a27469ba354b8..08afe497c9e167 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 99c7f4422720aa..b9760105c1f0cb 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 ca975329670a94..0e88168cb1d225 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 7d619c398b33e7..f2197505c4dcb2 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 221c58e3d5d92f..bac6ad1dbba55a 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 b4f23c1ac66ea3..2142408d1c2bc1 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 d418577e3be74e..615f834a1c5710 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 dfe8947411aab2..7fb327f1fd8205 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 4b7137a9d2e526..b0204177729cee 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 9c27be47c3942a..85cb6efd251e96 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 3858f3971f1dd5..3c2e2122d1fbf6 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 6d6c8507d26fac..a5358c3176478c 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 53facefaff77eb..f04438b4c35e3b 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 80d196dc6e0842..93a97de9940123 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 98f0bcbaf99a10..9dbfbcd97fb416 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 aafb718fc60c48..9627efc8700666 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 46aa342c29c5d1..761a42428af55d 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 882d3256b97fa7..9fe9ba4465ec47 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 1e30e85e4645dc..ca375098c7972f 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 02acfb268e796a..c0fe5dbc1ac4ce 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 a94aa6111746aa..d47660c7e9af8c 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 1f1949d765db88..7fc22c695e52a8 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 1fbefbfcfd523e..cefcd50c5ce715 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 052ddefe5cc5c5..f24d4554cdc6f0 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 62f63fa73491bb..48c664e3a22dd6 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 15a6ce06005daa..9f1c02f46f361d 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 669eed3072a754..e881940d61c22e 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 0ee12612323f4d..7a119d4109d057 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 899b97b53836e0..3dbe0aa9a489ca 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 f34d77953d4c83..b63440a48ca00b 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 87ddbb9b172521..8548b63d9cb0ff 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 d7d32ecd844ccd..508e6138640d1e 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 f96e98586b9fc9..5a0b7c5000bab6 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 50dd814043b4fa..321b3822f72e95 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 bb527c5d847c6e..100db300e62818 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 6fdc654b6603c3..c3787e7b8082ae 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 9e5eecf0b68e5c..9f9ab76709db07 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 0b57aa1f03ee17..ee289359b3267e 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 e70a69060e5b34..06486080c3cb9e 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 9313d5a6b644d0..fc3d772024ad43 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 ff8b5f8e51a566..113fe9b6b5e807 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 8e5fe6155aa426..6fc909667d546d 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 07b1903e5ff415..97c5b56769db0f 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 0968f1fd54906c..3723b260a6e5ec 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 eff2fdfe9edbea..d279bb240a6c0a 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 924de8ab91b937..93e80cdb8ae80f 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 1b89968f1cf966..eada293ab2788a 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 1f7f41837f26ef..5fd0138e2bc184 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 2f0e4dee68b9f0..fed4bda884104d 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 4e69d2f5a574f3..5c1faadc6dbf05 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 43a3d038178af2..fd9ad5d6b375f4 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 56d37e3d363268..e216186ed26d14 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 ec614bbf4730c2..b0628941d42fcd 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 72dd69fcf9fb9e..4698e90e7e1b49 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 b4c76ac8d40125..c7c2db1ea5a428 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 50e5907474133e..cee1f26c166aeb 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 853ee43a634d4a..57533a60831880 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 61e4ac9cdd3d8d..c28955cc1c1221 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 097385327be30a..3eee6c020820f8 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 274663f7928e6d..74cbeeb15eb2c3 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 70a5f87b5efeb5..4fd8992b81d4e2 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 15306dd81cad2b..47cb64fd75328d 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 43826076f19a67..0bb5a86ecab3bf 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 3aed636785b92d..11f6664f221f8d 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 59632b19f2da48..da434ffb8972f8 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 9ec294602aee99..f20e9c99237df2 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 14c11a7250bbf7..9fd43d0c432d0f 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 e2e44e7fcadae1..2efcddc7057ba6 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 4253552b3cea8b..5afb7ea76381ac 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 2fbb53bd9103d7..36b07959599001 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 da42ff3aef5095..1328d363a07dd7 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 d33fc9d5204f82..aa8690ec90f75a 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 9fe08f68ff0977..92d476a8f98542 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 875b724e1ebb32..891dca63848032 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 af64d496c6ce12..65ea0b913fb6eb 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 c6318ceb2814b6..70d397d5ac3c1f 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 738b04f7195f42..edafb527ba370e 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 bddad18586e0db..fa2d5dcc1a80cf 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 08df21466e8bea..6bf308e01c5f70 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 fe03f3eab368a6..fe10c6d1904a4e 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 586a3519d80868..aaa1b2986e193c 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 03e8889f98133c..ad16c9b3193a52 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 6b6fff84336ca6..eaf4fd8aabb20a 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 279a4a7c859b38..74d29665ac5076 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 b998ac8cb94b28..3c46b82c26191f 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 dd15a21e5bcc63..8b27d832aa4b4e 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 761b462ad2ecaa..6936bc6dc37775 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 af175cdc387ffc..c5b300d07e9e10 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 1db9f148f90d4d..4df2444e33959a 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 a3625b350df000..d893bccc8f3aaa 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 db1ab785523150..1c645e1526fac9 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 896b6b8ffd81d6..63d1f8ee54c60d 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 cc2d6e7442ef91..eaa7f364be4975 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 ad1ba6f2bf242a..02aab758856a17 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 396e39f9b22cbd..0a4089d597a478 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 64897e9c27d021..9740311c1aef72 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 c807cb32cdf8f4..a2d72ee5814942 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 dc369d61e65c20..f77f7c0ba30040 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 99fb99ab727ca7..f3bfa00cf9f50b 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 3ae8a7cbde7bf5..33c2012638f4cf 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 4932f644e60003..15212beb500258 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/manifest.json b/homeassistant/components/roborock/manifest.json index 75caa58ba36a5a..2d593b865f1f2d 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/homeassistant/components/roborock/services.py b/homeassistant/components/roborock/services.py index 35eebd2b4006da..1a66c09703bb75 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/roborock/strings.json b/homeassistant/components/roborock/strings.json index a914ef16720f2e..4c2d8c9dd96e4f 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 ee8ba8bb49687d..bd4607d9449da7 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/homeassistant/components/rocketchat/notify.py b/homeassistant/components/rocketchat/notify.py index 8b461423a3f881..b2c10466c2481b 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 884edd6f15ec47..b45522fe3619ae 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 15f6d97c28b83e..5ee318b780f558 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 66051c4e5f46b7..1b6735c7e62ae9 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 2837c966e9ec2c..36b1ce335fe143 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 5f3ac74b6a46dd..773b45c77d2be1 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 885e99d504019f..9b60e0dbd667f0 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 68d5eb736a4ffd..42a761050379d3 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 238781eb026b96..327c554b729322 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 e6c4c2668a19b7..5d62ae900b28b9 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 67c283fef5f902..64cb79f143cb22 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 8a7d0460718565..1de1306107d4af 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 b36974808b035c..14a0f500fac29e 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 d322c9d68c3f08..375802772e24de 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 8cc28de81e7b56..d0b014fd91db6c 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 5a7d7bb2fb7113..0272da2b8931bc 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 dca31657dcb034..25776da7a88193 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 f67e3ca1151b21..21d951b3564633 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 f319e59a3436e0..b2f7e9b98de759 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 6f1b1569eec74f..db94efe28f1eb6 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 e7d26f8942d416..cfdd5c14d28515 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 a184f3c67a9066..fec04048e712fd 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 471354b05de726..93a5b1cf5d39a8 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 e330772d3da2b9..32b764d249f23a 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 253469900a0b4b..5a9568755d59dc 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 1d3fc5705825f0..26d6925ad3b643 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 5cc5b386646e0f..ca00e8cb594225 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 06464e73915a6c..024e772be9bf59 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 657e62f69e5b5a..7565765d3b7410 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 9db4f7b05fe08f..507bf2c9eef88f 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 9992ec23638623..56fdbd987bc1f8 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 90a4a536646166..9c27f5b6907685 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 77a4a3aa50500b..a70d845696e951 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 37e74eea532b6a..c715fe7950f9a3 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 039daa32e821fe..e8bbc490f7c10a 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 f7a8b631a051d6..4c54dae00f0a2d 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 ff17a872ba6808..5b3388c44cbcd5 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 f680177219f3c2..fe32ce43b017a7 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 4accb581987ae8..0591e182961c64 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 567e0123485325..332be51434aa98 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 8680da97a74bf3..7dc2d094d7da6f 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 1eef5777378019..06cf9f9e846ca1 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 a99b6c308896b0..0934fcd178c4b3 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 30f9a4c75a6ec2..0dc69a9f983eab 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 cb49979dcbbdf8..f54fbead9ef553 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 0580793b8003ee..0d8c6bfde765b0 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 a8135e7901c822..a42603413e3837 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 2e7e796b245ae3..28f58a2a9948e8 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 1d176b517f11b0..4224221c84ff78 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 07b472a04ae2c9..9aa1289948450b 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 ca2474e69c2881..0ff373c8fdfe5f 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 8663d127931fa1..c86d12383f38db 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 90cbe12af1df64..cd5d45c7b735f3 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 4de1c028d7ed11..59dab89eeb729f 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 ede60ba229ee28..2599a7503978eb 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 aecb1c45f924b9..c0a7aa903e558b 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 9ec001f3bfe332..2dc8954369d2d9 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 c09a4c465dfbcb..9f396e99d4fca6 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 0b3de1377ccf38..f90f7b40ef4591 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 f3dbfa6b01611b..78a1bc8d8e0b7a 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 c9a68e3b4107b7..3665d7d7200b78 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 b7aae143c5ffd6..84df73b36e2d25 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 641ca81eef1fd2..5b3d7f73bf62b1 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 f0a07f04724327..295f4705321596 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 5d0ae61ecb1ead..43d2e45c28866a 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 e284866c066a5e..662fc25cd44469 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 eda863729fbf24..b3425643cef266 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 e7658cb394ba6d..22d608137c6c19 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 c150f6c71ab57b..f0c410fedce068 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 71ea3cda745860..58433d55bf2c18 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 222ec639388038..eb4a02781449ce 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 e0cc3909678622..ca1cca61b3ff5e 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 b6967686950138..79e4f17f6a9a1f 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 80158b976699d3..59a61dbac1375b 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 7f64e013080906..7a4707153cdda6 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 df9578e33a6dcd..f9a00ccb031ae8 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 61863489ce8479..0f57d22b35c957 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 52aef5522ac416..78c8d616dd4490 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 9ebc4499fa2c65..df713ecf286593 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 2f2a2c0009aab9..ee61e881d8198e 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 462820da23b341..678123ca877719 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 652a3363ad4f10..6a804ca9e04d02 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 b475bc016aa378..59af7e922d21fa 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 3af56179837416..0392f907ecac20 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 cdd7faf423836c..d3aa8889759f1b 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 5224bce10bdd56..afe566d8cc081c 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 dfd9f9bfd8b432..381ee9a8aefb62 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 c34726530573eb..d4854c6ca6494f 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 7c630dcb233cae..ea360cc258daf6 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 ee8543a822a622..0bf9a90ae9b427 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 3b793f97aaea29..33778295f16953 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 c1caddeebee9a3..47e7735eddaea0 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 08ac0f9f98a0e9..c5f46b0783ac29 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 ff3c5d0d734f22..770fefe3f0eb0f 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 ef898794674a64..185e1e84208761 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 30ef81ac31c850..eee2da646cf7bc 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 90d105a38864d6..9f7be075e243d0 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 1406826e47100f..2f36e8f81a20a2 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 84dabf9c155d24..136987c9e20574 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 b6c3a1b82fb7ba..dcd7cd5294a0ff 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 0cc65ac2c22d56..91b132795a9c4b 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 77b65032298696..0f25674bfa0011 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 f2a446e7b85cab..1add1d1c3950e1 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 f44e0b3a0c86d7..5c31f671a81930 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 7e57b3f5899112..4a9a4eaa7bee3b 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 1e7c5f38eeee28..ef648cd624b6ad 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 75d89d71ababcd..4e8213a370cf2c 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 868a0e82f89948..b35e5f10b1a59e 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 4637ad4b0e86b1..9f6cd03965a824 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 0f027e1f902bf1..68b9539ff96cee 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 3887a0babfd594..df58754d5e6479 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 67926368bea01c..4f74867e79874d 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 35dab938da61ca..e3dba3d64d5dc7 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 f03158d260c729..8c47c52c8e40cb 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 ff99fc66ff491f..3ec93fc049fa60 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 9cdd4cd9cbf70b..c159a3aa198777 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 89f467686fe367..86013a7aa13911 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 7d23d0b3020fb0..7b1ec1e5b38a59 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 ff47320ce3817a..3adf91bb773ad0 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 00cda638dbd542..43832280edbd4b 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 9c7fe0cb6d958f..9785caa86dec6d 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 7792cada11360d..18b2b8986e025a 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 910d3c6a017234..c3d96c0f8fd160 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 5b75759765e0d0..2a3776764d7560 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 a1d10484a812d1..cf65f2dbb4e73d 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 89fc4e07d65433..3bf5ad2aad10bd 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 f2cc623c8d0f50..a9d27d14837f63 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 192e56c6ffe4b2..9b979ec58178b6 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 26e46053602a34..7be1ca607ebaf4 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 cb5ec30d8519f8..d5713e29730781 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 4908a13c7038e4..ad3d8fb2718a71 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 19db352127968f..afcea07795743b 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 446de1a9b46f14..6848859fa17239 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 06282eac6834b0..3752f9843cdb39 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 fe4e29ad0a79e8..c345cd21638371 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 343c5d78740802..1e4e5563d74f19 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 d9d9c9d3fd46f7..0a824e40124000 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 9365d75d413664..08c13955b27c3f 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 b75f66d6f904b0..8230d35f58cd0c 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 bd01e5e4a745b7..02e847a7470bb6 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 0b4cb11ac1310f..7117f070e8f848 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 89dcc207a63ad7..5806688e77113c 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 78a137430761e2..491f7d8c3c1096 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 24779c5aa81050..523cf656c65b3a 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 49e6f259f467e4..d3d1e588b5486b 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 18f9aae8f13906..7bf1f5a6b6a0ce 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 eb6a1fe2182e8b..d7bfbf3a382c39 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 96e42b3925093b..fea5f1e5e0dafe 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 e953b4110f4347..a33607303844aa 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 b108b2315ad40a..29aa4218235ece 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 1e3dbf082ff1f8..d3b9c439d7f4b8 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 4623abc03da246..f9d2cc8a029d60 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 2a1a2b77ceb242..ba31ae52986dbe 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 a05867b8fd7f13..2de04eb962c53f 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 2fed542e382a15..727ea84e715490 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 bbc16afb2181d4..c724823e444270 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 0b32db20828a8c..d93ed0bbdbdae9 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 b373e754433590..29136ba2447e01 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 437b8ad24e6e1b..542224ee7dfd89 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 e45eb80627053b..db2d40dc2d9be9 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 ad5e1964ced32b..3197b202267024 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 6df6b76609dbeb..55d9c64275eff8 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 222ce4d196e2fb..ce60ce41519290 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 1584838a19a1f2..142903ac146bd9 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 a2386b8ed93287..65a951a2b5c16f 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 c4231d9db827fe..40725682db88e6 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 30e28825623965..b3a55e57c43832 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 f57c76bcfa1bd0..f22cd328ad7ede 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 2ae893b27927b9..46c5d6f1d11dea 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 1408a3194d7b1a..e75f16a8bfaa5a 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 5a229eae215407..c14a3e03b71f0a 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 68a0a245838f29..afab0e2203ab06 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 8d244e1846889f..79bdca4e03dbe6 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 d76b8b3df78c8a..4b59ff461fcfa0 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 4e8e5b7f9423ea..0f4d4d8b0296ed 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 b70f56b6b4f608..20a047cf81c9a0 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 9bafc13e0302ab..49ec9b4c025a9c 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 4e07dc185605ce..beaa4587def0d0 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 27095e508426f6..e566b4842b4af2 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 83af0cd20ac2e7..cea26f30ec153b 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 6043b53a546a0b..5c858324c2ee1d 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 db160d24ca1ce7..27751d3f2b630e 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 f015f6365cf703..70f400e9549978 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 8a98763b31c404..092d00cc803421 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 7d0041d03f8539..33f5cf58b0cf5a 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 598acef895b2a8..566565a95e1385 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 29c2f2dd75f65a..58d9d52e576e8c 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 80053d73ae114f..69772b8816f0f6 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 6c0f1765cab396..e31ad18449b174 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 eb0c6f3494c234..8787c4d4bf8eb7 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 29a1eec9a81137..5a8fe93feaca04 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 5820baeab33e06..d398c796bf0bcd 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 5c4180a38a9f7a..50ac4f6ff717e9 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 05123470e5fb2b..f9d051aa8b3606 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 6ff3d3c41c3a94..0f1917030653b3 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 f491b45634f978..fb121e03b14f76 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 63dec88dde497b..e9557bd33e3e43 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 575d17047f42ee..37fa473a08f367 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 499197d88f4b64..f834d0d7704533 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 9217fb8dbd525c..b9a660a1109974 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 0cd20e1452426c..7f321455aff89c 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 50519b9ed4bd6c..77fee17767aeb3 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 26e9576ce0ba52..fa55c4f3de5c7a 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 0c5db05f361b15..a6f750db067d08 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 5433696e9a82f7..fbd34d04e0dea8 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 72f1aa56fe3896..bbdf11de3b436b 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 0d85f965451d5a..bfc616577f4235 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 0a0cd67ade0ac0..4852e8b13e71a4 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 ff637aa9bb302d..76e4bc0e7d5e83 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 2aad1c2a2f395d..7c4bc0b1152f8d 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 40f7144f1e4b2a..39ff3c9b1f6878 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 2924ca7e092d73..f32eafb4f45f41 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 44480520af3d32..c9459822b6d687 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 f8eac2609e9403..c88bab6834cbd3 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 9dbb720227610a..0f8a642046ef1e 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 eb901399b2d5da..899e3ad511947f 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 400b05a8e89593..38d0c29fc8e2b1 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 0dbc40e8937e99..e8922c7b5c23c8 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 2654d74fdd5fe4..0c709f918bea5b 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 2e425b18c61296..eb8445bd0ab2f4 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 844b9f8f4cb532..f0ca0fed74e4f6 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 b54f6ebd04766e..84b1aa372ec46d 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 1c0916b3e47457..76fa9b5a197b67 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 097c84d1bc4fdc..d088f78d442b0b 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 97b505cba79b79..be05a522caa965 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 f3716a31597ea5..7e18a65b800ca1 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 d9893ef95d64f5..df913eea7288f3 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 a198be0e8e7864..b36b785d34fced 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 460c659584e2c8..0ab16b7122e6b8 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 3bf8c182e8679f..3a74e7a4788b97 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 a57b07f87b59e4..a8782202a75be4 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 6f0c4f4ba8d8c9..9b1f7cce0021af 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 175069a7171b47..b9d69f3fb945e5 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 f1a895f33bed0a..689a41df45dec2 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 ff4bc2ac2dafc7..f89ad87f0c35c3 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 dc8b16ad3c64c6..b6052f40f0c4d3 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 ae8c3d6a497d62..d4f65c6157161b 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 26cdccf6509c52..7b5bf9f7be5def 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 e9da8df17289ae..89b78b8a061400 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 0f93f3e4c9e75b..196cda94eee7d5 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 9adfa30cfe890c..754dea743dc7fc 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 68f2d6570ba3d9..291231c9945e18 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 f6378bbb3c2e0e..4a9474ce1915d0 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 2fe74a39dfe51c..c1669b92d8b800 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 accb7ac6206ac4..1df7da80417db8 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 fb4eabff5482e0..934b799c6eb2c0 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 bc15665fdd7706..4d01cef74cbef5 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 b2287fbc503062..2c5fbfa3b079b3 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 1eb9646ddb9839..da6451cdb42dbc 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 0aa84bc996c95e..620dd4c0417244 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 f87275e18d8030..acd58d7a058710 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 858920932ed74e..2ed17da6c53c00 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 93d9ed84489852..86eddb7228fbd3 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 5aea91a07c4289..634e9f9b786bd7 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 6ccc1f14b5fd81..5fb33ad72f8735 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 744040ac060a2d..fa9378b3342615 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 ce897fb84c5418..d0bce8c381e973 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 5ea13a6c6b5edb..f1ab9d9ebacbe8 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 f2d5efcb33c04b..1861f71bf63aec 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 c29feb5c786fdc..020ada5ed53cf5 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 9f7855526f4bc8..a89232c52f803b 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 75ded4bc7a4600..bf826b6526951c 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 77d83cad227223..ae9a9d6ff2e3f8 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 20622091071b6c..08d22e11a1a65f 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 e68085bdf52c1d..cbce57db40fd38 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 e62e61e1edfaf2..90b6d6a6728a8e 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 9065c017187979..35428953d25e67 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 a8ce3dc387e3c0..091fed7080ed6c 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 6080df8333d9e2..a13c4caeaca52f 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 9b1cc998b42be5..94a9ba1e0bd0bc 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 f46adf5b2db84d..9f1362fc29f9f7 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 8906f5064d9739..f20bf37d823386 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 2e82cf5f91d3b1..07bd1d1a755917 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 1566eb78d53e40..fe2104cb4b1751 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 3854c36a458d85..185b7c6bc42954 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 4feab70a04d21a..e7ae3040cb3171 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 6ba3fafdc231e3..99de37d4d139dd 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 6cce22e5d37247..fed7242afd6ef7 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 535a311f57b8e8..13a68c05f82692 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 33eee540c14e5c..967a310bf32fc4 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 c3e5a5d141f539..dc96c0ad9db35c 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 121cf644e9138e..69f98468f3b3a6 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 1ba120b8befc0a..dd6a3ead6c724a 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 4917ea7d48fa1c..fcf68739b98c42 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 d4cf2baf9ef249..82147be7d4eee7 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 5d47c381dc2a37..04412622979765 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 3e82df6f5fdb75..46db9f0d3c77cc 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 aa1b9c24c0bd2d..b7bee1cd762cef 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 38b77f89c72a5a..8d071f9199ee2c 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 58a5fa12f2e640..518537d2f2ed67 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 af8e0cb084f9b1..cae2c7d8bffb0e 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 911f3c6aa391c6..cee4d3c1e90771 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 433adeecec1387..7b888f35d27b56 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 1fc9c3519f5344..83f686170baa5e 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 0d897fb51ab18e..4a832d4c36e759 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 1f6721fd1514a1..80a9315ced4620 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 143b3e8d994477..e09e910565fb23 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 1798e4f1de0cab..7b430e70651e86 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 136bfcb4702f89..ae9fcb63518241 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 b4229c83f492d3..f02edfe0f2fe5b 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 89abd164311e16..48d7f03b7cd759 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 c725bc5d2e68d3..bc82d83d492386 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 6afb5aea8a3659..bce6f4ad4eb4d8 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 f1ed3f1d8fc8cd..66e2f6d313c9c5 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 7528d670c04e6a..fcf75699db367f 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 2e5a0c78ffa206..6ee1fd05877340 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 3156c9040e5c91..4af0b9e3dc9ac5 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 a150b21339705d..a3b84214a52a92 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 3cf945cc73340d..56a9e9e81c7896 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 16b09968ca7c38..ba6121f0444a2d 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 fab2639eeb4cae..f121bf3a8364d0 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 8344f19df81362..a2ac7bdf6dd7f7 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 28349cff3b2a8b..785e91cfb6bc47 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 409b9c0d887694..f4a103a97d6c13 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 7711125ffcb5ba..6856abed5a91db 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 a4a4318c4872f6..f74b5b43d4df5f 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 d573bc9799af83..c7be4a69eae851 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 c11437678034b9..b98ddd3d7a0ed9 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 7aaf3334f4aa84..d9f28e37dbc505 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 d0b77f0d847582..b5795dd080793a 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 b5ce72c38194a5..5fd9f38e5e9215 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 c8432a64d37dbc..190a33181e38e9 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 46a8585311de7a..a8f324f17163d4 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 4dbc31ccf9f5aa..8ec119b078683e 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 3ac312d23a6c6f..c2b4bbcd793c7c 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 5a50a704007491..857c84cc3037e8 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 7067858ad26463..968bb04b59944e 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 71d46d694c9530..d1b3dd62b5171d 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 6edfd235051692..1513635a6d602f 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 00803db2aa7678..589cdd3dca2d24 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 6062c7a2595fa3..7e2b5324adb302 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 21142073725e7a..7efbea358ce15a 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 a259274b1cb59e..196f9c9b2ddc33 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 5d2d522ae3bf09..41dc88e5c138eb 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 4a6a6cc4e95a79..09efb3d76cb6d7 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 6b2764aee36909..03d9f0c2fac05b 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 3759bf9f4c5055..532381be21daf5 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 9713a1aa227c53..dcb5ae551daabc 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 499e43b474fdaf..f29716335d999d 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 d13a87ec0af4b0..abcf0ffe47d5e0 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 2576196a921d17..85ab2b8a90e0a8 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 c3f0623f9e4bd6..46bd10cb5838b2 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 a0f51ac58a171b..7be5d64ca559e8 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 d75fff1a466948..7eddc5326601fb 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 46f3896782fa26..4db0df23e87679 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 67976f88f5cbcf..17216134ee5d4f 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 d9111272cd533b..cb4a9a23436126 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 a8cf72c2a76a3e..b0b38d17335789 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 c0629c29558ffc..0dfb25d3cbbeee 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 f930059b7dadce..f2634969c7ff05 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 a5acf1c514abd6..e4f0bea0a961ce 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 8ec904a778372f..f995f8c7d16fee 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 3be3c38a794c28..fa4a5dbeedec37 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 ea7690bf722674..af20cf9c1b772b 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 a224b2a9fd6a1f..206bd56d82e423 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 24ec146966f3e1..b2534ffc6038f8 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 2339013dcb5fbb..06bf11cff56bc3 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 3629f71b821fef..45753882d477ea 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 e9f0a400f3bb61..a095e52a5a3a9e 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 7556369d1ad1ef..5e556e62c85b15 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 a9d79e2a16a231..4f2a50171da234 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 cf182a092a0390..de17ab9583a4ee 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 7c4985c0df3fe3..678bf17d1a3e06 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 0a6bfa61968fc6..4536737a270024 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 364925e79957d7..17238b62ef1019 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 7ed65bdd54b67a..4c1a94e80b8d0c 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 7b6bb7ba32e10e..a1686d1c4c5340 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 6a17c667ea0e10..19895b01fa7c98 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 ecc293880a8f38..2c6e79f297f1ad 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 69a9280803f85b..6d220daa7019be 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 a5d018d01ccd88..c4417a4dbad35d 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 581864a611415b..2c6d04d795a935 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 e4b160253711a1..f8aafccb8c3ad5 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 bb40f72ed62f38..ad7eb1cdeca81f 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 5aa33f6c0a7702..a2a0bbd49e1ec0 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 0eed98805fd0c4..dcdf876a2bf79c 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 3558974b865536..2bec6a0a605a6d 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 47643a53f8fff2..ec8884da73b3fa 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 1d0bb89ed71023..bf2cf16c6e1313 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 1690662f38f351..f6fbcbf4db971f 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 6c24cb32c6b2c6..5d8ff918ad8fef 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 2c659bd00b6447..60bd9c40008378 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 211b64db30e36c..183e3583705549 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 71ffe80206f854..c10c2f0feb8e35 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 a8b306ee4915d0..3982234b0c1f73 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 6e063c5a088733..b4c38ca85ff8d4 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 f2c7ffd6383dd6..29c67a754aba46 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 ed75911b281719..2ed3d939b3ac4b 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 58761ff95ddcad..f495267e5591df 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 b2a049627d80bc..ab3a2ca49e4905 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 0a52ff9bb50503..87ab4f17e4851d 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 1aab699529ea09..ba136396f96ffa 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 486fbdb3c252e1..f5db51cf96879e 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 387b71e697caeb..0bce40fc854457 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 0f54b862e3d851..c78e8c7a68721b 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 260a91ea2e7dae..88262a8e003ca7 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 19f0d37ebbc822..df1e6dc36be73d 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 2a118f5b76711d..b295ef990ad196 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 01eed834fdda49..28314710e4ccad 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 ce2755f46ce5e1..0758860617969d 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 eb429a2e30c572..c68013027cc809 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 1afe66b28ee290..dcc3519adf92c0 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 818c176cbe5792..baa76de82e4c6e 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 62a757afdfba78..92e16742f93dd5 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 d4c251cecaa53b..b65055da5a007a 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 25616430bcca43..549052c0cd2943 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 f232375638b6f2..81995407b4bd74 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 16c540f26c4a55..705f410d060e3e 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 2768a3cc3ff3b7..11be2adc0c49d9 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 9e11b0556630de..8849fbb2743ff8 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 f92956a4d26440..9cdb4ac3311319 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 511cf3b09f973e..4503920cda2179 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 e29698033ccbc8..4d45ceab088ca3 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 8a3bdee0ad84b1..116f12795b16d4 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 83866aeb25176f..83ff47a50dda48 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 6d84a24f148559..b678fdc569f12c 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 e060aa98f619fc..e9f32b84d8427f 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 415f0a4693675d..4a9676324a2310 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 ab68a87d109298..c10b162f8bb662 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 f872e4aaa6a740..7debe3000ed174 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 782e921f7f6b87..22b12636dcf980 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 baef32e7b76d5f..70dbb0f045544a 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 184d8e659156a0..80e9567ed8f368 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 03a86e7bf5ba2d..41edc24942c383 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 d072c3a7fcfb56..a1f4f8e99305a9 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 5a73894a977008..f645e1f799cbee 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 bfa950dd3c34ef..b91c6f9736ae48 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 f4b0361b24f7b8..845bc269c0f08d 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_gx/manifest.json b/homeassistant/components/victron_gx/manifest.json index 82460492c8223b..9017243c05f845 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/homeassistant/components/victron_remote_monitoring/config_flow.py b/homeassistant/components/victron_remote_monitoring/config_flow.py index 6a9178d56fbd0b..0f360d52046337 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 40fd11edee3147..e161f84ea80e23 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 82c6f419ccf9ab..1d660f36bef824 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 421aa2c1aa5fa0..789cfa9699056f 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 cbcc5424a740e0..6c100e81961f69 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 dc784e15b8b81d..5585b34041b17a 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 424e5199e95eea..c5499db1a9aa01 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 e9e467639f10e5..22c7ad75113412 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 3b2af107af171c..cd4ab243da65a4 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 ed9a9c41aff911..0fcf694d6d1b9a 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 915fe26147b7e3..1630e51fc9ad25 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 acf58f9c1c41f7..c29c92dfb9d358 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 91f076a22e7277..b455dadf8bec4e 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 06d8d02e20b372..54ce36760df3c7 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 0eaabae1104473..67a33b6f638d71 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 7dab0b137c5355..172c919f6edc06 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 bdfed9222c0a06..32b41346c201c1 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 8dd1972757084a..d25ea2c5a5de2d 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 260cd82ecc46e7..8c48989d7d4ccd 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 623a5928a22b76..37a3680c37406f 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 7ff3c36facd55f..90a2bb6327a75c 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 be9ee72360f85c..003c0ade07e7e0 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 c87876dc72a790..4b82a904122b48 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 e67343474170d9..57845d96297a51 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 b6f51a348fd67f..cbcc03b6199388 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 8ef1735af32a8c..81447b7e886442 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 2fa0063fd63d2f..ba1d24b8cd58a8 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 499e438da68623..a7d55a58e1935e 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 3596005baf1e44..ddc4e02dd0d4ca 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 231e99854fa02b..d1d6bbd9d69d3f 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 e7659c6e47a665..b73eec819a162b 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 51f099e7d31913..10a76174be6829 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 2de2f5a70d151d..b5c81776f59e73 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 3b4d24ce26478f..0883fc2181d48f 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 8e6cf6e8b0cb31..4193f123a2ace1 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 ffc12cd6aba0e8..92280a5996436c 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 207318b3763429..00fb52bb18507e 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 68945a7e5944d4..eb5f2d0c0d7ec1 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 e37274c1501b9a..686768153c3005 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 f228919816fd01..77756289243284 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 2fd4de986a2c6c..f0acd42692f12a 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 f5fd14bfae35ae..4f87381c595ead 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 897e997541f5a0..fb307fa0e6f8ea 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 bba332f50d8cb6..3cffd0e4da227e 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 1e885cc71f72e2..3f8153b2a3caec 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 8732ed7c5a4236..66726a8a160db7 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 9b4141a5b7dc80..95c3e5b0e5f509 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 04cd10548ca086..ed4d4f4f502654 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 34afcd892a9c95..78b02a3e00fb33 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 f46606640f7885..a4b73688a506d0 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 0864b1bd9023f3..3f2b8103c594ad 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 d4f824d20db749..cd6e0426973039 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 37ac60baba0989..557f2b28760495 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 a6d3b54f427154..f1f543e2257720 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 68cce36725917c..9497854eb94faa 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 7be2c7e0896d7a..c1c85b61e7607e 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 8444dd4cd12884..82b12dcb3af5eb 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 138f5435ce57aa..a6c08f3540295f 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 46f4801425ef01..05251d8b0375a8 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 b5ad9cc4fa5257..f5338d10b64f4c 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 fce81c4e3e75b0..af8fed7395e19f 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 27eaca93a53d6e..171556463ab768 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 c345c38a95aa44..01f08541674d3e 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 ac326207719d09..8252b4ef1d2123 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 9baeee476a29d2..c3f55f3d56439f 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 f95ea0aa7e676f..9df587404abcc8 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 061192248833d0..f645a5dd9eff6d 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 e4c892af152136..6ae604cca71f58 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 d288a302306bf8..b5ff7f5165ec6d 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 18ad70266d95f2..09777d5693a9e3 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 ccc71834a8f995..6fa6878e4ee1c5 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 389ce0de4304bb..454cb67266f2fc 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 02384f88b2d3eb..f1ab64488fdb18 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 add884165c3efe..401f87ec0e2295 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 5fde80f410be74..a514e2a1874fd6 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 9c4e452771e55c..a104acb33d6f3f 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 e9b4ea4e557d44..fccf92fb17613b 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 bcfad346d1efa4..e1fa78cb911d27 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 b1b8fef7e122e3..184312d281f1ce 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 70ec6a7b36c0fc..bf74d5fe796635 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 ccae58bd918769..a4f449cb078e49 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 eee51da64ce64a..1dd09c8f4f3f32 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 35946b770c9917..4be9a2efb49ed4 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 66fb2e1eafa254..9112e293ecb2c3 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 a8546d1e1bbcef..7c2928f3878311 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 a3a174b801da8a..3c32e8e6b5341b 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 c536817ac40613..9bb2ca91317392 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 6ca4064751d57d..1bb2b472bab056 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 1e2b8b0b624da5..0877a702b12a2c 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 936e038e3dd935..44e63a5f2df118 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 6752767439d0a4..fa42fbc56ce1a6 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 88cf3ddb58dd47..352bc00662b503 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 d605bd272ff2f1..454392f5770e0f 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 d7d8176634c668..f44d830c125169 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 aed465717fb5dd..0cf1fa711c11bf 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 ac01b2fb8e9136..e8c562878da9ea 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 7ae0140202e859..d22d20ba97baf1 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 79c69b1b565142..45300bf82f47c5 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 8c24538553ff7b..6c62de38729582 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 bda93b9df26e83..8b9a297123ff57 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 15fb9d021c6481..c740724a3b10c9 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 8d796151982067..b930c4d7419963 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 ffcbec3d18519c..e6bc4a6c8c442b 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 d2f08a8ca39251..1f1c069b53e7a6 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 2bcbf732fc4508..10d023e4c7e4f4 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 1630a8e8f48264..fefeea019ee483 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 269b81b55dc41f..42d778aad37af3 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 f5e86f4518841c..92d6c4d6b25d27 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 780bda5331cbe9..7c9a9217a768df 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 3f65146f34cf1f..540497431b6c49 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 fa1edc29826e22..27362d86b7b040 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 ac526265b528c7..489edc81f39f4b 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 2fb54accdc95d5..5bf123414b789b 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 9ae044c6aa3c80..8af05dce7b5d49 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 4c332a0658abab..c177cf2d3e09ef 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 41a8c68e3cb85c..f3e565210e595b 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 0f0d7b6037fbfe..11e97cfb7b88fb 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 9880a55ea76818..24f56eae91272f 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 12dfe5a8b31d49..f7bd39b449c6ee 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 6a4ab6cf558d24..a6cab4e4158dff 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 265ffd3d3dd5d8..95234a469c59aa 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 9c5832a399c084..37ec040ca7335e 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 987a69a31aa125..c81727e83ef989 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 3ac49daad3dd7f..6bdcf23695d975 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 41e5b719d7aee1..52ce77d0c97fa0 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 7fb34b4cd15252..b67116d56dbc89 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 c513ed1042601f..7e0e2b638a254e 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 6b09a404b89ea4..2ebb288472a2b0 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 a434c502a3cca1..0a750c544d998d 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 3c532713156171..92f78dbbf91f8a 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 75d22ce28a1b06..dc7531142dcce4 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 93ea0eaf562076..59665ff83c9249 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 66294af2b7b3c2..decdd3516ab2c4 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 6ef2e40138806b..cbf196679f7df6 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 9d16fc29eafa9c..56c2c0fe7a3aab 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 3af5dff40ccb07..c31547529a1874 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 485b88a56fc40a..623436a1347d07 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 2c226f0b3bf479..52f71b55310ddb 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 8baa72db314fa6..b29b02462b0570 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 96dc18dbcf4bf9..b50099a1d0b537 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 78a220b06f0558..d89292b15ec6d9 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 ae00b0bff59993..106bbdda580fb9 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 c23a3bb6f3c96b..fefb0447208c3f 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 27b69a8d62dcac..94249c1e6aa7ff 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 46edbf7eb0e746..98af24b4d61233 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 53847213c85a52..59447c83856337 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 c934a96f58863b..83cb2c3dfc727e 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 1ebcce4cc97ad4..4cb55d2d766451 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 0b5cdbcfb846f2..877dbd225314f2 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 aeafd5a052af00..c6a345f2d10e2e 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 9467d570680abb..3c67c4a67f8dd1 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 77c09dae2aced3..08e20651efd72d 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 ceaf50e9c003a9..2f0db418b6e90c 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 3d04d613fc25d2..972c8b263aada5 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 a54f7b9df759d7..16dbe1dc268ae6 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 d6d19a1959042b..15f836c054817b 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 ddb8b5df63f57a..ec9bc6c13bc1d7 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 f958ef62e75730..eafda9ce28e07a 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 7dcf1972033f11..fdb979af67b0e8 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 32cdaf9544dfe1..e8db1b0f65a457 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 13b8445711081a..1598606d57a092 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, } ) diff --git a/homeassistant/config.py b/homeassistant/config.py index edcd6ec85fac1d..96e3a4f7c117b5 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 89077df7488d51..e39a6e505c5571 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 5bc5f94c85e308..34fd164c47dcb0 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 82413efcc7216b..93609b2cbc328c 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 deb8d5ae2226c8..adcc791fb0714d 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 4b1199e48a9ce4..98e4c8b59e40e6 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 c7f302a41f6906..fecbf8424d785f 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 3a8c8186f78cd5..07d089b115929c 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 b373d5dd4a6f84..dae7d54c82fd6a 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 95926ea7b7643b..04d5c6313bb035 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 b68ffa82f1ac5e..ae5763a27e7c6f 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 62b16a00175bd0..c4a9f7cd6b1cde 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 673862c85814c9..e2ca36c91aed86 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 111fb3c4a75f77..3192962dcbbe76 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 eb09ce526d9145..a0d343a78e6541 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 a380cec1ae3124..b5592ede489897 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 31d2bf26a69c36..2f112017479076 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 1fe67f966a7c3d..07b69a8f57a619 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 0d424b4d8cead7..c4de641e873e03 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 1da929f2291fc8..a70d8d594305be 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 88b690cb5bf189..f9af2eb1d71810 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 d4e9534c6337ba..00c8904136b7ad 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 5f446568f6a4f1..7dbd2cd5bf1b52 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 271a347ab251f8..8d79983628ddf0 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 e65d4a0043534f..6ebc1be77bbd0b 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 039b6c40b5376b..7c94006ad6711f 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 9451757998c63e..0dfe924eac574a 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 9515fd43f85dcd..3a860a2d61d6bb 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 9c044c7ea036cb..0ee784b23ce1a5 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 10f1697c4eee54..11a32606464810 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 d3e9249a2fa109..5c0e20b4337c7d 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( diff --git a/pyproject.toml b/pyproject.toml index a24618011d919d..a16e180b02b90a 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/requirements_all.txt b/requirements_all.txt index d0d38d5fa88ebd..c7d42576de91a9 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 @@ -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 @@ -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 @@ -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 diff --git a/script/ruff.toml b/script/ruff.toml index a14712ec142fab..357c7713872068 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 f81a7b5fa75585..51b2777f6932e5 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/components/nest/test_climate.py b/tests/components/nest/test_climate.py index d9d411dd6ae910..fcfa32ce528bdd 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, diff --git a/tests/components/roborock/test_vacuum.py b/tests/components/roborock/test_vacuum.py index 68069d850196c0..796d13d7081fb5 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( diff --git a/tests/ruff.toml b/tests/ruff.toml index d12fe8caead895..be9ad1ccf64954 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]