added error handling in roon trigger
This commit is contained in:
@@ -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()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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))
|
||||||
@@ -73,6 +74,13 @@ class TriggerScheduler(AppClass):
|
|||||||
task.cancel()
|
task.cancel()
|
||||||
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']
|
||||||
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)
|
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
@@ -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" }
|
||||||
|
|||||||
Reference in New Issue
Block a user