From 3130df69ceae1e026e3a6465f3bc567f431025dd Mon Sep 17 00:00:00 2001 From: Pierre Date: Sun, 8 Nov 2026 10:48:50 +0100 Subject: [PATCH] latest appdaemon version came now from docker image --- apps/informationscollector.py | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/apps/informationscollector.py b/apps/informationscollector.py index 6ee699c..254206e 100644 --- a/apps/informationscollector.py +++ b/apps/informationscollector.py @@ -4,11 +4,14 @@ from importlib import metadata import json import pickle import os +import re from urllib.request import urlopen class InformationsCollector(SmartObject): - APPDAEMON_PYPI_URL = "https://pypi.org/pypi/appdaemon/json" + APPDAEMON_DOCKER_TAGS_URL = ( + "https://hub.docker.com/v2/repositories/acockburn/appdaemon/tags?page_size=100" + ) def on_initialize_smart_object(self): super().on_initialize_smart_object() @@ -26,7 +29,7 @@ class InformationsCollector(SmartObject): sensor_name, state='unknown', attributes={ - 'latest_official_version': self.dataset.get('appdaemon_latest_official_version'), + 'latest_official_version': self.dataset.get('appdaemon_latest_docker_version'), 'update_available': None, }, icon='mdi:package-up' @@ -143,9 +146,9 @@ class InformationsCollector(SmartObject): latest_official_version = self._get_latest_official_appdaemon_version() if latest_official_version is not None: - self.dataset['appdaemon_latest_official_version'] = latest_official_version + self.dataset['appdaemon_latest_docker_version'] = latest_official_version else: - latest_official_version = self.dataset.get('appdaemon_latest_official_version') + latest_official_version = self.dataset.get('appdaemon_latest_docker_version') update_available = self._is_appdaemon_update_available(installed_version, latest_official_version) @@ -168,11 +171,22 @@ class InformationsCollector(SmartObject): def _get_latest_official_appdaemon_version(self): try: - with urlopen(self.APPDAEMON_PYPI_URL, timeout=10) as response: - payload = json.load(response) - return payload.get('info', {}).get('version') + url = self.APPDAEMON_DOCKER_TAGS_URL + versions = {} + while url: + with urlopen(url, timeout=10) as response: + payload = json.load(response) + for tag in payload['results']: + name = tag.get('name', '') + # Only stable version tags with published container images. + if re.fullmatch(r'[0-9]+\.[0-9]+\.[0-9]+', name) and tag.get('images'): + versions[tuple(map(int, name.split('.')))] = name + url = payload.get('next') + if not versions: + raise ValueError("No stable AppDaemon Docker image found") + return versions[max(versions)] except Exception as err: - self.log_warning(f"Unable to fetch latest official AppDaemon version: {err}") + self.log_warning(f"Unable to fetch latest official AppDaemon Docker version: {err}") return None def _is_appdaemon_update_available(self, installed_version, latest_official_version):