Add a standard interface for media player multi-room zone support

Hi,

Following @lwis comment on the PR #4523 I take a look at the Sonos component and SoCo library. I think we can add a standard media_player interface for multi-room zone support (Starting with Sonos and Bose Soundtouch). And I hope it can be later implemented with other multi-room devices (Samsung SHAPE, Harman, LG MusicFlow, etc …)

The commons features I can see:

  • Create a multi-room zone from one coordinator/master and play on select or all other devices:
    • sonos_group_players (Sonos)
    • soundtouch_play_everywhere (Soundtouch)
  • Remove a member/slave from a multi-room zone:
    • sonos_unjoin (Sonos)
    • remove_zone_slave (Soundtouch)
  • Add a member/slave to a multi-room zone:
    • not implemented in Sonos component but seems to be available in SoCo library (join method)
    • add_zone_slave (Soundtouch)

Some features seems not available for Sonos (maybe I’m wrong, I haven’t any Sonos device) but implemented for Soundtouch:

  • Create a custom multi-room zone: for example, if you have 3 devices and you want to create a multi-room with only 2 devices. I think it can be simulated by creating a multi-room zone and then remove members.
  • Create many multi-room zones. From my SoCo library understanding, if you create a multi-room zone, you can not choose members so you will not be able to create many multi room zones. One more time, I haven’t any Sonos devices so I can’t test (and at least 4 devices are required in order to create 2 multi-room zones …).

My proposition:

media_multi_room_create

Create a multi-room zone from a coordinator/master and play content on selected or all other devices.

| Service data attribute | Optional | Description                                                                      |
|------------------------|----------|----------------------------------------------------------------------------------|
| entity_id              | no       | Coordinator/master                                                               |
| members                | yes      | Members to add to the multi-room zone. If not set, play on all available devices |

media_multi_room_leave

Remove a member from a multi-room zone.

| Service data attribute | Optional | Description                            |
|------------------------|----------|----------------------------------------|
| entity_id              | no       | Member to remove from multi-room zone  |

media_multi_room_join

Add a member to a multi-room zone

| Service data attribute | Optional | Description                        |
|------------------------|----------|------------------------------------|
| entity_id              | no       | Coordinator/master                 |
| member                 | no       | Member to add to a multi-room zone |

media_multi_room_destroy

Destroy a multi room zone

| Service data attribute | Optional | Description                        |
|------------------------|----------|------------------------------------|
| entity_id              | no       | Coordinator/master                 |

Any feedback are welcome but if you agree with this proposition, I can start working on it.

Looks good,

https://soco.readthedocs.io/en/latest/api/soco.core.html#soco.core.SoCo.partymode

We could use partymode if media_multi_room_create is called without any members, and loop over the members adding them to the coordinator otherwise.

Question, how do you handle devices that are already part of a zone, and you execute the service to add them to a new zone?

Another question; media_multi_room_destroy - would this just disband all members from their respective zones? In Sonos if the coordinator is removed, the zone continues without it.

Slightly off topic, does Bose support EQ settings like Sonos? https://soco.readthedocs.io/en/latest/api/soco.core.html#soco.core.SoCo.bass

This is shaping up to be an excellent improvement to the platform.

Thanks for the feedback.

First question:
Good question. I’ll remove the device from the first zone and add them in the new zone. It should not be a problem with Soundtouch API because zone seems to be totally independent (but I can’t test, I haven’t enough devices :slight_smile: )
Or easier solution: It is not valid to add a device to a new multi-room zone if it is already in an existing zone.

Second question:
From my point of view, destroy should remove all no-coordinator members but continue playing on it. Something I’m not sure to understand with Sonos: does the end user know who is the coordinator or it is only a developer/API concept ?
If the end user don’t know who is the coordinator (and don’t know what it is), it make no sense to destroy a zone because one of the device will continue to play but without control on which one.

Soundtouch only support Bass level (no treble or loudness). And the values are between -9 and 0.
There is also an API call to known what are the min and the max.
I have 2 devices (one Soundtouch 10 and one Soundtouch 20) and both have values between -9 and 0 but I suppose if this API request is available, other devices can have different values. And the documentation says some devices doesn’t support bass settings (which one ? I don’t know).

For me it make sense to add:

  • bass: 0…1 (decimal, like volume)
  • treble: 0…1 (decimal, like volume). Not implemented by Soundtouch component.
  • loudness: I don’t know because I don’t know what it is and the link in the SoCo documentation is down. But it seems to be really Sonos

Remind me to buy you a beer when you get Soundtouch support going strong. I have been wanting this for a long time. A Soundtouch without any Apple devices seems like a crippled device so getting this going would be nice.

It sounds like we’re on the same page then, I think we should get started on this! :slight_smile:

This sounds great! Looking forward to more sonos group support!!

Samsung Shape should work just fine, Is based on Allconnect by Tuxera. Saw Allshare in apk.
I tired and now am succesfully using the current Samsung TV component to have basic control (volume, play, pause, on.off) of my Shape M5 since it uses same SOAP/HTTPS protocol. What you are suggesting would be welcomed.

Was about to ask @stefan-jonasson and @fabaff if they would be so kind and morf/copy the TV component in a audio version.

The complete key list for Samsung TV (and what us usefull for Shape is in there as well) is as follows

KEY_0
KEY_1
KEY_2
KEY_3
KEY_4
KEY_5
KEY_6
KEY_7
KEY_8
KEY_9
KEY_11
KEY_12
KEY_3SPEED
KEY_4_3
KEY_16_9
KEY_AD
KEY_ADDDEL
KEY_ALT_MHP
KEY_ANGLE
KEY_ANTENA
KEY_ANYNET
KEY_ANYVIEW
KEY_APP_LIST
KEY_ASPECT
KEY_AUTO_ARC_ANTENNA_AIR
KEY_AUTO_ARC_ANTENNA_CABLE
KEY_AUTO_ARC_ANTENNA_SATELLITE
KEY_AUTO_ARC_ANYNET_AUTO_START
KEY_AUTO_ARC_ANYNET_MODE_OK
KEY_AUTO_ARC_AUTOCOLOR_FAIL
KEY_AUTO_ARC_AUTOCOLOR_SUCCESS
KEY_AUTO_ARC_CAPTION_ENG
KEY_AUTO_ARC_CAPTION_KOR
KEY_AUTO_ARC_CAPTION_OFF
KEY_AUTO_ARC_CAPTION_ON
KEY_AUTO_ARC_C_FORCE_AGING
KEY_AUTO_ARC_JACK_IDENT
KEY_AUTO_ARC_LNA_OFF
KEY_AUTO_ARC_LNA_ON
KEY_AUTO_ARC_PIP_CH_CHANGE
KEY_AUTO_ARC_PIP_DOUBLE
KEY_AUTO_ARC_PIP_LARGE
KEY_AUTO_ARC_PIP_LEFT_BOTTOM
KEY_AUTO_ARC_PIP_LEFT_TOP
KEY_AUTO_ARC_PIP_RIGHT_BOTTOM
KEY_AUTO_ARC_PIP_RIGHT_TOP
KEY_AUTO_ARC_PIP_SMALL
KEY_AUTO_ARC_PIP_SOURCE_CHANGE
KEY_AUTO_ARC_PIP_WIDE
KEY_AUTO_ARC_RESET
KEY_AUTO_ARC_USBJACK_INSPECT
KEY_AUTO_FORMAT
KEY_AUTO_PROGRAM
KEY_AV1
KEY_AV2
KEY_AV3
KEY_BACK_MHP
KEY_BOOKMARK
KEY_CALLER_ID
KEY_CAPTION
KEY_CATV_MODE
KEY_CHDOWN
KEY_CHUP
KEY_CH_LIST
KEY_CLEAR
KEY_CLOCK_DISPLAY
KEY_COMPONENT1
KEY_COMPONENT2
KEY_CONTENTS
KEY_CONVERGENCE
KEY_CONVERT_AUDIO_MAINSUB
KEY_CUSTOM
KEY_CYAN
KEY_DEVICE_CONNECT
KEY_DISC_MENU
KEY_DMA
KEY_DNET
KEY_DNIe
KEY_DNSe
KEY_DOOR
KEY_DOWN
KEY_DSS_MODE
KEY_DTV
KEY_DTV_LINK
KEY_DTV_SIGNAL
KEY_DVD_MODE
KEY_DVI
KEY_DVR
KEY_DVR_MENU
KEY_DYNAMIC
KEY_ENTER
KEY_ENTERTAINMENT
KEY_ESAVING
KEY_EXIT
KEY_EXT1
KEY_EXT2
KEY_EXT3
KEY_EXT4
KEY_EXT5
KEY_EXT6
KEY_EXT7
KEY_EXT8
KEY_EXT9
KEY_EXT10
KEY_EXT11
KEY_EXT12
KEY_EXT13
KEY_EXT14
KEY_EXT15
KEY_EXT16
KEY_EXT17
KEY_EXT18
KEY_EXT19
KEY_EXT20
KEY_EXT21
KEY_EXT22
KEY_EXT23
KEY_EXT24
KEY_EXT25
KEY_EXT26
KEY_EXT27
KEY_EXT28
KEY_EXT29
KEY_EXT30
KEY_EXT31
KEY_EXT32
KEY_EXT33
KEY_EXT34
KEY_EXT35
KEY_EXT36
KEY_EXT37
KEY_EXT38
KEY_EXT39
KEY_EXT40
KEY_EXT41
KEY_FACTORY
KEY_FAVCH
KEY_FF
KEY_FF_
KEY_FM_RADIO
KEY_GAME
KEY_GREEN
KEY_GUIDE
KEY_HDMI
KEY_HDMI1
KEY_HDMI2
KEY_HDMI3
KEY_HDMI4
KEY_HELP
KEY_HOME
KEY_ID_INPUT
KEY_ID_SETUP
KEY_INFO
KEY_INSTANT_REPLAY
KEY_LEFT
KEY_LINK
KEY_LIVE
KEY_MAGIC_BRIGHT
KEY_MAGIC_CHANNEL
KEY_MDC
KEY_MENU
KEY_MIC
KEY_MORE
KEY_MOVIE1
KEY_MS
KEY_MTS
KEY_MUTE
KEY_NINE_SEPERATE
KEY_OPEN
KEY_PANNEL_CHDOWN
KEY_PANNEL_CHUP
KEY_PANNEL_ENTER
KEY_PANNEL_MENU
KEY_PANNEL_POWER
KEY_PANNEL_SOURCE
KEY_PANNEL_VOLDOW
KEY_PANNEL_VOLUP
KEY_PANORAMA
KEY_PAUSE
KEY_PCMODE
KEY_PERPECT_FOCUS
KEY_PICTURE_SIZE
KEY_PIP_CHDOWN
KEY_PIP_CHUP
KEY_PIP_ONOFF
KEY_PIP_SCAN
KEY_PIP_SIZE
KEY_PIP_SWAP
KEY_PLAY
KEY_PLUS100
KEY_PMODE
KEY_POWER
KEY_POWEROFF
KEY_POWERON
KEY_PRECH
KEY_PRINT
KEY_PROGRAM
KEY_QUICK_REPLAY
KEY_REC
KEY_RED
KEY_REPEAT
KEY_RESERVED1
KEY_RETURN
KEY_REWIND
KEY_REWIND_
KEY_RIGHT
KEY_RSS
KEY_RSURF
KEY_SCALE
KEY_SEFFECT
KEY_SETUP_CLOCK_TIMER
KEY_SLEEP
KEY_SOUND_MODE
KEY_SOURCE
KEY_SRS
KEY_STANDARD
KEY_STB_MODE
KEY_STILL_PICTURE
KEY_STOP
KEY_SUB_TITLE
KEY_SVIDEO1
KEY_SVIDEO2
KEY_SVIDEO3
KEY_TOOLS
KEY_TOPMENU
KEY_TTX_MIX
KEY_TTX_SUBFACE
KEY_TURBO
KEY_TV
KEY_TV_MODE
KEY_UP
KEY_VCHIP
KEY_VCR_MODE
KEY_VOLDOWN
KEY_VOLUP
KEY_WHEEL_LEFT
KEY_WHEEL_RIGHT
KEY_W_LINK
KEY_YELLOW
KEY_ZOOM1
KEY_ZOOM2
KEY_ZOOM_IN
KEY_ZOOM_MOVE
KEY_ZOOM_OUT

1 Like

Any update on this? Would love to see an interface for multi-room audio for my bose soundtouch devices. I’ve tried to do this in homeassistant but I think it is not possible because the soundtouch devices do not show who is current master and who is slaves. Do you have a solution that works in hommeassistant?

Non whatsoever

I use this for my multi room audio setup. You should be able to adapt it to any device that shows as a media_player in HA, not just ChromeCasts.