Skip to content
Snippets Groups Projects
Unverified Commit 2025afe1 authored by Simone Chemelli's avatar Simone Chemelli Committed by GitHub
Browse files

Add MAC to SamsungTV when missing (#53479)

* Add MAC when missing

* Fix I/O

* Add test for missing MAC address
parent 46c3495a
No related branches found
No related tags found
No related merge requests found
"""The Samsung TV integration.""" """The Samsung TV integration."""
from functools import partial
import socket import socket
import getmac
import voluptuous as vol import voluptuous as vol
from homeassistant import config_entries from homeassistant import config_entries
...@@ -140,13 +142,19 @@ async def _async_create_bridge_with_updated_data(hass, entry): ...@@ -140,13 +142,19 @@ async def _async_create_bridge_with_updated_data(hass, entry):
bridge = _async_get_device_bridge({**entry.data, **updated_data}) bridge = _async_get_device_bridge({**entry.data, **updated_data})
if not entry.data.get(CONF_MAC) and bridge.method == METHOD_WEBSOCKET: mac = entry.data.get(CONF_MAC)
if not mac and bridge.method == METHOD_WEBSOCKET:
if info: if info:
mac = mac_from_device_info(info) mac = mac_from_device_info(info)
else: else:
mac = await hass.async_add_executor_job(bridge.mac_from_device) mac = await hass.async_add_executor_job(bridge.mac_from_device)
if mac:
updated_data[CONF_MAC] = mac if not mac:
mac = await hass.async_add_executor_job(
partial(getmac.get_mac_address, ip=host)
)
if mac:
updated_data[CONF_MAC] = mac
if updated_data: if updated_data:
data = {**entry.data, **updated_data} data = {**entry.data, **updated_data}
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
import socket import socket
from urllib.parse import urlparse from urllib.parse import urlparse
import getmac
import voluptuous as vol import voluptuous as vol
from homeassistant import config_entries, data_entry_flow from homeassistant import config_entries, data_entry_flow
...@@ -154,6 +155,8 @@ class SamsungTVConfigFlow(config_entries.ConfigFlow, domain=DOMAIN): ...@@ -154,6 +155,8 @@ class SamsungTVConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
self._udn = _strip_uuid(dev_info.get("udn", info["id"])) self._udn = _strip_uuid(dev_info.get("udn", info["id"]))
if mac := mac_from_device_info(info): if mac := mac_from_device_info(info):
self._mac = mac self._mac = mac
elif mac := getmac.get_mac_address(ip=self._host):
self._mac = mac
self._device_info = info self._device_info = info
return True return True
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
"name": "Samsung Smart TV", "name": "Samsung Smart TV",
"documentation": "https://www.home-assistant.io/integrations/samsungtv", "documentation": "https://www.home-assistant.io/integrations/samsungtv",
"requirements": [ "requirements": [
"getmac==0.8.2",
"samsungctl[websocket]==0.7.1", "samsungctl[websocket]==0.7.1",
"samsungtvws==1.6.0", "samsungtvws==1.6.0",
"wakeonlan==2.0.1" "wakeonlan==2.0.1"
......
...@@ -679,6 +679,7 @@ georss_qld_bushfire_alert_client==0.5 ...@@ -679,6 +679,7 @@ georss_qld_bushfire_alert_client==0.5
# homeassistant.components.kef # homeassistant.components.kef
# homeassistant.components.minecraft_server # homeassistant.components.minecraft_server
# homeassistant.components.nmap_tracker # homeassistant.components.nmap_tracker
# homeassistant.components.samsungtv
getmac==0.8.2 getmac==0.8.2
# homeassistant.components.gios # homeassistant.components.gios
......
...@@ -388,6 +388,7 @@ georss_qld_bushfire_alert_client==0.5 ...@@ -388,6 +388,7 @@ georss_qld_bushfire_alert_client==0.5
# homeassistant.components.kef # homeassistant.components.kef
# homeassistant.components.minecraft_server # homeassistant.components.minecraft_server
# homeassistant.components.nmap_tracker # homeassistant.components.nmap_tracker
# homeassistant.components.samsungtv
getmac==0.8.2 getmac==0.8.2
# homeassistant.components.gios # homeassistant.components.gios
......
...@@ -797,6 +797,55 @@ async def test_autodetect_websocket(hass: HomeAssistant, remote: Mock, remotews: ...@@ -797,6 +797,55 @@ async def test_autodetect_websocket(hass: HomeAssistant, remote: Mock, remotews:
assert entries[0].data[CONF_MAC] == "aa:bb:cc:dd:ee:ff" assert entries[0].data[CONF_MAC] == "aa:bb:cc:dd:ee:ff"
async def test_websocket_no_mac(hass: HomeAssistant, remote: Mock, remotews: Mock):
"""Test for send key with autodetection of protocol."""
with patch(
"homeassistant.components.samsungtv.bridge.Remote",
side_effect=OSError("Boom"),
), patch(
"homeassistant.components.samsungtv.config_flow.socket.gethostbyname",
return_value="fake_host",
), patch(
"homeassistant.components.samsungtv.bridge.SamsungTVWS"
) as remotews, patch(
"getmac.get_mac_address", return_value="gg:hh:ii:ll:mm:nn"
):
enter = Mock()
type(enter).token = PropertyMock(return_value="123456789")
remote = Mock()
remote.__enter__ = Mock(return_value=enter)
remote.__exit__ = Mock(return_value=False)
remote.rest_device_info.return_value = {
"id": "uuid:be9554b9-c9fb-41f4-8920-22da015376a4",
"device": {
"modelName": "82GXARRS",
"networkType": "lan",
"udn": "uuid:be9554b9-c9fb-41f4-8920-22da015376a4",
"name": "[TV] Living Room",
"type": "Samsung SmartTV",
},
}
remotews.return_value = remote
result = await hass.config_entries.flow.async_init(
DOMAIN, context={"source": config_entries.SOURCE_USER}, data=MOCK_USER_DATA
)
assert result["type"] == "create_entry"
assert result["data"][CONF_METHOD] == "websocket"
assert result["data"][CONF_TOKEN] == "123456789"
assert result["data"][CONF_MAC] == "gg:hh:ii:ll:mm:nn"
assert remotews.call_count == 2
assert remotews.call_args_list == [
call(**AUTODETECT_WEBSOCKET_SSL),
call(**DEVICEINFO_WEBSOCKET_SSL),
]
await hass.async_block_till_done()
entries = hass.config_entries.async_entries(DOMAIN)
assert len(entries) == 1
assert entries[0].data[CONF_MAC] == "gg:hh:ii:ll:mm:nn"
async def test_autodetect_auth_missing(hass: HomeAssistant, remote: Mock): async def test_autodetect_auth_missing(hass: HomeAssistant, remote: Mock):
"""Test for send key with autodetection of protocol.""" """Test for send key with autodetection of protocol."""
with patch( with patch(
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment