From 2cfbd0dc1dcf7b6ae8b2a9a7af4d7450f10ba30a Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Sat, 20 Jan 2018 16:11:04 +0000 Subject: [PATCH] Add missing availability schema to MQTT alarm panel (#11829) * Add missing availability schema to MQTT alarm panel * Add tests for default MQTT availability payloads --- .../components/alarm_control_panel/mqtt.py | 2 +- .../alarm_control_panel/test_mqtt.py | 38 ++++++++++++----- tests/components/fan/test_mqtt.py | 40 ++++++++++++++++++ tests/components/light/test_mqtt.py | 28 +++++++++++++ tests/components/light/test_mqtt_json.py | 27 ++++++++++++ tests/components/light/test_mqtt_template.py | 28 +++++++++++++ tests/components/lock/test_mqtt.py | 29 +++++++++++++ tests/components/sensor/test_mqtt.py | 26 ++++++++++++ tests/components/switch/test_mqtt.py | 42 +++++++++++++++++++ tests/components/vacuum/test_mqtt.py | 25 +++++++++++ 10 files changed, 274 insertions(+), 11 deletions(-) diff --git a/homeassistant/components/alarm_control_panel/mqtt.py b/homeassistant/components/alarm_control_panel/mqtt.py index a4559160e3b..1422136c405 100644 --- a/homeassistant/components/alarm_control_panel/mqtt.py +++ b/homeassistant/components/alarm_control_panel/mqtt.py @@ -42,7 +42,7 @@ PLATFORM_SCHEMA = mqtt.MQTT_BASE_PLATFORM_SCHEMA.extend({ vol.Optional(CONF_PAYLOAD_ARM_AWAY, default=DEFAULT_ARM_AWAY): cv.string, vol.Optional(CONF_PAYLOAD_ARM_HOME, default=DEFAULT_ARM_HOME): cv.string, vol.Optional(CONF_PAYLOAD_DISARM, default=DEFAULT_DISARM): cv.string, -}) +}).extend(mqtt.MQTT_AVAILABILITY_SCHEMA.schema) @asyncio.coroutine diff --git a/tests/components/alarm_control_panel/test_mqtt.py b/tests/components/alarm_control_panel/test_mqtt.py index 200978ea1a0..5a93a55254d 100644 --- a/tests/components/alarm_control_panel/test_mqtt.py +++ b/tests/components/alarm_control_panel/test_mqtt.py @@ -192,6 +192,34 @@ class TestAlarmControlPanelMQTT(unittest.TestCase): self.hass.block_till_done() self.assertEqual(call_count, self.mock_publish.call_count) + def test_default_availability_payload(self): + """Test availability by default payload with defined topic.""" + assert setup_component(self.hass, alarm_control_panel.DOMAIN, { + alarm_control_panel.DOMAIN: { + 'platform': 'mqtt', + 'name': 'test', + 'state_topic': 'alarm/state', + 'command_topic': 'alarm/command', + 'code': '1234', + 'availability_topic': 'availability-topic' + } + }) + + state = self.hass.states.get('alarm_control_panel.test') + self.assertEqual(STATE_UNAVAILABLE, state.state) + + fire_mqtt_message(self.hass, 'availability-topic', 'online') + self.hass.block_till_done() + + state = self.hass.states.get('alarm_control_panel.test') + self.assertNotEqual(STATE_UNAVAILABLE, state.state) + + fire_mqtt_message(self.hass, 'availability-topic', 'offline') + self.hass.block_till_done() + + state = self.hass.states.get('alarm_control_panel.test') + self.assertEqual(STATE_UNAVAILABLE, state.state) + def test_custom_availability_payload(self): """Test availability by custom payload with defined topic.""" assert setup_component(self.hass, alarm_control_panel.DOMAIN, { @@ -211,13 +239,3 @@ class TestAlarmControlPanelMQTT(unittest.TestCase): self.assertEqual(STATE_UNAVAILABLE, state.state) fire_mqtt_message(self.hass, 'availability-topic', 'good') - self.hass.block_till_done() - - state = self.hass.states.get('alarm_control_panel.test') - self.assertNotEqual(STATE_UNAVAILABLE, state.state) - - fire_mqtt_message(self.hass, 'availability-topic', 'nogood') - self.hass.block_till_done() - - state = self.hass.states.get('alarm_control_panel.test') - self.assertEqual(STATE_UNAVAILABLE, state.state) diff --git a/tests/components/fan/test_mqtt.py b/tests/components/fan/test_mqtt.py index 3846887f21c..ec68492ed1e 100644 --- a/tests/components/fan/test_mqtt.py +++ b/tests/components/fan/test_mqtt.py @@ -21,6 +21,46 @@ class TestMqttFan(unittest.TestCase): """"Stop everything that was started.""" self.hass.stop() + def test_default_availability_payload(self): + """Test the availability payload.""" + assert setup_component(self.hass, fan.DOMAIN, { + fan.DOMAIN: { + 'platform': 'mqtt', + 'name': 'test', + 'state_topic': 'state-topic', + 'command_topic': 'command-topic', + 'availability_topic': 'availability_topic' + } + }) + + state = self.hass.states.get('fan.test') + self.assertEqual(STATE_UNAVAILABLE, state.state) + + fire_mqtt_message(self.hass, 'availability_topic', 'online') + self.hass.block_till_done() + + state = self.hass.states.get('fan.test') + self.assertNotEqual(STATE_UNAVAILABLE, state.state) + self.assertFalse(state.attributes.get(ATTR_ASSUMED_STATE)) + + fire_mqtt_message(self.hass, 'availability_topic', 'offline') + self.hass.block_till_done() + + state = self.hass.states.get('fan.test') + self.assertEqual(STATE_UNAVAILABLE, state.state) + + fire_mqtt_message(self.hass, 'state-topic', '1') + self.hass.block_till_done() + + state = self.hass.states.get('fan.test') + self.assertEqual(STATE_UNAVAILABLE, state.state) + + fire_mqtt_message(self.hass, 'availability_topic', 'online') + self.hass.block_till_done() + + state = self.hass.states.get('fan.test') + self.assertNotEqual(STATE_UNAVAILABLE, state.state) + def test_custom_availability_payload(self): """Test the availability payload.""" assert setup_component(self.hass, fan.DOMAIN, { diff --git a/tests/components/light/test_mqtt.py b/tests/components/light/test_mqtt.py index d6dabaf9a4f..7ef33aad2d9 100644 --- a/tests/components/light/test_mqtt.py +++ b/tests/components/light/test_mqtt.py @@ -796,6 +796,34 @@ class TestLightMQTT(unittest.TestCase): self.assertEqual(('test_light/bright', 50, 0, False), self.mock_publish.mock_calls[-2][1]) + def test_default_availability_payload(self): + """Test availability by default payload with defined topic.""" + self.assertTrue(setup_component(self.hass, light.DOMAIN, { + light.DOMAIN: { + 'platform': 'mqtt', + 'name': 'test', + 'command_topic': 'test_light/set', + 'brightness_command_topic': 'test_light/bright', + 'rgb_command_topic': "test_light/rgb", + 'availability_topic': 'availability-topic' + } + })) + + state = self.hass.states.get('light.test') + self.assertEqual(STATE_UNAVAILABLE, state.state) + + fire_mqtt_message(self.hass, 'availability-topic', 'online') + self.hass.block_till_done() + + state = self.hass.states.get('light.test') + self.assertNotEqual(STATE_UNAVAILABLE, state.state) + + fire_mqtt_message(self.hass, 'availability-topic', 'offline') + self.hass.block_till_done() + + state = self.hass.states.get('light.test') + self.assertEqual(STATE_UNAVAILABLE, state.state) + def test_custom_availability_payload(self): """Test availability by custom payload with defined topic.""" self.assertTrue(setup_component(self.hass, light.DOMAIN, { diff --git a/tests/components/light/test_mqtt_json.py b/tests/components/light/test_mqtt_json.py index d0412df22f5..5cb0d0cdc1b 100644 --- a/tests/components/light/test_mqtt_json.py +++ b/tests/components/light/test_mqtt_json.py @@ -522,6 +522,33 @@ class TestLightMQTTJSON(unittest.TestCase): self.assertEqual(STATE_ON, state.state) self.assertEqual(255, state.attributes.get('white_value')) + def test_default_availability_payload(self): + """Test availability by default payload with defined topic.""" + self.assertTrue(setup_component(self.hass, light.DOMAIN, { + light.DOMAIN: { + 'platform': 'mqtt_json', + 'name': 'test', + 'state_topic': 'test_light_rgb', + 'command_topic': 'test_light_rgb/set', + 'availability_topic': 'availability-topic' + } + })) + + state = self.hass.states.get('light.test') + self.assertEqual(STATE_UNAVAILABLE, state.state) + + fire_mqtt_message(self.hass, 'availability-topic', 'online') + self.hass.block_till_done() + + state = self.hass.states.get('light.test') + self.assertNotEqual(STATE_UNAVAILABLE, state.state) + + fire_mqtt_message(self.hass, 'availability-topic', 'offline') + self.hass.block_till_done() + + state = self.hass.states.get('light.test') + self.assertEqual(STATE_UNAVAILABLE, state.state) + def test_custom_availability_payload(self): """Test availability by custom payload with defined topic.""" self.assertTrue(setup_component(self.hass, light.DOMAIN, { diff --git a/tests/components/light/test_mqtt_template.py b/tests/components/light/test_mqtt_template.py index fddb75880cc..be1f119fc14 100644 --- a/tests/components/light/test_mqtt_template.py +++ b/tests/components/light/test_mqtt_template.py @@ -465,6 +465,34 @@ class TestLightMQTTTemplate(unittest.TestCase): state = self.hass.states.get('light.test') self.assertEqual('rainbow', state.attributes.get('effect')) + def test_default_availability_payload(self): + """Test availability by default payload with defined topic.""" + self.assertTrue(setup_component(self.hass, light.DOMAIN, { + light.DOMAIN: { + 'platform': 'mqtt_template', + 'name': 'test', + 'command_topic': 'test_light_rgb/set', + 'command_on_template': 'on,{{ transition }}', + 'command_off_template': 'off,{{ transition|d }}', + 'availability_topic': 'availability-topic' + } + })) + + state = self.hass.states.get('light.test') + self.assertEqual(STATE_UNAVAILABLE, state.state) + + fire_mqtt_message(self.hass, 'availability-topic', 'online') + self.hass.block_till_done() + + state = self.hass.states.get('light.test') + self.assertNotEqual(STATE_UNAVAILABLE, state.state) + + fire_mqtt_message(self.hass, 'availability-topic', 'offline') + self.hass.block_till_done() + + state = self.hass.states.get('light.test') + self.assertEqual(STATE_UNAVAILABLE, state.state) + def test_custom_availability_payload(self): """Test availability by custom payload with defined topic.""" self.assertTrue(setup_component(self.hass, light.DOMAIN, { diff --git a/tests/components/lock/test_mqtt.py b/tests/components/lock/test_mqtt.py index 667908e13fa..0f4df75d1a2 100644 --- a/tests/components/lock/test_mqtt.py +++ b/tests/components/lock/test_mqtt.py @@ -112,6 +112,35 @@ class TestLockMQTT(unittest.TestCase): state = self.hass.states.get('lock.test') self.assertEqual(STATE_UNLOCKED, state.state) + def test_default_availability_payload(self): + """Test availability by default payload with defined topic.""" + self.assertTrue(setup_component(self.hass, lock.DOMAIN, { + lock.DOMAIN: { + 'platform': 'mqtt', + 'name': 'test', + 'state_topic': 'state-topic', + 'command_topic': 'command-topic', + 'payload_lock': 'LOCK', + 'payload_unlock': 'UNLOCK', + 'availability_topic': 'availability-topic' + } + })) + + state = self.hass.states.get('lock.test') + self.assertEqual(STATE_UNAVAILABLE, state.state) + + fire_mqtt_message(self.hass, 'availability-topic', 'online') + self.hass.block_till_done() + + state = self.hass.states.get('lock.test') + self.assertNotEqual(STATE_UNAVAILABLE, state.state) + + fire_mqtt_message(self.hass, 'availability-topic', 'offline') + self.hass.block_till_done() + + state = self.hass.states.get('lock.test') + self.assertEqual(STATE_UNAVAILABLE, state.state) + def test_custom_availability_payload(self): """Test availability by custom payload with defined topic.""" self.assertTrue(setup_component(self.hass, lock.DOMAIN, { diff --git a/tests/components/sensor/test_mqtt.py b/tests/components/sensor/test_mqtt.py index d5cfad407d5..efcd44658c3 100644 --- a/tests/components/sensor/test_mqtt.py +++ b/tests/components/sensor/test_mqtt.py @@ -185,6 +185,32 @@ class TestSensorMQTT(unittest.TestCase): self.hass.block_till_done() self.assertEqual(2, len(events)) + def test_default_availability_payload(self): + """Test availability by default payload with defined topic.""" + self.assertTrue(setup_component(self.hass, sensor.DOMAIN, { + sensor.DOMAIN: { + 'platform': 'mqtt', + 'name': 'test', + 'state_topic': 'test-topic', + 'availability_topic': 'availability-topic' + } + })) + + state = self.hass.states.get('sensor.test') + self.assertEqual(STATE_UNAVAILABLE, state.state) + + fire_mqtt_message(self.hass, 'availability-topic', 'online') + self.hass.block_till_done() + + state = self.hass.states.get('sensor.test') + self.assertNotEqual(STATE_UNAVAILABLE, state.state) + + fire_mqtt_message(self.hass, 'availability-topic', 'offline') + self.hass.block_till_done() + + state = self.hass.states.get('sensor.test') + self.assertEqual(STATE_UNAVAILABLE, state.state) + def test_custom_availability_payload(self): """Test availability by custom payload with defined topic.""" self.assertTrue(setup_component(self.hass, sensor.DOMAIN, { diff --git a/tests/components/switch/test_mqtt.py b/tests/components/switch/test_mqtt.py index a3118f8ebf0..661f570e698 100644 --- a/tests/components/switch/test_mqtt.py +++ b/tests/components/switch/test_mqtt.py @@ -156,6 +156,48 @@ class TestSwitchMQTT(unittest.TestCase): state = self.hass.states.get('switch.test') self.assertEqual(STATE_ON, state.state) + def test_default_availability_payload(self): + """Test the availability payload.""" + assert setup_component(self.hass, switch.DOMAIN, { + switch.DOMAIN: { + 'platform': 'mqtt', + 'name': 'test', + 'state_topic': 'state-topic', + 'command_topic': 'command-topic', + 'availability_topic': 'availability_topic', + 'payload_on': 1, + 'payload_off': 0 + } + }) + + state = self.hass.states.get('switch.test') + self.assertEqual(STATE_UNAVAILABLE, state.state) + + fire_mqtt_message(self.hass, 'availability_topic', 'online') + self.hass.block_till_done() + + state = self.hass.states.get('switch.test') + self.assertEqual(STATE_OFF, state.state) + self.assertFalse(state.attributes.get(ATTR_ASSUMED_STATE)) + + fire_mqtt_message(self.hass, 'availability_topic', 'offline') + self.hass.block_till_done() + + state = self.hass.states.get('switch.test') + self.assertEqual(STATE_UNAVAILABLE, state.state) + + fire_mqtt_message(self.hass, 'state-topic', '1') + self.hass.block_till_done() + + state = self.hass.states.get('switch.test') + self.assertEqual(STATE_UNAVAILABLE, state.state) + + fire_mqtt_message(self.hass, 'availability_topic', 'online') + self.hass.block_till_done() + + state = self.hass.states.get('switch.test') + self.assertEqual(STATE_ON, state.state) + def test_custom_availability_payload(self): """Test the availability payload.""" assert setup_component(self.hass, switch.DOMAIN, { diff --git a/tests/components/vacuum/test_mqtt.py b/tests/components/vacuum/test_mqtt.py index f81a5c849ec..8c3b5fa4eeb 100644 --- a/tests/components/vacuum/test_mqtt.py +++ b/tests/components/vacuum/test_mqtt.py @@ -199,6 +199,31 @@ class TestVacuumMQTT(unittest.TestCase): self.assertEqual(STATE_OFF, state.state) self.assertEqual("Stopped", state.attributes.get(ATTR_STATUS)) + def test_default_availability_payload(self): + """Test availability by default payload with defined topic.""" + self.default_config.update({ + 'availability_topic': 'availability-topic' + }) + + self.assertTrue(setup_component(self.hass, vacuum.DOMAIN, { + vacuum.DOMAIN: self.default_config, + })) + + state = self.hass.states.get('vacuum.mqtttest') + self.assertEqual(STATE_UNAVAILABLE, state.state) + + fire_mqtt_message(self.hass, 'availability-topic', 'online') + self.hass.block_till_done() + + state = self.hass.states.get('vacuum.mqtttest') + self.assertNotEqual(STATE_UNAVAILABLE, state.state) + + fire_mqtt_message(self.hass, 'availability-topic', 'offline') + self.hass.block_till_done() + + state = self.hass.states.get('vacuum.mqtttest') + self.assertEqual(STATE_UNAVAILABLE, state.state) + def test_custom_availability_payload(self): """Test availability by custom payload with defined topic.""" self.default_config.update({