[sonos] Support added for models Five and Roam SL (#12607)

Fix #12596
Fix #12610

Signed-off-by: Laurent Garnier <lg.hc@free.fr>
This commit is contained in:
lolodomo 2022-04-16 14:23:20 +02:00 committed by GitHub
parent 320dd8ab00
commit 77ed54d338
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 181 additions and 26 deletions

View File

@ -11,11 +11,11 @@ This happens because of a TTL=1 for ALIVE packets send by Sonos devices, resulti
## Supported Things ## Supported Things
All available Sonos (playback) devices are supported by this binding. All available Sonos (playback) devices are supported by this binding.
This includes the One, One SL, Move, Play:1, Play:3, Play:5, Connect, Connect:Amp, Port, Amp, SYMFONISK, Playbar, Playbase, Beam, Arc, Arc SL and Sub. This includes the One, One SL, Move, Roam, Roam SL, Play:1, Play:3, Play:5, Five, Connect, Connect:Amp, Port, Amp, SYMFONISK, Playbar, Playbase, Beam, Arc, Arc SL and Sub.
The Bridge and Boost are not supported, but these devices do only have an auxiliary role in the Sonos network and do not have any playback capability. The Bridge and Boost are not supported, but these devices do only have an auxiliary role in the Sonos network and do not have any playback capability.
All supported Sonos devices are registered as an audio sink in the framework. All supported Sonos devices are registered as an audio sink in the framework.
When being defined in a \*.things file, the specific thing types One, OneSL, Move, PLAY1, PLAY3, PLAY5, SYMFONISK, PLAYBAR, PLAYBASE, Beam, Arc, ArcSL, CONNECT, CONNECTAMP, Port and Amp should be used. When being defined in a \*.things file, the specific thing types One, OneSL, Move, Roam, RoamSL, PLAY1, PLAY3, PLAY5, Five, SYMFONISK, PLAYBAR, PLAYBASE, Beam, Arc, ArcSL, CONNECT, CONNECTAMP, Port and Amp should be used.
Please note that these thing types are case sensitive (you need to define them **exactly as stated above**). Please note that these thing types are case sensitive (you need to define them **exactly as stated above**).
@ -55,8 +55,8 @@ The devices support the following channels:
| alarmproperties | String | R | Properties of the alarm currently running | all | | alarmproperties | String | R | Properties of the alarm currently running | all |
| alarmrunning | Switch | R | Set to ON if the alarm was triggered | all | | alarmrunning | Switch | R | Set to ON if the alarm was triggered | all |
| bass | Number | RW | Set or get the bass level adjustment (value in range -10 / 10) | all | | bass | Number | RW | Set or get the bass level adjustment (value in range -10 / 10) | all |
| batterycharging | Switch | R | Indicator set to ON when the battery is charging | Move | | batterycharging | Switch | R | Indicator set to ON when the battery is charging | Move, Roam, RoamSL |
| batterylevel | Number | R | Current battery level | Move | | batterylevel | Number | R | Current battery level | Move, Roam, RoamSL |
| clearqueue | Switch | W | Suppress all songs from the current queue | all | | clearqueue | Switch | W | Suppress all songs from the current queue | all |
| codec | String | R | Name of codec currently being decoded | Arc, Arc SL, PLAYBAR, PLAYBASE, Beam, Amp | | codec | String | R | Name of codec currently being decoded | Arc, Arc SL, PLAYBAR, PLAYBASE, Beam, Amp |
| control | Player | RW | Control the Zone Player, e.g. PLAY/PAUSE/NEXT/PREVIOUS | all | | control | Player | RW | Control the Zone Player, e.g. PLAY/PAUSE/NEXT/PREVIOUS | all |
@ -72,12 +72,12 @@ The devices support the following channels:
| favorite | String | W | Play the given favorite entry. The favorite entry has to be predefined in the Sonos Controller app | all | | favorite | String | W | Play the given favorite entry. The favorite entry has to be predefined in the Sonos Controller app | all |
| heightlevel | Number | RW | Set or get the height level adjustment (value in range -10 / 10) | Arc, Arc SL | | heightlevel | Number | RW | Set or get the height level adjustment (value in range -10 / 10) | Arc, Arc SL |
| led | Switch | RW | Set or get the status of the white LED on the front of the Zone Player | all | | led | Switch | RW | Set or get the status of the white LED on the front of the Zone Player | all |
| linein | Switch | R | Indicator set to ON when the line-in of the Zone Player is connected | PLAY5, CONNECT, CONNECTAMP, PLAYBAR, PLAYBASE, Beam, Port | | linein | Switch | R | Indicator set to ON when the line-in of the Zone Player is connected | PLAY5, Five, CONNECT, CONNECTAMP, PLAYBAR, PLAYBASE, Beam, Port |
| analoglinein | Switch | R | Indicator set to ON when the analog line-in of the Zone Player is connected | Amp | | analoglinein | Switch | R | Indicator set to ON when the analog line-in of the Zone Player is connected | Amp |
| digitallinein | Switch | R | Indicator set to ON when the digital line-in of the Zone Player is connected | Amp | | digitallinein | Switch | R | Indicator set to ON when the digital line-in of the Zone Player is connected | Amp |
| localcoordinator | Switch | R | Indicator set to ON if the this Zone Player is the Zone Group Coordinator | all | | localcoordinator | Switch | R | Indicator set to ON if the this Zone Player is the Zone Group Coordinator | all |
| loudness | Switch | RW | Enable or disable the loudness | all | | loudness | Switch | RW | Enable or disable the loudness | all |
| microphone | Switch | R | Indicator set to ON when the microphone is enabled | Arc, Beam, Move, One | | microphone | Switch | R | Indicator set to ON when the microphone is enabled | Arc, Beam, Move, One, Roam |
| mute | Switch | RW | Set or get the mute state of the master volume of the Zone Player | all | | mute | Switch | RW | Set or get the mute state of the master volume of the Zone Player | all |
| nightmode | Switch | RW | Enable or disable the night mode feature | PLAYBAR, PLAYBASE, Beam, Amp | | nightmode | Switch | RW | Enable or disable the night mode feature | PLAYBAR, PLAYBASE, Beam, Amp |
| notificationsound | String | W | Play a notification sound by a given URI | all | | notificationsound | String | W | Play a notification sound by a given URI | all |

View File

@ -14,8 +14,6 @@ package org.openhab.binding.sonos.internal;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.NonNullByDefault;
import org.openhab.core.thing.ThingTypeUID; import org.openhab.core.thing.ThingTypeUID;
@ -41,6 +39,7 @@ public class SonosBindingConstants {
public static final ThingTypeUID PLAY1_THING_TYPE_UID = new ThingTypeUID(BINDING_ID, "PLAY1"); public static final ThingTypeUID PLAY1_THING_TYPE_UID = new ThingTypeUID(BINDING_ID, "PLAY1");
public static final ThingTypeUID PLAY3_THING_TYPE_UID = new ThingTypeUID(BINDING_ID, "PLAY3"); public static final ThingTypeUID PLAY3_THING_TYPE_UID = new ThingTypeUID(BINDING_ID, "PLAY3");
public static final ThingTypeUID PLAY5_THING_TYPE_UID = new ThingTypeUID(BINDING_ID, "PLAY5"); public static final ThingTypeUID PLAY5_THING_TYPE_UID = new ThingTypeUID(BINDING_ID, "PLAY5");
public static final ThingTypeUID FIVE_THING_TYPE_UID = new ThingTypeUID(BINDING_ID, "Five");
public static final ThingTypeUID PLAYBAR_THING_TYPE_UID = new ThingTypeUID(BINDING_ID, "PLAYBAR"); public static final ThingTypeUID PLAYBAR_THING_TYPE_UID = new ThingTypeUID(BINDING_ID, "PLAYBAR");
public static final ThingTypeUID PLAYBASE_THING_TYPE_UID = new ThingTypeUID(BINDING_ID, "PLAYBASE"); public static final ThingTypeUID PLAYBASE_THING_TYPE_UID = new ThingTypeUID(BINDING_ID, "PLAYBASE");
public static final ThingTypeUID BEAM_THING_TYPE_UID = new ThingTypeUID(BINDING_ID, "Beam"); public static final ThingTypeUID BEAM_THING_TYPE_UID = new ThingTypeUID(BINDING_ID, "Beam");
@ -53,25 +52,24 @@ public class SonosBindingConstants {
public static final ThingTypeUID ARC_SL_THING_TYPE_UID = new ThingTypeUID(BINDING_ID, "ArcSL"); public static final ThingTypeUID ARC_SL_THING_TYPE_UID = new ThingTypeUID(BINDING_ID, "ArcSL");
public static final ThingTypeUID MOVE_THING_TYPE_UID = new ThingTypeUID(BINDING_ID, "Move"); public static final ThingTypeUID MOVE_THING_TYPE_UID = new ThingTypeUID(BINDING_ID, "Move");
public static final ThingTypeUID ROAM_THING_TYPE_UID = new ThingTypeUID(BINDING_ID, "Roam"); public static final ThingTypeUID ROAM_THING_TYPE_UID = new ThingTypeUID(BINDING_ID, "Roam");
public static final ThingTypeUID ROAM_SL_THING_TYPE_UID = new ThingTypeUID(BINDING_ID, "RoamSL");
public static final ThingTypeUID ZONEPLAYER_THING_TYPE_UID = new ThingTypeUID(BINDING_ID, "zoneplayer"); public static final ThingTypeUID ZONEPLAYER_THING_TYPE_UID = new ThingTypeUID(BINDING_ID, "zoneplayer");
public static final Set<ThingTypeUID> WITH_LINEIN_THING_TYPES_UIDS = Stream.of(PLAY5_THING_TYPE_UID, public static final Set<ThingTypeUID> WITH_LINEIN_THING_TYPES_UIDS = Set.of(PLAY5_THING_TYPE_UID,
PLAYBAR_THING_TYPE_UID, PLAYBASE_THING_TYPE_UID, BEAM_THING_TYPE_UID, CONNECT_THING_TYPE_UID, FIVE_THING_TYPE_UID, PLAYBAR_THING_TYPE_UID, PLAYBASE_THING_TYPE_UID, BEAM_THING_TYPE_UID,
CONNECTAMP_THING_TYPE_UID, PORT_THING_TYPE_UID, ARC_THING_TYPE_UID, ARC_SL_THING_TYPE_UID) CONNECT_THING_TYPE_UID, CONNECTAMP_THING_TYPE_UID, PORT_THING_TYPE_UID, ARC_THING_TYPE_UID,
.collect(Collectors.toSet()); ARC_SL_THING_TYPE_UID);
public static final Set<ThingTypeUID> WITH_ANALOG_LINEIN_THING_TYPES_UIDS = Stream.of(AMP_THING_TYPE_UID) public static final Set<ThingTypeUID> WITH_ANALOG_LINEIN_THING_TYPES_UIDS = Set.of(AMP_THING_TYPE_UID);
.collect(Collectors.toSet());
public static final Set<ThingTypeUID> WITH_DIGITAL_LINEIN_THING_TYPES_UIDS = Stream.of(AMP_THING_TYPE_UID) public static final Set<ThingTypeUID> WITH_DIGITAL_LINEIN_THING_TYPES_UIDS = Set.of(AMP_THING_TYPE_UID);
.collect(Collectors.toSet());
public static final Set<ThingTypeUID> SUPPORTED_KNOWN_THING_TYPES_UIDS = Stream.of(ONE_THING_TYPE_UID, public static final Set<ThingTypeUID> SUPPORTED_KNOWN_THING_TYPES_UIDS = Set.of(ONE_THING_TYPE_UID,
ONE_SL_THING_TYPE_UID, PLAY1_THING_TYPE_UID, PLAY3_THING_TYPE_UID, PLAY5_THING_TYPE_UID, ONE_SL_THING_TYPE_UID, PLAY1_THING_TYPE_UID, PLAY3_THING_TYPE_UID, PLAY5_THING_TYPE_UID,
PLAYBAR_THING_TYPE_UID, PLAYBASE_THING_TYPE_UID, BEAM_THING_TYPE_UID, CONNECT_THING_TYPE_UID, FIVE_THING_TYPE_UID, PLAYBAR_THING_TYPE_UID, PLAYBASE_THING_TYPE_UID, BEAM_THING_TYPE_UID,
CONNECTAMP_THING_TYPE_UID, PORT_THING_TYPE_UID, AMP_THING_TYPE_UID, SYMFONISK_THING_TYPE_UID, CONNECT_THING_TYPE_UID, CONNECTAMP_THING_TYPE_UID, PORT_THING_TYPE_UID, AMP_THING_TYPE_UID,
ARC_THING_TYPE_UID, ARC_SL_THING_TYPE_UID, MOVE_THING_TYPE_UID, ROAM_THING_TYPE_UID) SYMFONISK_THING_TYPE_UID, ARC_THING_TYPE_UID, ARC_SL_THING_TYPE_UID, MOVE_THING_TYPE_UID,
.collect(Collectors.toSet()); ROAM_THING_TYPE_UID, ROAM_SL_THING_TYPE_UID);
public static final Set<ThingTypeUID> SUPPORTED_THING_TYPES_UIDS = new HashSet<>(SUPPORTED_KNOWN_THING_TYPES_UIDS); public static final Set<ThingTypeUID> SUPPORTED_THING_TYPES_UIDS = new HashSet<>(SUPPORTED_KNOWN_THING_TYPES_UIDS);
static { static {

View File

@ -95,6 +95,9 @@ public class ZonePlayerDiscoveryParticipant implements UpnpDiscoveryParticipant
case "Arc SL": case "Arc SL":
modelName = "ArcSL"; modelName = "ArcSL";
break; break;
case "Roam SL":
modelName = "RoamSL";
break;
case "Sub": case "Sub":
// The Sonos Sub is ignored // The Sonos Sub is ignored
ignored = true; ignored = true;

View File

@ -1,12 +1,17 @@
# binding # binding
binding.sonos.name = Sonos Binding binding.sonos.name = Sonos Binding
binding.sonos.description = This is the binding for the Sonos multi-room audio system. binding.sonos.description = This is the binding for the Sonos multi-room audio system.
binding.config.sonos.opmlUrl.label = OPML Service URL
binding.config.sonos.opmlUrl.description = URL for the OPML/tunein.com service # binding config
binding.config.sonos.callbackUrl.label = Callback URL binding.config.sonos.callbackUrl.label = Callback URL
binding.config.sonos.callbackUrl.description = URL to use for playing notification sounds, e.g. http://192.168.0.2:8080 binding.config.sonos.callbackUrl.description = URL to use for playing notification sounds, e.g. http://192.168.0.2:8080
binding.config.sonos.opmlUrl.label = OPML Service URL
binding.config.sonos.opmlUrl.description = URL for the OPML/tunein.com service
# thing types # thing types
thing-type.sonos.Amp.label = Amp thing-type.sonos.Amp.label = Amp
thing-type.sonos.Amp.description = Represents SONOS Amp amplifier thing-type.sonos.Amp.description = Represents SONOS Amp amplifier
thing-type.sonos.Arc.label = Arc thing-type.sonos.Arc.label = Arc
@ -19,6 +24,8 @@ thing-type.sonos.CONNECT.label = CONNECT
thing-type.sonos.CONNECT.description = Represents SONOS CONNECT connector thing-type.sonos.CONNECT.description = Represents SONOS CONNECT connector
thing-type.sonos.CONNECTAMP.label = CONNECT AMP thing-type.sonos.CONNECTAMP.label = CONNECT AMP
thing-type.sonos.CONNECTAMP.description = Represents SONOS CONNECT:AMP amplifier thing-type.sonos.CONNECTAMP.description = Represents SONOS CONNECT:AMP amplifier
thing-type.sonos.Five.label = Five
thing-type.sonos.Five.description = Represents SONOS Five speaker
thing-type.sonos.Move.label = Move thing-type.sonos.Move.label = Move
thing-type.sonos.Move.description = Represents SONOS Move speaker thing-type.sonos.Move.description = Represents SONOS Move speaker
thing-type.sonos.One.label = One thing-type.sonos.One.label = One
@ -39,21 +46,26 @@ thing-type.sonos.Port.label = Port
thing-type.sonos.Port.description = Represents SONOS Port connector thing-type.sonos.Port.description = Represents SONOS Port connector
thing-type.sonos.Roam.label = Roam thing-type.sonos.Roam.label = Roam
thing-type.sonos.Roam.description = Represents SONOS Roam speaker thing-type.sonos.Roam.description = Represents SONOS Roam speaker
thing-type.sonos.RoamSL.label = Roam SL
thing-type.sonos.RoamSL.description = Represents SONOS Roam SL speaker
thing-type.sonos.SYMFONISK.label = SYMFONISK thing-type.sonos.SYMFONISK.label = SYMFONISK
thing-type.sonos.SYMFONISK.description = Represents IKEA SYMFONISK speaker thing-type.sonos.SYMFONISK.description = Represents IKEA SYMFONISK speaker
thing-type.sonos.zoneplayer.label = Zone Player thing-type.sonos.zoneplayer.label = Zone Player
thing-type.sonos.zoneplayer.description = The Zone Player represents a Sonos Zone Player which is not known to this binding thing-type.sonos.zoneplayer.description = The Zone Player represents a Sonos Zone Player which is not known to this binding
thing-type.config.sonos.zoneplayer.udn.label = Unique Device Name # thing types config
thing-type.config.sonos.zoneplayer.udn.description = The UDN identifies the Sonos device.
thing-type.config.sonos.zoneplayer.notificationTimeout.label = Notification Timeout thing-type.config.sonos.zoneplayer.notificationTimeout.label = Notification Timeout
thing-type.config.sonos.zoneplayer.notificationTimeout.description = Specifies the amount of time in seconds for which the notification sound will be played thing-type.config.sonos.zoneplayer.notificationTimeout.description = Specifies the amount of time in seconds for which the notification sound will be played
thing-type.config.sonos.zoneplayer.notificationVolume.label = Notification Sound Volume thing-type.config.sonos.zoneplayer.notificationVolume.label = Notification Sound Volume
thing-type.config.sonos.zoneplayer.notificationVolume.description = Specifies the volume in percent applied to a notification sound thing-type.config.sonos.zoneplayer.notificationVolume.description = Specifies the volume in percent applied to a notification sound
thing-type.config.sonos.zoneplayer.refresh.label = Refresh Interval thing-type.config.sonos.zoneplayer.refresh.label = Refresh Interval
thing-type.config.sonos.zoneplayer.refresh.description = Specifies the refresh interval in seconds thing-type.config.sonos.zoneplayer.refresh.description = Specifies the refresh interval in seconds
thing-type.config.sonos.zoneplayer.udn.label = Unique Device Name
thing-type.config.sonos.zoneplayer.udn.description = The UDN identifies the Sonos device.
# channel types # channel types
channel-type.sonos.add.label = Add channel-type.sonos.add.label = Add
channel-type.sonos.add.description = Add the given Sonos device to the group of this Sonos device channel-type.sonos.add.description = Add the given Sonos device to the group of this Sonos device
channel-type.sonos.alarm.label = Set Alarm channel-type.sonos.alarm.label = Set Alarm
@ -181,7 +193,8 @@ channel-type.sonos.batterycharging.description = Indicator set to ON when the ba
channel-type.sonos.microphone.label = Microphone channel-type.sonos.microphone.label = Microphone
channel-type.sonos.microphone.description = Indicator set to ON when the microphone is enabled channel-type.sonos.microphone.description = Indicator set to ON when the microphone is enabled
# Thing status descriptions # thing status descriptions
offline.conf-error-missing-udn = The parameter "Unique Device Name" must be configured. offline.conf-error-missing-udn = The parameter "Unique Device Name" must be configured.
offline.upnp-device-not-registered = The UPnP device {0} is not yet registered. offline.upnp-device-not-registered = The UPnP device {0} is not yet registered.
offline.not-available-on-network = The Sonos player {0} is not available in local network. offline.not-available-on-network = The Sonos player {0} is not available in local network.

View File

@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8"?>
<thing:thing-descriptions bindingId="sonos"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:thing="https://openhab.org/schemas/thing-description/v1.0.0"
xsi:schemaLocation="https://openhab.org/schemas/thing-description/v1.0.0 https://openhab.org/schemas/thing-description-1.0.0.xsd">
<!-- Player Five Thing Type -->
<thing-type id="Five" listed="false">
<label>Five</label>
<description>Represents SONOS Five speaker</description>
<channels>
<channel id="add" typeId="add"/>
<channel id="alarm" typeId="alarm"/>
<channel id="alarmproperties" typeId="alarmproperties"/>
<channel id="alarmrunning" typeId="alarmrunning"/>
<channel id="bass" typeId="bass"/>
<channel id="control" typeId="system.media-control"/>
<channel id="currentalbum" typeId="currentalbum"/>
<channel id="currentalbumart" typeId="currentalbumart"/>
<channel id="currentalbumarturl" typeId="currentalbumarturl"/>
<channel id="currentartist" typeId="system.media-artist"/>
<channel id="currenttitle" typeId="system.media-title"/>
<channel id="currenttrack" typeId="currenttrack"/>
<channel id="shuffle" typeId="shuffle"/>
<channel id="repeat" typeId="repeat"/>
<channel id="favorite" typeId="favorite"/>
<channel id="led" typeId="led"/>
<channel id="localcoordinator" typeId="localcoordinator"/>
<channel id="loudness" typeId="loudness"/>
<channel id="mute" typeId="system.mute"/>
<channel id="notificationsound" typeId="notificationsound"/>
<channel id="playlist" typeId="playlist"/>
<channel id="clearqueue" typeId="clearqueue"/>
<channel id="playlinein" typeId="playlinein"/>
<channel id="playqueue" typeId="playqueue"/>
<channel id="playtrack" typeId="playtrack"/>
<channel id="playuri" typeId="playuri"/>
<channel id="publicaddress" typeId="publicaddress"/>
<channel id="radio" typeId="radio"/>
<channel id="remove" typeId="remove"/>
<channel id="restore" typeId="restore"/>
<channel id="restoreall" typeId="restoreall"/>
<channel id="save" typeId="save"/>
<channel id="saveall" typeId="saveall"/>
<channel id="snooze" typeId="snooze"/>
<channel id="standalone" typeId="standalone"/>
<channel id="state" typeId="state"/>
<channel id="stop" typeId="stop"/>
<channel id="treble" typeId="treble"/>
<channel id="tuneinstationid" typeId="tuneinstationid"/>
<channel id="volume" typeId="system.volume"/>
<channel id="zonegroupid" typeId="zonegroupid"/>
<channel id="zonename" typeId="zonename"/>
<channel id="coordinator" typeId="coordinator"/>
<channel id="sleeptimer" typeId="sleeptimer"/>
<channel id="currenttransporturi" typeId="currenttransporturi"/>
<channel id="currenttrackuri" typeId="currenttrackuri"/>
<!-- Extended SONOS channels -->
<channel id="linein" typeId="linein"/>
</channels>
<properties>
<property name="vendor">SONOS</property>
<property name="modelId">Five</property>
</properties>
<representation-property>udn</representation-property>
<config-description-ref uri="thing-type:sonos:zoneplayer"/>
</thing-type>
</thing:thing-descriptions>

View File

@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8"?>
<thing:thing-descriptions bindingId="sonos"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:thing="https://openhab.org/schemas/thing-description/v1.0.0"
xsi:schemaLocation="https://openhab.org/schemas/thing-description/v1.0.0 https://openhab.org/schemas/thing-description-1.0.0.xsd">
<!-- Sonos Roam SL Thing Type -->
<thing-type id="RoamSL" listed="false">
<label>Roam SL</label>
<description>Represents SONOS Roam SL speaker</description>
<channels>
<channel id="add" typeId="add"/>
<channel id="alarm" typeId="alarm"/>
<channel id="alarmproperties" typeId="alarmproperties"/>
<channel id="alarmrunning" typeId="alarmrunning"/>
<channel id="control" typeId="system.media-control"/>
<channel id="currentalbum" typeId="currentalbum"/>
<channel id="currentalbumart" typeId="currentalbumart"/>
<channel id="currentalbumarturl" typeId="currentalbumarturl"/>
<channel id="currentartist" typeId="system.media-artist"/>
<channel id="currenttitle" typeId="system.media-title"/>
<channel id="currenttrack" typeId="currenttrack"/>
<channel id="shuffle" typeId="shuffle"/>
<channel id="repeat" typeId="repeat"/>
<channel id="favorite" typeId="favorite"/>
<channel id="led" typeId="led"/>
<channel id="localcoordinator" typeId="localcoordinator"/>
<channel id="mute" typeId="system.mute"/>
<channel id="notificationsound" typeId="notificationsound"/>
<channel id="playlist" typeId="playlist"/>
<channel id="clearqueue" typeId="clearqueue"/>
<channel id="playlinein" typeId="playlinein"/>
<channel id="playqueue" typeId="playqueue"/>
<channel id="playtrack" typeId="playtrack"/>
<channel id="playuri" typeId="playuri"/>
<channel id="radio" typeId="radio"/>
<channel id="remove" typeId="remove"/>
<channel id="restore" typeId="restore"/>
<channel id="restoreall" typeId="restoreall"/>
<channel id="save" typeId="save"/>
<channel id="saveall" typeId="saveall"/>
<channel id="snooze" typeId="snooze"/>
<channel id="standalone" typeId="standalone"/>
<channel id="state" typeId="state"/>
<channel id="stop" typeId="stop"/>
<channel id="tuneinstationid" typeId="tuneinstationid"/>
<channel id="volume" typeId="system.volume"/>
<channel id="zonegroupid" typeId="zonegroupid"/>
<channel id="zonename" typeId="zonename"/>
<channel id="coordinator" typeId="coordinator"/>
<channel id="sleeptimer" typeId="sleeptimer"/>
<channel id="currenttransporturi" typeId="currenttransporturi"/>
<channel id="currenttrackuri" typeId="currenttrackuri"/>
<!-- Extended SONOS channels -->
<channel id="batterycharging" typeId="batterycharging"/>
<channel id="batterylevel" typeId="system.battery-level"/>
</channels>
<properties>
<property name="vendor">SONOS</property>
<property name="modelId">Roam SL</property>
</properties>
<representation-property>udn</representation-property>
<config-description-ref uri="thing-type:sonos:zoneplayer"/>
</thing-type>
</thing:thing-descriptions>