From a7016e4b32d62ee009153a3910a7f82e11c5b938 Mon Sep 17 00:00:00 2001 From: Jan Harkes Date: Wed, 6 Apr 2016 21:35:46 -0400 Subject: [PATCH] Move CONF_STATE_TOPIC, CONF_COMMAND_TOPIC and CONF_RETAIN to mqtt component. --- .../components/alarm_control_panel/mqtt.py | 10 ++--- .../components/binary_sensor/mqtt.py | 8 ++-- .../components/device_tracker/mqtt.py | 3 +- homeassistant/components/light/mqtt.py | 29 ++++++------ homeassistant/components/lock/mqtt.py | 14 ++---- homeassistant/components/mqtt/__init__.py | 45 +++++++++++++------ .../components/rollershutter/mqtt.py | 11 ++--- homeassistant/components/sensor/mqtt.py | 8 ++-- homeassistant/components/switch/mqtt.py | 14 ++---- 9 files changed, 73 insertions(+), 69 deletions(-) diff --git a/homeassistant/components/alarm_control_panel/mqtt.py b/homeassistant/components/alarm_control_panel/mqtt.py index 687de5de474..3bc7b860869 100644 --- a/homeassistant/components/alarm_control_panel/mqtt.py +++ b/homeassistant/components/alarm_control_panel/mqtt.py @@ -14,14 +14,14 @@ from homeassistant.const import ( STATE_ALARM_ARMED_AWAY, STATE_ALARM_ARMED_HOME, STATE_ALARM_DISARMED, STATE_ALARM_PENDING, STATE_ALARM_TRIGGERED, STATE_UNKNOWN, CONF_NAME) +from homeassistant.components.mqtt import ( + CONF_STATE_TOPIC, CONF_COMMAND_TOPIC, CONF_QOS) import homeassistant.helpers.config_validation as cv _LOGGER = logging.getLogger(__name__) DEPENDENCIES = ['mqtt'] -CONF_STATE_TOPIC = 'state_topic' -CONF_COMMAND_TOPIC = 'command_topic' CONF_PAYLOAD_DISARM = 'payload_disarm' CONF_PAYLOAD_ARM_HOME = 'payload_arm_home' CONF_PAYLOAD_ARM_AWAY = 'payload_arm_away' @@ -50,11 +50,11 @@ def setup_platform(hass, config, add_devices, discovery_info=None): config[CONF_NAME], config[CONF_STATE_TOPIC], config[CONF_COMMAND_TOPIC], - config[mqtt.CONF_QOS], + config[CONF_QOS], config[CONF_PAYLOAD_DISARM], config[CONF_PAYLOAD_ARM_HOME], config[CONF_PAYLOAD_ARM_AWAY], - config.get('code'))]) + config.get(CONF_CODE))]) # pylint: disable=too-many-arguments, too-many-instance-attributes @@ -74,7 +74,7 @@ class MqttAlarm(alarm.AlarmControlPanel): self._payload_disarm = payload_disarm self._payload_arm_home = payload_arm_home self._payload_arm_away = payload_arm_away - self._code = str(code) if code else None + self._code = code def message_received(topic, payload, qos): """A new MQTT message has been received.""" diff --git a/homeassistant/components/binary_sensor/mqtt.py b/homeassistant/components/binary_sensor/mqtt.py index 15b17066ce5..a381305691a 100644 --- a/homeassistant/components/binary_sensor/mqtt.py +++ b/homeassistant/components/binary_sensor/mqtt.py @@ -12,6 +12,7 @@ import homeassistant.components.mqtt as mqtt from homeassistant.components.binary_sensor import (BinarySensorDevice, SENSOR_CLASSES) from homeassistant.const import CONF_NAME, CONF_VALUE_TEMPLATE +from homeassistant.components.mqtt import CONF_STATE_TOPIC, CONF_QOS from homeassistant.helpers import template import homeassistant.helpers.config_validation as cv @@ -19,7 +20,6 @@ _LOGGER = logging.getLogger(__name__) DEPENDENCIES = ['mqtt'] -CONF_STATE_TOPIC = 'state_topic' CONF_SENSOR_CLASS = 'sensor_class' CONF_PAYLOAD_ON = 'payload_on' CONF_PAYLOAD_OFF = 'payload_off' @@ -28,14 +28,12 @@ DEFAULT_NAME = 'MQTT Binary sensor' DEFAULT_PAYLOAD_ON = 'ON' DEFAULT_PAYLOAD_OFF = 'OFF' -PLATFORM_SCHEMA = mqtt.MQTT_BASE_PLATFORM_SCHEMA.extend({ +PLATFORM_SCHEMA = mqtt.MQTT_RO_PLATFORM_SCHEMA.extend({ vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Required(CONF_STATE_TOPIC): mqtt.valid_subscribe_topic, vol.Optional(CONF_SENSOR_CLASS, default=None): vol.Any(vol.In(SENSOR_CLASSES), vol.SetTo(None)), vol.Optional(CONF_PAYLOAD_ON, default=DEFAULT_PAYLOAD_ON): cv.string, vol.Optional(CONF_PAYLOAD_OFF, default=DEFAULT_PAYLOAD_OFF): cv.string, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, }) @@ -47,7 +45,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None): config[CONF_NAME], config[CONF_STATE_TOPIC], config[CONF_SENSOR_CLASS], - config[mqtt.CONF_QOS], + config[CONF_QOS], config[CONF_PAYLOAD_ON], config[CONF_PAYLOAD_OFF], config.get(CONF_VALUE_TEMPLATE) diff --git a/homeassistant/components/device_tracker/mqtt.py b/homeassistant/components/device_tracker/mqtt.py index 609d8cc713a..0998e227857 100644 --- a/homeassistant/components/device_tracker/mqtt.py +++ b/homeassistant/components/device_tracker/mqtt.py @@ -9,6 +9,7 @@ import logging import voluptuous as vol import homeassistant.components.mqtt as mqtt +from homeassistant.components.mqtt import CONF_QOS import homeassistant.helpers.config_validation as cv DEPENDENCIES = ['mqtt'] @@ -25,7 +26,7 @@ PLATFORM_SCHEMA = mqtt.MQTT_BASE_PLATFORM_SCHEMA.extend({ def setup_scanner(hass, config, see): """Setup the MQTT tracker.""" devices = config[CONF_DEVICES] - qos = config[mqtt.CONF_QOS] + qos = config[CONF_QOS] dev_id_lookup = {} diff --git a/homeassistant/components/light/mqtt.py b/homeassistant/components/light/mqtt.py index 65d7d925723..2d0e7bb6df0 100644 --- a/homeassistant/components/light/mqtt.py +++ b/homeassistant/components/light/mqtt.py @@ -12,7 +12,9 @@ import voluptuous as vol import homeassistant.components.mqtt as mqtt from homeassistant.components.light import ( ATTR_BRIGHTNESS, ATTR_RGB_COLOR, Light) -from homeassistant.const import CONF_NAME, CONF_OPTIMISTIC +from homeassistant.const import CONF_NAME, CONF_OPTIMISTIC, CONF_VALUE_TEMPLATE +from homeassistant.components.mqtt import ( + CONF_STATE_TOPIC, CONF_COMMAND_TOPIC, CONF_QOS, CONF_RETAIN) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.template import render_with_possible_json_value @@ -20,8 +22,6 @@ _LOGGER = logging.getLogger(__name__) DEPENDENCIES = ['mqtt'] -CONF_STATE_TOPIC = 'state_topic' -CONF_COMMAND_TOPIC = 'command_topic' CONF_STATE_VALUE_TEMPLATE = 'state_value_template' CONF_BRIGHTNESS_STATE_TOPIC = 'brightness_state_topic' CONF_BRIGHTNESS_COMMAND_TOPIC = 'brightness_command_topic' @@ -39,10 +39,8 @@ DEFAULT_PAYLOAD_OFF = 'OFF' DEFAULT_OPTIMISTIC = False DEFAULT_BRIGHTNESS_SCALE = 255 -PLATFORM_SCHEMA = mqtt.MQTT_BASE_PLATFORM_SCHEMA.extend({ +PLATFORM_SCHEMA = mqtt.MQTT_RW_PLATFORM_SCHEMA.extend({ vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_STATE_TOPIC): mqtt.valid_subscribe_topic, - vol.Required(CONF_COMMAND_TOPIC): mqtt.valid_publish_topic, vol.Optional(CONF_STATE_VALUE_TEMPLATE): cv.template, vol.Optional(CONF_BRIGHTNESS_STATE_TOPIC): mqtt.valid_subscribe_topic, vol.Optional(CONF_BRIGHTNESS_COMMAND_TOPIC): mqtt.valid_publish_topic, @@ -60,6 +58,8 @@ PLATFORM_SCHEMA = mqtt.MQTT_BASE_PLATFORM_SCHEMA.extend({ def setup_platform(hass, config, add_devices_callback, discovery_info=None): """Add MQTT Light.""" + config.setdefault(CONF_STATE_VALUE_TEMPLATE, + config.get(CONF_VALUE_TEMPLATE)) add_devices_callback([MqttLight( hass, config[CONF_NAME], @@ -78,7 +78,8 @@ def setup_platform(hass, config, add_devices_callback, discovery_info=None): 'brightness': config.get(CONF_BRIGHTNESS_VALUE_TEMPLATE), 'rgb': config.get(CONF_RGB_VALUE_TEMPLATE) }, - config[mqtt.CONF_QOS], + config[CONF_QOS], + config[CONF_RETAIN], { 'on': config[CONF_PAYLOAD_ON], 'off': config[CONF_PAYLOAD_OFF], @@ -92,13 +93,14 @@ class MqttLight(Light): """MQTT light.""" # pylint: disable=too-many-arguments,too-many-instance-attributes - def __init__(self, hass, name, topic, templates, qos, payload, optimistic, - brightness_scale): + def __init__(self, hass, name, topic, templates, qos, retain, payload, + optimistic, brightness_scale): """Initialize MQTT light.""" self._hass = hass self._name = name self._topic = topic self._qos = qos + self._retain = retain self._payload = payload self._optimistic = optimistic or topic["state_topic"] is None self._optimistic_rgb = optimistic or topic["rgb_state_topic"] is None @@ -194,7 +196,8 @@ class MqttLight(Light): self._topic["rgb_command_topic"] is not None: mqtt.publish(self._hass, self._topic["rgb_command_topic"], - "{},{},{}".format(*kwargs[ATTR_RGB_COLOR]), self._qos) + "{},{},{}".format(*kwargs[ATTR_RGB_COLOR]), + self._qos, self._retain) if self._optimistic_rgb: self._rgb = kwargs[ATTR_RGB_COLOR] @@ -205,14 +208,14 @@ class MqttLight(Light): percent_bright = float(kwargs[ATTR_BRIGHTNESS]) / 255 device_brightness = int(percent_bright * self._brightness_scale) mqtt.publish(self._hass, self._topic["brightness_command_topic"], - device_brightness, self._qos) + device_brightness, self._qos, self._retain) if self._optimistic_brightness: self._brightness = kwargs[ATTR_BRIGHTNESS] should_update = True mqtt.publish(self._hass, self._topic["command_topic"], - self._payload["on"], self._qos) + self._payload["on"], self._qos, self._retain) if self._optimistic: # Optimistically assume that switch has changed state. @@ -225,7 +228,7 @@ class MqttLight(Light): def turn_off(self, **kwargs): """Turn the device off.""" mqtt.publish(self._hass, self._topic["command_topic"], - self._payload["off"], self._qos) + self._payload["off"], self._qos, self._retain) if self._optimistic: # Optimistically assume that switch has changed state. diff --git a/homeassistant/components/lock/mqtt.py b/homeassistant/components/lock/mqtt.py index c6e81716adf..b188de21edc 100644 --- a/homeassistant/components/lock/mqtt.py +++ b/homeassistant/components/lock/mqtt.py @@ -11,6 +11,8 @@ import voluptuous as vol import homeassistant.components.mqtt as mqtt from homeassistant.components.lock import LockDevice from homeassistant.const import CONF_NAME, CONF_OPTIMISTIC, CONF_VALUE_TEMPLATE +from homeassistant.components.mqtt import ( + CONF_STATE_TOPIC, CONF_COMMAND_TOPIC, CONF_QOS, CONF_RETAIN) from homeassistant.helpers import template import homeassistant.helpers.config_validation as cv @@ -18,9 +20,6 @@ _LOGGER = logging.getLogger(__name__) DEPENDENCIES = ['mqtt'] -CONF_STATE_TOPIC = 'state_topic' -CONF_COMMAND_TOPIC = 'command_topic' -CONF_RETAIN = 'retain' CONF_PAYLOAD_LOCK = 'payload_lock' CONF_PAYLOAD_UNLOCK = 'payload_unlock' @@ -28,19 +27,14 @@ DEFAULT_NAME = "MQTT Lock" DEFAULT_PAYLOAD_LOCK = "LOCK" DEFAULT_PAYLOAD_UNLOCK = "UNLOCK" DEFAULT_OPTIMISTIC = False -DEFAULT_RETAIN = False -PLATFORM_SCHEMA = mqtt.MQTT_BASE_PLATFORM_SCHEMA.extend({ +PLATFORM_SCHEMA = mqtt.MQTT_RW_PLATFORM_SCHEMA.extend({ vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_STATE_TOPIC): mqtt.valid_subscribe_topic, - vol.Required(CONF_COMMAND_TOPIC): mqtt.valid_publish_topic, vol.Optional(CONF_PAYLOAD_LOCK, default=DEFAULT_PAYLOAD_LOCK): cv.string, vol.Optional(CONF_PAYLOAD_UNLOCK, default=DEFAULT_PAYLOAD_UNLOCK): cv.string, vol.Optional(CONF_OPTIMISTIC, default=DEFAULT_OPTIMISTIC): cv.boolean, - vol.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, }) @@ -52,7 +46,7 @@ def setup_platform(hass, config, add_devices_callback, discovery_info=None): config[CONF_NAME], config.get(CONF_STATE_TOPIC), config[CONF_COMMAND_TOPIC], - config[mqtt.CONF_QOS], + config[CONF_QOS], config[CONF_RETAIN], config[CONF_PAYLOAD_LOCK], config[CONF_PAYLOAD_UNLOCK], diff --git a/homeassistant/components/mqtt/__init__.py b/homeassistant/components/mqtt/__init__.py index 4b5756fdccb..e78496f1e06 100644 --- a/homeassistant/components/mqtt/__init__.py +++ b/homeassistant/components/mqtt/__init__.py @@ -18,7 +18,7 @@ from homeassistant.helpers import template import homeassistant.helpers.config_validation as cv from homeassistant.const import ( EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP, - CONF_PLATFORM, CONF_SCAN_INTERVAL) + CONF_PLATFORM, CONF_SCAN_INTERVAL, CONF_VALUE_TEMPLATE) _LOGGER = logging.getLogger(__name__) @@ -40,7 +40,11 @@ CONF_USERNAME = 'username' CONF_PASSWORD = 'password' CONF_CERTIFICATE = 'certificate' CONF_PROTOCOL = 'protocol' + +CONF_STATE_TOPIC = 'state_topic' +CONF_COMMAND_TOPIC = 'command_topic' CONF_QOS = 'qos' +CONF_RETAIN = 'retain' PROTOCOL_31 = '3.1' PROTOCOL_311 = '3.1.1' @@ -55,10 +59,22 @@ ATTR_TOPIC = 'topic' ATTR_PAYLOAD = 'payload' ATTR_PAYLOAD_TEMPLATE = 'payload_template' ATTR_QOS = CONF_QOS -ATTR_RETAIN = 'retain' +ATTR_RETAIN = CONF_RETAIN MAX_RECONNECT_WAIT = 300 # seconds + +def valid_subscribe_topic(value, invalid_chars='\0'): + """Validate that we can subscribe using this MQTT topic.""" + if isinstance(value, str) and all(c not in value for c in invalid_chars): + return vol.Length(min=1, max=65535)(value) + raise vol.Invalid('Invalid MQTT topic name') + + +def valid_publish_topic(value): + """Validate that we can publish using this MQTT topic.""" + return valid_subscribe_topic(value, invalid_chars='#+\0') + _VALID_QOS_SCHEMA = vol.All(vol.Coerce(int), vol.In([0, 1, 2])) _HBMQTT_CONFIG_SCHEMA = vol.Schema(dict) @@ -86,19 +102,22 @@ MQTT_BASE_PLATFORM_SCHEMA = vol.Schema({ vol.Optional(CONF_QOS, default=DEFAULT_QOS): _VALID_QOS_SCHEMA, }) +# Sensor type platforms subscribe to mqtt events +MQTT_RO_PLATFORM_SCHEMA = MQTT_BASE_PLATFORM_SCHEMA.extend({ + vol.Required(CONF_STATE_TOPIC): valid_subscribe_topic, + vol.Optional(CONF_VALUE_TEMPLATE): cv.template, +}) + +# Switch type platforms publish to mqtt and may subscribe +MQTT_RW_PLATFORM_SCHEMA = MQTT_BASE_PLATFORM_SCHEMA.extend({ + vol.Required(CONF_COMMAND_TOPIC): valid_publish_topic, + vol.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, + vol.Optional(CONF_STATE_TOPIC): valid_subscribe_topic, + vol.Optional(CONF_VALUE_TEMPLATE): cv.template, +}) + # Service call validation schema -def valid_subscribe_topic(value, invalid_chars='\0'): - """Validate that we can subscribe using this MQTT topic.""" - if isinstance(value, str) and all(c not in value for c in invalid_chars): - return vol.Length(min=1, max=65535)(value) - raise vol.Invalid('Invalid MQTT topic name') - - -def valid_publish_topic(value): - """Validate that we can publish using this MQTT topic.""" - return valid_subscribe_topic(value, invalid_chars='#+\0') - MQTT_PUBLISH_SCHEMA = vol.Schema({ vol.Required(ATTR_TOPIC): valid_publish_topic, vol.Exclusive(ATTR_PAYLOAD, 'payload'): object, diff --git a/homeassistant/components/rollershutter/mqtt.py b/homeassistant/components/rollershutter/mqtt.py index c7e098d41bd..6465c02dca2 100644 --- a/homeassistant/components/rollershutter/mqtt.py +++ b/homeassistant/components/rollershutter/mqtt.py @@ -11,6 +11,8 @@ import voluptuous as vol import homeassistant.components.mqtt as mqtt from homeassistant.components.rollershutter import RollershutterDevice from homeassistant.const import CONF_NAME, CONF_VALUE_TEMPLATE +from homeassistant.components.mqtt import ( + CONF_STATE_TOPIC, CONF_COMMAND_TOPIC, CONF_QOS) from homeassistant.helpers import template import homeassistant.helpers.config_validation as cv @@ -18,8 +20,6 @@ _LOGGER = logging.getLogger(__name__) DEPENDENCIES = ['mqtt'] -CONF_STATE_TOPIC = 'state_topic' -CONF_COMMAND_TOPIC = 'command_topic' CONF_PAYLOAD_UP = 'payload_up' CONF_PAYLOAD_DOWN = 'payload_down' CONF_PAYLOAD_STOP = 'payload_stop' @@ -29,14 +29,11 @@ DEFAULT_PAYLOAD_UP = "UP" DEFAULT_PAYLOAD_DOWN = "DOWN" DEFAULT_PAYLOAD_STOP = "STOP" -PLATFORM_SCHEMA = mqtt.MQTT_BASE_PLATFORM_SCHEMA.extend({ +PLATFORM_SCHEMA = mqtt.MQTT_RW_PLATFORM_SCHEMA.extend({ vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_STATE_TOPIC): mqtt.valid_subscribe_topic, - vol.Required(CONF_COMMAND_TOPIC): mqtt.valid_publish_topic, vol.Optional(CONF_PAYLOAD_UP, default=DEFAULT_PAYLOAD_UP): cv.string, vol.Optional(CONF_PAYLOAD_DOWN, default=DEFAULT_PAYLOAD_DOWN): cv.string, vol.Optional(CONF_PAYLOAD_STOP, default=DEFAULT_PAYLOAD_STOP): cv.string, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, }) @@ -47,7 +44,7 @@ def setup_platform(hass, config, add_devices_callback, discovery_info=None): config[CONF_NAME], config.get(CONF_STATE_TOPIC), config[CONF_COMMAND_TOPIC], - config[mqtt.CONF_QOS], + config[CONF_QOS], config[CONF_PAYLOAD_UP], config[CONF_PAYLOAD_DOWN], config[CONF_PAYLOAD_STOP], diff --git a/homeassistant/components/sensor/mqtt.py b/homeassistant/components/sensor/mqtt.py index 4b23eeb3d82..eaa856b010e 100644 --- a/homeassistant/components/sensor/mqtt.py +++ b/homeassistant/components/sensor/mqtt.py @@ -10,6 +10,7 @@ import voluptuous as vol import homeassistant.components.mqtt as mqtt from homeassistant.const import CONF_NAME, CONF_VALUE_TEMPLATE, STATE_UNKNOWN +from homeassistant.components.mqtt import CONF_STATE_TOPIC, CONF_QOS import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity from homeassistant.helpers import template @@ -18,16 +19,13 @@ _LOGGER = logging.getLogger(__name__) DEPENDENCIES = ['mqtt'] -CONF_STATE_TOPIC = 'state_topic' CONF_UNIT_OF_MEASUREMENT = 'unit_of_measurement' DEFAULT_NAME = "MQTT Sensor" -PLATFORM_SCHEMA = mqtt.MQTT_BASE_PLATFORM_SCHEMA.extend({ +PLATFORM_SCHEMA = mqtt.MQTT_RO_PLATFORM_SCHEMA.extend({ vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Required(CONF_STATE_TOPIC): mqtt.valid_subscribe_topic, vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, }) @@ -38,7 +36,7 @@ def setup_platform(hass, config, add_devices_callback, discovery_info=None): hass, config[CONF_NAME], config[CONF_STATE_TOPIC], - config[mqtt.CONF_QOS], + config[CONF_QOS], config.get(CONF_UNIT_OF_MEASUREMENT), config.get(CONF_VALUE_TEMPLATE), )]) diff --git a/homeassistant/components/switch/mqtt.py b/homeassistant/components/switch/mqtt.py index 92711f83d62..2a2b2aed547 100644 --- a/homeassistant/components/switch/mqtt.py +++ b/homeassistant/components/switch/mqtt.py @@ -11,6 +11,8 @@ import voluptuous as vol import homeassistant.components.mqtt as mqtt from homeassistant.components.switch import SwitchDevice from homeassistant.const import CONF_NAME, CONF_OPTIMISTIC, CONF_VALUE_TEMPLATE +from homeassistant.components.mqtt import ( + CONF_STATE_TOPIC, CONF_COMMAND_TOPIC, CONF_QOS, CONF_RETAIN) import homeassistant.helpers.config_validation as cv from homeassistant.helpers import template @@ -18,9 +20,6 @@ _LOGGER = logging.getLogger(__name__) DEPENDENCIES = ['mqtt'] -CONF_STATE_TOPIC = 'state_topic' -CONF_COMMAND_TOPIC = 'command_topic' -CONF_RETAIN = 'retain' CONF_PAYLOAD_ON = 'payload_on' CONF_PAYLOAD_OFF = 'payload_off' @@ -28,17 +27,12 @@ DEFAULT_NAME = "MQTT Switch" DEFAULT_PAYLOAD_ON = "ON" DEFAULT_PAYLOAD_OFF = "OFF" DEFAULT_OPTIMISTIC = False -DEFAULT_RETAIN = False -PLATFORM_SCHEMA = mqtt.MQTT_BASE_PLATFORM_SCHEMA.extend({ +PLATFORM_SCHEMA = mqtt.MQTT_RW_PLATFORM_SCHEMA.extend({ vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, - vol.Optional(CONF_STATE_TOPIC): mqtt.valid_subscribe_topic, - vol.Required(CONF_COMMAND_TOPIC): mqtt.valid_publish_topic, - vol.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean, vol.Optional(CONF_PAYLOAD_ON, default=DEFAULT_PAYLOAD_ON): cv.string, vol.Optional(CONF_PAYLOAD_OFF, default=DEFAULT_PAYLOAD_OFF): cv.string, vol.Optional(CONF_OPTIMISTIC, default=DEFAULT_OPTIMISTIC): cv.boolean, - vol.Optional(CONF_VALUE_TEMPLATE): cv.template, }) @@ -50,7 +44,7 @@ def setup_platform(hass, config, add_devices_callback, discovery_info=None): config[CONF_NAME], config.get(CONF_STATE_TOPIC), config[CONF_COMMAND_TOPIC], - config[mqtt.CONF_QOS], + config[CONF_QOS], config[CONF_RETAIN], config[CONF_PAYLOAD_ON], config[CONF_PAYLOAD_OFF],