made RoonTrigger startup async

This commit is contained in:
2025-04-04 17:57:43 +02:00
parent 83d64453c0
commit d762fe7c1c
4 changed files with 29 additions and 32 deletions
+2 -2
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<cpuGovernorAutoAdjust> <cpuGovernorAutoAdjust>
<logLevel>Debug</logLevel> <logLevel>Info</logLevel>
<testMode>true</testMode> <testMode>true</testMode>
<defaultGovernor>powersave</defaultGovernor> <defaultGovernor>powersave</defaultGovernor>
<statisticsIntervalInSeconds>5</statisticsIntervalInSeconds> <statisticsIntervalInSeconds>5</statisticsIntervalInSeconds>
@@ -43,7 +43,7 @@
</trigger> </trigger>
<trigger> <trigger>
<name>cpu_load</name> <name>cpu_load</name>
<logLevel>Debug</logLevel> <logLevel>Info</logLevel>
<intervalInSeconds>1</intervalInSeconds> <intervalInSeconds>1</intervalInSeconds>
<governor>performance</governor> <governor>performance</governor>
<customConfig> <customConfig>
+1 -1
View File
@@ -79,6 +79,6 @@ class GovernorControl(AppClass):
self.log.debug("running governor control") self.log.debug("running governor control")
while True: while True:
if self.current_governor != self.governor: 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) self._set_governor(self.governor.name)
await asyncio.sleep(1) await asyncio.sleep(1)
+23 -26
View File
@@ -2,25 +2,21 @@ from cpu_governor_auto_adjust.trigger import Trigger
from cpu_governor_auto_adjust.config import Config from cpu_governor_auto_adjust.config import Config
from roonapi import RoonApi, RoonDiscovery # type: ignore from roonapi import RoonApi, RoonDiscovery # type: ignore
from functools import cached_property from functools import cached_property
from typing import Any, NamedTuple, Union from typing import Any, NamedTuple, Union, Optional
from pathlib import Path from pathlib import Path
from importlib.metadata import version from importlib.metadata import version
from socket import gethostname from socket import gethostname
import time
class RoonServer(NamedTuple): class RoonNotReadyError(Exception):
ip: str """Exception raised when Roon is not ready."""
port: str pass
def __repr__(self) -> str:
return f"RoonServer: ip: {self.ip}, port: {self.port}"
class RoonTrigger(Trigger): class RoonTrigger(Trigger):
def __init__(self, _config: Config) -> None: def __init__(self, _config: Config) -> None:
super().__init__(_config) super().__init__(_config)
self.set_status() self.callback_registered = False
self._roonapi.register_state_callback(self.roon_state_callback, "zones_changed")
def set_status(self) -> None: def set_status(self) -> None:
zones_state = list() zones_state = list()
@@ -71,26 +67,20 @@ class RoonTrigger(Trigger):
self.log.debug('roon token: %s', _token) self.log.debug('roon token: %s', _token)
return _token return _token
@cached_property @property
def _discover(self) -> RoonDiscovery: def _discover(self) -> RoonDiscovery:
return RoonDiscovery(self.core_id) 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 @cached_property
def _roonapi(self) -> RoonApi: 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 return _roonapi
def roon_state_callback(self, event: str, changed_ids: Union[str, list[str]]) -> None: def roon_state_callback(self, event: str, changed_ids: Union[str, list[str]]) -> None:
@@ -101,5 +91,12 @@ class RoonTrigger(Trigger):
self.set_status() self.set_status()
def trigger_code(self) -> None: def trigger_code(self) -> None:
# this check works with the callback function of roonapi if not self.callback_registered:
pass 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
+1 -1
View File
@@ -1,6 +1,6 @@
[project] [project]
name = "cpu_governor_auto_adjust" 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." description = "This application has been developed to automatically change cpu governor based on certain triggers."
authors = [ authors = [
{ name = "Martin Reurekas", email = "martin@semrks.nl" } { name = "Martin Reurekas", email = "martin@semrks.nl" }