mirror of
https://github.com/home-assistant/core.git
synced 2025-07-22 12:47:08 +00:00
Handle numeric versions in mqtt update (#83218)
* Handle numeric versions in mqtt update * Remove need for type:ignore Co-authored-by: Jan Bouwhuis <jbouwh@users.noreply.github.com> Co-authored-by: Jan Bouwhuis <jbouwh@users.noreply.github.com>
This commit is contained in:
parent
c617e7da31
commit
f1ee920463
@ -172,14 +172,22 @@ class MqttUpdate(MqttEntity, UpdateEntity, RestoreEntity):
|
|||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
json_payload = {}
|
json_payload: Any | dict = {}
|
||||||
try:
|
try:
|
||||||
json_payload = json_loads(payload)
|
json_payload = json_loads(payload)
|
||||||
_LOGGER.debug(
|
if isinstance(json_payload, dict):
|
||||||
"JSON payload detected after processing payload '%s' on topic %s",
|
_LOGGER.debug(
|
||||||
json_payload,
|
"JSON payload detected after processing payload '%s' on topic %s",
|
||||||
msg.topic,
|
json_payload,
|
||||||
)
|
msg.topic,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
_LOGGER.debug(
|
||||||
|
"Non-dictionary JSON payload detected after processing payload '%s' on topic %s",
|
||||||
|
payload,
|
||||||
|
msg.topic,
|
||||||
|
)
|
||||||
|
json_payload = {"installed_version": payload}
|
||||||
except JSON_DECODE_EXCEPTIONS:
|
except JSON_DECODE_EXCEPTIONS:
|
||||||
_LOGGER.debug(
|
_LOGGER.debug(
|
||||||
"No valid (JSON) payload detected after processing payload '%s' on topic %s",
|
"No valid (JSON) payload detected after processing payload '%s' on topic %s",
|
||||||
|
@ -110,6 +110,54 @@ async def test_run_update_setup(hass, mqtt_mock_entry_with_yaml_config):
|
|||||||
assert state.attributes.get("latest_version") == "2.0.0"
|
assert state.attributes.get("latest_version") == "2.0.0"
|
||||||
|
|
||||||
|
|
||||||
|
async def test_run_update_setup_float(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
|
"""Test that it fetches the given payload when the version is parsable as a number."""
|
||||||
|
installed_version_topic = "test/installed-version"
|
||||||
|
latest_version_topic = "test/latest-version"
|
||||||
|
await async_setup_component(
|
||||||
|
hass,
|
||||||
|
mqtt.DOMAIN,
|
||||||
|
{
|
||||||
|
mqtt.DOMAIN: {
|
||||||
|
update.DOMAIN: {
|
||||||
|
"state_topic": installed_version_topic,
|
||||||
|
"latest_version_topic": latest_version_topic,
|
||||||
|
"name": "Test Update",
|
||||||
|
"release_summary": "Test release summary",
|
||||||
|
"release_url": "https://example.com/release",
|
||||||
|
"title": "Test Update Title",
|
||||||
|
"entity_picture": "https://example.com/icon.png",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
await mqtt_mock_entry_with_yaml_config()
|
||||||
|
|
||||||
|
async_fire_mqtt_message(hass, installed_version_topic, "1.9")
|
||||||
|
async_fire_mqtt_message(hass, latest_version_topic, "1.9")
|
||||||
|
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
state = hass.states.get("update.test_update")
|
||||||
|
assert state.state == STATE_OFF
|
||||||
|
assert state.attributes.get("installed_version") == "1.9"
|
||||||
|
assert state.attributes.get("latest_version") == "1.9"
|
||||||
|
assert state.attributes.get("release_summary") == "Test release summary"
|
||||||
|
assert state.attributes.get("release_url") == "https://example.com/release"
|
||||||
|
assert state.attributes.get("title") == "Test Update Title"
|
||||||
|
assert state.attributes.get("entity_picture") == "https://example.com/icon.png"
|
||||||
|
|
||||||
|
async_fire_mqtt_message(hass, latest_version_topic, "2.0")
|
||||||
|
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
state = hass.states.get("update.test_update")
|
||||||
|
assert state.state == STATE_ON
|
||||||
|
assert state.attributes.get("installed_version") == "1.9"
|
||||||
|
assert state.attributes.get("latest_version") == "2.0"
|
||||||
|
|
||||||
|
|
||||||
async def test_value_template(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_value_template(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test that it fetches the given payload with a template."""
|
"""Test that it fetches the given payload with a template."""
|
||||||
installed_version_topic = "test/installed-version"
|
installed_version_topic = "test/installed-version"
|
||||||
@ -156,6 +204,52 @@ async def test_value_template(hass, mqtt_mock_entry_with_yaml_config):
|
|||||||
assert state.attributes.get("latest_version") == "2.0.0"
|
assert state.attributes.get("latest_version") == "2.0.0"
|
||||||
|
|
||||||
|
|
||||||
|
async def test_value_template_float(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
|
"""Test that it fetches the given payload with a template when the version is parsable as a number."""
|
||||||
|
installed_version_topic = "test/installed-version"
|
||||||
|
latest_version_topic = "test/latest-version"
|
||||||
|
await async_setup_component(
|
||||||
|
hass,
|
||||||
|
mqtt.DOMAIN,
|
||||||
|
{
|
||||||
|
mqtt.DOMAIN: {
|
||||||
|
update.DOMAIN: {
|
||||||
|
"state_topic": installed_version_topic,
|
||||||
|
"value_template": "{{ value_json.installed }}",
|
||||||
|
"latest_version_topic": latest_version_topic,
|
||||||
|
"latest_version_template": "{{ value_json.latest }}",
|
||||||
|
"name": "Test Update",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
await mqtt_mock_entry_with_yaml_config()
|
||||||
|
|
||||||
|
async_fire_mqtt_message(hass, installed_version_topic, '{"installed":"1.9"}')
|
||||||
|
async_fire_mqtt_message(hass, latest_version_topic, '{"latest":"1.9"}')
|
||||||
|
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
state = hass.states.get("update.test_update")
|
||||||
|
assert state.state == STATE_OFF
|
||||||
|
assert state.attributes.get("installed_version") == "1.9"
|
||||||
|
assert state.attributes.get("latest_version") == "1.9"
|
||||||
|
assert (
|
||||||
|
state.attributes.get("entity_picture")
|
||||||
|
== "https://brands.home-assistant.io/_/mqtt/icon.png"
|
||||||
|
)
|
||||||
|
|
||||||
|
async_fire_mqtt_message(hass, latest_version_topic, '{"latest":"2.0"}')
|
||||||
|
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
state = hass.states.get("update.test_update")
|
||||||
|
assert state.state == STATE_ON
|
||||||
|
assert state.attributes.get("installed_version") == "1.9"
|
||||||
|
assert state.attributes.get("latest_version") == "2.0"
|
||||||
|
|
||||||
|
|
||||||
async def test_empty_json_state_message(hass, mqtt_mock_entry_with_yaml_config):
|
async def test_empty_json_state_message(hass, mqtt_mock_entry_with_yaml_config):
|
||||||
"""Test an empty JSON payload."""
|
"""Test an empty JSON payload."""
|
||||||
state_topic = "test/state-topic"
|
state_topic = "test/state-topic"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user