Refine logging

This commit is contained in:
Edward Brown 2025-12-24 13:35:02 +00:00
parent 74f967f7f9
commit ca3d794587
7 changed files with 30 additions and 21 deletions

View file

@ -3,15 +3,15 @@ import asyncio
from fmtr.tools import mqtt, Constants
from haco import constants
from haco.constants import SUBSCRIBE
from haco.obs import logger
from haco.utils import get_prefix
class ClientHaco(mqtt.Client):
ONLINE = 'online'
OFFLINE = 'offline'
aiomqtt.Client
def __init__(self, *args, device=None, will=None, identifier=None, **kwargs):
self.will = will or mqtt.Will(topic=str(constants.TOPIC_AVAIL), payload=self.OFFLINE, retain=True, qos=1, )
identifier = identifier or constants.CLIENT_ID
@ -24,10 +24,9 @@ class ClientHaco(mqtt.Client):
return constants.TOPIC_CLIENT
async def handle(self):
"""Listen for command messages from HA."""
for topic_sub in self.device.subscriptions.keys():
logger.info(f"Subscribing to {topic_sub}")
logger.info(f"{get_prefix(SUBSCRIBE)}: {topic_sub}")
await self.subscribe(topic_sub)
async for message in self.messages:

View file

@ -13,3 +13,6 @@ TOPIC_ROOT = Path(paths.name) / env.CHANNEL
TOPIC_CLIENT = TOPIC_ROOT / CLIENT_ID
TOPIC_AVAIL = TOPIC_CLIENT / STATUS
PREFIX_MDI = "mdi:"
ANNOUNCE = 'announce'
SUBSCRIBE = 'subscribe'

View file

@ -3,12 +3,13 @@ from __future__ import annotations
from dataclasses import dataclass, field
from typing import TYPE_CHECKING, TypeVar, Generic, Type, ClassVar
from fmtr.tools import Constants
from fmtr.tools.json_tools import to_json
from haco.base import Base
from haco.capabilities import Capability
from haco.constants import PREFIX_MDI
from haco.constants import PREFIX_MDI, ANNOUNCE
from haco.obs import logger
from haco.utils import sanitize_name, Converters, ConvertersBool
from haco.utils import sanitize_name, Converters, ConvertersBool, get_prefix
if TYPE_CHECKING:
from haco.device import Device
@ -27,7 +28,6 @@ class Control(Base, Generic[DeviceT]):
unique_id: str | None = field(default=None, init=False)
availability_topic: str | None = field(default=None, init=False)
# announce: dict | None = field(default=None, metadata=dict(exclude=True))
subscriptions: dict | None = field(default=None, metadata=dict(exclude=True), init=False)
def __post_init__(self):
@ -49,9 +49,6 @@ class Control(Base, Generic[DeviceT]):
self.unique_id = self.get_unique_id()
self.availability_topic = self.get_availability_topic()
self.subscriptions = self.get_subscriptions()
#self.announce = self.get_announce()
@property
def parent(self):
@ -111,8 +108,11 @@ class Control(Base, Generic[DeviceT]):
"""
topic = self.announce_topic
data_json = to_json(self.get_announce())
logger.info(f'Announcing {topic} with {data_json}')
data = self.get_announce()
data_json = to_json(data)
logger.info(f'{get_prefix(ANNOUNCE)}: {data} {Constants.ARROW_RIGHT} {topic}')
await self.device.client.publish(topic, data_json, retain=True)

View file

@ -34,11 +34,8 @@ class Device(Base):
for control in self.controls:
control.set_parent(self)
#self.announce = self.get_announce()
self.subscriptions = self.get_subscriptions()
self
@cached_property
def topic(self):
return self.client.topic / self.name_san

View file

@ -4,8 +4,9 @@ from dataclasses import dataclass, field
from functools import cached_property
from typing import ClassVar, TYPE_CHECKING, Callable
from fmtr.tools import aio
from fmtr.tools import aio, Constants
from haco.obs import logger
from haco.utils import get_prefix
if TYPE_CHECKING:
from capabilities import Capability
@ -107,6 +108,9 @@ class AnnounceTopicState(AnnounceTopic):
value_raw = self.capability.converters.state(value)
await self.capability.control.device.client.publish(self.topic, value_raw)
logger.info(f'{get_prefix(self.IO)}: {self.topic} {Constants.ARROW_RIGHT} {value_raw}')
return value_raw
@dataclass(kw_only=True)
@ -119,14 +123,17 @@ class AnnounceTopicCommand(AnnounceTopic):
async def handle(self, message):
value = message.payload.decode('utf-8')
value = self.capability.converters.command(value)
logger.info(f'{get_prefix(self.IO)}: {value} {Constants.ARROW_LEFT} {self.topic}')
if not self.control_method:
logger.error(f'Incomplete base class: {self.callback_class_method_name}')
return
is_async = aio.is_async(self.control_method)
value = message.payload.decode('utf-8')
value = self.capability.converters.command(value)
try:
if is_async:
@ -138,7 +145,6 @@ class AnnounceTopicCommand(AnnounceTopic):
logger.warning(f'Subclass has not implemented method: {self.callback_class_method_name} {self.topic} {value}')
return
# Echo back as new state
topic_state = self.state
if topic_state:
await topic_state.handle(value_raw)

View file

@ -57,3 +57,7 @@ class ConvertersNumeric(Converters):
@dataclass
class Metadata:
exclude: bool = False
def get_prefix(io: str) -> str:
return io[:2].upper()

View file

@ -1 +1 @@
0.1.4
0.1.5