From d762fe7c1cc2c8057acedb64d42e91e8047c0b5f Mon Sep 17 00:00:00 2001 From: martin Date: Fri, 4 Apr 2025 17:57:43 +0200 Subject: [PATCH] made RoonTrigger startup async --- cpu_governor_auto_adjust.xml | 4 +- cpu_governor_auto_adjust/governor.py | 2 +- cpu_governor_auto_adjust/triggers/roon.py | 53 +++++++++++------------ pyproject.toml | 2 +- 4 files changed, 29 insertions(+), 32 deletions(-) diff --git a/cpu_governor_auto_adjust.xml b/cpu_governor_auto_adjust.xml index 8f7eec4..ee66a1c 100644 --- a/cpu_governor_auto_adjust.xml +++ b/cpu_governor_auto_adjust.xml @@ -1,6 +1,6 @@ - Debug + Info true powersave 5 @@ -43,7 +43,7 @@ cpu_load - Debug + Info 1 performance diff --git a/cpu_governor_auto_adjust/governor.py b/cpu_governor_auto_adjust/governor.py index 96c6227..e700a53 100644 --- a/cpu_governor_auto_adjust/governor.py +++ b/cpu_governor_auto_adjust/governor.py @@ -79,6 +79,6 @@ class GovernorControl(AppClass): self.log.debug("running governor control") while True: if self.current_governor != self.governor: - self.log.debug("governor has changed from %s to %s", self.current_governor, self.governor) + self.log.info("governor has changed from %s to %s", self.current_governor, self.governor) self._set_governor(self.governor.name) await asyncio.sleep(1) diff --git a/cpu_governor_auto_adjust/triggers/roon.py b/cpu_governor_auto_adjust/triggers/roon.py index dd2c3df..5f80902 100644 --- a/cpu_governor_auto_adjust/triggers/roon.py +++ b/cpu_governor_auto_adjust/triggers/roon.py @@ -2,26 +2,22 @@ from cpu_governor_auto_adjust.trigger import Trigger from cpu_governor_auto_adjust.config import Config from roonapi import RoonApi, RoonDiscovery # type: ignore from functools import cached_property -from typing import Any, NamedTuple, Union +from typing import Any, NamedTuple, Union, Optional from pathlib import Path from importlib.metadata import version from socket import gethostname -import time + +class RoonNotReadyError(Exception): + """Exception raised when Roon is not ready.""" + pass -class RoonServer(NamedTuple): - ip: str - port: str - - def __repr__(self) -> str: - return f"RoonServer: ip: {self.ip}, port: {self.port}" class RoonTrigger(Trigger): def __init__(self, _config: Config) -> None: super().__init__(_config) - self.set_status() - self._roonapi.register_state_callback(self.roon_state_callback, "zones_changed") - + self.callback_registered = False + def set_status(self) -> None: zones_state = list() @@ -71,26 +67,20 @@ class RoonTrigger(Trigger): self.log.debug('roon token: %s', _token) return _token - @cached_property + @property def _discover(self) -> RoonDiscovery: return RoonDiscovery(self.core_id) - @cached_property - def server(self) -> RoonServer: - _server = self._discover.first() - assert isinstance(_server, tuple) and len(_server) == 2, "failed to discover roon server" - while _server[0] is None: - _server = self._discover.first() - self.log.warning("roon not ready (yet)") - time.sleep(1) - self._discover.stop() - roon_server = RoonServer(_server[0], _server[1]) - self.log.info("found %s", roon_server) - return roon_server - @cached_property def _roonapi(self) -> RoonApi: - _roonapi = RoonApi(self.appinfo, self.token, self.server.ip, self.server.port, True) + self.log.info("discovering roon server...") + server = self._discover.first() + assert isinstance(server, tuple) and len(server) == 2, "failed to discover roon server" + self._discover.stop() + if server[0] is None or server[1] is None: + raise RoonNotReadyError("Roon is not ready") + self.log.info("Roon server found: %s:%s", server[0], server[1]) + _roonapi = RoonApi(self.appinfo, self.token, server[0], server[1], True) return _roonapi def roon_state_callback(self, event: str, changed_ids: Union[str, list[str]]) -> None: @@ -101,5 +91,12 @@ class RoonTrigger(Trigger): self.set_status() def trigger_code(self) -> None: - # this check works with the callback function of roonapi - pass + if not self.callback_registered: + try: + self._roonapi.register_state_callback(self.roon_state_callback, "zones_changed") + self.callback_registered = True + self.set_status() + self.log.info("Roon callback registered") + except RoonNotReadyError: + self.log.warning("Roon is not ready yet, retrying after %s second(s)...", self.config.interval_in_seconds) + return diff --git a/pyproject.toml b/pyproject.toml index 90c87fb..17ac013 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "cpu_governor_auto_adjust" -version = "0.5.19" +version = "0.5.21" description = "This application has been developed to automatically change cpu governor based on certain triggers." authors = [ { name = "Martin Reurekas", email = "martin@semrks.nl" }