From 7500d0c61cfea3508bca9c53c144c0bc9c035142 Mon Sep 17 00:00:00 2001 From: Jan Bouwhuis Date: Thu, 10 Nov 2022 15:24:56 +0100 Subject: [PATCH] Refactor MQTT_WILL_BIRTH_SCHEMA (#81879) * Refactor MQTT_WILL_BIRTH_SCHEMA * Refactor and move birth/will validation to utils * Simplify birth will validation --- homeassistant/components/mqtt/__init__.py | 4 +-- homeassistant/components/mqtt/config.py | 4 +-- homeassistant/components/mqtt/config_flow.py | 6 ++--- .../components/mqtt/config_integration.py | 26 ++++--------------- homeassistant/components/mqtt/util.py | 21 +++++++++++---- 5 files changed, 28 insertions(+), 33 deletions(-) diff --git a/homeassistant/components/mqtt/__init__.py b/homeassistant/components/mqtt/__init__.py index 06921105aae..f7c9e5fbe86 100644 --- a/homeassistant/components/mqtt/__init__.py +++ b/homeassistant/components/mqtt/__init__.py @@ -95,12 +95,12 @@ from .models import ( # noqa: F401 ReceivePayloadType, ) from .util import ( - _VALID_QOS_SCHEMA, async_create_certificate_temp_files, get_mqtt_data, migrate_certificate_file_to_content, mqtt_config_entry_enabled, valid_publish_topic, + valid_qos_schema, valid_subscribe_topic, ) @@ -172,7 +172,7 @@ MQTT_PUBLISH_SCHEMA = vol.All( vol.Exclusive(ATTR_TOPIC_TEMPLATE, CONF_TOPIC): cv.string, vol.Exclusive(ATTR_PAYLOAD, CONF_PAYLOAD): cv.string, vol.Exclusive(ATTR_PAYLOAD_TEMPLATE, CONF_PAYLOAD): cv.string, - vol.Optional(ATTR_QOS, default=DEFAULT_QOS): _VALID_QOS_SCHEMA, + vol.Optional(ATTR_QOS, default=DEFAULT_QOS): valid_qos_schema, vol.Optional(ATTR_RETAIN, default=DEFAULT_RETAIN): cv.boolean, }, required=True, diff --git a/homeassistant/components/mqtt/config.py b/homeassistant/components/mqtt/config.py index 8cfc3490f0c..88adcac7194 100644 --- a/homeassistant/components/mqtt/config.py +++ b/homeassistant/components/mqtt/config.py @@ -16,10 +16,10 @@ from .const import ( DEFAULT_QOS, DEFAULT_RETAIN, ) -from .util import _VALID_QOS_SCHEMA, valid_publish_topic, valid_subscribe_topic +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_QOS, default=DEFAULT_QOS): valid_qos_schema, vol.Optional(CONF_ENCODING, default=DEFAULT_ENCODING): cv.string, } diff --git a/homeassistant/components/mqtt/config_flow.py b/homeassistant/components/mqtt/config_flow.py index ec818348701..5d8b19ce31a 100644 --- a/homeassistant/components/mqtt/config_flow.py +++ b/homeassistant/components/mqtt/config_flow.py @@ -71,9 +71,9 @@ from .const import ( SUPPORTED_PROTOCOLS, ) from .util import ( - MQTT_WILL_BIRTH_SCHEMA, async_create_certificate_temp_files, get_file_path, + valid_birth_will, valid_publish_topic, ) @@ -326,7 +326,7 @@ class MQTTOptionsFlowHandler(config_entries.OptionsFlow): CONF_BIRTH_MESSAGE, _birth_will("birth"), "bad_birth", - MQTT_WILL_BIRTH_SCHEMA, + valid_birth_will, ) if not user_input["birth_enable"]: options_config[CONF_BIRTH_MESSAGE] = {} @@ -336,7 +336,7 @@ class MQTTOptionsFlowHandler(config_entries.OptionsFlow): CONF_WILL_MESSAGE, _birth_will("will"), "bad_will", - MQTT_WILL_BIRTH_SCHEMA, + valid_birth_will, ) if not user_input["will_enable"]: options_config[CONF_WILL_MESSAGE] = {} diff --git a/homeassistant/components/mqtt/config_integration.py b/homeassistant/components/mqtt/config_integration.py index 2be125c2c12..9319a48ac3d 100644 --- a/homeassistant/components/mqtt/config_integration.py +++ b/homeassistant/components/mqtt/config_integration.py @@ -36,10 +36,6 @@ from . import ( vacuum as vacuum_platform, ) from .const import ( - ATTR_PAYLOAD, - ATTR_QOS, - ATTR_RETAIN, - ATTR_TOPIC, CONF_BIRTH_MESSAGE, CONF_BROKER, CONF_CERTIFICATE, @@ -56,12 +52,10 @@ from .const import ( DEFAULT_PORT, DEFAULT_PREFIX, DEFAULT_PROTOCOL, - DEFAULT_QOS, - DEFAULT_RETAIN, DEFAULT_WILL, SUPPORTED_PROTOCOLS, ) -from .util import _VALID_QOS_SCHEMA, valid_publish_topic +from .util import valid_birth_will, valid_publish_topic DEFAULT_TLS_PROTOCOL = "auto" @@ -144,16 +138,6 @@ CLIENT_KEY_AUTH_MSG = ( "the MQTT broker configuration" ) -MQTT_WILL_BIRTH_SCHEMA = vol.Schema( - { - vol.Inclusive(ATTR_TOPIC, "topic_payload"): valid_publish_topic, - vol.Inclusive(ATTR_PAYLOAD, "topic_payload"): cv.string, - vol.Optional(ATTR_QOS, default=DEFAULT_QOS): _VALID_QOS_SCHEMA, - vol.Optional(ATTR_RETAIN, default=DEFAULT_RETAIN): cv.boolean, - }, - required=True, -) - CONFIG_SCHEMA_ENTRY = vol.Schema( { vol.Optional(CONF_CLIENT_ID): cv.string, @@ -170,8 +154,8 @@ CONFIG_SCHEMA_ENTRY = vol.Schema( vol.Optional(CONF_TLS_INSECURE): cv.boolean, vol.Optional(CONF_TLS_VERSION): vol.Any("auto", "1.0", "1.1", "1.2"), vol.Optional(CONF_PROTOCOL): vol.All(cv.string, vol.In(SUPPORTED_PROTOCOLS)), - vol.Optional(CONF_WILL_MESSAGE): MQTT_WILL_BIRTH_SCHEMA, - vol.Optional(CONF_BIRTH_MESSAGE): MQTT_WILL_BIRTH_SCHEMA, + vol.Optional(CONF_WILL_MESSAGE): valid_birth_will, + vol.Optional(CONF_BIRTH_MESSAGE): valid_birth_will, vol.Optional(CONF_DISCOVERY): cv.boolean, # discovery_prefix must be a valid publish topic because if no # state topic is specified, it will be created with the given prefix. @@ -197,8 +181,8 @@ CONFIG_SCHEMA_BASE = PLATFORM_CONFIG_SCHEMA_BASE.extend( vol.Optional(CONF_TLS_INSECURE): cv.boolean, vol.Optional(CONF_TLS_VERSION): vol.Any("auto", "1.0", "1.1", "1.2"), vol.Optional(CONF_PROTOCOL): vol.All(cv.string, vol.In(SUPPORTED_PROTOCOLS)), - vol.Optional(CONF_WILL_MESSAGE): MQTT_WILL_BIRTH_SCHEMA, - vol.Optional(CONF_BIRTH_MESSAGE): MQTT_WILL_BIRTH_SCHEMA, + vol.Optional(CONF_WILL_MESSAGE): valid_birth_will, + vol.Optional(CONF_BIRTH_MESSAGE): valid_birth_will, vol.Optional(CONF_DISCOVERY): cv.boolean, # discovery_prefix must be a valid publish topic because if no # state topic is specified, it will be created with the given prefix. diff --git a/homeassistant/components/mqtt/util.py b/homeassistant/components/mqtt/util.py index 0b2d10977aa..ab907854499 100644 --- a/homeassistant/components/mqtt/util.py +++ b/homeassistant/components/mqtt/util.py @@ -9,7 +9,6 @@ from typing import Any import voluptuous as vol -from homeassistant.const import CONF_PAYLOAD from homeassistant.core import HomeAssistant from homeassistant.helpers import config_validation as cv, template from homeassistant.helpers.typing import ConfigType @@ -32,6 +31,8 @@ from .models import MqttData TEMP_DIR_NAME = f"home-assistant-{DOMAIN}" +_VALID_QOS_SCHEMA = vol.All(vol.Coerce(int), vol.In([0, 1, 2])) + def mqtt_config_entry_enabled(hass: HomeAssistant) -> bool | None: """Return true when the MQTT config entry is enabled.""" @@ -112,19 +113,29 @@ def valid_publish_topic(topic: Any) -> str: return validated_topic -_VALID_QOS_SCHEMA = vol.All(vol.Coerce(int), vol.In([0, 1, 2])) +def valid_qos_schema(qos: Any) -> int: + """Validate that QOS value is valid.""" + return _VALID_QOS_SCHEMA(qos) -MQTT_WILL_BIRTH_SCHEMA = vol.Schema( + +_MQTT_WILL_BIRTH_SCHEMA = vol.Schema( { vol.Required(ATTR_TOPIC): valid_publish_topic, - vol.Required(ATTR_PAYLOAD, CONF_PAYLOAD): cv.string, - vol.Optional(ATTR_QOS, default=DEFAULT_QOS): _VALID_QOS_SCHEMA, + 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, }, required=True, ) +def valid_birth_will(config: ConfigType) -> ConfigType: + """Validate a birth or will configuration and required topic/payload.""" + if config: + config = _MQTT_WILL_BIRTH_SCHEMA(config) + return config + + def get_mqtt_data(hass: HomeAssistant, ensure_exists: bool = False) -> MqttData: """Return typed MqttData from hass.data[DATA_MQTT].""" if ensure_exists: