Add service calls for setting individual speaker levels and setting the rear speaker mode
This commit is contained in:
		
							parent
							
								
									c6e96d0754
								
							
						
					
					
						commit
						4839f403e8
					
				|  | @ -14,6 +14,8 @@ | ||||||
|   - "advanced audio" features (NightMode, Bassmode, VoiceEnhancer) |   - "advanced audio" features (NightMode, Bassmode, VoiceEnhancer) | ||||||
|   - "woofer" feature |   - "woofer" feature | ||||||
|   - "soundmode" feature |   - "soundmode" feature | ||||||
|  |   - "speaker_level" | ||||||
|  |   - "rear_speaker_mode" | ||||||
| 
 | 
 | ||||||
| ### Changed | ### Changed | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -2,11 +2,11 @@ import asyncio | ||||||
| import datetime | import datetime | ||||||
| import json | import json | ||||||
| import logging | import logging | ||||||
| import time |  | ||||||
| from urllib.parse import quote | from urllib.parse import quote | ||||||
| 
 | 
 | ||||||
| from pysmartthings import DeviceEntity | from pysmartthings import DeviceEntity | ||||||
| 
 | 
 | ||||||
|  | from .const import SpeakerIdentifier, RearSpeakerMode | ||||||
| from ..const import DOMAIN | from ..const import DOMAIN | ||||||
| 
 | 
 | ||||||
| log = logging.getLogger(__name__) | log = logging.getLogger(__name__) | ||||||
|  | @ -404,6 +404,22 @@ class SoundbarDevice: | ||||||
|     def media_coverart_updated(self) -> datetime.datetime: |     def media_coverart_updated(self) -> datetime.datetime: | ||||||
|         return self.__media_cover_url_update_time |         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 ------------ |     # ------------ SUPPORT FUNCTIONS ------------ | ||||||
| 
 | 
 | ||||||
|     async def update_execution_data(self, argument: str): |     async def update_execution_data(self, argument: str): | ||||||
|  | @ -412,7 +428,7 @@ class SoundbarDevice: | ||||||
| 
 | 
 | ||||||
|     async def set_custom_execution_data(self, href: str, property: str, value): |     async def set_custom_execution_data(self, href: str, property: str, value): | ||||||
|         argument = [href, {property: 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): |     async def get_execute_status(self): | ||||||
|         url = f"https://api.smartthings.com/v1/devices/{self._device_id}/components/main/capabilities/execute/status" |         url = f"https://api.smartthings.com/v1/devices/{self._device_id}/components/main/capabilities/execute/status" | ||||||
|  |  | ||||||
|  | @ -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" | ||||||
|  | @ -11,8 +11,8 @@ from homeassistant.helpers.entity import DeviceInfo, generate_entity_id | ||||||
| from homeassistant.helpers import config_validation as cv, entity_platform, selector | from homeassistant.helpers import config_validation as cv, entity_platform, selector | ||||||
| import voluptuous as vol | import voluptuous as vol | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| from .api_extension.SoundbarDevice import SoundbarDevice | from .api_extension.SoundbarDevice import SoundbarDevice | ||||||
|  | from .api_extension.const import SpeakerIdentifier, RearSpeakerMode | ||||||
| from .const import ( | from .const import ( | ||||||
|     CONF_ENTRY_API_KEY, |     CONF_ENTRY_API_KEY, | ||||||
|     CONF_ENTRY_DEVICE_ID, |     CONF_ENTRY_DEVICE_ID, | ||||||
|  | @ -78,6 +78,20 @@ def addServices(): | ||||||
|         SmartThingsSoundbarMediaPlayer.async_set_voice_mode.__name__, |         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): | async def async_setup_entry(hass, config_entry, async_add_entities): | ||||||
|     domain_data = hass.data[DOMAIN] |     domain_data = hass.data[DOMAIN] | ||||||
|  | @ -243,6 +257,16 @@ class SmartThingsSoundbarMediaPlayer(MediaPlayerEntity): | ||||||
|     async def async_set_night_mode(self, enabled: bool): |     async def async_set_night_mode(self, enabled: bool): | ||||||
|         await self.device.set_night_mode(enabled) |         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 |     # This property can be uncommented for some extra_attributes | ||||||
|     # Still enabling this can cause side-effects. |     # Still enabling this can cause side-effects. | ||||||
|     # @property |     # @property | ||||||
|  |  | ||||||
|  | @ -86,3 +86,52 @@ set_voice_enhancer: | ||||||
|       default: false |       default: false | ||||||
|       selector: |       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"  | ||||||
		Loading…
	
		Reference in New Issue