From 93a9a110654cd5708e159a35331aba287aa77d15 Mon Sep 17 00:00:00 2001 From: Matthias Alphart Date: Sun, 11 Oct 2020 22:04:49 +0200 Subject: [PATCH] Add config validator helper positive_float (#41640) --- homeassistant/components/buienradar/camera.py | 4 +--- homeassistant/components/fronius/sensor.py | 4 +--- homeassistant/components/geonetnz_quakes/__init__.py | 2 +- homeassistant/components/hvv_departures/config_flow.py | 4 ++-- homeassistant/components/ign_sismologia/geo_location.py | 2 +- homeassistant/components/lcn/services.py | 8 +++----- homeassistant/components/lifx/light.py | 6 ++---- homeassistant/components/light/__init__.py | 2 +- homeassistant/components/media_player/__init__.py | 6 +----- homeassistant/components/mqtt/binary_sensor.py | 2 +- homeassistant/components/onkyo/media_player.py | 2 +- homeassistant/components/rainbird/switch.py | 2 +- homeassistant/components/recorder/__init__.py | 8 +++----- homeassistant/components/traccar/device_tracker.py | 4 +--- .../components/usgs_earthquakes_feed/geo_location.py | 2 +- homeassistant/components/xiaomi_miio/fan.py | 2 +- homeassistant/components/xiaomi_miio/remote.py | 6 ++---- homeassistant/components/xiaomi_miio/switch.py | 2 +- homeassistant/helpers/config_validation.py | 1 + 19 files changed, 26 insertions(+), 43 deletions(-) diff --git a/homeassistant/components/buienradar/camera.py b/homeassistant/components/buienradar/camera.py index 1bc0ee464db..652e37714f5 100644 --- a/homeassistant/components/buienradar/camera.py +++ b/homeassistant/components/buienradar/camera.py @@ -29,9 +29,7 @@ PLATFORM_SCHEMA = vol.All( PLATFORM_SCHEMA.extend( { vol.Optional(CONF_DIMENSION, default=512): DIM_RANGE, - vol.Optional(CONF_DELTA, default=600.0): vol.All( - vol.Coerce(float), vol.Range(min=0) - ), + vol.Optional(CONF_DELTA, default=600.0): cv.positive_float, vol.Optional(CONF_NAME, default="Buienradar loop"): cv.string, vol.Optional(CONF_COUNTRY, default="NL"): vol.All( vol.Coerce(str), vol.In(SUPPORTED_COUNTRY_CODES) diff --git a/homeassistant/components/fronius/sensor.py b/homeassistant/components/fronius/sensor.py index 7c966a6fa4a..130a8d55072 100644 --- a/homeassistant/components/fronius/sensor.py +++ b/homeassistant/components/fronius/sensor.py @@ -64,9 +64,7 @@ PLATFORM_SCHEMA = vol.Schema( vol.Optional(CONF_SCOPE, default=DEFAULT_SCOPE): vol.In( SCOPE_TYPES ), - vol.Optional(CONF_DEVICE): vol.All( - vol.Coerce(int), vol.Range(min=0) - ), + vol.Optional(CONF_DEVICE): cv.positive_int, } ], ), diff --git a/homeassistant/components/geonetnz_quakes/__init__.py b/homeassistant/components/geonetnz_quakes/__init__.py index 9395c9dbe66..a41fe350a11 100644 --- a/homeassistant/components/geonetnz_quakes/__init__.py +++ b/homeassistant/components/geonetnz_quakes/__init__.py @@ -48,7 +48,7 @@ CONFIG_SCHEMA = vol.Schema( vol.Optional(CONF_RADIUS, default=DEFAULT_RADIUS): vol.Coerce(float), vol.Optional( CONF_MINIMUM_MAGNITUDE, default=DEFAULT_MINIMUM_MAGNITUDE - ): vol.All(vol.Coerce(float), vol.Range(min=0)), + ): cv.positive_float, vol.Optional( CONF_SCAN_INTERVAL, default=DEFAULT_SCAN_INTERVAL ): cv.time_period, diff --git a/homeassistant/components/hvv_departures/config_flow.py b/homeassistant/components/hvv_departures/config_flow.py index 720114413d9..1a49bffd2f5 100644 --- a/homeassistant/components/hvv_departures/config_flow.py +++ b/homeassistant/components/hvv_departures/config_flow.py @@ -34,7 +34,7 @@ SCHEMA_STEP_STATION = vol.Schema({vol.Required(CONF_STATION): str}) SCHEMA_STEP_OPTIONS = vol.Schema( { vol.Required(CONF_FILTER): vol.In([]), - vol.Required(CONF_OFFSET, default=0): vol.All(int, vol.Range(min=0)), + vol.Required(CONF_OFFSET, default=0): cv.positive_int, vol.Optional(CONF_REAL_TIME, default=True): bool, } ) @@ -207,7 +207,7 @@ class OptionsFlowHandler(config_entries.OptionsFlow): vol.Required( CONF_OFFSET, default=self.config_entry.options.get(CONF_OFFSET, 0), - ): vol.All(int, vol.Range(min=0)), + ): cv.positive_int, vol.Optional( CONF_REAL_TIME, default=self.config_entry.options.get(CONF_REAL_TIME, True), diff --git a/homeassistant/components/ign_sismologia/geo_location.py b/homeassistant/components/ign_sismologia/geo_location.py index 6ed3af285a3..cc06110c111 100644 --- a/homeassistant/components/ign_sismologia/geo_location.py +++ b/homeassistant/components/ign_sismologia/geo_location.py @@ -46,7 +46,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( vol.Optional(CONF_RADIUS, default=DEFAULT_RADIUS_IN_KM): vol.Coerce(float), vol.Optional( CONF_MINIMUM_MAGNITUDE, default=DEFAULT_MINIMUM_MAGNITUDE - ): vol.All(vol.Coerce(float), vol.Range(min=0)), + ): cv.positive_float, } ) diff --git a/homeassistant/components/lcn/services.py b/homeassistant/components/lcn/services.py index 1a5d4475b0e..baa318f891f 100644 --- a/homeassistant/components/lcn/services.py +++ b/homeassistant/components/lcn/services.py @@ -187,9 +187,7 @@ class VarAbs(LcnServiceCall): vol.Required(CONF_VARIABLE): vol.All( vol.Upper, vol.In(VARIABLES + SETPOINTS) ), - vol.Optional(CONF_VALUE, default=0): vol.All( - vol.Coerce(int), vol.Range(min=0) - ), + vol.Optional(CONF_VALUE, default=0): cv.positive_int, vol.Optional(CONF_UNIT_OF_MEASUREMENT, default="native"): vol.All( vol.Upper, vol.In(VAR_UNITS) ), @@ -281,7 +279,7 @@ class SendKeys(LcnServiceCall): vol.Optional(CONF_STATE, default="hit"): vol.All( vol.Upper, vol.In(SENDKEYCOMMANDS) ), - vol.Optional(CONF_TIME, default=0): vol.All(int, vol.Range(min=0)), + vol.Optional(CONF_TIME, default=0): cv.positive_int, vol.Optional(CONF_TIME_UNIT, default=TIME_SECONDS): vol.All( vol.Upper, vol.In(TIME_UNITS) ), @@ -324,7 +322,7 @@ class LockKeys(LcnServiceCall): vol.Upper, cv.matches_regex(r"^[A-D]$") ), vol.Required(CONF_STATE): is_key_lock_states_string, - vol.Optional(CONF_TIME, default=0): vol.All(int, vol.Range(min=0)), + vol.Optional(CONF_TIME, default=0): cv.positive_int, vol.Optional(CONF_TIME_UNIT, default=TIME_SECONDS): vol.All( vol.Upper, vol.In(TIME_UNITS) ), diff --git a/homeassistant/components/lifx/light.py b/homeassistant/components/lifx/light.py index a6dbdb557dc..444bfe31480 100644 --- a/homeassistant/components/lifx/light.py +++ b/homeassistant/components/lifx/light.py @@ -127,9 +127,7 @@ LIFX_EFFECT_PULSE_SCHEMA = cv.make_entity_service_schema( vol.Exclusive(ATTR_COLOR_TEMP, COLOR_GROUP): vol.All( vol.Coerce(int), vol.Range(min=1) ), - vol.Exclusive(ATTR_KELVIN, COLOR_GROUP): vol.All( - vol.Coerce(int), vol.Range(min=0) - ), + vol.Exclusive(ATTR_KELVIN, COLOR_GROUP): cv.positive_int, 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), @@ -144,7 +142,7 @@ LIFX_EFFECT_COLORLOOP_SCHEMA = cv.make_entity_service_schema( 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)), - ATTR_TRANSITION: vol.All(vol.Coerce(float), vol.Range(min=0)), + ATTR_TRANSITION: cv.positive_float, } ) diff --git a/homeassistant/components/light/__init__.py b/homeassistant/components/light/__init__.py index 3defb203be8..a179eca6957 100644 --- a/homeassistant/components/light/__init__.py +++ b/homeassistant/components/light/__init__.py @@ -115,7 +115,7 @@ LIGHT_TURN_ON_SCHEMA = { vol.Exclusive(ATTR_COLOR_TEMP, COLOR_GROUP): vol.All( vol.Coerce(int), vol.Range(min=1) ), - vol.Exclusive(ATTR_KELVIN, COLOR_GROUP): vol.All(vol.Coerce(int), vol.Range(min=0)), + vol.Exclusive(ATTR_KELVIN, COLOR_GROUP): cv.positive_int, ATTR_WHITE_VALUE: vol.All(vol.Coerce(int), vol.Range(min=0, max=255)), ATTR_FLASH: VALID_FLASH, ATTR_EFFECT: cv.string, diff --git a/homeassistant/components/media_player/__init__.py b/homeassistant/components/media_player/__init__.py index 37f4b1db5da..52d61339c38 100644 --- a/homeassistant/components/media_player/__init__.py +++ b/homeassistant/components/media_player/__init__.py @@ -286,11 +286,7 @@ async def async_setup(hass, config): SERVICE_MEDIA_SEEK, vol.All( cv.make_entity_service_schema( - { - vol.Required(ATTR_MEDIA_SEEK_POSITION): vol.All( - vol.Coerce(float), vol.Range(min=0) - ) - } + {vol.Required(ATTR_MEDIA_SEEK_POSITION): cv.positive_float} ), _rename_keys(position=ATTR_MEDIA_SEEK_POSITION), ), diff --git a/homeassistant/components/mqtt/binary_sensor.py b/homeassistant/components/mqtt/binary_sensor.py index cf7b0fc3ca6..339b41a9ddc 100644 --- a/homeassistant/components/mqtt/binary_sensor.py +++ b/homeassistant/components/mqtt/binary_sensor.py @@ -60,7 +60,7 @@ PLATFORM_SCHEMA = ( vol.Optional(CONF_EXPIRE_AFTER): cv.positive_int, vol.Optional(CONF_FORCE_UPDATE, default=DEFAULT_FORCE_UPDATE): cv.boolean, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_OFF_DELAY): vol.All(vol.Coerce(int), vol.Range(min=0)), + 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, vol.Optional(CONF_UNIQUE_ID): cv.string, diff --git a/homeassistant/components/onkyo/media_player.py b/homeassistant/components/onkyo/media_player.py index 283c1468385..54df7735f10 100644 --- a/homeassistant/components/onkyo/media_player.py +++ b/homeassistant/components/onkyo/media_player.py @@ -83,7 +83,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( ), vol.Optional( CONF_RECEIVER_MAX_VOLUME, default=DEFAULT_RECEIVER_MAX_VOLUME - ): vol.All(vol.Coerce(int), vol.Range(min=0)), + ): cv.positive_int, vol.Optional(CONF_SOURCES, default=DEFAULT_SOURCES): {cv.string: cv.string}, } ) diff --git a/homeassistant/components/rainbird/switch.py b/homeassistant/components/rainbird/switch.py index 9041128be60..ce6cf9d1b22 100644 --- a/homeassistant/components/rainbird/switch.py +++ b/homeassistant/components/rainbird/switch.py @@ -20,7 +20,7 @@ SERVICE_START_IRRIGATION = "start_irrigation" SERVICE_SCHEMA_IRRIGATION = vol.Schema( { vol.Required(ATTR_ENTITY_ID): cv.entity_id, - vol.Required(ATTR_DURATION): vol.All(vol.Coerce(float), vol.Range(min=0)), + vol.Required(ATTR_DURATION): cv.positive_float, } ) diff --git a/homeassistant/components/recorder/__init__.py b/homeassistant/components/recorder/__init__.py index 65cb02d9ab1..4c74e5e8d41 100644 --- a/homeassistant/components/recorder/__init__.py +++ b/homeassistant/components/recorder/__init__.py @@ -48,7 +48,7 @@ ATTR_REPACK = "repack" SERVICE_PURGE_SCHEMA = vol.Schema( { - vol.Optional(ATTR_KEEP_DAYS): vol.All(vol.Coerce(int), vol.Range(min=0)), + vol.Optional(ATTR_KEEP_DAYS): cv.positive_int, vol.Optional(ATTR_REPACK, default=False): cv.boolean, } ) @@ -92,13 +92,11 @@ CONFIG_SCHEMA = vol.Schema( vol.Optional(CONF_PURGE_KEEP_DAYS, default=10): vol.All( vol.Coerce(int), vol.Range(min=1) ), - vol.Optional(CONF_PURGE_INTERVAL, default=1): vol.All( - vol.Coerce(int), vol.Range(min=0) - ), + vol.Optional(CONF_PURGE_INTERVAL, default=1): cv.positive_int, vol.Optional(CONF_DB_URL): cv.string, vol.Optional( CONF_COMMIT_INTERVAL, default=DEFAULT_COMMIT_INTERVAL - ): vol.All(vol.Coerce(int), vol.Range(min=0)), + ): cv.positive_int, vol.Optional( CONF_DB_MAX_RETRIES, default=DEFAULT_DB_MAX_RETRIES ): cv.positive_int, diff --git a/homeassistant/components/traccar/device_tracker.py b/homeassistant/components/traccar/device_tracker.py index dc2b60dec1a..cdb20339510 100644 --- a/homeassistant/components/traccar/device_tracker.py +++ b/homeassistant/components/traccar/device_tracker.py @@ -79,9 +79,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( vol.Optional(CONF_PORT, default=8082): cv.port, vol.Optional(CONF_SSL, default=False): cv.boolean, vol.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, - vol.Required(CONF_MAX_ACCURACY, default=0): vol.All( - vol.Coerce(int), vol.Range(min=0) - ), + vol.Required(CONF_MAX_ACCURACY, default=0): cv.positive_int, vol.Optional(CONF_SKIP_ACCURACY_ON, default=[]): vol.All( cv.ensure_list, [cv.string] ), diff --git a/homeassistant/components/usgs_earthquakes_feed/geo_location.py b/homeassistant/components/usgs_earthquakes_feed/geo_location.py index af9e82adf49..40a544a2e21 100644 --- a/homeassistant/components/usgs_earthquakes_feed/geo_location.py +++ b/homeassistant/components/usgs_earthquakes_feed/geo_location.py @@ -79,7 +79,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( vol.Optional(CONF_RADIUS, default=DEFAULT_RADIUS_IN_KM): vol.Coerce(float), vol.Optional( CONF_MINIMUM_MAGNITUDE, default=DEFAULT_MINIMUM_MAGNITUDE - ): vol.All(vol.Coerce(float), vol.Range(min=0)), + ): cv.positive_float, } ) diff --git a/homeassistant/components/xiaomi_miio/fan.py b/homeassistant/components/xiaomi_miio/fan.py index 3382ca910c3..b25f69f68c3 100644 --- a/homeassistant/components/xiaomi_miio/fan.py +++ b/homeassistant/components/xiaomi_miio/fan.py @@ -449,7 +449,7 @@ SERVICE_SCHEMA_VOLUME = AIRPURIFIER_SERVICE_SCHEMA.extend( ) SERVICE_SCHEMA_EXTRA_FEATURES = AIRPURIFIER_SERVICE_SCHEMA.extend( - {vol.Required(ATTR_FEATURES): vol.All(vol.Coerce(int), vol.Range(min=0))} + {vol.Required(ATTR_FEATURES): cv.positive_int} ) SERVICE_SCHEMA_TARGET_HUMIDITY = AIRPURIFIER_SERVICE_SCHEMA.extend( diff --git a/homeassistant/components/xiaomi_miio/remote.py b/homeassistant/components/xiaomi_miio/remote.py index c88b2d3663c..c946533ab54 100644 --- a/homeassistant/components/xiaomi_miio/remote.py +++ b/homeassistant/components/xiaomi_miio/remote.py @@ -45,9 +45,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { vol.Optional(CONF_NAME): cv.string, vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): vol.All( - int, vol.Range(min=0) - ), + 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) ), @@ -150,7 +148,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= platform.async_register_entity_service( SERVICE_LEARN, { - vol.Optional(CONF_TIMEOUT, default=10): vol.All(int, vol.Range(min=0)), + vol.Optional(CONF_TIMEOUT, default=10): cv.positive_int, vol.Optional(CONF_SLOT, default=1): vol.All( int, vol.Range(min=1, max=1000000) ), diff --git a/homeassistant/components/xiaomi_miio/switch.py b/homeassistant/components/xiaomi_miio/switch.py index e406e344ebf..781dd10a825 100644 --- a/homeassistant/components/xiaomi_miio/switch.py +++ b/homeassistant/components/xiaomi_miio/switch.py @@ -96,7 +96,7 @@ SERVICE_SCHEMA_POWER_MODE = SERVICE_SCHEMA.extend( ) SERVICE_SCHEMA_POWER_PRICE = SERVICE_SCHEMA.extend( - {vol.Required(ATTR_PRICE): vol.All(vol.Coerce(float), vol.Range(min=0))} + {vol.Required(ATTR_PRICE): cv.positive_float} ) SERVICE_TO_METHOD = { diff --git a/homeassistant/helpers/config_validation.py b/homeassistant/helpers/config_validation.py index 0a65fa96354..0b636ea5699 100644 --- a/homeassistant/helpers/config_validation.py +++ b/homeassistant/helpers/config_validation.py @@ -98,6 +98,7 @@ TIME_PERIOD_ERROR = "offset {} should be format 'HH:MM', 'HH:MM:SS' or 'HH:MM:SS 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" )