diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/button.py b/button.py index c4f0373..3d203c4 100644 --- a/button.py +++ b/button.py @@ -1,17 +1,25 @@ import json +from dataclasses import dataclass from appdaemon.plugins.mqtt.mqttapi import Mqtt -from console import setup_logging +from console import console, init_logging from room_control import RoomController +@dataclass(init=False) class Button(Mqtt): + button: str + rich: bool = False + async def initialize(self): - if self.args.get('rich', False): - setup_logging(self) + if level := self.args.get('rich', False): + self.rich = True + init_logging(self, level) self.app: RoomController = await self.get_app(self.args['app']) - self.setup_buttons(self.args['button']) + + self.button = self.args['button'] + self.setup_buttons(self.button) def setup_buttons(self, buttons): if isinstance(buttons, list): @@ -22,9 +30,12 @@ class Button(Mqtt): def setup_button(self, name: str): topic = f'zigbee2mqtt/{name}' - self.mqtt_subscribe(topic, namespace='mqtt') + # self.mqtt_subscribe(topic, namespace='mqtt') self.listen_event(self.handle_button, 'MQTT_MESSAGE', topic=topic, namespace='mqtt', button=name) - self.log(f'"{topic}" controls app {self.app.name}') + if self.rich: + self.log(f'MQTT topic [blue]{topic}[/] controls app [green]{self.app.name}[/]') + else: + self.log(f'MQTT topic "{topic}" controls app {self.app.name}') def handle_button(self, event_name, data, kwargs): try: @@ -39,8 +50,11 @@ class Button(Mqtt): self.handle_action(action) def handle_action(self, action: str): + if isinstance(action, str): + action_str = f' [yellow]{action.upper()}[/] ' if self.rich else f' {action.upper()} ' + if action == 'single': - self.log(f' {action.upper()} '.center(50, '=')) + self.log(action_str.center(80, '=')) state = self.get_state(self.args['ref_entity']) kwargs = {'kwargs': {'cause': f'button single click: toggle while {state}'}} if state == 'on': diff --git a/console.py b/console.py index 24eebf7..1bac19f 100644 --- a/console.py +++ b/console.py @@ -1,26 +1,39 @@ import logging from appdaemon.adapi import ADAPI +from appdaemon.logging import AppNameFormatter from rich.console import Console +from rich.highlighter import NullHighlighter from rich.logging import RichHandler +from rich.theme import Theme + +console = Console( + width=150, + theme=Theme({'appname': 'italic bright_cyan'}), +) -console = Console(width=150) handler = RichHandler( console=console, + highlighter=NullHighlighter(), markup=True, show_path=False, + omit_repeated_times=False, log_time_format='%Y-%m-%d %I:%M:%S %p', ) -def setup_logging(self: ADAPI, level): +handler.setFormatter(AppNameFormatter(fmt='[appname]{appname}[/] {message}', style='{')) + + +def init_logging(self: ADAPI, level): if not any(isinstance(h, RichHandler) for h in self.logger.handlers): self.logger.propagate = False self.logger.setLevel(level) self.logger.addHandler(handler) self.log(f'Added rich handler for [bold green]{self.logger.name}[/]') - # self.log(f'Formatter [bold green]{self.logger.handlers[0].formatter}[/]') + # self.log(f'Formatter for RichHandler: {handler.formatter}') + def deinit_logging(self: ADAPI): self.logger.setLevel(logging.NOTSET) diff --git a/room_control.py b/room_control.py index e0a4d24..e299f7d 100755 --- a/room_control.py +++ b/room_control.py @@ -9,7 +9,7 @@ from appdaemon.entity import Entity from appdaemon.plugins.hass.hassapi import Hass from appdaemon.plugins.mqtt.mqttapi import Mqtt from astral import SunDirection -from console import console, setup_logging, deinit_logging +from console import console, init_logging, deinit_logging from rich.table import Table @@ -152,7 +152,7 @@ class RoomController(Hass, Mqtt): def initialize(self): if (level := self.args.get('rich', False)): - setup_logging(self, level) + init_logging(self, level) self.rich_logging = True self.log(f'Initializing {self}') @@ -211,9 +211,7 @@ class RoomController(Hass, Mqtt): if self.rich_logging: table = self._room_config.rich_table(self.name) - console.print(table) - # for state in self.states: - # self.log(f'State: {state.time.strftime("%I:%M:%S %p")} {state.scene}') + console.log(table, highlight=False) self.states = sorted(self.states, key=lambda s: s.time, reverse=True)