Add JSON attribute topic to MQTT climate (#20239)
This commit is contained in:
parent
89e9d827a2
commit
dbba3eb0d4
2 changed files with 109 additions and 4 deletions
|
@ -674,6 +674,106 @@ class TestMQTTClimate(unittest.TestCase):
|
|||
assert 0.01 == temp_step
|
||||
|
||||
|
||||
async def test_setting_attribute_via_mqtt_json_message(hass, mqtt_mock):
|
||||
"""Test the setting of attribute via MQTT with JSON payload."""
|
||||
assert await async_setup_component(hass, climate.DOMAIN, {
|
||||
climate.DOMAIN: {
|
||||
'platform': 'mqtt',
|
||||
'name': 'test',
|
||||
'state_topic': 'test-topic',
|
||||
'json_attributes_topic': 'attr-topic'
|
||||
}
|
||||
})
|
||||
|
||||
async_fire_mqtt_message(hass, 'attr-topic', '{ "val": "100" }')
|
||||
await hass.async_block_till_done()
|
||||
state = hass.states.get('climate.test')
|
||||
|
||||
assert '100' == state.attributes.get('val')
|
||||
|
||||
|
||||
async def test_update_with_json_attrs_not_dict(hass, mqtt_mock, caplog):
|
||||
"""Test attributes get extracted from a JSON result."""
|
||||
assert await async_setup_component(hass, climate.DOMAIN, {
|
||||
climate.DOMAIN: {
|
||||
'platform': 'mqtt',
|
||||
'name': 'test',
|
||||
'state_topic': 'test-topic',
|
||||
'json_attributes_topic': 'attr-topic'
|
||||
}
|
||||
})
|
||||
|
||||
async_fire_mqtt_message(hass, 'attr-topic', '[ "list", "of", "things"]')
|
||||
await hass.async_block_till_done()
|
||||
state = hass.states.get('climate.test')
|
||||
|
||||
assert state.attributes.get('val') is None
|
||||
assert 'JSON result was not a dictionary' in caplog.text
|
||||
|
||||
|
||||
async def test_update_with_json_attrs_bad_JSON(hass, mqtt_mock, caplog):
|
||||
"""Test attributes get extracted from a JSON result."""
|
||||
assert await async_setup_component(hass, climate.DOMAIN, {
|
||||
climate.DOMAIN: {
|
||||
'platform': 'mqtt',
|
||||
'name': 'test',
|
||||
'state_topic': 'test-topic',
|
||||
'json_attributes_topic': 'attr-topic'
|
||||
}
|
||||
})
|
||||
|
||||
async_fire_mqtt_message(hass, 'attr-topic', 'This is not JSON')
|
||||
await hass.async_block_till_done()
|
||||
|
||||
state = hass.states.get('climate.test')
|
||||
assert state.attributes.get('val') is None
|
||||
assert 'Erroneous JSON: This is not JSON' in caplog.text
|
||||
|
||||
|
||||
async def test_discovery_update_attr(hass, mqtt_mock, caplog):
|
||||
"""Test update of discovered MQTTAttributes."""
|
||||
entry = MockConfigEntry(domain=mqtt.DOMAIN)
|
||||
await async_start(hass, 'homeassistant', {}, entry)
|
||||
data1 = (
|
||||
'{ "name": "Beer",'
|
||||
' "command_topic": "test_topic",'
|
||||
' "json_attributes_topic": "attr-topic1" }'
|
||||
)
|
||||
data2 = (
|
||||
'{ "name": "Beer",'
|
||||
' "command_topic": "test_topic",'
|
||||
' "json_attributes_topic": "attr-topic2" }'
|
||||
)
|
||||
async_fire_mqtt_message(hass, 'homeassistant/climate/bla/config',
|
||||
data1)
|
||||
await hass.async_block_till_done()
|
||||
async_fire_mqtt_message(hass, 'attr-topic1', '{ "val": "100" }')
|
||||
await hass.async_block_till_done()
|
||||
await hass.async_block_till_done()
|
||||
state = hass.states.get('climate.beer')
|
||||
assert '100' == state.attributes.get('val')
|
||||
|
||||
# Change json_attributes_topic
|
||||
async_fire_mqtt_message(hass, 'homeassistant/climate/bla/config',
|
||||
data2)
|
||||
await hass.async_block_till_done()
|
||||
await hass.async_block_till_done()
|
||||
|
||||
# Verify we are no longer subscribing to the old topic
|
||||
async_fire_mqtt_message(hass, 'attr-topic1', '{ "val": "50" }')
|
||||
await hass.async_block_till_done()
|
||||
await hass.async_block_till_done()
|
||||
state = hass.states.get('climate.beer')
|
||||
assert '100' == state.attributes.get('val')
|
||||
|
||||
# Verify we are subscribing to the new topic
|
||||
async_fire_mqtt_message(hass, 'attr-topic2', '{ "val": "75" }')
|
||||
await hass.async_block_till_done()
|
||||
await hass.async_block_till_done()
|
||||
state = hass.states.get('climate.beer')
|
||||
assert '75' == state.attributes.get('val')
|
||||
|
||||
|
||||
async def test_unique_id(hass):
|
||||
"""Test unique id option only creates one climate per unique_id."""
|
||||
await async_mock_mqtt_component(hass)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue