diff --git a/haco/client.py b/haco/client.py index 671bf4b..341937d 100644 --- a/haco/client.py +++ b/haco/client.py @@ -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: diff --git a/haco/constants.py b/haco/constants.py index 4b22965..3e66065 100644 --- a/haco/constants.py +++ b/haco/constants.py @@ -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' diff --git a/haco/control.py b/haco/control.py index f1e458b..6a7f27a 100644 --- a/haco/control.py +++ b/haco/control.py @@ -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) diff --git a/haco/device.py b/haco/device.py index 718cc60..e0587ac 100644 --- a/haco/device.py +++ b/haco/device.py @@ -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 diff --git a/haco/topics.py b/haco/topics.py index 583fce6..3367062 100644 --- a/haco/topics.py +++ b/haco/topics.py @@ -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) diff --git a/haco/utils.py b/haco/utils.py index c223482..4d12e1e 100644 --- a/haco/utils.py +++ b/haco/utils.py @@ -57,3 +57,7 @@ class ConvertersNumeric(Converters): @dataclass class Metadata: exclude: bool = False + + +def get_prefix(io: str) -> str: + return io[:2].upper() diff --git a/haco/version b/haco/version index 446ba66..def9a01 100644 --- a/haco/version +++ b/haco/version @@ -1 +1 @@ -0.1.4 \ No newline at end of file +0.1.5 \ No newline at end of file