From b167e05a56da2ef66f972d7dd2649161fae08a62 Mon Sep 17 00:00:00 2001 From: Ben Edmunds Date: Wed, 25 Aug 2021 16:42:40 +0100 Subject: [PATCH] Sonos add bass & treble EQ option (#53978) --- .../components/sonos/media_player.py | 23 ++++++++++++++++++- homeassistant/components/sonos/services.yaml | 16 +++++++++++++ homeassistant/components/sonos/speaker.py | 10 ++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/sonos/media_player.py b/homeassistant/components/sonos/media_player.py index 0948e971baf..4fdc5c6f320 100644 --- a/homeassistant/components/sonos/media_player.py +++ b/homeassistant/components/sonos/media_player.py @@ -125,6 +125,8 @@ ATTR_NIGHT_SOUND = "night_sound" ATTR_SPEECH_ENHANCE = "speech_enhance" ATTR_QUEUE_POSITION = "queue_position" ATTR_STATUS_LIGHT = "status_light" +ATTR_EQ_BASS = "bass_level" +ATTR_EQ_TREBLE = "treble_level" async def async_setup_entry( @@ -221,7 +223,6 @@ async def async_setup_entry( { vol.Required(ATTR_ALARM_ID): cv.positive_int, vol.Optional(ATTR_TIME): cv.time, - vol.Optional(ATTR_VOLUME): cv.small_float, vol.Optional(ATTR_ENABLED): cv.boolean, vol.Optional(ATTR_INCLUDE_LINKED_ZONES): cv.boolean, }, @@ -236,6 +237,12 @@ async def async_setup_entry( vol.Optional(ATTR_NIGHT_SOUND): cv.boolean, vol.Optional(ATTR_SPEECH_ENHANCE): cv.boolean, vol.Optional(ATTR_STATUS_LIGHT): cv.boolean, + vol.Optional(ATTR_EQ_BASS): vol.All( + vol.Coerce(int), vol.Range(min=-10, max=10) + ), + vol.Optional(ATTR_EQ_TREBLE): vol.All( + vol.Coerce(int), vol.Range(min=-10, max=10) + ), }, "set_option", ) @@ -615,6 +622,8 @@ class SonosMediaPlayerEntity(SonosEntity, MediaPlayerEntity): night_sound: bool | None = None, speech_enhance: bool | None = None, status_light: bool | None = None, + bass_level: int | None = None, + treble_level: int | None = None, ) -> None: """Modify playback options.""" if buttons_enabled is not None: @@ -632,6 +641,12 @@ class SonosMediaPlayerEntity(SonosEntity, MediaPlayerEntity): if status_light is not None: self.soco.status_light = status_light + if bass_level is not None: + self.soco.bass = bass_level + + if treble_level is not None: + self.soco.treble = treble_level + @soco_error() def play_queue(self, queue_position: int = 0) -> None: """Start playing the queue.""" @@ -649,6 +664,12 @@ class SonosMediaPlayerEntity(SonosEntity, MediaPlayerEntity): ATTR_SONOS_GROUP: self.speaker.sonos_group_entities } + if self.speaker.bass_level is not None: + attributes[ATTR_EQ_BASS] = self.speaker.bass_level + + if self.speaker.treble_level is not None: + attributes[ATTR_EQ_TREBLE] = self.speaker.treble_level + if self.speaker.night_mode is not None: attributes[ATTR_NIGHT_SOUND] = self.speaker.night_mode diff --git a/homeassistant/components/sonos/services.yaml b/homeassistant/components/sonos/services.yaml index 76bc656f990..9858eb7f8ed 100644 --- a/homeassistant/components/sonos/services.yaml +++ b/homeassistant/components/sonos/services.yaml @@ -121,6 +121,22 @@ set_option: description: Enable Status (LED) Light selector: boolean: + bass_level: + name: Bass Level + description: Bass level for EQ. + selector: + number: + min: -10 + max: 10 + mode: box + treble_level: + name: Treble Level + description: Treble level for EQ. + selector: + number: + min: -10 + max: 10 + mode: box play_queue: name: Play queue diff --git a/homeassistant/components/sonos/speaker.py b/homeassistant/components/sonos/speaker.py index 9febace5e8c..6f37739a17a 100644 --- a/homeassistant/components/sonos/speaker.py +++ b/homeassistant/components/sonos/speaker.py @@ -190,6 +190,8 @@ class SonosSpeaker: self.muted: bool | None = None self.night_mode: bool | None = None self.dialog_mode: bool | None = None + self.bass_level: int | None = None + self.treble_level: int | None = None # Grouping self.coordinator: SonosSpeaker | None = None @@ -460,6 +462,12 @@ class SonosSpeaker: if "dialog_level" in variables: self.dialog_mode = variables["dialog_level"] == "1" + if "bass_level" in variables: + self.bass_level = variables["bass_level"] + + if "treble_level" in variables: + self.treble_level = variables["treble_level"] + self.async_write_entity_states() # @@ -982,6 +990,8 @@ class SonosSpeaker: self.muted = self.soco.mute self.night_mode = self.soco.night_mode self.dialog_mode = self.soco.dialog_mode + self.bass_level = self.soco.bass + self.treble_level = self.soco.treble def update_media(self, event: SonosEvent | None = None) -> None: """Update information about currently playing media."""