支持多个实体关联

This commit is contained in:
shaonianzhentan 2023-11-15 18:28:05 +08:00
parent bb2fcfac9c
commit 8052caa7fc
3 changed files with 26 additions and 15 deletions

View File

@ -9,17 +9,16 @@ from homeassistant.const import CONF_URL, CONF_USERNAME, CONF_PASSWORD
from homeassistant.helpers.storage import STORAGE_DIR
from urllib.parse import quote
from homeassistant.core import callback
from homeassistant.helpers.selector import selector
import os
from .manifest import manifest
from .http_api import fetch_data
from homeassistant.util.json import save_json
DOMAIN = manifest.domain
class SimpleConfigFlow(ConfigFlow, domain=DOMAIN):
VERSION = 2
VERSION = 3
async def async_step_user(
self, user_input: dict[str, Any] | None = None
@ -66,7 +65,7 @@ class OptionsFlowHandler(OptionsFlow):
return self.async_create_entry(title='', data=user_input)
media_states = self.hass.states.async_all('media_player')
media_entities = {}
media_entities = []
for state in media_states:
friendly_name = state.attributes.get('friendly_name')
@ -75,10 +74,15 @@ class OptionsFlowHandler(OptionsFlow):
value = f'{friendly_name}{entity_id}'
if platform != 'cloud_music':
media_entities[entity_id] = value
media_entities.append({ 'label': value, 'value': entity_id })
DATA_SCHEMA = vol.Schema({
vol.Required('media_player', default=options.get('media_player')): vol.In(media_entities)
vol.Required('media_player', default=options.get('media_player')): selector({
"select": {
"options": media_entities,
"multiple": True
}
})
})
return self.async_show_form(step_id="user", data_schema=DATA_SCHEMA, errors=errors)

View File

@ -1,7 +1,7 @@
{
"domain": "ha_cloud_music",
"name": "\u4E91\u97F3\u4E50",
"version": "2023.11.6",
"version": "2023.11.15",
"config_flow": true,
"documentation": "https://github.com/shaonianzhentan/ha_cloud_music",
"requirements": [

View File

@ -60,15 +60,22 @@ async def async_setup_entry(
hass: HomeAssistant,
entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
media_player = CloudMusicMediaPlayer(hass, entry)
) -> None:
await hass.async_add_executor_job(track_time_interval, hass, media_player.interval, TIME_BETWEEN_UPDATES)
async_add_entities([ media_player ], True)
entities = []
for source_media_player in entry.options.get('media_player'):
entities.append(CloudMusicMediaPlayer(hass, source_media_player))
def media_player_interval(now):
for mp in entities:
mp.interval(now)
await hass.async_add_executor_job(track_time_interval, hass, media_player_interval, TIME_BETWEEN_UPDATES)
async_add_entities(entities, True)
class CloudMusicMediaPlayer(MediaPlayerEntity):
def __init__(self, hass, entry):
def __init__(self, hass, source_media_player):
self.hass = hass
self._attributes = {
'platform': 'cloud_music'
@ -79,9 +86,9 @@ class CloudMusicMediaPlayer(MediaPlayerEntity):
self._attr_supported_features = SUPPORT_FEATURES
# default attribute
self.source_media_player = entry.options.get('media_player')
self._attr_name = manifest.name
self._attr_unique_id = manifest.documentation
self.source_media_player = source_media_player
self._attr_name = f'{manifest.name} {source_media_player.split(".")[1]}'
self._attr_unique_id = f'{manifest.domain}{source_media_player}'
self._attr_state = STATE_ON
self._attr_volume_level = 1
self._attr_repeat = 'all'