added error handling in roon trigger

This commit is contained in:
2025-03-08 12:05:45 +01:00
parent b95698c962
commit 020c376ee6
4 changed files with 22 additions and 7 deletions
@@ -21,8 +21,7 @@ async def _main() -> None:
scheduler = TriggerScheduler(config) scheduler = TriggerScheduler(config)
for triggertuple in config.triggertuples: for triggertuple in config.triggertuples:
_trigger = trigger_mapping[triggertuple.name](config) _trigger = trigger_mapping[triggertuple.name](config)
scheduler.start_trigger(_trigger) await scheduler.schedule_task(scheduler.start_trigger, _trigger)
await scheduler.run() await scheduler.run()
+10 -3
View File
@@ -7,6 +7,7 @@ import signal
from asyncio import Task from asyncio import Task
from functools import cached_property, partial from functools import cached_property, partial
from time import monotonic from time import monotonic
from typing import Callable, Any, Optional
class TriggerScheduler(AppClass): 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) 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) 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.""" """Start a new trigger."""
if _trigger.config.type == "callback": if _trigger.config.type == "callback":
self.loop.create_task(self.callback_trigger(_trigger)) self.loop.create_task(self.callback_trigger(_trigger))
@@ -74,6 +75,13 @@ class TriggerScheduler(AppClass):
await asyncio.gather(*tasks, return_exceptions=True) await asyncio.gather(*tasks, return_exceptions=True)
self.loop.stop() 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: async def run(self) -> None:
"""Run the scheduler and keep it alive until stopped.""" """Run the scheduler and keep it alive until stopped."""
@@ -88,8 +96,7 @@ class TriggerScheduler(AppClass):
try: try:
while True: while True:
preferred_governor = self.establish_preferred_governor() preferred_governor = self.establish_preferred_governor()
task = self.loop.create_task(self.set_governor(preferred_governor)) await self.schedule_task(self.set_governor, preferred_governor)
await task
await asyncio.sleep(1) # Keep the main function alive await asyncio.sleep(1) # Keep the main function alive
except asyncio.exceptions.CancelledError: except asyncio.exceptions.CancelledError:
pass pass
@@ -6,6 +6,7 @@ from typing import Any, NamedTuple, Union
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 RoonServer(NamedTuple):
@@ -29,7 +30,11 @@ class RoonTrigger(Trigger):
self.log.debug("zone_id: %s zone_info: %s" , zone_id, zone) self.log.debug("zone_id: %s zone_info: %s" , zone_id, zone)
zone_name = zone['display_name'] zone_name = zone['display_name']
zone_state = zone['state'] zone_state = zone['state']
try:
zone_now_playing = f"{zone['now_playing']['two_line']['line1']} - {zone['now_playing']['two_line']['line2']}" 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) 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) zones_state.append(zone_state)
@@ -73,6 +78,10 @@ class RoonTrigger(Trigger):
def server(self) -> RoonServer: def server(self) -> RoonServer:
_server = self.discover.first() _server = self.discover.first()
assert isinstance(_server, tuple) and len(_server) == 2, "failed to discover roon server" 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() self.discover.stop()
roon_server = RoonServer(_server[0], _server[1]) roon_server = RoonServer(_server[0], _server[1])
self.log.info("found %s", roon_server) self.log.info("found %s", roon_server)
+1 -1
View File
@@ -1,6 +1,6 @@
[project] [project]
name = "cpu_governor_auto_adjust" 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." 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" }