From c47119ab599063857fda2b52db02238acf59b7e5 Mon Sep 17 00:00:00 2001 From: bahmcloud Date: Wed, 14 Jan 2026 17:34:31 +0000 Subject: [PATCH] =?UTF-8?q?custom=5Fcomponents/bahmcloud=5Fstore/update.py?= =?UTF-8?q?=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- custom_components/bahmcloud_store/update.py | 84 +++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 custom_components/bahmcloud_store/update.py diff --git a/custom_components/bahmcloud_store/update.py b/custom_components/bahmcloud_store/update.py new file mode 100644 index 0000000..63686ae --- /dev/null +++ b/custom_components/bahmcloud_store/update.py @@ -0,0 +1,84 @@ +from __future__ import annotations + +from homeassistant.components.update import UpdateEntity, UpdateEntityFeature +from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity_platform import AddEntitiesCallback + +from . import DOMAIN +from .store import BahmcloudStore, Package + + +async def async_setup_platform( + hass: HomeAssistant, + config, + async_add_entities: AddEntitiesCallback, + discovery_info=None, +): + store: BahmcloudStore = hass.data[DOMAIN] + entities: dict[str, BahmcloudPackageUpdate] = {} + + def rebuild_entities() -> None: + # create entities for any new package in store.yaml + for pkg in store.packages.values(): + uid = f"{DOMAIN}:{pkg.id}" + if uid not in entities: + ent = BahmcloudPackageUpdate(store, pkg.id) + entities[uid] = ent + async_add_entities([ent], update_before_add=True) + + # refresh states + for ent in entities.values(): + ent.async_write_ha_state() + + store.add_listener(rebuild_entities) + rebuild_entities() + + +class BahmcloudPackageUpdate(UpdateEntity): + _attr_supported_features = UpdateEntityFeature.INSTALL + + def __init__(self, store: BahmcloudStore, package_id: str) -> None: + self.store = store + self.package_id = package_id + + self._attr_unique_id = f"{DOMAIN}_{package_id}" + self._attr_name = f"{package_id} update" + + @property + def _pkg(self) -> Package | None: + return self.store.packages.get(self.package_id) + + @property + def title(self) -> str | None: + pkg = self._pkg + return pkg.name if pkg else None + + @property + def installed_version(self) -> str | None: + pkg = self._pkg + if not pkg: + return None + if not self.store.is_installed(pkg.domain): + return None + return self.store.installed_version(pkg.domain) + + @property + def latest_version(self) -> str | None: + pkg = self._pkg + return pkg.latest_version if pkg else None + + @property + def release_summary(self) -> str | None: + pkg = self._pkg + if not pkg: + return None + if pkg.release_url: + return f"Release: {pkg.release_url}" + return f"Repo: {pkg.repo}" + + async def async_install(self, version: str | None, backup: bool, **kwargs) -> None: + pkg = self._pkg + if not pkg: + return + await self.store.install_from_zip(pkg) + self.async_write_ha_state()