Directive 3: ESP32 MQTT auto-reconnect, heartbeat, MQTT-state LED, drop logging

- Reconnect and re-subscribe on every (re)connect; log the subscribe result.
- Heartbeat every 5 min on voice/audio_stream (valid silent PCM frame) so the
  Directive-1 watchdog can tell "device dead" from "nobody spoke". voice_bridge
  treats it as silence and ignores it.
- Retained LWT "offline" / "online" presence on voice/status for layer
  attribution in the watchdog.
- LED: green now means MQTT connected AND publishing. Wi-Fi down = red blink,
  Wi-Fi up but MQTT down = amber blink. Never green without MQTT.
- Log the reason on every drop: PubSubClient state code, or the Wi-Fi
  disconnect reason from the Wi-Fi event.
- Bound the I2S read (50 ms) so Wi-Fi/MQTT housekeeping cannot stall; reset a
  stale streaming state on disconnect (the stuck-green bug).
- Document the MQTT/LED contract in README; flag config.h and led_control.h as
  stale drafts so they cannot creep back as a second config.
- Credentials stay placeholders; nothing secret is committed.

Not flashed/tested: no ESP32 and no arduino-cli is reachable from the build
environment. Hardware-in-the-loop verification needs a human at the device.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
2026-10-14 10:59:19 +11:00
parent 3943b00dac
commit 611fdf812b
4 changed files with 373 additions and 89 deletions

View File

@@ -1,5 +1,11 @@
#pragma once
// STALE / UNUSED. This file is an early draft and is NOT compiled: the sketch
// voice_assistant.ino does not include it and holds the live config itself.
// The values below are wrong for the running device (broker .30 and the
// homeassistant/voice/* topics belong to an older design). Kept only so old
// checkouts do not break; do not add a second config here.
// --- WiFi ---
const char* WIFI_SSID = "Aussie Broadband 8729";
const char* WIFI_PASS = "WIFI_PASS_REDACTED";