mirror of
https://github.com/home-assistant/core.git
synced 2025-07-20 11:47:06 +00:00
Add MQTT schema validation functions for platform schemas.
This commit is contained in:
parent
58ea589f99
commit
2c119091dc
@ -17,7 +17,8 @@ from homeassistant.exceptions import HomeAssistantError
|
|||||||
from homeassistant.helpers import template
|
from homeassistant.helpers import template
|
||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP)
|
EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP,
|
||||||
|
CONF_PLATFORM, CONF_SCAN_INTERVAL)
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -39,6 +40,7 @@ CONF_USERNAME = 'username'
|
|||||||
CONF_PASSWORD = 'password'
|
CONF_PASSWORD = 'password'
|
||||||
CONF_CERTIFICATE = 'certificate'
|
CONF_CERTIFICATE = 'certificate'
|
||||||
CONF_PROTOCOL = 'protocol'
|
CONF_PROTOCOL = 'protocol'
|
||||||
|
CONF_QOS = 'qos'
|
||||||
|
|
||||||
PROTOCOL_31 = '3.1'
|
PROTOCOL_31 = '3.1'
|
||||||
PROTOCOL_311 = '3.1.1'
|
PROTOCOL_311 = '3.1.1'
|
||||||
@ -52,11 +54,12 @@ DEFAULT_PROTOCOL = PROTOCOL_311
|
|||||||
ATTR_TOPIC = 'topic'
|
ATTR_TOPIC = 'topic'
|
||||||
ATTR_PAYLOAD = 'payload'
|
ATTR_PAYLOAD = 'payload'
|
||||||
ATTR_PAYLOAD_TEMPLATE = 'payload_template'
|
ATTR_PAYLOAD_TEMPLATE = 'payload_template'
|
||||||
ATTR_QOS = 'qos'
|
ATTR_QOS = CONF_QOS
|
||||||
ATTR_RETAIN = 'retain'
|
ATTR_RETAIN = 'retain'
|
||||||
|
|
||||||
MAX_RECONNECT_WAIT = 300 # seconds
|
MAX_RECONNECT_WAIT = 300 # seconds
|
||||||
|
|
||||||
|
_VALID_QOS_SCHEMA = vol.All(vol.Coerce(int), vol.In([0, 1, 2]))
|
||||||
_HBMQTT_CONFIG_SCHEMA = vol.Schema(dict)
|
_HBMQTT_CONFIG_SCHEMA = vol.Schema(dict)
|
||||||
|
|
||||||
CONFIG_SCHEMA = vol.Schema({
|
CONFIG_SCHEMA = vol.Schema({
|
||||||
@ -76,20 +79,37 @@ CONFIG_SCHEMA = vol.Schema({
|
|||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
MQTT_BASE_PLATFORM_SCHEMA = vol.Schema({
|
||||||
|
vol.Required(CONF_PLATFORM): DOMAIN,
|
||||||
|
vol.Optional(CONF_SCAN_INTERVAL):
|
||||||
|
vol.All(vol.Coerce(int), vol.Range(min=1)),
|
||||||
|
vol.Optional(CONF_QOS, default=DEFAULT_QOS): _VALID_QOS_SCHEMA,
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
# Service call validation schema
|
# Service call validation schema
|
||||||
def mqtt_topic(value):
|
def _mqtt_topic(value, invalid_chars='\0'):
|
||||||
"""Validate that we can publish using this MQTT topic."""
|
"""Validate MQTT topic."""
|
||||||
if isinstance(value, str) and all(c not in value for c in '#+\0'):
|
if isinstance(value, str) and all(c not in value for c in invalid_chars):
|
||||||
return vol.Length(min=1, max=65535)(value)
|
return vol.Length(min=1, max=65535)(value)
|
||||||
raise vol.Invalid('Invalid MQTT topic name')
|
raise vol.Invalid('Invalid MQTT topic name')
|
||||||
|
|
||||||
|
|
||||||
|
def valid_publish_topic(value):
|
||||||
|
"""Validate that we can publish using this MQTT topic."""
|
||||||
|
return _mqtt_topic(value, invalid_chars='#+\0')
|
||||||
|
|
||||||
|
|
||||||
|
def valid_subscribe_topic(value):
|
||||||
|
"""Validate that we can subscribe using this MQTT topic."""
|
||||||
|
return _mqtt_topic(value)
|
||||||
|
|
||||||
|
|
||||||
MQTT_PUBLISH_SCHEMA = vol.Schema({
|
MQTT_PUBLISH_SCHEMA = vol.Schema({
|
||||||
vol.Required(ATTR_TOPIC): mqtt_topic,
|
vol.Required(ATTR_TOPIC): valid_publish_topic,
|
||||||
vol.Exclusive(ATTR_PAYLOAD, 'payload'): object,
|
vol.Exclusive(ATTR_PAYLOAD, 'payload'): object,
|
||||||
vol.Exclusive(ATTR_PAYLOAD_TEMPLATE, 'payload'): cv.string,
|
vol.Exclusive(ATTR_PAYLOAD_TEMPLATE, 'payload'): cv.string,
|
||||||
vol.Required(ATTR_QOS, default=DEFAULT_QOS):
|
vol.Required(ATTR_QOS, default=DEFAULT_QOS): _VALID_QOS_SCHEMA,
|
||||||
vol.All(vol.Coerce(int), vol.In([0, 1, 2])),
|
|
||||||
vol.Required(ATTR_RETAIN, default=DEFAULT_RETAIN): cv.boolean,
|
vol.Required(ATTR_RETAIN, default=DEFAULT_RETAIN): cv.boolean,
|
||||||
}, required=True)
|
}, required=True)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user