Repository navigation
Conversation
rudyberends
added a commit
that referenced
this pull request
Oct 3, 2026
The picker listed speakers as "192.168.1.20 - Sonos Beam": the device description's friendlyName names the box, not the room. S2 firmware also dropped <RoomName> from /status/zp, leaving a ZoneName with the channels glued on, "Living Room (LF,RF)". The room now comes from the description's <roomName>, a ZoneName loses only real Sonos channel codes (so "Office (AV)" stays), and XML entities are decoded. The model is reported alongside, so the picker can tell two speakers apart without folding it into the name a zone saves and rediscovers by. Refs #396 Co-Authored-By: Jeroen Van Daele <github.com@vitto.eu>
rudyberends
added a commit
that referenced
this pull request
Oct 3, 2026
The picker listed bonded speakers as rooms ("Television · Sonos Sub"), and
a zone pointed at one sent its audio to a speaker that only follows. The
topology meant to hide them and map them to their coordinator was read
from /status/topology, which S2 no longer serves and whose shape the
parser never matched, so neither ever happened. It now comes from the
ZoneGroupTopology GetZoneGroupState action, and a home theatre's Sub and
surrounds, nested as <Satellite> elements, count as passive alongside an
invisible stereo-pair member.
Refs #396
Co-Authored-By: Jeroen Van Daele <github.com@vitto.eu>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Sonos discovery: show room name, model and IP in the output picker
Component:
sonn-audio/core— Sonos output discovery (GET /transports/sonos/devices)Tested on:
ghcr.io/sonn-audio/core:beta, Sonos S2 firmware 97.1-80312 (Beam, Sub, 2× One)Problem
In Zones → Output routing → Devices, Sonos speakers were listed by their raw UPnP
friendlyName:The room name configured in the Sonos app (e.g. Television) was never shown, which makes picking the right speaker hard in a larger household.
Root cause
Three issues in
src/adapters/outputs/sonos/sonosDiscovery.ts:resolveDeviceFromLocation()setname: friendlyName ?? status?.roomName.friendlyNameis always present, so the room name never won. The admin UI rendersdevice.namefirst./status/zp. Current S2 firmware has no<RoomName>there; the<ZoneName>fallback includes a channel suffix (Television (LF,RF)).<roomName>Television</roomName>and<modelName>Sonos Beam</modelName>, but neither was parsed.Changes
src/adapters/outputs/sonos/sonosDiscovery.ts<roomName>from the device description and use it as the primary room name, falling back to/status/zp.<modelName>and return it as a newmodelfield.namenow prefers the room name overfriendlyName.stripChannelSuffix()removes suffixes like(LF,RF),(LF),(RF)from the<ZoneName>fallback (still used by the network-scan path).src/adapters/http/adminApi/transports/transportsHandlers.tshandleSonosDiscovery()builds the display name asroomName · model · hostand also returnsmodelas a separate field.src/ports/OutputDiscoveryPort.tsmodel?: stringtoSonosDiscoveredDevice.Result
172.16.0.104 - Sonos One - RINCON_48A6B8F652EA01400Kitchen · Sonos One · 172.16.0.104172.16.0.178 - Sonos Beam - RINCON_949F3ED056A401400Television · Sonos Beam · 172.16.0.178172.16.0.150 - Sonos Sub - RINCON_949F3EA0BBEE01400Television · Sonos Sub · 172.16.0.150172.16.0.117 - Sonos One - RINCON_48A6B8F652A201400Dining Room · Sonos One · 172.16.0.117The subtitle line (
Sonos <householdId>) is unchanged; it is produced by the admin UI (sonn-audio/adminui,ZonesView.tsx), not by core.Side effects
nameas the zone'sdeviceName. Newly selected devices will store the newroom · model · hoststring. This is harmless:hostis stored as well and takes precedence; previously the rawfriendlyNamewas stored, which was equally verbose.deviceNameis only used as a fallback match when no host is configured.Known remaining issue (not fixed here)
Bonded satellites (Sub, surrounds, the passive member of a stereo pair) are still listed as separate devices.
enrichWithTopology()is meant to hide them, but:parseTopology()only matches<ZoneGroupMember>elements, while home-theatre satellites are nested<Satellite>elements;/status/topologymay not be served by current S2 firmware, in which case the filter silently does nothing.Suggested fix: determine satellites via the
ZoneGroupTopologySOAP actionGetZoneGroupStateon port 1400.