From 49bec86dae526ab14c003c726bc75b4ea07531de Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Fri, 11 Jun 2021 09:51:12 +0200 Subject: [PATCH] Add base schema for triggers (#51727) * Add base schema for triggers * Tweak * Make TRIGGER_BASE_SCHEMA a voluptuous schema * Make state trigger BASE_SCHEMA a voluptuous schema --- .../components/device_automation/__init__.py | 2 +- .../components/geo_location/trigger.py | 2 +- .../homeassistant/triggers/event.py | 2 +- .../homeassistant/triggers/homeassistant.py | 3 ++- .../homeassistant/triggers/numeric_state.py | 2 +- .../homeassistant/triggers/state.py | 22 +++++++++---------- .../components/homeassistant/triggers/time.py | 2 +- .../homeassistant/triggers/time_pattern.py | 2 +- homeassistant/components/litejet/trigger.py | 2 +- homeassistant/components/mqtt/trigger.py | 2 +- homeassistant/components/sun/trigger.py | 2 +- homeassistant/components/tag/trigger.py | 2 +- homeassistant/components/template/trigger.py | 2 +- homeassistant/components/webhook/trigger.py | 7 ++++-- homeassistant/components/zone/trigger.py | 2 +- homeassistant/helpers/config_validation.py | 4 +++- 16 files changed, 33 insertions(+), 27 deletions(-) diff --git a/homeassistant/components/device_automation/__init__.py b/homeassistant/components/device_automation/__init__.py index d6317ce45ce..93b0b9a4a9d 100644 --- a/homeassistant/components/device_automation/__init__.py +++ b/homeassistant/components/device_automation/__init__.py @@ -25,7 +25,7 @@ from .exceptions import DeviceNotFound, InvalidDeviceAutomationConfig DOMAIN = "device_automation" -DEVICE_TRIGGER_BASE_SCHEMA = vol.Schema( +DEVICE_TRIGGER_BASE_SCHEMA = cv.TRIGGER_BASE_SCHEMA.extend( { vol.Required(CONF_PLATFORM): "device", vol.Required(CONF_DOMAIN): str, diff --git a/homeassistant/components/geo_location/trigger.py b/homeassistant/components/geo_location/trigger.py index 4410d39c0a6..90621e7062c 100644 --- a/homeassistant/components/geo_location/trigger.py +++ b/homeassistant/components/geo_location/trigger.py @@ -18,7 +18,7 @@ EVENT_ENTER = "enter" EVENT_LEAVE = "leave" DEFAULT_EVENT = EVENT_ENTER -TRIGGER_SCHEMA = vol.Schema( +TRIGGER_SCHEMA = cv.TRIGGER_BASE_SCHEMA.extend( { vol.Required(CONF_PLATFORM): "geo_location", vol.Required(CONF_SOURCE): cv.string, diff --git a/homeassistant/components/homeassistant/triggers/event.py b/homeassistant/components/homeassistant/triggers/event.py index 2e78a93315d..ec44c861835 100644 --- a/homeassistant/components/homeassistant/triggers/event.py +++ b/homeassistant/components/homeassistant/triggers/event.py @@ -10,7 +10,7 @@ from homeassistant.helpers import config_validation as cv, template CONF_EVENT_TYPE = "event_type" CONF_EVENT_CONTEXT = "context" -TRIGGER_SCHEMA = vol.Schema( +TRIGGER_SCHEMA = cv.TRIGGER_BASE_SCHEMA.extend( { vol.Required(CONF_PLATFORM): "event", vol.Required(CONF_EVENT_TYPE): vol.All(cv.ensure_list, [cv.template]), diff --git a/homeassistant/components/homeassistant/triggers/homeassistant.py b/homeassistant/components/homeassistant/triggers/homeassistant.py index 2f3ae8e6ad2..3593e27b530 100644 --- a/homeassistant/components/homeassistant/triggers/homeassistant.py +++ b/homeassistant/components/homeassistant/triggers/homeassistant.py @@ -3,13 +3,14 @@ import voluptuous as vol from homeassistant.const import CONF_EVENT, CONF_PLATFORM, EVENT_HOMEASSISTANT_STOP from homeassistant.core import HassJob, callback +from homeassistant.helpers import config_validation as cv # mypy: allow-untyped-defs EVENT_START = "start" EVENT_SHUTDOWN = "shutdown" -TRIGGER_SCHEMA = vol.Schema( +TRIGGER_SCHEMA = cv.TRIGGER_BASE_SCHEMA.extend( { vol.Required(CONF_PLATFORM): "homeassistant", vol.Required(CONF_EVENT): vol.Any(EVENT_START, EVENT_SHUTDOWN), diff --git a/homeassistant/components/homeassistant/triggers/numeric_state.py b/homeassistant/components/homeassistant/triggers/numeric_state.py index 05eed9ee27b..4ab92c36205 100644 --- a/homeassistant/components/homeassistant/triggers/numeric_state.py +++ b/homeassistant/components/homeassistant/triggers/numeric_state.py @@ -44,7 +44,7 @@ def validate_above_below(value): TRIGGER_SCHEMA = vol.All( - vol.Schema( + cv.TRIGGER_BASE_SCHEMA.extend( { vol.Required(CONF_PLATFORM): "numeric_state", vol.Required(CONF_ENTITY_ID): cv.entity_ids, diff --git a/homeassistant/components/homeassistant/triggers/state.py b/homeassistant/components/homeassistant/triggers/state.py index 69cddbfe126..edcf6b09a78 100644 --- a/homeassistant/components/homeassistant/triggers/state.py +++ b/homeassistant/components/homeassistant/triggers/state.py @@ -27,25 +27,25 @@ CONF_ENTITY_ID = "entity_id" CONF_FROM = "from" CONF_TO = "to" -BASE_SCHEMA = { - vol.Required(CONF_PLATFORM): "state", - vol.Required(CONF_ENTITY_ID): cv.entity_ids, - vol.Optional(CONF_FOR): cv.positive_time_period_template, - vol.Optional(CONF_ATTRIBUTE): cv.match_all, -} - -TRIGGER_STATE_SCHEMA = vol.Schema( +BASE_SCHEMA = cv.TRIGGER_BASE_SCHEMA.extend( + { + vol.Required(CONF_PLATFORM): "state", + vol.Required(CONF_ENTITY_ID): cv.entity_ids, + vol.Optional(CONF_FOR): cv.positive_time_period_template, + vol.Optional(CONF_ATTRIBUTE): cv.match_all, + } +) + +TRIGGER_STATE_SCHEMA = BASE_SCHEMA.extend( { - **BASE_SCHEMA, # These are str on purpose. Want to catch YAML conversions vol.Optional(CONF_FROM): vol.Any(str, [str]), vol.Optional(CONF_TO): vol.Any(str, [str]), } ) -TRIGGER_ATTRIBUTE_SCHEMA = vol.Schema( +TRIGGER_ATTRIBUTE_SCHEMA = BASE_SCHEMA.extend( { - **BASE_SCHEMA, vol.Optional(CONF_FROM): cv.match_all, vol.Optional(CONF_TO): cv.match_all, } diff --git a/homeassistant/components/homeassistant/triggers/time.py b/homeassistant/components/homeassistant/triggers/time.py index 6668672732e..3d7c612cc55 100644 --- a/homeassistant/components/homeassistant/triggers/time.py +++ b/homeassistant/components/homeassistant/triggers/time.py @@ -29,7 +29,7 @@ _TIME_TRIGGER_SCHEMA = vol.Any( msg="Expected HH:MM, HH:MM:SS or Entity ID with domain 'input_datetime' or 'sensor'", ) -TRIGGER_SCHEMA = vol.Schema( +TRIGGER_SCHEMA = cv.TRIGGER_BASE_SCHEMA.extend( { vol.Required(CONF_PLATFORM): "time", vol.Required(CONF_AT): vol.All(cv.ensure_list, [_TIME_TRIGGER_SCHEMA]), diff --git a/homeassistant/components/homeassistant/triggers/time_pattern.py b/homeassistant/components/homeassistant/triggers/time_pattern.py index 859f76b773b..bd56ea89663 100644 --- a/homeassistant/components/homeassistant/triggers/time_pattern.py +++ b/homeassistant/components/homeassistant/triggers/time_pattern.py @@ -43,7 +43,7 @@ class TimePattern: TRIGGER_SCHEMA = vol.All( - vol.Schema( + cv.TRIGGER_BASE_SCHEMA.extend( { vol.Required(CONF_PLATFORM): "time_pattern", CONF_HOURS: TimePattern(maximum=23), diff --git a/homeassistant/components/litejet/trigger.py b/homeassistant/components/litejet/trigger.py index 6800282766b..5bbd8e2f912 100644 --- a/homeassistant/components/litejet/trigger.py +++ b/homeassistant/components/litejet/trigger.py @@ -15,7 +15,7 @@ CONF_NUMBER = "number" CONF_HELD_MORE_THAN = "held_more_than" CONF_HELD_LESS_THAN = "held_less_than" -TRIGGER_SCHEMA = vol.Schema( +TRIGGER_SCHEMA = cv.TRIGGER_BASE_SCHEMA.extend( { vol.Required(CONF_PLATFORM): "litejet", vol.Required(CONF_NUMBER): cv.positive_int, diff --git a/homeassistant/components/mqtt/trigger.py b/homeassistant/components/mqtt/trigger.py index 34c47aec791..ae184c9182a 100644 --- a/homeassistant/components/mqtt/trigger.py +++ b/homeassistant/components/mqtt/trigger.py @@ -19,7 +19,7 @@ CONF_TOPIC = "topic" DEFAULT_ENCODING = "utf-8" DEFAULT_QOS = 0 -TRIGGER_SCHEMA = vol.Schema( +TRIGGER_SCHEMA = cv.TRIGGER_BASE_SCHEMA.extend( { vol.Required(CONF_PLATFORM): mqtt.DOMAIN, vol.Required(CONF_TOPIC): mqtt.util.valid_subscribe_topic_template, diff --git a/homeassistant/components/sun/trigger.py b/homeassistant/components/sun/trigger.py index d2b6f6de560..2a46f665e3c 100644 --- a/homeassistant/components/sun/trigger.py +++ b/homeassistant/components/sun/trigger.py @@ -15,7 +15,7 @@ from homeassistant.helpers.event import async_track_sunrise, async_track_sunset # mypy: allow-untyped-defs, no-check-untyped-defs -TRIGGER_SCHEMA = vol.Schema( +TRIGGER_SCHEMA = cv.TRIGGER_BASE_SCHEMA.extend( { vol.Required(CONF_PLATFORM): "sun", vol.Required(CONF_EVENT): cv.sun_event, diff --git a/homeassistant/components/tag/trigger.py b/homeassistant/components/tag/trigger.py index 4f6dd89a252..e46e737986e 100644 --- a/homeassistant/components/tag/trigger.py +++ b/homeassistant/components/tag/trigger.py @@ -7,7 +7,7 @@ from homeassistant.helpers import config_validation as cv from .const import DEVICE_ID, DOMAIN, EVENT_TAG_SCANNED, TAG_ID -TRIGGER_SCHEMA = vol.Schema( +TRIGGER_SCHEMA = cv.TRIGGER_BASE_SCHEMA.extend( { vol.Required(CONF_PLATFORM): DOMAIN, vol.Required(TAG_ID): vol.All(cv.ensure_list, [cv.string]), diff --git a/homeassistant/components/template/trigger.py b/homeassistant/components/template/trigger.py index 998984e0b9a..c4751055962 100644 --- a/homeassistant/components/template/trigger.py +++ b/homeassistant/components/template/trigger.py @@ -18,7 +18,7 @@ from homeassistant.helpers.template import result_as_boolean _LOGGER = logging.getLogger(__name__) -TRIGGER_SCHEMA = IF_ACTION_SCHEMA = vol.Schema( +TRIGGER_SCHEMA = IF_ACTION_SCHEMA = cv.TRIGGER_BASE_SCHEMA.extend( { vol.Required(CONF_PLATFORM): "template", vol.Required(CONF_VALUE_TEMPLATE): cv.template, diff --git a/homeassistant/components/webhook/trigger.py b/homeassistant/components/webhook/trigger.py index a82dd0251c9..687a72108da 100644 --- a/homeassistant/components/webhook/trigger.py +++ b/homeassistant/components/webhook/trigger.py @@ -12,8 +12,11 @@ import homeassistant.helpers.config_validation as cv DEPENDENCIES = ("webhook",) -TRIGGER_SCHEMA = vol.Schema( - {vol.Required(CONF_PLATFORM): "webhook", vol.Required(CONF_WEBHOOK_ID): cv.string} +TRIGGER_SCHEMA = cv.TRIGGER_BASE_SCHEMA.extend( + { + vol.Required(CONF_PLATFORM): "webhook", + vol.Required(CONF_WEBHOOK_ID): cv.string, + } ) diff --git a/homeassistant/components/zone/trigger.py b/homeassistant/components/zone/trigger.py index db5ca2cf01b..64c904defea 100644 --- a/homeassistant/components/zone/trigger.py +++ b/homeassistant/components/zone/trigger.py @@ -21,7 +21,7 @@ DEFAULT_EVENT = EVENT_ENTER _EVENT_DESCRIPTION = {EVENT_ENTER: "entering", EVENT_LEAVE: "leaving"} -TRIGGER_SCHEMA = vol.Schema( +TRIGGER_SCHEMA = cv.TRIGGER_BASE_SCHEMA.extend( { vol.Required(CONF_PLATFORM): "zone", vol.Required(CONF_ENTITY_ID): cv.entity_ids, diff --git a/homeassistant/helpers/config_validation.py b/homeassistant/helpers/config_validation.py index 324173ed2e8..feb03cf04a2 100644 --- a/homeassistant/helpers/config_validation.py +++ b/homeassistant/helpers/config_validation.py @@ -1106,8 +1106,10 @@ CONDITION_SCHEMA: vol.Schema = vol.Schema( ) ) +TRIGGER_BASE_SCHEMA = vol.Schema({vol.Required(CONF_PLATFORM): str}) + TRIGGER_SCHEMA = vol.All( - ensure_list, [vol.Schema({vol.Required(CONF_PLATFORM): str}, extra=vol.ALLOW_EXTRA)] + ensure_list, [TRIGGER_BASE_SCHEMA.extend({}, extra=vol.ALLOW_EXTRA)] ) _SCRIPT_DELAY_SCHEMA = vol.Schema(