diff --git a/cpu_governor_auto_adjust/cpu_governor_auto_adjust.py b/cpu_governor_auto_adjust/cpu_governor_auto_adjust.py index 3cb282a..0352a9f 100755 --- a/cpu_governor_auto_adjust/cpu_governor_auto_adjust.py +++ b/cpu_governor_auto_adjust/cpu_governor_auto_adjust.py @@ -21,8 +21,7 @@ async def _main() -> None: scheduler = TriggerScheduler(config) for triggertuple in config.triggertuples: _trigger = trigger_mapping[triggertuple.name](config) - scheduler.start_trigger(_trigger) - + await scheduler.schedule_task(scheduler.start_trigger, _trigger) await scheduler.run() diff --git a/cpu_governor_auto_adjust/schedule.py b/cpu_governor_auto_adjust/schedule.py index 2eb2cf5..486d48d 100644 --- a/cpu_governor_auto_adjust/schedule.py +++ b/cpu_governor_auto_adjust/schedule.py @@ -7,6 +7,7 @@ import signal from asyncio import Task from functools import cached_property, partial from time import monotonic +from typing import Callable, Any, Optional class TriggerScheduler(AppClass): @@ -57,7 +58,7 @@ class TriggerScheduler(AppClass): self.log.debug("run once trigger %s, state: %s, duration: %.3f ms", _trigger.name, _trigger.trigger_state, (end - start) * 1000) await asyncio.sleep(_trigger.config.interval_in_seconds) - def start_trigger(self, _trigger: Trigger) -> None: + async def start_trigger(self, _trigger: Trigger) -> None: """Start a new trigger.""" if _trigger.config.type == "callback": self.loop.create_task(self.callback_trigger(_trigger)) @@ -73,6 +74,13 @@ class TriggerScheduler(AppClass): task.cancel() await asyncio.gather(*tasks, return_exceptions=True) self.loop.stop() + + async def schedule_task(self, task: Callable, *args: Any) -> None: + self.log.debug("scheduling task: %s", task.__name__) + start = monotonic() + await self.loop.create_task(task(*args)) + end = monotonic() + self.log.debug("task %s finished in %.3f ms", task.__name__, (end - start) * 1000) async def run(self) -> None: """Run the scheduler and keep it alive until stopped.""" @@ -88,8 +96,7 @@ class TriggerScheduler(AppClass): try: while True: preferred_governor = self.establish_preferred_governor() - task = self.loop.create_task(self.set_governor(preferred_governor)) - await task + await self.schedule_task(self.set_governor, preferred_governor) await asyncio.sleep(1) # Keep the main function alive except asyncio.exceptions.CancelledError: pass diff --git a/cpu_governor_auto_adjust/triggers/roon.py b/cpu_governor_auto_adjust/triggers/roon.py index 2d736bb..4eff256 100644 --- a/cpu_governor_auto_adjust/triggers/roon.py +++ b/cpu_governor_auto_adjust/triggers/roon.py @@ -6,6 +6,7 @@ from typing import Any, NamedTuple, Union from pathlib import Path from importlib.metadata import version from socket import gethostname +import time class RoonServer(NamedTuple): @@ -29,7 +30,11 @@ class RoonTrigger(Trigger): self.log.debug("zone_id: %s zone_info: %s" , zone_id, zone) zone_name = zone['display_name'] zone_state = zone['state'] - zone_now_playing = f"{zone['now_playing']['two_line']['line1']} - {zone['now_playing']['two_line']['line2']}" + try: + zone_now_playing = f"{zone['now_playing']['two_line']['line1']} - {zone['now_playing']['two_line']['line2']}" + except KeyError: + self.log.warning("failed to get now playing info from zone: %s", zone_name) + zone_now_playing = "" self.log.info("zone_id: %s name: %s, state: %s, now playing: %s" , zone_id, zone_name, zone_state, zone_now_playing) zones_state.append(zone_state) @@ -73,6 +78,10 @@ class RoonTrigger(Trigger): 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) diff --git a/pyproject.toml b/pyproject.toml index d4a0753..c170e75 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "cpu_governor_auto_adjust" -version = "0.1.28" +version = "0.1.30" description = "This application has been developed to automatically change cpu governor based on certain triggers." authors = [ { name = "Martin Reurekas", email = "martin@semrks.nl" }