latest appdaemon version came now from docker image

This commit is contained in:
Pierre committed 2026-11-08 10:48:50 +01:00
1 parent 35856b2ba9
commit 3130df69ce
1 file changed
+21 -7
+21 -7
View File
@@ -4,11 +4,14 @@ from importlib import metadata
import json import json
import pickle import pickle
import os import os
import re
from urllib.request import urlopen from urllib.request import urlopen
class InformationsCollector(SmartObject): 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): def on_initialize_smart_object(self):
super().on_initialize_smart_object() super().on_initialize_smart_object()
@@ -26,7 +29,7 @@ class InformationsCollector(SmartObject):
sensor_name, sensor_name,
state='unknown', state='unknown',
attributes={ attributes={
'latest_official_version': self.dataset.get('appdaemon_latest_official_version'), 'latest_official_version': self.dataset.get('appdaemon_latest_docker_version'),
'update_available': None, 'update_available': None,
}, },
icon='mdi:package-up' icon='mdi:package-up'
@@ -143,9 +146,9 @@ class InformationsCollector(SmartObject):
latest_official_version = self._get_latest_official_appdaemon_version() latest_official_version = self._get_latest_official_appdaemon_version()
if latest_official_version is not None: 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: 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) 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): def _get_latest_official_appdaemon_version(self):
try: try:
with urlopen(self.APPDAEMON_PYPI_URL, timeout=10) as response: url = self.APPDAEMON_DOCKER_TAGS_URL
versions = {}
while url:
with urlopen(url, timeout=10) as response:
payload = json.load(response) payload = json.load(response)
return payload.get('info', {}).get('version') 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: 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 return None
def _is_appdaemon_update_available(self, installed_version, latest_official_version): def _is_appdaemon_update_available(self, installed_version, latest_official_version):