Refactor MQTT_WILL_BIRTH_SCHEMA (#81879)

* Refactor MQTT_WILL_BIRTH_SCHEMA

* Refactor and move birth/will validation to utils

* Simplify birth will validation
This commit is contained in:
Jan Bouwhuis 2022-11-10 15:24:56 +01:00 committed by GitHub
parent 9bd676aff6
commit 7500d0c61c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 28 additions and 33 deletions

View File

@ -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,

View File

@ -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,
}

View File

@ -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] = {}

View File

@ -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.

View File

@ -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: