diff --git a/homeassistant/components/lock/mqtt.py b/homeassistant/components/lock/mqtt.py index a68a3303de6..4cea06543e2 100644 --- a/homeassistant/components/lock/mqtt.py +++ b/homeassistant/components/lock/mqtt.py @@ -6,40 +6,58 @@ https://home-assistant.io/components/lock.mqtt/ """ import logging +import voluptuous as vol + import homeassistant.components.mqtt as mqtt from homeassistant.components.lock import LockDevice -from homeassistant.const import CONF_VALUE_TEMPLATE +from homeassistant.const import CONF_NAME, CONF_VALUE_TEMPLATE from homeassistant.helpers import template +import homeassistant.helpers.config_validation as cv _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' +CONF_OPTIMISTIC = 'optimistic' + DEFAULT_NAME = "MQTT Lock" DEFAULT_PAYLOAD_LOCK = "LOCK" DEFAULT_PAYLOAD_UNLOCK = "UNLOCK" -DEFAULT_QOS = 0 DEFAULT_OPTIMISTIC = False DEFAULT_RETAIN = False -DEPENDENCIES = ['mqtt'] +PLATFORM_SCHEMA = mqtt.MQTT_BASE_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, +}) # pylint: disable=unused-argument def setup_platform(hass, config, add_devices_callback, discovery_info=None): """Setup the MQTT lock.""" - if config.get('command_topic') is None: - _LOGGER.error("Missing required variable: command_topic") - return False - add_devices_callback([MqttLock( hass, - config.get('name', DEFAULT_NAME), - config.get('state_topic'), - config.get('command_topic'), - config.get('qos', DEFAULT_QOS), - config.get('retain', DEFAULT_RETAIN), - config.get('payload_lock', DEFAULT_PAYLOAD_LOCK), - config.get('payload_unlock', DEFAULT_PAYLOAD_UNLOCK), - config.get('optimistic', DEFAULT_OPTIMISTIC), + config[CONF_NAME], + config.get(CONF_STATE_TOPIC), + config[CONF_COMMAND_TOPIC], + config[mqtt.CONF_QOS], + config[CONF_RETAIN], + config[CONF_PAYLOAD_LOCK], + config[CONF_PAYLOAD_UNLOCK], + config[CONF_OPTIMISTIC], config.get(CONF_VALUE_TEMPLATE))]) diff --git a/tests/components/lock/test_mqtt.py b/tests/components/lock/test_mqtt.py index 810d5c5449f..006d241bcad 100644 --- a/tests/components/lock/test_mqtt.py +++ b/tests/components/lock/test_mqtt.py @@ -1,6 +1,7 @@ """The tests for the MQTT lock platform.""" import unittest +from homeassistant.bootstrap import _setup_component from homeassistant.const import (STATE_LOCKED, STATE_UNLOCKED, ATTR_ASSUMED_STATE) import homeassistant.components.lock as lock @@ -22,8 +23,9 @@ class TestLockMQTT(unittest.TestCase): def test_controlling_state_via_topic(self): """Test the controlling state via topic.""" - self.assertTrue(lock.setup(self.hass, { - 'lock': { + self.hass.config.components = ['mqtt'] + assert _setup_component(self.hass, lock.DOMAIN, { + lock.DOMAIN: { 'platform': 'mqtt', 'name': 'test', 'state_topic': 'state-topic', @@ -31,7 +33,7 @@ class TestLockMQTT(unittest.TestCase): 'payload_lock': 'LOCK', 'payload_unlock': 'UNLOCK' } - })) + }) state = self.hass.states.get('lock.test') self.assertEqual(STATE_UNLOCKED, state.state) @@ -51,8 +53,9 @@ class TestLockMQTT(unittest.TestCase): def test_sending_mqtt_commands_and_optimistic(self): """Test the sending MQTT commands in optimistic mode.""" - self.assertTrue(lock.setup(self.hass, { - 'lock': { + self.hass.config.components = ['mqtt'] + assert _setup_component(self.hass, lock.DOMAIN, { + lock.DOMAIN: { 'platform': 'mqtt', 'name': 'test', 'command_topic': 'command-topic', @@ -60,7 +63,7 @@ class TestLockMQTT(unittest.TestCase): 'payload_unlock': 'UNLOCK', 'qos': 2 } - })) + }) state = self.hass.states.get('lock.test') self.assertEqual(STATE_UNLOCKED, state.state) @@ -84,8 +87,9 @@ class TestLockMQTT(unittest.TestCase): def test_controlling_state_via_topic_and_json_message(self): """Test the controlling state via topic and JSON message.""" - self.assertTrue(lock.setup(self.hass, { - 'lock': { + self.hass.config.components = ['mqtt'] + assert _setup_component(self.hass, lock.DOMAIN, { + lock.DOMAIN: { 'platform': 'mqtt', 'name': 'test', 'state_topic': 'state-topic', @@ -94,7 +98,7 @@ class TestLockMQTT(unittest.TestCase): 'payload_unlock': 'UNLOCK', 'value_template': '{{ value_json.val }}' } - })) + }) state = self.hass.states.get('lock.test') self.assertEqual(STATE_UNLOCKED, state.state)