[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
6 changed files with 181 additions and 26 deletions

View File

@@ -14,8 +14,6 @@ package org.openhab.binding.sonos.internal;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.eclipse.jdt.annotation.NonNullByDefault;
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 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 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 PLAYBASE_THING_TYPE_UID = new ThingTypeUID(BINDING_ID, "PLAYBASE");
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 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_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 Set<ThingTypeUID> WITH_LINEIN_THING_TYPES_UIDS = Stream.of(PLAY5_THING_TYPE_UID,
PLAYBAR_THING_TYPE_UID, PLAYBASE_THING_TYPE_UID, BEAM_THING_TYPE_UID, CONNECT_THING_TYPE_UID,
CONNECTAMP_THING_TYPE_UID, PORT_THING_TYPE_UID, ARC_THING_TYPE_UID, ARC_SL_THING_TYPE_UID)
.collect(Collectors.toSet());
public static final Set<ThingTypeUID> WITH_LINEIN_THING_TYPES_UIDS = Set.of(PLAY5_THING_TYPE_UID,
FIVE_THING_TYPE_UID, PLAYBAR_THING_TYPE_UID, PLAYBASE_THING_TYPE_UID, BEAM_THING_TYPE_UID,
CONNECT_THING_TYPE_UID, CONNECTAMP_THING_TYPE_UID, PORT_THING_TYPE_UID, ARC_THING_TYPE_UID,
ARC_SL_THING_TYPE_UID);
public static final Set<ThingTypeUID> WITH_ANALOG_LINEIN_THING_TYPES_UIDS = Stream.of(AMP_THING_TYPE_UID)
.collect(Collectors.toSet());
public static final Set<ThingTypeUID> WITH_ANALOG_LINEIN_THING_TYPES_UIDS = Set.of(AMP_THING_TYPE_UID);
public static final Set<ThingTypeUID> WITH_DIGITAL_LINEIN_THING_TYPES_UIDS = Stream.of(AMP_THING_TYPE_UID)
.collect(Collectors.toSet());
public static final Set<ThingTypeUID> WITH_DIGITAL_LINEIN_THING_TYPES_UIDS = Set.of(AMP_THING_TYPE_UID);
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,
PLAYBAR_THING_TYPE_UID, PLAYBASE_THING_TYPE_UID, BEAM_THING_TYPE_UID, CONNECT_THING_TYPE_UID,
CONNECTAMP_THING_TYPE_UID, PORT_THING_TYPE_UID, AMP_THING_TYPE_UID, SYMFONISK_THING_TYPE_UID,
ARC_THING_TYPE_UID, ARC_SL_THING_TYPE_UID, MOVE_THING_TYPE_UID, ROAM_THING_TYPE_UID)
.collect(Collectors.toSet());
FIVE_THING_TYPE_UID, PLAYBAR_THING_TYPE_UID, PLAYBASE_THING_TYPE_UID, BEAM_THING_TYPE_UID,
CONNECT_THING_TYPE_UID, CONNECTAMP_THING_TYPE_UID, PORT_THING_TYPE_UID, AMP_THING_TYPE_UID,
SYMFONISK_THING_TYPE_UID, ARC_THING_TYPE_UID, ARC_SL_THING_TYPE_UID, MOVE_THING_TYPE_UID,
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);
static {

View File

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

View File

@@ -1,12 +1,17 @@
# binding
binding.sonos.name = Sonos Binding
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.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-type.sonos.Amp.label = Amp
thing-type.sonos.Amp.description = Represents SONOS Amp amplifier
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.CONNECTAMP.label = CONNECT AMP
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.description = Represents SONOS Move speaker
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.Roam.label = Roam
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.description = Represents IKEA SYMFONISK speaker
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.config.sonos.zoneplayer.udn.label = Unique Device Name
thing-type.config.sonos.zoneplayer.udn.description = The UDN identifies the Sonos device.
# thing types config
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.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.refresh.label = Refresh Interval
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-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.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.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.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.

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>