From fd1bfb4786a0222ba39053464d14e001926526d2 Mon Sep 17 00:00:00 2001 From: Kai Date: Fri, 13 Feb 2026 17:40:21 +0100 Subject: [PATCH] Split MQTT events into dedicated topics --- bridge/README.md | 6 ++++-- bridge/app.py | 19 +++++++++++++++++-- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/bridge/README.md b/bridge/README.md index 598a146..6de4ca4 100644 --- a/bridge/README.md +++ b/bridge/README.md @@ -60,8 +60,10 @@ Then upload firmware. ## 4) MQTT topics - Status/events published by bridge: - - `evs//status` (JSON) - - includes `type: "vad_segment"` when a speech segment is finalized + - `evs//status` (connection/start/stop/disconnect) + - `evs//mic_level` (mic telemetry) + - `evs//vad_segment` (finalized speech segments) + - reserved for next steps: `evs//transcript`, `evs//stt_error` - Playback input to device: - `evs//play_pcm16le` - payload options: diff --git a/bridge/app.py b/bridge/app.py index af77511..67fdf6d 100644 --- a/bridge/app.py +++ b/bridge/app.py @@ -91,9 +91,24 @@ class BridgeState: def publish_status(self, device_id: str, payload: dict) -> None: if not self.mqtt_client: return - topic = f"{MQTT_BASE_TOPIC}/{device_id}/status" + msg_type = str(payload.get("type", "status")) + retain = MQTT_STATUS_RETAIN + if msg_type == "mic_level": + topic = f"{MQTT_BASE_TOPIC}/{device_id}/mic_level" + retain = False + elif msg_type == "vad_segment": + topic = f"{MQTT_BASE_TOPIC}/{device_id}/vad_segment" + retain = False + elif msg_type == "transcript": + topic = f"{MQTT_BASE_TOPIC}/{device_id}/transcript" + retain = False + elif msg_type == "stt_error": + topic = f"{MQTT_BASE_TOPIC}/{device_id}/stt_error" + retain = False + else: + topic = f"{MQTT_BASE_TOPIC}/{device_id}/status" try: - self.mqtt_client.publish(topic, json.dumps(payload), qos=0, retain=MQTT_STATUS_RETAIN) + self.mqtt_client.publish(topic, json.dumps(payload), qos=0, retain=retain) except Exception: log.exception("mqtt publish failed")