From b1698bc0d5f8402a5c3d27980a1c12738fc458fc Mon Sep 17 00:00:00 2001 From: Simon Lamon <32477463+silamon@users.noreply.github.com> Date: Wed, 11 Sep 2024 12:54:12 +0200 Subject: [PATCH] Allow to play a LinkPlay preset (#125204) * Allow to play a linkplay preset * Make it an entity service * Fixes * PR feedback * Rename more --- homeassistant/components/linkplay/icons.json | 7 +++++ .../components/linkplay/media_player.py | 28 ++++++++++++++++++- .../components/linkplay/services.yaml | 15 ++++++++++ .../components/linkplay/strings.json | 12 ++++++++ 4 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 homeassistant/components/linkplay/icons.json create mode 100644 homeassistant/components/linkplay/services.yaml diff --git a/homeassistant/components/linkplay/icons.json b/homeassistant/components/linkplay/icons.json new file mode 100644 index 00000000000..ee76344dc39 --- /dev/null +++ b/homeassistant/components/linkplay/icons.json @@ -0,0 +1,7 @@ +{ + "services": { + "play_preset": { + "service": "mdi:play-box-outline" + } + } +} diff --git a/homeassistant/components/linkplay/media_player.py b/homeassistant/components/linkplay/media_player.py index e6ea5c5f11c..0e29a7f27d0 100644 --- a/homeassistant/components/linkplay/media_player.py +++ b/homeassistant/components/linkplay/media_player.py @@ -9,6 +9,7 @@ from typing import Any, Concatenate from linkplay.bridge import LinkPlayBridge from linkplay.consts import EqualizerMode, LoopMode, PlayingMode, PlayingStatus from linkplay.exceptions import LinkPlayException, LinkPlayRequestException +import voluptuous as vol from homeassistant.components import media_source from homeassistant.components.media_player import ( @@ -25,7 +26,11 @@ from homeassistant.components.media_player.browse_media import ( ) from homeassistant.core import HomeAssistant from homeassistant.exceptions import HomeAssistantError -from homeassistant.helpers import device_registry as dr +from homeassistant.helpers import ( + config_validation as cv, + device_registry as dr, + entity_platform, +) from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.util.dt import utcnow @@ -109,6 +114,15 @@ SEEKABLE_FEATURES: MediaPlayerEntityFeature = ( | MediaPlayerEntityFeature.SEEK ) +SERVICE_PLAY_PRESET = "play_preset" +ATTR_PRESET_NUMBER = "preset_number" + +SERVICE_PLAY_PRESET_SCHEMA = cv.make_entity_service_schema( + { + vol.Required(ATTR_PRESET_NUMBER): cv.positive_int, + } +) + async def async_setup_entry( hass: HomeAssistant, @@ -117,6 +131,13 @@ async def async_setup_entry( ) -> None: """Set up a media player from a config entry.""" + # register services + platform = entity_platform.async_get_current_platform() + platform.async_register_entity_service( + SERVICE_PLAY_PRESET, SERVICE_PLAY_PRESET_SCHEMA, "async_play_preset" + ) + + # add entities async_add_entities([LinkPlayMediaPlayerEntity(entry.runtime_data.bridge)]) @@ -262,6 +283,11 @@ class LinkPlayMediaPlayerEntity(MediaPlayerEntity): url = async_process_play_media_url(self.hass, media_id) await self._bridge.player.play(url) + @exception_wrap + async def async_play_preset(self, preset_number: int) -> None: + """Play preset number.""" + await self._bridge.player.play_preset(preset_number) + def _update_properties(self) -> None: """Update the properties of the media player.""" self._attr_available = True diff --git a/homeassistant/components/linkplay/services.yaml b/homeassistant/components/linkplay/services.yaml new file mode 100644 index 00000000000..20bc47be7a7 --- /dev/null +++ b/homeassistant/components/linkplay/services.yaml @@ -0,0 +1,15 @@ +play_preset: + target: + entity: + integration: linkplay + domain: media_player + fields: + preset_number: + example: 1 + required: true + default: 1 + selector: + number: + min: 1 + max: 10 + mode: box diff --git a/homeassistant/components/linkplay/strings.json b/homeassistant/components/linkplay/strings.json index 46f5b29059f..12870816af7 100644 --- a/homeassistant/components/linkplay/strings.json +++ b/homeassistant/components/linkplay/strings.json @@ -22,5 +22,17 @@ "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]", "unknown": "[%key:common::config_flow::error::unknown%]" } + }, + "services": { + "play_preset": { + "name": "Play preset", + "description": "Play the preset number on the device.", + "fields": { + "preset_number": { + "name": "Preset number", + "description": "The preset number on the device to play." + } + } + } } }