Add missing availability schema to MQTT alarm panel (#11829)

* Add missing availability schema to MQTT alarm panel

* Add tests for default MQTT availability payloads
This commit is contained in:
Dan Nixon 2018-01-20 16:11:04 +00:00 committed by Pascal Vizeli
parent a470cc212e
commit 2cfbd0dc1d
10 changed files with 274 additions and 11 deletions

View file

@ -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_AWAY, default=DEFAULT_ARM_AWAY): cv.string,
vol.Optional(CONF_PAYLOAD_ARM_HOME, default=DEFAULT_ARM_HOME): cv.string, vol.Optional(CONF_PAYLOAD_ARM_HOME, default=DEFAULT_ARM_HOME): cv.string,
vol.Optional(CONF_PAYLOAD_DISARM, default=DEFAULT_DISARM): cv.string, vol.Optional(CONF_PAYLOAD_DISARM, default=DEFAULT_DISARM): cv.string,
}) }).extend(mqtt.MQTT_AVAILABILITY_SCHEMA.schema)
@asyncio.coroutine @asyncio.coroutine

View file

@ -192,6 +192,34 @@ class TestAlarmControlPanelMQTT(unittest.TestCase):
self.hass.block_till_done() self.hass.block_till_done()
self.assertEqual(call_count, self.mock_publish.call_count) 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): def test_custom_availability_payload(self):
"""Test availability by custom payload with defined topic.""" """Test availability by custom payload with defined topic."""
assert setup_component(self.hass, alarm_control_panel.DOMAIN, { assert setup_component(self.hass, alarm_control_panel.DOMAIN, {
@ -211,13 +239,3 @@ class TestAlarmControlPanelMQTT(unittest.TestCase):
self.assertEqual(STATE_UNAVAILABLE, state.state) self.assertEqual(STATE_UNAVAILABLE, state.state)
fire_mqtt_message(self.hass, 'availability-topic', 'good') 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)

View file

@ -21,6 +21,46 @@ class TestMqttFan(unittest.TestCase):
""""Stop everything that was started.""" """"Stop everything that was started."""
self.hass.stop() 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): def test_custom_availability_payload(self):
"""Test the availability payload.""" """Test the availability payload."""
assert setup_component(self.hass, fan.DOMAIN, { assert setup_component(self.hass, fan.DOMAIN, {

View file

@ -796,6 +796,34 @@ class TestLightMQTT(unittest.TestCase):
self.assertEqual(('test_light/bright', 50, 0, False), self.assertEqual(('test_light/bright', 50, 0, False),
self.mock_publish.mock_calls[-2][1]) 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): def test_custom_availability_payload(self):
"""Test availability by custom payload with defined topic.""" """Test availability by custom payload with defined topic."""
self.assertTrue(setup_component(self.hass, light.DOMAIN, { self.assertTrue(setup_component(self.hass, light.DOMAIN, {

View file

@ -522,6 +522,33 @@ class TestLightMQTTJSON(unittest.TestCase):
self.assertEqual(STATE_ON, state.state) self.assertEqual(STATE_ON, state.state)
self.assertEqual(255, state.attributes.get('white_value')) 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): def test_custom_availability_payload(self):
"""Test availability by custom payload with defined topic.""" """Test availability by custom payload with defined topic."""
self.assertTrue(setup_component(self.hass, light.DOMAIN, { self.assertTrue(setup_component(self.hass, light.DOMAIN, {

View file

@ -465,6 +465,34 @@ class TestLightMQTTTemplate(unittest.TestCase):
state = self.hass.states.get('light.test') state = self.hass.states.get('light.test')
self.assertEqual('rainbow', state.attributes.get('effect')) 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): def test_custom_availability_payload(self):
"""Test availability by custom payload with defined topic.""" """Test availability by custom payload with defined topic."""
self.assertTrue(setup_component(self.hass, light.DOMAIN, { self.assertTrue(setup_component(self.hass, light.DOMAIN, {

View file

@ -112,6 +112,35 @@ class TestLockMQTT(unittest.TestCase):
state = self.hass.states.get('lock.test') state = self.hass.states.get('lock.test')
self.assertEqual(STATE_UNLOCKED, state.state) 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): def test_custom_availability_payload(self):
"""Test availability by custom payload with defined topic.""" """Test availability by custom payload with defined topic."""
self.assertTrue(setup_component(self.hass, lock.DOMAIN, { self.assertTrue(setup_component(self.hass, lock.DOMAIN, {

View file

@ -185,6 +185,32 @@ class TestSensorMQTT(unittest.TestCase):
self.hass.block_till_done() self.hass.block_till_done()
self.assertEqual(2, len(events)) 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): def test_custom_availability_payload(self):
"""Test availability by custom payload with defined topic.""" """Test availability by custom payload with defined topic."""
self.assertTrue(setup_component(self.hass, sensor.DOMAIN, { self.assertTrue(setup_component(self.hass, sensor.DOMAIN, {

View file

@ -156,6 +156,48 @@ class TestSwitchMQTT(unittest.TestCase):
state = self.hass.states.get('switch.test') state = self.hass.states.get('switch.test')
self.assertEqual(STATE_ON, state.state) 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): def test_custom_availability_payload(self):
"""Test the availability payload.""" """Test the availability payload."""
assert setup_component(self.hass, switch.DOMAIN, { assert setup_component(self.hass, switch.DOMAIN, {

View file

@ -199,6 +199,31 @@ class TestVacuumMQTT(unittest.TestCase):
self.assertEqual(STATE_OFF, state.state) self.assertEqual(STATE_OFF, state.state)
self.assertEqual("Stopped", state.attributes.get(ATTR_STATUS)) 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): def test_custom_availability_payload(self):
"""Test availability by custom payload with defined topic.""" """Test availability by custom payload with defined topic."""
self.default_config.update({ self.default_config.update({