docs(api,health): note /speaker play_info needs DNS interception (refs #517)

play_info notifications make the speaker validate the app_key via
GET /v1/auth against a hardcoded Bose host; without DNS interception that
call can't resolve and /speaker times out with ALLEGROWEBSERVER_TIMEOUT
(1046). Document the requirement on POST /speaker (plus the no-DNS
LOCAL_INTERNET_RADIO alternative), and have the "Test DNS path" health
check mention that TTS/play_info depends on the same DNS path.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Tobias Gesellchen
2026-06-27 19:58:19 +02:00
co-authored by Claude Opus 4.8
parent 788a6ced93
commit 18f3eabd67
2 changed files with 17 additions and 1 deletions
@@ -338,6 +338,19 @@ Configures the clock display.
### POST /speaker ✅ **Implemented**
Plays TTS messages or URL content for notifications (ST-10 Series only).
> **Requires DNS interception.** Before playing a `play_info` notification the
> speaker validates the `app_key` by calling `GET /v1/auth` against a hardcoded
> Bose host (`audionotification.api.bosecm.com`, on some firmware the
> `...dev...` variant). After the cloud shutdown that host no longer exists, so
> unless the speaker resolves Bose hostnames through AfterTouch (DNS server +
> the `/etc/resolv.conf` hook, so `*.api.bosecm.com` points at AfterTouch, which
> answers `/v1/auth`), the request hangs and returns
> `ALLEGROWEBSERVER_TIMEOUT` (error `1046`) after ~60s. If you cannot use DNS
> interception, play the clip via the `LOCAL_INTERNET_RADIO` path instead (the
> "radio" method used by the web player's TTS): it needs no `app_key` and no DNS
> redirection, but it replaces the current source rather than ducking and
> resuming it.
**TTS Request XML:**
```xml
<play_info>
@@ -100,7 +100,10 @@ func runDNSSpeakerUsageCheck(
"Bose hostnames. It may simply not have played a TuneIn stream since the " +
"last restart, or it may be using a different DNS resolver. " +
"Click 'Test DNS path' to run an active probe that sends a silent " +
"notification and waits for the speaker to call back through AfterTouch's DNS.",
"notification and waits for the speaker to call back through AfterTouch's DNS. " +
"The same DNS path is required for TTS / `/speaker` `play_info` notifications: " +
"the speaker validates the app_key against a hardcoded Bose host, so without " +
"DNS interception those requests time out with ALLEGROWEBSERVER_TIMEOUT (1046).",
QuickFixes: []QuickFix{probeDNSPathQuickFix},
})
}