From 6d168d267248dcc9a56ece2656e92fabb8b18c31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20S=C3=B8rensen?= Date: Wed, 30 Mar 2022 18:34:29 +0200 Subject: [PATCH] Do not mark downgrades as updates (#68893) --- homeassistant/components/update/__init__.py | 13 ++++++++++--- tests/components/update/test_init.py | 10 ++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/update/__init__.py b/homeassistant/components/update/__init__.py index 8b95415c010..1ecb5d13090 100644 --- a/homeassistant/components/update/__init__.py +++ b/homeassistant/components/update/__init__.py @@ -6,6 +6,7 @@ from datetime import timedelta import logging from typing import Any, Final, final +from awesomeversion import AwesomeVersion, AwesomeVersionCompareException import voluptuous as vol from homeassistant.backports.enum import StrEnum @@ -295,9 +296,15 @@ class UpdateEntity(RestoreEntity): ) is None: return None - if latest_version not in (current_version, self.__skipped_version): - return STATE_ON - return STATE_OFF + if latest_version == self.__skipped_version: + return STATE_OFF + + try: + newer = AwesomeVersion(latest_version) > current_version + return STATE_ON if newer else STATE_OFF + except AwesomeVersionCompareException: + # Can't compare versions, fallback to exact match + return STATE_OFF if latest_version == current_version else STATE_ON @final @property diff --git a/tests/components/update/test_init.py b/tests/components/update/test_init.py index 3fbe80dbdbf..c6845f73d0c 100644 --- a/tests/components/update/test_init.py +++ b/tests/components/update/test_init.py @@ -89,6 +89,16 @@ async def test_update(hass: HomeAssistant) -> None: update._attr_latest_version = None assert update.state is None + # Test no update if new version is not an update + update._attr_current_version = "1.0.0" + update._attr_latest_version = "0.9.0" + assert update.state is STATE_OFF + + # Test update if new version is not considered a valid version + update._attr_current_version = "1.0.0" + update._attr_latest_version = "awesome_update" + assert update.state is STATE_ON + # Test entity category becomes config when its possible to install update._attr_supported_features = UpdateEntityFeature.INSTALL assert update.entity_category is EntityCategory.CONFIG