1
0
mirror of https://github.com/home-assistant/core.git synced 2026-07-06 22:36:33 +01:00
Files
core/homeassistant/components/smartthings/update.py
T
2026-06-22 20:52:27 +02:00

91 lines
2.9 KiB
Python

"""Support for update entities through the SmartThings cloud API."""
from typing import Any, override
from awesomeversion import AwesomeVersion
from pysmartthings import Attribute, Capability, Command
from homeassistant.components.update import (
UpdateDeviceClass,
UpdateEntity,
UpdateEntityFeature,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from . import SmartThingsConfigEntry
from .const import MAIN
from .entity import SmartThingsEntity
async def async_setup_entry(
hass: HomeAssistant,
entry: SmartThingsConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
"""Add update entities for a config entry."""
entry_data = entry.runtime_data
async_add_entities(
SmartThingsUpdateEntity(entry_data.client, device, {Capability.FIRMWARE_UPDATE})
for device in entry_data.devices.values()
if Capability.FIRMWARE_UPDATE in device.status[MAIN]
)
def is_hex_version(version: str) -> bool:
"""Check if the version is a hex version."""
return len(version) == 8 and all(c in "0123456789abcdefABCDEF" for c in version)
class SmartThingsUpdateEntity(SmartThingsEntity, UpdateEntity):
"""Define a SmartThings update entity."""
_attr_device_class = UpdateDeviceClass.FIRMWARE
_attr_supported_features = (
UpdateEntityFeature.INSTALL | UpdateEntityFeature.PROGRESS
)
@property
@override
def installed_version(self) -> str | None:
"""Return the installed version of the entity."""
return self.get_attribute_value(
Capability.FIRMWARE_UPDATE, Attribute.CURRENT_VERSION
)
@property
@override
def latest_version(self) -> str | None:
"""Return the available version of the entity."""
return self.get_attribute_value(
Capability.FIRMWARE_UPDATE, Attribute.AVAILABLE_VERSION
)
@property
@override
def in_progress(self) -> bool:
"""Return if the entity is in progress."""
return (
self.get_attribute_value(Capability.FIRMWARE_UPDATE, Attribute.STATE)
== "updateInProgress"
)
@override
async def async_install(
self, version: str | None, backup: bool, **kwargs: Any
) -> None:
"""Install the firmware update."""
await self.execute_device_command(
Capability.FIRMWARE_UPDATE,
Command.UPDATE_FIRMWARE,
)
@override
def version_is_newer(self, latest_version: str, installed_version: str) -> bool:
"""Return if the latest version is newer."""
if is_hex_version(latest_version):
latest_version = f"0x{latest_version}"
if is_hex_version(installed_version):
installed_version = f"0x{installed_version}"
return AwesomeVersion(latest_version) > AwesomeVersion(installed_version)