Sonos Integration to support Sub ON/OFF

Hi,

You can turn the sub on and off in the Sonos app but cannot turn it on and off with HA.

Is this a feature we can add? Can the sub also be added as a separate unit so you can also control its volume separate from the other speakers like you can in the Sonos app?

Thanks so much!

I support this feature to be implemented. Very useful to me!

This seems like it should be straightforward but I do not have a sub to test against. Would anyone be willing to test with some basic python scripts to help me understand the protocol? Can someone share a screenshot of how this is exposed in the native Sonos app?

I’d be happy to try if you direct me how.

Here’s how you get into the sun audio settings:




I see. I’m not seeing the controls to enabled/disable the sub in my system, so maybe it’s only exposed when there’s one included in the system.

Can you grab an XML file from your Beam’s IP and attach here?

http://<YOUR_BEAM_IP>:1400/xml/RenderingControl1.xml

That’s correct - If I turn off the sub from the wall it disappears in the app.

The xlm is:

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<scpd xmlns="urn:schemas-upnp-org:service-1-0">
<specVersion>
<major>1</major>
<minor>0</minor>
</specVersion>
<serviceStateTable>
<stateVariable sendEvents="yes">
<name>LastChange</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>Mute</name>
<dataType>boolean</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>Volume</name>
<dataType>ui2</dataType>
<allowedValueRange>
<minimum>0</minimum>
<maximum>100</maximum>
<step>1</step>
</allowedValueRange>
</stateVariable>
<stateVariable sendEvents="no">
<name>A_ARG_TYPE_LeftVolume</name>
<dataType>ui2</dataType>
<allowedValueRange>
<minimum>0</minimum>
<maximum>100</maximum>
<step>1</step>
</allowedValueRange>
</stateVariable>
<stateVariable sendEvents="no">
<name>A_ARG_TYPE_RightVolume</name>
<dataType>ui2</dataType>
<allowedValueRange>
<minimum>0</minimum>
<maximum>100</maximum>
<step>1</step>
</allowedValueRange>
</stateVariable>
<stateVariable sendEvents="no">
<name>VolumeDB</name>
<dataType>i2</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>Bass</name>
<dataType>i2</dataType>
<allowedValueRange>
<minimum>-10</minimum>
<maximum>10</maximum>
<step>1</step>
</allowedValueRange>
</stateVariable>
<stateVariable sendEvents="no">
<name>Treble</name>
<dataType>i2</dataType>
<allowedValueRange>
<minimum>-10</minimum>
<maximum>10</maximum>
<step>1</step>
</allowedValueRange>
</stateVariable>
<stateVariable sendEvents="no">
<name>EQValue</name>
<dataType>i2</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>A_ARG_TYPE_EQType</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>Loudness</name>
<dataType>boolean</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>SupportsOutputFixed</name>
<dataType>boolean</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>OutputFixed</name>
<dataType>boolean</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>HeadphoneConnected</name>
<dataType>boolean</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>A_ARG_TYPE_Channel</name>
<dataType>string</dataType>
<allowedValueList>
<allowedValue>Master</allowedValue>
<allowedValue>LF</allowedValue>
<allowedValue>RF</allowedValue>
</allowedValueList>
</stateVariable>
<stateVariable sendEvents="no">
<name>A_ARG_TYPE_MuteChannel</name>
<dataType>string</dataType>
<allowedValueList>
<allowedValue>Master</allowedValue>
<allowedValue>LF</allowedValue>
<allowedValue>RF</allowedValue>
<allowedValue>SpeakerOnly</allowedValue>
</allowedValueList>
</stateVariable>
<stateVariable sendEvents="no">
<name>A_ARG_TYPE_InstanceID</name>
<dataType>ui4</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>A_ARG_TYPE_VolumeAdjustment</name>
<dataType>i4</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>A_ARG_TYPE_RampType</name>
<dataType>string</dataType>
<allowedValueList>
<allowedValue>SLEEP_TIMER_RAMP_TYPE</allowedValue>
<allowedValue>ALARM_RAMP_TYPE</allowedValue>
<allowedValue>AUTOPLAY_RAMP_TYPE</allowedValue>
</allowedValueList>
</stateVariable>
<stateVariable sendEvents="no">
<name>A_ARG_TYPE_RampTimeSeconds</name>
<dataType>ui4</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>A_ARG_TYPE_ResetVolumeAfter</name>
<dataType>boolean</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>A_ARG_TYPE_ProgramURI</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>A_ARG_TYPE_ChannelMap</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>AudioDelay</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>AudioDelayLeftRear</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>AudioDelayRightRear</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>DialogLevel</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>SpeakerSize</name>
<dataType>ui4</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>SubCrossover</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>SubEnabled</name>
<dataType>boolean</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>SubGain</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>SubPolarity</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>SurroundLevel</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>MusicSurroundLevel</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>NightMode</name>
<dataType>boolean</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>SurroundEnabled</name>
<dataType>boolean</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>SurroundMode</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>PresetNameList</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>RoomCalibrationID</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>RoomCalibrationCoefficients</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>RoomCalibrationCalibrationMode</name>
<dataType>string</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>RoomCalibrationEnabled</name>
<dataType>boolean</dataType>
</stateVariable>
<stateVariable sendEvents="no">
<name>RoomCalibrationAvailable</name>
<dataType>boolean</dataType>
</stateVariable>
</serviceStateTable>
<actionList>
<action>
<name>GetMute</name>
<argumentList>
<argument>
<name>InstanceID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
</argument>
<argument>
<name>Channel</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_MuteChannel</relatedStateVariable>
</argument>
<argument>
<name>CurrentMute</name>
<direction>out</direction>
<relatedStateVariable>Mute</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SetMute</name>
<argumentList>
<argument>
<name>InstanceID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
</argument>
<argument>
<name>Channel</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_MuteChannel</relatedStateVariable>
</argument>
<argument>
<name>DesiredMute</name>
<direction>in</direction>
<relatedStateVariable>Mute</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>ResetBasicEQ</name>
<argumentList>
<argument>
<name>InstanceID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
</argument>
<argument>
<name>Bass</name>
<direction>out</direction>
<relatedStateVariable>Bass</relatedStateVariable>
</argument>
<argument>
<name>Treble</name>
<direction>out</direction>
<relatedStateVariable>Treble</relatedStateVariable>
</argument>
<argument>
<name>Loudness</name>
<direction>out</direction>
<relatedStateVariable>Loudness</relatedStateVariable>
</argument>
<argument>
<name>LeftVolume</name>
<direction>out</direction>
<relatedStateVariable>A_ARG_TYPE_LeftVolume</relatedStateVariable>
</argument>
<argument>
<name>RightVolume</name>
<direction>out</direction>
<relatedStateVariable>A_ARG_TYPE_RightVolume</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>ResetExtEQ</name>
<argumentList>
<argument>
<name>InstanceID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
</argument>
<argument>
<name>EQType</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_EQType</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetVolume</name>
<argumentList>
<argument>
<name>InstanceID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
</argument>
<argument>
<name>Channel</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_Channel</relatedStateVariable>
</argument>
<argument>
<name>CurrentVolume</name>
<direction>out</direction>
<relatedStateVariable>Volume</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SetVolume</name>
<argumentList>
<argument>
<name>InstanceID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
</argument>
<argument>
<name>Channel</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_Channel</relatedStateVariable>
</argument>
<argument>
<name>DesiredVolume</name>
<direction>in</direction>
<relatedStateVariable>Volume</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SetRelativeVolume</name>
<argumentList>
<argument>
<name>InstanceID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
</argument>
<argument>
<name>Channel</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_Channel</relatedStateVariable>
</argument>
<argument>
<name>Adjustment</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_VolumeAdjustment</relatedStateVariable>
</argument>
<argument>
<name>NewVolume</name>
<direction>out</direction>
<relatedStateVariable>Volume</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetVolumeDB</name>
<argumentList>
<argument>
<name>InstanceID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
</argument>
<argument>
<name>Channel</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_Channel</relatedStateVariable>
</argument>
<argument>
<name>CurrentVolume</name>
<direction>out</direction>
<relatedStateVariable>VolumeDB</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SetVolumeDB</name>
<argumentList>
<argument>
<name>InstanceID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
</argument>
<argument>
<name>Channel</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_Channel</relatedStateVariable>
</argument>
<argument>
<name>DesiredVolume</name>
<direction>in</direction>
<relatedStateVariable>VolumeDB</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetVolumeDBRange</name>
<argumentList>
<argument>
<name>InstanceID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
</argument>
<argument>
<name>Channel</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_Channel</relatedStateVariable>
</argument>
<argument>
<name>MinValue</name>
<direction>out</direction>
<relatedStateVariable>VolumeDB</relatedStateVariable>
</argument>
<argument>
<name>MaxValue</name>
<direction>out</direction>
<relatedStateVariable>VolumeDB</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetBass</name>
<argumentList>
<argument>
<name>InstanceID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
</argument>
<argument>
<name>CurrentBass</name>
<direction>out</direction>
<relatedStateVariable>Bass</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SetBass</name>
<argumentList>
<argument>
<name>InstanceID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
</argument>
<argument>
<name>DesiredBass</name>
<direction>in</direction>
<relatedStateVariable>Bass</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetTreble</name>
<argumentList>
<argument>
<name>InstanceID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
</argument>
<argument>
<name>CurrentTreble</name>
<direction>out</direction>
<relatedStateVariable>Treble</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SetTreble</name>
<argumentList>
<argument>
<name>InstanceID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
</argument>
<argument>
<name>DesiredTreble</name>
<direction>in</direction>
<relatedStateVariable>Treble</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetEQ</name>
<argumentList>
<argument>
<name>InstanceID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
</argument>
<argument>
<name>EQType</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_EQType</relatedStateVariable>
</argument>
<argument>
<name>CurrentValue</name>
<direction>out</direction>
<relatedStateVariable>EQValue</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SetEQ</name>
<argumentList>
<argument>
<name>InstanceID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
</argument>
<argument>
<name>EQType</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_EQType</relatedStateVariable>
</argument>
<argument>
<name>DesiredValue</name>
<direction>in</direction>
<relatedStateVariable>EQValue</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetLoudness</name>
<argumentList>
<argument>
<name>InstanceID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
</argument>
<argument>
<name>Channel</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_Channel</relatedStateVariable>
</argument>
<argument>
<name>CurrentLoudness</name>
<direction>out</direction>
<relatedStateVariable>Loudness</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SetLoudness</name>
<argumentList>
<argument>
<name>InstanceID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
</argument>
<argument>
<name>Channel</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_Channel</relatedStateVariable>
</argument>
<argument>
<name>DesiredLoudness</name>
<direction>in</direction>
<relatedStateVariable>Loudness</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetSupportsOutputFixed</name>
<argumentList>
<argument>
<name>InstanceID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
</argument>
<argument>
<name>CurrentSupportsFixed</name>
<direction>out</direction>
<relatedStateVariable>SupportsOutputFixed</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetOutputFixed</name>
<argumentList>
<argument>
<name>InstanceID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
</argument>
<argument>
<name>CurrentFixed</name>
<direction>out</direction>
<relatedStateVariable>OutputFixed</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SetOutputFixed</name>
<argumentList>
<argument>
<name>InstanceID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
</argument>
<argument>
<name>DesiredFixed</name>
<direction>in</direction>
<relatedStateVariable>OutputFixed</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetHeadphoneConnected</name>
<argumentList>
<argument>
<name>InstanceID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
</argument>
<argument>
<name>CurrentHeadphoneConnected</name>
<direction>out</direction>
<relatedStateVariable>HeadphoneConnected</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>RampToVolume</name>
<argumentList>
<argument>
<name>InstanceID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
</argument>
<argument>
<name>Channel</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_Channel</relatedStateVariable>
</argument>
<argument>
<name>RampType</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_RampType</relatedStateVariable>
</argument>
<argument>
<name>DesiredVolume</name>
<direction>in</direction>
<relatedStateVariable>Volume</relatedStateVariable>
</argument>
<argument>
<name>ResetVolumeAfter</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_ResetVolumeAfter</relatedStateVariable>
</argument>
<argument>
<name>ProgramURI</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_ProgramURI</relatedStateVariable>
</argument>
<argument>
<name>RampTime</name>
<direction>out</direction>
<relatedStateVariable>A_ARG_TYPE_RampTimeSeconds</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>RestoreVolumePriorToRamp</name>
<argumentList>
<argument>
<name>InstanceID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
</argument>
<argument>
<name>Channel</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_Channel</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SetChannelMap</name>
<argumentList>
<argument>
<name>InstanceID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
</argument>
<argument>
<name>ChannelMap</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_ChannelMap</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SetRoomCalibrationX</name>
<argumentList>
<argument>
<name>InstanceID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
</argument>
<argument>
<name>CalibrationID</name>
<direction>in</direction>
<relatedStateVariable>RoomCalibrationID</relatedStateVariable>
</argument>
<argument>
<name>Coefficients</name>
<direction>in</direction>
<relatedStateVariable>RoomCalibrationCoefficients</relatedStateVariable>
</argument>
<argument>
<name>CalibrationMode</name>
<direction>in</direction>
<relatedStateVariable>RoomCalibrationCalibrationMode</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>GetRoomCalibrationStatus</name>
<argumentList>
<argument>
<name>InstanceID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
</argument>
<argument>
<name>RoomCalibrationEnabled</name>
<direction>out</direction>
<relatedStateVariable>RoomCalibrationEnabled</relatedStateVariable>
</argument>
<argument>
<name>RoomCalibrationAvailable</name>
<direction>out</direction>
<relatedStateVariable>RoomCalibrationAvailable</relatedStateVariable>
</argument>
</argumentList>
</action>
<action>
<name>SetRoomCalibrationStatus</name>
<argumentList>
<argument>
<name>InstanceID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
</argument>
<argument>
<name>RoomCalibrationEnabled</name>
<direction>in</direction>
<relatedStateVariable>RoomCalibrationEnabled</relatedStateVariable>
</argument>
</argumentList>
</action>
</actionList>
</scpd>

let me know if I can help with anything else. and thanks for trying to make this work :slight_smile:

Sure thing. Working on the underlying library feature(s) here now: Add sub & surround properties and controls by jjlawren · Pull Request #870 · SoCo/SoCo · GitHub.

Submitted the feature PR here: Add Sonos subwoofer and surround on/off controls by jjlawren · Pull Request #60918 · home-assistant/core · GitHub.

Edit: It just made the cut for the 2021.12 release :tada:

You are an absolute legend! Thank you so much. Can’t wait to see it in action

It’s now live!
Thanks for your help. I have found a problem and unsure to post it here or on the github but:

When I turn off the sub - it turns off then 2 seconds later the state switches back to ON but the sub stays off. Unsure why it’s turning the state back on. I have to double tap the switch on/off to turn it back on or off as it shows the wrong state.

The history of the entity shows that the sub never turned off:

also is there a entity to control the Sub Audio - I can only control the overall treble and bass and not the sub level or phase:

Thanks again :slight_smile:

Do changes to the sub switch in the Sonos app reflect properly in HA? What about in the other direction? I’m unclear from your description if the feature is actually being enabled/disabled on the sub and/or if the state reporting in HA is incorrect.

Just as a sanity check, do you ever see warnings that say “… falling back to polling, functionality may be limited” in your HA logs?

Those will need to be a future feature request. I’m doing this a bit in the dark as I don’t have a sub locally to test with and wanted to keep it simple to start.

When I turn the sub off in HA the phone app shows it as off straight away - HA then turns the state back to ON but it stays OFF in the app.

Nothing in the logs - I don’t think I have it in my debug - how do I add it? I currently have:

# Logger (For Debugging)
logger:
  default: info
  logs:
    aiohue: debug # Hue
    custom_components.alexa_media: debug  
# for API debugging (verbose and intended for service debugging)
    alexapy: debug
# for proxy debugging
    authcaptureproxy: debug

I was able to reproduce with the surround switch. It wasn’t handling the subscription event callbacks properly, so it would never update the state. I swear I had this code during development but I must have lost it along the way.

Either way, Fix Sonos sub & surround switch state reporting by jjlawren · Pull Request #61531 · home-assistant/core · GitHub should fix it. Will try to get it into the next point release.

1 Like

Great thanks!

Let me know if you need a hand with the Sub Audio settings

Can you confirm that it behaves better in 2021.12.1?

seems to be working perfectly after your fix

1 Like

Hi, just wanted to say your latest updates have been so great!
Thank you so much :slight_smile:
Any chance you will update the Sub Audio settings? I would love to control the sub level :slight_smile:

Sub Gain controls have also already been added if that’s what you’re asking for.

it works perfectly! thanks so much

1 Like