Skip to content

Commit

Permalink
Add service calls for setting individual speaker levels and setting t…
Browse files Browse the repository at this point in the history
…he rear speaker mode
  • Loading branch information
samuelspagl committed May 20, 2024
1 parent c6e96d0 commit 4839f40
Show file tree
Hide file tree
Showing 5 changed files with 110 additions and 4 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
- "advanced audio" features (NightMode, Bassmode, VoiceEnhancer)
- "woofer" feature
- "soundmode" feature
- "speaker_level"
- "rear_speaker_mode"

### Changed

Expand Down
20 changes: 18 additions & 2 deletions custom_components/samsung_soundbar/api_extension/SoundbarDevice.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
import datetime
import json
import logging
import time
from urllib.parse import quote

from pysmartthings import DeviceEntity

from .const import SpeakerIdentifier, RearSpeakerMode
from ..const import DOMAIN

log = logging.getLogger(__name__)
Expand Down Expand Up @@ -404,6 +404,22 @@ def media_app_name(self):
def media_coverart_updated(self) -> datetime.datetime:
return self.__media_cover_url_update_time

# ------------ Speaker Level ----------------

async def set_speaker_level(self, speaker: SpeakerIdentifier, level: int):
await self.set_custom_execution_data(
href="/sec/networkaudio/channelVolume",
property="x.com.samsung.networkaudio.channelVolume",
value=[{"name": speaker.value, "value": level}],
)

async def set_rear_speaker_mode(self, mode: RearSpeakerMode):
await self.set_custom_execution_data(
href="/sec/networkaudio/surroundspeaker",
property="x.com.samsung.networkaudio.currentRearPosition",
value=mode.value,
)

# ------------ SUPPORT FUNCTIONS ------------

async def update_execution_data(self, argument: str):
Expand All @@ -412,7 +428,7 @@ async def update_execution_data(self, argument: str):

async def set_custom_execution_data(self, href: str, property: str, value):
argument = [href, {property: value}]
await self.device.command("main", "execute", "execute", argument)
assert await self.device.command("main", "execute", "execute", argument)

async def get_execute_status(self):
url = f"https://api.smartthings.com/v1/devices/{self._device_id}/components/main/capabilities/execute/status"
Expand Down
15 changes: 15 additions & 0 deletions custom_components/samsung_soundbar/api_extension/const.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from enum import Enum


class SpeakerIdentifier(Enum):
CENTER = "Spk_Center"
SIDE = "Spk_Side"
WIDE = "Spk_Wide"
FRONT_TOP = "Spk_Front_Top"
REAR = "Spk_Rear"
REAR_TOP = "Spk_Rear_Top"


class RearSpeakerMode(Enum):
FRONT = "Front"
REAR = "Rear"
26 changes: 25 additions & 1 deletion custom_components/samsung_soundbar/media_player.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
from homeassistant.helpers import config_validation as cv, entity_platform, selector
import voluptuous as vol


from .api_extension.SoundbarDevice import SoundbarDevice
from .api_extension.const import SpeakerIdentifier, RearSpeakerMode
from .const import (
CONF_ENTRY_API_KEY,
CONF_ENTRY_DEVICE_ID,
Expand Down Expand Up @@ -78,6 +78,20 @@ def addServices():
SmartThingsSoundbarMediaPlayer.async_set_voice_mode.__name__,
)

platform.async_register_entity_service(
"set_speaker_level",
cv.make_entity_service_schema(
{vol.Required("speaker_identifier"): str, vol.Required("level"): int}
),
SmartThingsSoundbarMediaPlayer.async_set_speaker_level.__name__,
)

platform.async_register_entity_service(
"set_rear_speaker_mode",
cv.make_entity_service_schema({vol.Required("speaker_mode"): str}),
SmartThingsSoundbarMediaPlayer.async_set_rear_speaker_mode.__name__,
)


async def async_setup_entry(hass, config_entry, async_add_entities):
domain_data = hass.data[DOMAIN]
Expand Down Expand Up @@ -243,6 +257,16 @@ async def async_set_voice_mode(self, enabled: bool):
async def async_set_night_mode(self, enabled: bool):
await self.device.set_night_mode(enabled)

# ---------- SERVICE_UTILITY ------------

async def async_set_speaker_level(self, speaker_identifier: str, level: int):
await self.device.set_speaker_level(
SpeakerIdentifier(speaker_identifier), level
)

async def async_set_rear_speaker_mode(self, speaker_mode: str):
await self.device.set_rear_speaker_mode(RearSpeakerMode(speaker_mode))

# This property can be uncommented for some extra_attributes
# Still enabling this can cause side-effects.
# @property
Expand Down
51 changes: 50 additions & 1 deletion custom_components/samsung_soundbar/services.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -85,4 +85,53 @@ set_voice_enhancer:
example: true
default: false
selector:
boolean:
boolean:

set_speaker_level:
name: Set Speaker level
description: Set the speaker levels of your soundbar
target:
device:
integration: samsung_soundbar
fields:
speaker_identifier:
name: Speaker Identifier
required: true
example: Spk_Center
selector:
select:
translation_key: "speaker_identifier"
options:
- "Spk_Center"
- "Spk_Side"
- "Spk_Wide"
- "Spk_Front_Top"
- "Spk_Rear"
- "Spk_Rear_Top"
level:
name: Speaker Level
required: true
example: 0
selector:
number:
min: -6
max: 6
step: 1

set_rear_speaker_mode:
name: Set rear speaker mode
description: Set the rear speaker mode of your soundbar
target:
device:
integration: samsung_soundbar
fields:
speaker_mode:
name: Speaker mode
required: true
example: Rear
selector:
select:
translation_key: "speaker_identifier"
options:
- "Rear"
- "Front"

0 comments on commit 4839f40

Please sign in to comment.