From 37efced3d685ec144d06dd6f396f714ef45258be Mon Sep 17 00:00:00 2001 From: jtkDvlp Date: Fri, 28 Jul 2023 02:27:09 +0200 Subject: [PATCH] Add ha_discovery support for serial stream --- mqtt_io/home_assistant.py | 34 +++++++++++++++++++++++++++++++- mqtt_io/modules/stream/serial.py | 4 ++++ mqtt_io/server.py | 7 +++++++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/mqtt_io/home_assistant.py b/mqtt_io/home_assistant.py index 6e405cf0..54c0abc4 100644 --- a/mqtt_io/home_assistant.py +++ b/mqtt_io/home_assistant.py @@ -8,7 +8,7 @@ import logging from typing import Any, Dict -from .constants import INPUT_TOPIC, OUTPUT_TOPIC, SENSOR_TOPIC, SET_SUFFIX +from .constants import INPUT_TOPIC, OUTPUT_TOPIC, SENSOR_TOPIC, STREAM_TOPIC, SET_SUFFIX, SEND_SUFFIX from .mqtt import MQTTClientOptions, MQTTMessageSend from .types import ConfigType from . import VERSION @@ -148,3 +148,35 @@ def hass_announce_sensor_input( json.dumps(sensor_config).encode("utf8"), retain=True, ) + +def hass_announce_stream( + in_conf: ConfigType, mqtt_conf: ConfigType, mqtt_options: MQTTClientOptions +) -> MQTTMessageSend: + """ + Create a message which announces stream as text to Home Assistant. + """ + disco_conf: ConfigType = mqtt_conf["ha_discovery"] + name: str = in_conf["name"] + disco_prefix: str = disco_conf["prefix"] + stream_config = get_common_config(in_conf, mqtt_conf, mqtt_options) + stream_config.update( + dict( + unique_id=f"{mqtt_options.client_id}_{in_conf['module']}_input_{name}", + state_topic="/".join((mqtt_conf["topic_prefix"], STREAM_TOPIC, name)), + command_topic="/".join((mqtt_conf["topic_prefix"], STREAM_TOPIC, name, SEND_SUFFIX)) + ) + ) + return MQTTMessageSend( + "/".join( + ( + disco_prefix, + stream_config.pop("component", "text"), + mqtt_options.client_id, + name, + "config", + ) + ), + json.dumps(stream_config).encode("utf8"), + retain=True, + ) + diff --git a/mqtt_io/modules/stream/serial.py b/mqtt_io/modules/stream/serial.py index cabac6bb..a9eb9823 100644 --- a/mqtt_io/modules/stream/serial.py +++ b/mqtt_io/modules/stream/serial.py @@ -47,6 +47,10 @@ "required": False, "empty": False, "default": False + }, + "ha_discovery": { + "type": "dict", + "allow_unknown": True } } diff --git a/mqtt_io/server.py b/mqtt_io/server.py index f026cefc..23535d5e 100644 --- a/mqtt_io/server.py +++ b/mqtt_io/server.py @@ -56,6 +56,7 @@ hass_announce_digital_input, hass_announce_digital_output, hass_announce_sensor_input, + hass_announce_stream ) from .modules import install_missing_module_requirements from .modules.gpio import GenericGPIO, InterruptEdge, InterruptSupport, PinDirection @@ -636,6 +637,12 @@ def _ha_discovery_announce(self) -> None: sens_conf, mqtt_config, self.mqtt_client_options ) ) + for stream_conf in self.stream_configs.values(): + messages.append( + hass_announce_stream( + stream_conf, mqtt_config, self.mqtt_client_options + ) + ) for msg in messages: self.mqtt_task_queue.put_nowait( PriorityCoro(self._mqtt_publish(msg), MQTT_ANNOUNCE_PRIORITY)