From d84c0d58db8620dcd8b3fbe67a0ade563b42de51 Mon Sep 17 00:00:00 2001 From: martin Date: Fri, 7 Mar 2025 13:54:54 +0100 Subject: [PATCH] fixes and improvements --- cpu_governor_auto_adjust/app_class.py | 5 +++-- .../cpu_governor_auto_adjust.py | 3 --- cpu_governor_auto_adjust/governor.py | 5 +---- cpu_governor_auto_adjust/logger.py | 3 +-- cpu_governor_auto_adjust/schedule.py | 15 ++++++++++++++- cpu_governor_auto_adjust/triggers/roon.py | 15 +++++++++------ pyproject.toml | 2 +- 7 files changed, 29 insertions(+), 19 deletions(-) diff --git a/cpu_governor_auto_adjust/app_class.py b/cpu_governor_auto_adjust/app_class.py index ee62c0f..ab39521 100644 --- a/cpu_governor_auto_adjust/app_class.py +++ b/cpu_governor_auto_adjust/app_class.py @@ -1,10 +1,11 @@ from cpu_governor_auto_adjust.logger import getLogger from cpu_governor_auto_adjust.config import Config - +from logging import Formatter class AppClass: def __init__(self, _config: Config) -> None: self._config = _config self.log = getLogger(self.__class__.__name__, loglevel=_config.loglevel.upper()) + app_class_logging_format = self.log.handlers[0].formatter._fmt.replace("%(asctime)s %(levelname)-8s", f"%(asctime)s %(levelname)-8s [{self.__class__.__name__}]") + self.log.handlers[0].setFormatter(Formatter(app_class_logging_format)) self.log.info(f'initializing {self.__class__.__name__}') - \ No newline at end of file diff --git a/cpu_governor_auto_adjust/cpu_governor_auto_adjust.py b/cpu_governor_auto_adjust/cpu_governor_auto_adjust.py index dc16e0e..3cb282a 100755 --- a/cpu_governor_auto_adjust/cpu_governor_auto_adjust.py +++ b/cpu_governor_auto_adjust/cpu_governor_auto_adjust.py @@ -8,19 +8,16 @@ from cpu_governor_auto_adjust.governor import GovernorControl from cpu_governor_auto_adjust.schedule import TriggerScheduler - def main() -> None: asyncio.run(_main()) - async def _main() -> None: config = Config() log = getLogger('main', loglevel=config.loglevel.upper()) if config.testmode: log.warning("starting in testmode, cpu adjustments have been disabled") - governor = GovernorControl(config) scheduler = TriggerScheduler(config) for triggertuple in config.triggertuples: _trigger = trigger_mapping[triggertuple.name](config) diff --git a/cpu_governor_auto_adjust/governor.py b/cpu_governor_auto_adjust/governor.py index 9d7d830..3cada8c 100644 --- a/cpu_governor_auto_adjust/governor.py +++ b/cpu_governor_auto_adjust/governor.py @@ -58,10 +58,7 @@ class GovernorControl(AppClass): return governor def set_governor(self, governor_name: str) -> None: - self.log.debug( - "setting cpu governor to %s by using command self._cpufreq.set_governors(%s)", - governor_name, governor_name - ) + self.log.info("setting cpu governor to %s", governor_name) if self._config.testmode: self.log.warning("application is running in testmode, cpu governor not set") diff --git a/cpu_governor_auto_adjust/logger.py b/cpu_governor_auto_adjust/logger.py index a67cb45..7be4759 100644 --- a/cpu_governor_auto_adjust/logger.py +++ b/cpu_governor_auto_adjust/logger.py @@ -20,8 +20,7 @@ def getLogger(name: str = 'root', loglevel: str = 'INFO') -> Logger: fmt = '%(asctime)s %(levelname)-8s %(message)s (%(filename)s:%(lineno)d)' else: fmt = '%(asctime)s %(levelname)-8s %(message)s' - fmt_date = '%Y-%m-%dT%T' - formatter = logging.Formatter(fmt, fmt_date) + formatter = logging.Formatter(fmt) handler = logging.StreamHandler() handler.setFormatter(formatter) logger.addHandler(handler) diff --git a/cpu_governor_auto_adjust/schedule.py b/cpu_governor_auto_adjust/schedule.py index 371761d..2eb2cf5 100644 --- a/cpu_governor_auto_adjust/schedule.py +++ b/cpu_governor_auto_adjust/schedule.py @@ -29,6 +29,17 @@ class TriggerScheduler(AppClass): preferred_governor = trigger.governor self.log.debug('preferred governor: %s', preferred_governor.name) return preferred_governor.name + + async def set_governor(self, governor_name: str) -> None: + if self.governor_control.current_governor is None: + self.log.debug("unable to retrieve current governor") + return + + if self.governor_control.current_governor.name == governor_name: + self.log.debug("governor is already set to: %s", governor_name) + return + + self.governor_control.set_governor(governor_name) async def callback_trigger(self, _trigger: Trigger) -> None: """Run a callback_trigger with a specific name and check its status at a given interval.""" @@ -76,7 +87,9 @@ class TriggerScheduler(AppClass): try: while True: - self.establish_preferred_governor() + preferred_governor = self.establish_preferred_governor() + task = self.loop.create_task(self.set_governor(preferred_governor)) + await task 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 b64071f..9cb2362 100644 --- a/cpu_governor_auto_adjust/triggers/roon.py +++ b/cpu_governor_auto_adjust/triggers/roon.py @@ -4,6 +4,8 @@ from roonapi import RoonApi, RoonDiscovery # type: ignore from functools import cached_property from typing import Any, NamedTuple, Union from pathlib import Path +from importlib.metadata import version +from socket import gethostname class RoonServer(NamedTuple): @@ -27,17 +29,18 @@ class RoonTrigger(Trigger): self.log.debug("zone_id: %s zone_info: %s" , zone_id, zone) zone_name = zone['display_name'] zone_state = zone['state'] - self.log.info("zone_id: %s name: %s, state: %s" , zone_id, zone_name, zone_state) + zone_now_playing = zone['now_playing']['one_line']['line1'] + 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) - self.active = True if "playing" in zones_state else False + self.active = "playing" in zones_state or "loading" in zones_state @cached_property def appinfo(self) -> dict[str, Any]: _appinfo = { - "extension_id": self.config.custom_config['extensionId'], - "display_name": self.config.custom_config['displayName'], - "display_version": self.config.custom_config['displayVersion'], + "extension_id": f"{self.config.custom_config['extensionId']}_{gethostname()}", + "display_name": f"{self.config.custom_config['displayName']} on {gethostname()}", + "display_version": version('cpu_governor_auto_adjust'), "publisher": self.config.custom_config['publisher'], "email": self.config.custom_config['email'], } @@ -88,4 +91,4 @@ class RoonTrigger(Trigger): self.set_status() async def async_run(self) -> None: - self.roonapi.register_state_callback(self.roon_state_callback, "zones_changed") \ No newline at end of file + self.roonapi.register_state_callback(self.roon_state_callback, "zones_changed") diff --git a/pyproject.toml b/pyproject.toml index cc30cb2..d8c2d0b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "cpu_governor_auto_adjust" -version = "0.1.13" +version = "0.1.26" description = "This application has been developed to automatically change cpu governor based on certain triggers." authors = [ { name = "Martin Reurekas", email = "martin@semrks.nl" }