From a4c0c340282ce623d284b9ded52876e3da074ddb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ville=20Skytt=C3=A4?= <ville.skytta@iki.fi>
Date: Fri, 2 Nov 2018 11:50:07 +0200
Subject: [PATCH] Use ssdp udn uuid as Samsung TV unique id (#18022)

---
 homeassistant/components/media_player/samsungtv.py | 14 ++++++++++++--
 tests/components/media_player/test_samsungtv.py    |  3 ++-
 2 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/homeassistant/components/media_player/samsungtv.py b/homeassistant/components/media_player/samsungtv.py
index 45d158a8653..1d40683e51e 100644
--- a/homeassistant/components/media_player/samsungtv.py
+++ b/homeassistant/components/media_player/samsungtv.py
@@ -51,6 +51,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
         known_devices = set()
         hass.data[KNOWN_DEVICES_KEY] = known_devices
 
+    uuid = None
     # Is this a manual configuration?
     if config.get(CONF_HOST) is not None:
         host = config.get(CONF_HOST)
@@ -66,6 +67,9 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
         port = DEFAULT_PORT
         timeout = DEFAULT_TIMEOUT
         mac = None
+        udn = discovery_info.get('udn')
+        if udn and udn.startswith('uuid:'):
+            uuid = udn[len('uuid:'):]
     else:
         _LOGGER.warning("Cannot determine device")
         return
@@ -75,7 +79,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
     ip_addr = socket.gethostbyname(host)
     if ip_addr not in known_devices:
         known_devices.add(ip_addr)
-        add_entities([SamsungTVDevice(host, port, name, timeout, mac)])
+        add_entities([SamsungTVDevice(host, port, name, timeout, mac, uuid)])
         _LOGGER.info("Samsung TV %s:%d added as '%s'", host, port, name)
     else:
         _LOGGER.info("Ignoring duplicate Samsung TV %s:%d", host, port)
@@ -84,7 +88,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
 class SamsungTVDevice(MediaPlayerDevice):
     """Representation of a Samsung TV."""
 
-    def __init__(self, host, port, name, timeout, mac):
+    def __init__(self, host, port, name, timeout, mac, uuid):
         """Initialize the Samsung device."""
         from samsungctl import exceptions
         from samsungctl import Remote
@@ -94,6 +98,7 @@ class SamsungTVDevice(MediaPlayerDevice):
         self._remote_class = Remote
         self._name = name
         self._mac = mac
+        self._uuid = uuid
         self._wol = wakeonlan
         # Assume that the TV is not muted
         self._muted = False
@@ -166,6 +171,11 @@ class SamsungTVDevice(MediaPlayerDevice):
         return self._end_of_power_off is not None and \
                self._end_of_power_off > dt_util.utcnow()
 
+    @property
+    def unique_id(self) -> str:
+        """Return the unique ID of the device."""
+        return self._uuid
+
     @property
     def name(self):
         """Return the name of the device."""
diff --git a/tests/components/media_player/test_samsungtv.py b/tests/components/media_player/test_samsungtv.py
index 31ad449254b..4049ba66a3c 100644
--- a/tests/components/media_player/test_samsungtv.py
+++ b/tests/components/media_player/test_samsungtv.py
@@ -23,7 +23,8 @@ WORKING_CONFIG = {
     CONF_NAME: 'fake',
     CONF_PORT: 8001,
     CONF_TIMEOUT: 10,
-    CONF_MAC: 'fake'
+    CONF_MAC: 'fake',
+    'uuid': None,
 }
 
 DISCOVERY_INFO = {