mirror of
https://github.com/home-assistant/core.git
synced 2025-07-27 07:07:28 +00:00
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:
parent
9bd676aff6
commit
7500d0c61c
@ -95,12 +95,12 @@ from .models import ( # noqa: F401
|
|||||||
ReceivePayloadType,
|
ReceivePayloadType,
|
||||||
)
|
)
|
||||||
from .util import (
|
from .util import (
|
||||||
_VALID_QOS_SCHEMA,
|
|
||||||
async_create_certificate_temp_files,
|
async_create_certificate_temp_files,
|
||||||
get_mqtt_data,
|
get_mqtt_data,
|
||||||
migrate_certificate_file_to_content,
|
migrate_certificate_file_to_content,
|
||||||
mqtt_config_entry_enabled,
|
mqtt_config_entry_enabled,
|
||||||
valid_publish_topic,
|
valid_publish_topic,
|
||||||
|
valid_qos_schema,
|
||||||
valid_subscribe_topic,
|
valid_subscribe_topic,
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -172,7 +172,7 @@ MQTT_PUBLISH_SCHEMA = vol.All(
|
|||||||
vol.Exclusive(ATTR_TOPIC_TEMPLATE, CONF_TOPIC): cv.string,
|
vol.Exclusive(ATTR_TOPIC_TEMPLATE, CONF_TOPIC): cv.string,
|
||||||
vol.Exclusive(ATTR_PAYLOAD, CONF_PAYLOAD): cv.string,
|
vol.Exclusive(ATTR_PAYLOAD, CONF_PAYLOAD): cv.string,
|
||||||
vol.Exclusive(ATTR_PAYLOAD_TEMPLATE, 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,
|
vol.Optional(ATTR_RETAIN, default=DEFAULT_RETAIN): cv.boolean,
|
||||||
},
|
},
|
||||||
required=True,
|
required=True,
|
||||||
|
@ -16,10 +16,10 @@ from .const import (
|
|||||||
DEFAULT_QOS,
|
DEFAULT_QOS,
|
||||||
DEFAULT_RETAIN,
|
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 = {
|
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,
|
vol.Optional(CONF_ENCODING, default=DEFAULT_ENCODING): cv.string,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,9 +71,9 @@ from .const import (
|
|||||||
SUPPORTED_PROTOCOLS,
|
SUPPORTED_PROTOCOLS,
|
||||||
)
|
)
|
||||||
from .util import (
|
from .util import (
|
||||||
MQTT_WILL_BIRTH_SCHEMA,
|
|
||||||
async_create_certificate_temp_files,
|
async_create_certificate_temp_files,
|
||||||
get_file_path,
|
get_file_path,
|
||||||
|
valid_birth_will,
|
||||||
valid_publish_topic,
|
valid_publish_topic,
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -326,7 +326,7 @@ class MQTTOptionsFlowHandler(config_entries.OptionsFlow):
|
|||||||
CONF_BIRTH_MESSAGE,
|
CONF_BIRTH_MESSAGE,
|
||||||
_birth_will("birth"),
|
_birth_will("birth"),
|
||||||
"bad_birth",
|
"bad_birth",
|
||||||
MQTT_WILL_BIRTH_SCHEMA,
|
valid_birth_will,
|
||||||
)
|
)
|
||||||
if not user_input["birth_enable"]:
|
if not user_input["birth_enable"]:
|
||||||
options_config[CONF_BIRTH_MESSAGE] = {}
|
options_config[CONF_BIRTH_MESSAGE] = {}
|
||||||
@ -336,7 +336,7 @@ class MQTTOptionsFlowHandler(config_entries.OptionsFlow):
|
|||||||
CONF_WILL_MESSAGE,
|
CONF_WILL_MESSAGE,
|
||||||
_birth_will("will"),
|
_birth_will("will"),
|
||||||
"bad_will",
|
"bad_will",
|
||||||
MQTT_WILL_BIRTH_SCHEMA,
|
valid_birth_will,
|
||||||
)
|
)
|
||||||
if not user_input["will_enable"]:
|
if not user_input["will_enable"]:
|
||||||
options_config[CONF_WILL_MESSAGE] = {}
|
options_config[CONF_WILL_MESSAGE] = {}
|
||||||
|
@ -36,10 +36,6 @@ from . import (
|
|||||||
vacuum as vacuum_platform,
|
vacuum as vacuum_platform,
|
||||||
)
|
)
|
||||||
from .const import (
|
from .const import (
|
||||||
ATTR_PAYLOAD,
|
|
||||||
ATTR_QOS,
|
|
||||||
ATTR_RETAIN,
|
|
||||||
ATTR_TOPIC,
|
|
||||||
CONF_BIRTH_MESSAGE,
|
CONF_BIRTH_MESSAGE,
|
||||||
CONF_BROKER,
|
CONF_BROKER,
|
||||||
CONF_CERTIFICATE,
|
CONF_CERTIFICATE,
|
||||||
@ -56,12 +52,10 @@ from .const import (
|
|||||||
DEFAULT_PORT,
|
DEFAULT_PORT,
|
||||||
DEFAULT_PREFIX,
|
DEFAULT_PREFIX,
|
||||||
DEFAULT_PROTOCOL,
|
DEFAULT_PROTOCOL,
|
||||||
DEFAULT_QOS,
|
|
||||||
DEFAULT_RETAIN,
|
|
||||||
DEFAULT_WILL,
|
DEFAULT_WILL,
|
||||||
SUPPORTED_PROTOCOLS,
|
SUPPORTED_PROTOCOLS,
|
||||||
)
|
)
|
||||||
from .util import _VALID_QOS_SCHEMA, valid_publish_topic
|
from .util import valid_birth_will, valid_publish_topic
|
||||||
|
|
||||||
DEFAULT_TLS_PROTOCOL = "auto"
|
DEFAULT_TLS_PROTOCOL = "auto"
|
||||||
|
|
||||||
@ -144,16 +138,6 @@ CLIENT_KEY_AUTH_MSG = (
|
|||||||
"the MQTT broker configuration"
|
"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(
|
CONFIG_SCHEMA_ENTRY = vol.Schema(
|
||||||
{
|
{
|
||||||
vol.Optional(CONF_CLIENT_ID): cv.string,
|
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_INSECURE): cv.boolean,
|
||||||
vol.Optional(CONF_TLS_VERSION): vol.Any("auto", "1.0", "1.1", "1.2"),
|
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_PROTOCOL): vol.All(cv.string, vol.In(SUPPORTED_PROTOCOLS)),
|
||||||
vol.Optional(CONF_WILL_MESSAGE): MQTT_WILL_BIRTH_SCHEMA,
|
vol.Optional(CONF_WILL_MESSAGE): valid_birth_will,
|
||||||
vol.Optional(CONF_BIRTH_MESSAGE): MQTT_WILL_BIRTH_SCHEMA,
|
vol.Optional(CONF_BIRTH_MESSAGE): valid_birth_will,
|
||||||
vol.Optional(CONF_DISCOVERY): cv.boolean,
|
vol.Optional(CONF_DISCOVERY): cv.boolean,
|
||||||
# discovery_prefix must be a valid publish topic because if no
|
# discovery_prefix must be a valid publish topic because if no
|
||||||
# state topic is specified, it will be created with the given prefix.
|
# 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_INSECURE): cv.boolean,
|
||||||
vol.Optional(CONF_TLS_VERSION): vol.Any("auto", "1.0", "1.1", "1.2"),
|
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_PROTOCOL): vol.All(cv.string, vol.In(SUPPORTED_PROTOCOLS)),
|
||||||
vol.Optional(CONF_WILL_MESSAGE): MQTT_WILL_BIRTH_SCHEMA,
|
vol.Optional(CONF_WILL_MESSAGE): valid_birth_will,
|
||||||
vol.Optional(CONF_BIRTH_MESSAGE): MQTT_WILL_BIRTH_SCHEMA,
|
vol.Optional(CONF_BIRTH_MESSAGE): valid_birth_will,
|
||||||
vol.Optional(CONF_DISCOVERY): cv.boolean,
|
vol.Optional(CONF_DISCOVERY): cv.boolean,
|
||||||
# discovery_prefix must be a valid publish topic because if no
|
# discovery_prefix must be a valid publish topic because if no
|
||||||
# state topic is specified, it will be created with the given prefix.
|
# state topic is specified, it will be created with the given prefix.
|
||||||
|
@ -9,7 +9,6 @@ from typing import Any
|
|||||||
|
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from homeassistant.const import CONF_PAYLOAD
|
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.helpers import config_validation as cv, template
|
from homeassistant.helpers import config_validation as cv, template
|
||||||
from homeassistant.helpers.typing import ConfigType
|
from homeassistant.helpers.typing import ConfigType
|
||||||
@ -32,6 +31,8 @@ from .models import MqttData
|
|||||||
|
|
||||||
TEMP_DIR_NAME = f"home-assistant-{DOMAIN}"
|
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:
|
def mqtt_config_entry_enabled(hass: HomeAssistant) -> bool | None:
|
||||||
"""Return true when the MQTT config entry is enabled."""
|
"""Return true when the MQTT config entry is enabled."""
|
||||||
@ -112,19 +113,29 @@ def valid_publish_topic(topic: Any) -> str:
|
|||||||
return validated_topic
|
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_TOPIC): valid_publish_topic,
|
||||||
vol.Required(ATTR_PAYLOAD, CONF_PAYLOAD): cv.string,
|
vol.Required(ATTR_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,
|
vol.Optional(ATTR_RETAIN, default=DEFAULT_RETAIN): cv.boolean,
|
||||||
},
|
},
|
||||||
required=True,
|
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:
|
def get_mqtt_data(hass: HomeAssistant, ensure_exists: bool = False) -> MqttData:
|
||||||
"""Return typed MqttData from hass.data[DATA_MQTT]."""
|
"""Return typed MqttData from hass.data[DATA_MQTT]."""
|
||||||
if ensure_exists:
|
if ensure_exists:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user