diff --git a/homeassistant/components/universal/media_player.py b/homeassistant/components/universal/media_player.py index 75c2b5d0432..55adadad845 100644 --- a/homeassistant/components/universal/media_player.py +++ b/homeassistant/components/universal/media_player.py @@ -53,6 +53,7 @@ from homeassistant.const import ( CONF_NAME, CONF_STATE, CONF_STATE_TEMPLATE, + CONF_UNIQUE_ID, EVENT_HOMEASSISTANT_START, SERVICE_MEDIA_NEXT_TRACK, SERVICE_MEDIA_PAUSE, @@ -124,6 +125,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( vol.Optional(CONF_ATTRS, default={}): vol.Or( cv.ensure_list(ATTRS_SCHEMA), ATTRS_SCHEMA ), + vol.Optional(CONF_UNIQUE_ID): cv.string, vol.Optional(CONF_DEVICE_CLASS): DEVICE_CLASSES_SCHEMA, vol.Optional(CONF_STATE_TEMPLATE): cv.template, }, @@ -146,6 +148,7 @@ async def async_setup_platform( config.get(CONF_CHILDREN), config.get(CONF_COMMANDS), config.get(CONF_ATTRS), + config.get(CONF_UNIQUE_ID), config.get(CONF_DEVICE_CLASS), config.get(CONF_STATE_TEMPLATE), ) @@ -165,6 +168,7 @@ class UniversalMediaPlayer(MediaPlayerEntity): children, commands, attributes, + unique_id=None, device_class=None, state_template=None, ): @@ -183,6 +187,7 @@ class UniversalMediaPlayer(MediaPlayerEntity): self._state_template_result = None self._state_template = state_template self._device_class = device_class + self._attr_unique_id = unique_id async def async_added_to_hass(self) -> None: """Subscribe to children and template state changes.""" diff --git a/tests/components/universal/test_media_player.py b/tests/components/universal/test_media_player.py index b589fc09a6a..059a19caf45 100644 --- a/tests/components/universal/test_media_player.py +++ b/tests/components/universal/test_media_player.py @@ -21,6 +21,7 @@ from homeassistant.const import ( STATE_UNKNOWN, ) from homeassistant.core import Context, callback +from homeassistant.helpers import entity_registry from homeassistant.helpers.event import async_track_state_change_event from homeassistant.setup import async_setup_component @@ -1092,6 +1093,26 @@ async def test_device_class(hass): assert hass.states.get("media_player.tv").attributes["device_class"] == "tv" +async def test_unique_id(hass): + """Test unique_id property.""" + hass.states.async_set("sensor.test_sensor", "on") + + await async_setup_component( + hass, + "media_player", + { + "media_player": { + "platform": "universal", + "name": "tv", + "unique_id": "universal_master_bed_tv", + } + }, + ) + await hass.async_block_till_done() + er = entity_registry.async_get(hass) + assert er.async_get("media_player.tv").unique_id == "universal_master_bed_tv" + + async def test_invalid_state_template(hass): """Test invalid state template sets state to None.""" hass.states.async_set("sensor.test_sensor", "on") @@ -1220,3 +1241,4 @@ async def test_reload(hass): assert ( "device_class" not in hass.states.get("media_player.master_bed_tv").attributes ) + assert "unique_id" not in hass.states.get("media_player.master_bed_tv").attributes