Amazonechocontrol: what can your Alexa devices really do? Help us compare Amazon's device data with reality

While fixing a Sonos problem in the amazonechocontrol binding we found that Amazon’s device data is not what it seems. A Sonos with Alexa appears twice (family THIRD_PARTY_AVS_SONOS_BOOTLEG for voice and text, THIRD_PARTY_AVS_MEDIA_DISPLAY for playback and player control), the media entry is reported offline although it works, and the capability list describes the speaker rather than the entry: AUDIO_PLAYER sits on an entry without a player and the equalizer answers on devices without the equalizer flag. The binding gives every device the same 36 channels, so which of them actually work depends on facts Amazon does not state. Background in the 2023 thread (Using Sonos Speakers as Alexa Echo via Amazon Echo Control Binding--> Sonos Arc works, Sonos Move not), the fix for the Sonos part is in review ([amazonechocontrol] Sonos speakers: playback state and player commands live on a second device the binding never uses · Issue #21591 · openhab/openhab-addons · GitHub, [amazonechocontrol] Fix status of Sonos media devices by ML19821 · Pull Request #21592 · openhab/openhab-addons · GitHub), and a test build for openHAB 5.2.x makes the media entry usable today: Release amazonechocontrol: combined test build 9 (main state plus experimental Sonos media-twin support) · ML19821/openhab-addons · GitHub

To decide how far the binding should go, we collect data from other households. All device types are welcome, especially Echo Show and Spot, Fire TV, multiroom groups and non-Amazon speakers with Alexa built in. Please post a screenshot of the “Connected Devices” table from the binding’s page at http://<openhab>:8080/amazonechocontrol (serial numbers blurred) and one line per device: device, family, device type, Alexa enabled yes/no, and what works for you: voice, player, alarms, equalizer, bluetooth, DND.

What we have so far is in the table at the end of [amazonechocontrol] Sonos speakers: playback state and player commands live on a second device the binding never uses · Issue #21591 · openhab/openhab-addons · GitHub.

Device Family Device type Alexa built in Voice, TTS Player Alarms Equalizer Bluetooth DND Source
Echo Show 5 1.GEN KNIGHT Echo Show 5 yes yes n.t. yes yes n.t. yes
Echo Show 5 2.GEN KNIGHT Echo Show 5 2.Gen yes yes n.t. yes yes n.t. yes
Echo Plus 4.Gen ECHO Echo Plus 4.Gen yes yes n.t. yes yes n.t. yes

openHAB 5.3.0.M1.
All of my other devices are already mentioned on github.

Current recurring log entries
2026-08-31 17:00:33.268 [INFO ] [zonechocontrol.internal.connection.Connection] - getting items from list 'YW16bjEuYWNjb3VudC5BR05VRjZVRUM0TkdWSFFBWVVURlRPV09CUUFRLVNIT1BQSU5HX0lURU0=' failed
org.openhab.binding.amazonechocontrol.internal.ConnectionException: https://eu-api-alexa.amazon.com/api/namedLists/YW16bjEuYWNjb3VudC5BR05VRjZVRUM0TkdWSFFBWVVURlRPV09CUUFRLVNIT1BQSU5HX0lURU0=/items?_=1788188426984 failed with code 503: Service Temporarily Unavailable
	at org.openhab.binding.amazonechocontrol.internal.util.HttpRequestBuilder$HttpResponseListener.onComplete(HttpRequestBuilder.java:412)
	at org.eclipse.jetty.client.ResponseNotifier.notifyComplete(ResponseNotifier.java:218)
	at org.eclipse.jetty.client.ResponseNotifier.notifyComplete(ResponseNotifier.java:210)
	at org.eclipse.jetty.client.HttpReceiver.terminateResponse(HttpReceiver.java:481)
	at org.eclipse.jetty.client.HttpReceiver.terminateResponse(HttpReceiver.java:461)
	at org.eclipse.jetty.client.HttpReceiver.responseSuccess(HttpReceiver.java:424)
	at org.eclipse.jetty.client.http.HttpReceiverOverHTTP.messageComplete(HttpReceiverOverHTTP.java:374)
	at org.eclipse.jetty.http.HttpParser.parseFields(HttpParser.java:1188)
	at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:1560)
	at org.eclipse.jetty.client.http.HttpReceiverOverHTTP.parse(HttpReceiverOverHTTP.java:208)
	at org.eclipse.jetty.client.http.HttpReceiverOverHTTP.process(HttpReceiverOverHTTP.java:148)
	at org.eclipse.jetty.client.http.HttpReceiverOverHTTP.receive(HttpReceiverOverHTTP.java:80)
	at org.eclipse.jetty.client.http.HttpChannelOverHTTP.receive(HttpChannelOverHTTP.java:131)
	at org.eclipse.jetty.client.http.HttpConnectionOverHTTP.onFillable(HttpConnectionOverHTTP.java:172)
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
	at org.eclipse.jetty.io.ssl.SslConnection$DecryptedEndPoint.onFillable(SslConnection.java:555)
	at org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:410)
	at org.eclipse.jetty.io.ssl.SslConnection$2.succeeded(SslConnection.java:164)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
	at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)
	at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)
	at java.base/java.lang.Thread.run(Thread.java:1583)
...
2026-09-01 05:54:46.057 [WARN ] [nechocontrol.internal.push.PushSessionHandler] - Session 836272859 failed: null
2026-09-01 09:42:40.659 [WARN ] [onechocontrol.internal.push.PushStreamAdapter] - Exception while processing message
com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Unterminated string at line 1 column 744 path $.directive.payload.renderingUpdates[0].resourceMetadata
See https://github.com/google/gson/blob/main/Troubleshooting.md#malformed-json
	at com.google.gson.Gson.fromJson(Gson.java:1384)
	at com.google.gson.Gson.fromJson(Gson.java:1259)
	at com.google.gson.Gson.fromJson(Gson.java:1169)
	at com.google.gson.Gson.fromJson(Gson.java:1106)
	at org.openhab.binding.amazonechocontrol.internal.push.PushStreamAdapter.onData(PushStreamAdapter.java:104)
	at org.eclipse.jetty.http2.HTTP2Stream.notifyData(HTTP2Stream.java:658)
	at org.eclipse.jetty.http2.HTTP2Stream.onData(HTTP2Stream.java:394)
	at org.eclipse.jetty.http2.HTTP2Stream.process(HTTP2Stream.java:315)
	at org.eclipse.jetty.http2.HTTP2Session.onData(HTTP2Session.java:287)
	at org.eclipse.jetty.http2.HTTP2Connection$ParserListener.onData(HTTP2Connection.java:400)
	at org.eclipse.jetty.http2.parser.BodyParser.notifyData(BodyParser.java:108)
	at org.eclipse.jetty.http2.parser.DataBodyParser.onData(DataBodyParser.java:150)
	at org.eclipse.jetty.http2.parser.DataBodyParser.onData(DataBodyParser.java:145)
	at org.eclipse.jetty.http2.parser.DataBodyParser.parse(DataBodyParser.java:111)
	at org.eclipse.jetty.http2.parser.Parser.parseBody(Parser.java:227)
	at org.eclipse.jetty.http2.parser.Parser.parse(Parser.java:156)
	at org.eclipse.jetty.http2.HTTP2Connection$HTTP2Producer.produce(HTTP2Connection.java:271)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.produceTask(EatWhatYouKill.java:362)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:186)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.produce(EatWhatYouKill.java:137)
	at org.eclipse.jetty.http2.HTTP2Connection.produce(HTTP2Connection.java:193)
	at org.eclipse.jetty.http2.HTTP2Connection.onFillable(HTTP2Connection.java:148)
	at org.eclipse.jetty.http2.HTTP2Connection$FillableCallback.succeeded(HTTP2Connection.java:371)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
	at org.eclipse.jetty.io.ssl.SslConnection$DecryptedEndPoint.onFillable(SslConnection.java:555)
	at org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:410)
	at org.eclipse.jetty.io.ssl.SslConnection$2.succeeded(SslConnection.java:164)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
	at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)
	at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)
	at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: com.google.gson.stream.MalformedJsonException: Unterminated string at line 1 column 744 path $.directive.payload.renderingUpdates[0].resourceMetadata
See https://github.com/google/gson/blob/main/Troubleshooting.md#malformed-json
	at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1817)
	at com.google.gson.stream.JsonReader.nextQuotedValue(JsonReader.java:1177)
	at com.google.gson.stream.JsonReader.nextString(JsonReader.java:964)
	at com.google.gson.internal.bind.TypeAdapters$15.read(TypeAdapters.java:461)
	at com.google.gson.internal.bind.TypeAdapters$15.read(TypeAdapters.java:449)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$2.readIntoField(ReflectiveTypeAdapterFactory.java:271)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$FieldReflectionAdapter.readField(ReflectiveTypeAdapterFactory.java:559)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:517)
	at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40)
	at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:84)
	at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:64)
	at org.openhab.binding.amazonechocontrol.internal.util.NonNullListTypeAdapterFactory$DeserializeNonNullTypeAdapter.read(NonNullListTypeAdapterFactory.java:72)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$2.readIntoField(ReflectiveTypeAdapterFactory.java:271)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$FieldReflectionAdapter.readField(ReflectiveTypeAdapterFactory.java:559)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:517)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$2.readIntoField(ReflectiveTypeAdapterFactory.java:271)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$FieldReflectionAdapter.readField(ReflectiveTypeAdapterFactory.java:559)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:517)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$2.readIntoField(ReflectiveTypeAdapterFactory.java:271)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$FieldReflectionAdapter.readField(ReflectiveTypeAdapterFactory.java:559)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:517)
	at com.google.gson.Gson.fromJson(Gson.java:1358)
	... 37 more
...
2026-09-01 09:42:40.689 [WARN ] [onechocontrol.internal.push.PushStreamAdapter] - Don't know how to handle frame starting with a.media.access.shared.model.MusicNowPlayingData\\\",\\\"transport\\\":{\\\"playPause\\\":\\\"ENABLED\\\",\\\"next\\\":\\\"DISABLED\\\",\\\"previous\\\":\\\"DISABLED\\\",\\\"shuffle\\\":\\\"HIDDEN\\\",\\\"repeat\\\":\\\"HIDDEN\\\",\\\"seekForward\\\":\\\"HIDDEN\\\",\\\"seekBackward\\\":\\\"HIDDEN\\\",\\\"thumbsUp\\\":\\\"HIDDEN\\\",\\\"thumbsDown\\\":\\\"HIDDEN\\\"},\\\"progress\\\":{\\\"visible\\\":true,\\\"mediaProgress\\\":10003434,\\\"mediaLength\\\":0,\\\"allowScrubbing\\\":false,\\\"showTiming\\\":true},\\\"playerState\\\":\\\"PAUSED\\\",\\\"queueId\\\":\\\"4b505576-0faf-4fb5-811e-f1399546918b\\\",\\\"mediaId\\\":\\\"4b505576-0faf-4fb5-811e-f1399546918b:1\\\",\\\"quality\\\":{\\\"name\\\":\\\"Default Quality\\\",\\\"badge\\\":{\\\"altText\\\":null,\\\"url\\\":\\\"\\\",\\\"contentType\\\":null}},\\\"provider\\\":{\\\"providerName\\\":\\\"ARD Sounds\\\",\\\"providerLogo\\\":{\\\"altText\\\":\\\"ARD Sounds\\\",\\\"url\\\":\\\"https://s3.amazonaws.com/CAPS-SSE/alexa_music_skills/28d5/ask.skill.wordmark.0bdc3c9a9f8949d98a0c1cf0a18e9aa7/APP_WORDMARK_LARGE?versionId=2_20.CltzIj.HizIujLTC31M_NK9V.Sx&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20260901T073033Z&X-Amz-SignedHeaders=host&X-Amz-Expires=7200&X-Amz-Credential=AKIAWBV6LQ4QGZPQZQYL%2F20260901%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=1e884e932ab86ac65bd00853cc0f0ea27a0e9c545724b4aecb8786b7855ab902\\\",\\\"contentType\\\":\\\"image/*\\\"}},\\\"mainArt\\\":{\\\"altText\\\":null,\\\"contentType\\\":\\\"image/jpeg\\\",\\\"tinyUrl\\\":\\\"https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:823f9d14033a2db9/1x1?ch=cc5af2649e307a77&w=320\\\",\\\"smallUrl\\\":\\\"https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:823f9d14033a2db9/1x1?ch=cc5af2649e307a77&w=320\\\",\\\"mediumUrl\\\":\\\"https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:823f9d14033a2db9/1x1?ch=cc5af2649e307a77&w=320\\\",\\\"largeUrl\\\":\\\"https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:823f9d14033a2db9/1x1?ch=cc5af2649e307a77&w=320\\\",\\\"fullUrl\\\":\\\"https://api.ardmediathek.de/image-service/image-collections/urn:ard:image-collection:823f9d14033a2db9/1x1?ch=cc5af2649e307a77&w=640\\\"},\\\"infoText\\\":{\\\"title\\\":\\\"NDR 2 (Hamburg) Livestream\\\",\\\"subText1\\\":null,\\\"subText2\\\":null,\\\"multiLineMode\\\":false},\\\"mediaReference\\\":{\\\"namespace\\\":\\\"Alexa.Audio.PlayQueue\\\",\\\"name\\\":\\\"item\\\",\\\"value\\\":\\\"{\\\\\\\"contentId\\\\\\\":\\\\\\\"{\\\\\\\\\\\\\\\"catalog\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\"radio\\\\\\\\\\\\\\\",\\\\\\\\\\\\\\\"source\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\"core\\\\\\\\\\\\\\\",\\\\\\\\\\\\\\\"type\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\"station\\\\\\\\\\\\\\\",\\\\\\\\\\\\\\\"id\\\\\\\\\\\\\\\":null,\\\\\\\\\\\\\\\"options\\\\\\\\\\\\\\\":null,\\\\\\\\\\\\\\\"coreId\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\"urn:ard:permanent-livestream:56d71679a77b2ca9\\\\\\\\\\\\\\\"}\\\\\\\",\\\\\\\"queueId\\\\\\\":\\\\\\\"q2/2026-07-14T04:24:20.632Z/01KXFDWRWRMWWBSFA1W5FTW1ZF\\\\\\\",\\\\\\\"id\\\\\\\":\\\\\\\"{\\\\\\\\\\\\\\\"catalog\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\"radio\\\\\\\\\\\\\\\",\\\\\\\\\\\\\\\"source\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\"core\\\\\\\\\\\\\\\",\\\\\\\\\\\\\\\"type\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\"station\\\\\\\\\\\\\\\",\\\\\\\\\\\\\\\"id\\\\\\\\\\\\\\\":null,\\\\\\\\\\\\\\\"options\\\\\\\\\\\\\\\":null,\\\\\\\\\\\\\\\"coreId\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\"urn:ard:permanent-livestream:56d71679a77b2ca9\\\\\\\\\\\\\\\"}\\\\\\\",\\\\\\\"content\\\\\\\":{\\\\\\\"id\\\\\\\":\\\\\\\"{\\\\\\\\\\\\\\\"catalog\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\"radio\\\\\\\\\\\\\\\",\\\\\\\\\\\\\\\"source\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\"core\\\\\\\\\\\\\\\",\\\\\\\\\\\\\\\"type\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\"station\\\\\\\\\\\\\\\",\\\\\\\\\\\\\\\"id\\\\\\\\\\\\\\\":null,\\\\\\\\\\\\\\\"options\\\\\\\\\\\\\\\":null,\\\\\\\\\\\\\\\"coreId\\\\\\\\\\\\\\\":\\\\\\\\\\\\\\\"urn:ard:permanent-livestream:56d71679a77b2ca9\\\\\\\\\\\\\\\"}\\\\\\\",\\\\\\\"metadataType\\\\\\\":\\\\\\\"RADIO\\\\\\\"}}\\\"},\\\"sources\\\":[]},\\\"playbackError\\\":false,\\\"errorMessage\\\":null}},\\\"name\\\":\\\"NotifyNowPlayingUpdated\\\"}\",\"timeStamp\":1788248560598}"}]}}}
2026-09-01 17:10:44.488 [INFO ] [zonechocontrol.internal.connection.Connection] - getting items from list 'YW16bjEuYWNjb3VudC5BR05VRjZVRUM0TkdWSFFBWVVURlRPV09CUUFRLVNIT1BQSU5HX0lURU0=' failed
...

Thanks sihui, the three devices are in the table now.

The 503 on namedLists turned out to be worth a fix of its own: the binding requested the changed list from Amazon and did nothing with the answer, so every list edit made a request nobody needed. [amazonechocontrol] Stop fetching unused list data by ML19821 · Pull Request #21614 · openhab/openhab-addons · GitHub removes it, and test build Release amazonechocontrol all-fixes test-12 (5.2.x) · ML19821/openhab-addons · GitHub carries it if you want the log entry gone before the merge.

Thx for the fixes.
Please note the different “Family” on the Show devices: KNIGHT instead of ECHO.
See also