mirror of
https://github.com/home-assistant/core.git
synced 2025-07-21 20:27:08 +00:00
Add broadcast address for WOL and samsungtv (#28819)
* Add broadcast address for WOL and samsungtv * Fix style * Fix tests, and add new test for new functionality * Fix code style
This commit is contained in:
parent
f25a3cbfcf
commit
cb63a9d7e1
@ -26,6 +26,7 @@ from homeassistant.components.media_player.const import (
|
|||||||
SUPPORT_VOLUME_STEP,
|
SUPPORT_VOLUME_STEP,
|
||||||
)
|
)
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
|
CONF_BROADCAST_ADDRESS,
|
||||||
CONF_HOST,
|
CONF_HOST,
|
||||||
CONF_MAC,
|
CONF_MAC,
|
||||||
CONF_NAME,
|
CONF_NAME,
|
||||||
@ -41,6 +42,7 @@ from .const import LOGGER
|
|||||||
|
|
||||||
DEFAULT_NAME = "Samsung TV Remote"
|
DEFAULT_NAME = "Samsung TV Remote"
|
||||||
DEFAULT_TIMEOUT = 1
|
DEFAULT_TIMEOUT = 1
|
||||||
|
DEFAULT_BROADCAST_ADDRESS = "255.255.255.255"
|
||||||
|
|
||||||
KEY_PRESS_TIMEOUT = 1.2
|
KEY_PRESS_TIMEOUT = 1.2
|
||||||
KNOWN_DEVICES_KEY = "samsungtv_known_devices"
|
KNOWN_DEVICES_KEY = "samsungtv_known_devices"
|
||||||
@ -65,6 +67,9 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
|
|||||||
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
|
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
|
||||||
vol.Optional(CONF_PORT): cv.port,
|
vol.Optional(CONF_PORT): cv.port,
|
||||||
vol.Optional(CONF_MAC): cv.string,
|
vol.Optional(CONF_MAC): cv.string,
|
||||||
|
vol.Optional(
|
||||||
|
CONF_BROADCAST_ADDRESS, default=DEFAULT_BROADCAST_ADDRESS
|
||||||
|
): cv.string,
|
||||||
vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int,
|
vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@ -84,6 +89,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
|
|||||||
port = config.get(CONF_PORT)
|
port = config.get(CONF_PORT)
|
||||||
name = config.get(CONF_NAME)
|
name = config.get(CONF_NAME)
|
||||||
mac = config.get(CONF_MAC)
|
mac = config.get(CONF_MAC)
|
||||||
|
broadcast = config.get(CONF_BROADCAST_ADDRESS)
|
||||||
timeout = config.get(CONF_TIMEOUT)
|
timeout = config.get(CONF_TIMEOUT)
|
||||||
elif discovery_info is not None:
|
elif discovery_info is not None:
|
||||||
tv_name = discovery_info.get("name")
|
tv_name = discovery_info.get("name")
|
||||||
@ -95,6 +101,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
|
|||||||
port = None
|
port = None
|
||||||
timeout = DEFAULT_TIMEOUT
|
timeout = DEFAULT_TIMEOUT
|
||||||
mac = None
|
mac = None
|
||||||
|
broadcast = DEFAULT_BROADCAST_ADDRESS
|
||||||
uuid = discovery_info.get("udn")
|
uuid = discovery_info.get("udn")
|
||||||
if uuid and uuid.startswith("uuid:"):
|
if uuid and uuid.startswith("uuid:"):
|
||||||
uuid = uuid[len("uuid:") :]
|
uuid = uuid[len("uuid:") :]
|
||||||
@ -104,7 +111,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
|
|||||||
ip_addr = socket.gethostbyname(host)
|
ip_addr = socket.gethostbyname(host)
|
||||||
if ip_addr not in known_devices:
|
if ip_addr not in known_devices:
|
||||||
known_devices.add(ip_addr)
|
known_devices.add(ip_addr)
|
||||||
add_entities([SamsungTVDevice(host, port, name, timeout, mac, uuid)])
|
add_entities([SamsungTVDevice(host, port, name, timeout, mac, broadcast, uuid)])
|
||||||
LOGGER.info("Samsung TV %s added as '%s'", host, name)
|
LOGGER.info("Samsung TV %s added as '%s'", host, name)
|
||||||
else:
|
else:
|
||||||
LOGGER.info("Ignoring duplicate Samsung TV %s", host)
|
LOGGER.info("Ignoring duplicate Samsung TV %s", host)
|
||||||
@ -113,12 +120,13 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
|
|||||||
class SamsungTVDevice(MediaPlayerDevice):
|
class SamsungTVDevice(MediaPlayerDevice):
|
||||||
"""Representation of a Samsung TV."""
|
"""Representation of a Samsung TV."""
|
||||||
|
|
||||||
def __init__(self, host, port, name, timeout, mac, uuid):
|
def __init__(self, host, port, name, timeout, mac, broadcast, uuid):
|
||||||
"""Initialize the Samsung device."""
|
"""Initialize the Samsung device."""
|
||||||
|
|
||||||
# Save a reference to the imported classes
|
# Save a reference to the imported classes
|
||||||
self._name = name
|
self._name = name
|
||||||
self._mac = mac
|
self._mac = mac
|
||||||
|
self._broadcast = broadcast
|
||||||
self._uuid = uuid
|
self._uuid = uuid
|
||||||
# Assume that the TV is not muted
|
# Assume that the TV is not muted
|
||||||
self._muted = False
|
self._muted = False
|
||||||
@ -339,7 +347,7 @@ class SamsungTVDevice(MediaPlayerDevice):
|
|||||||
def turn_on(self):
|
def turn_on(self):
|
||||||
"""Turn the media player on."""
|
"""Turn the media player on."""
|
||||||
if self._mac:
|
if self._mac:
|
||||||
wakeonlan.send_magic_packet(self._mac)
|
wakeonlan.send_magic_packet(self._mac, ip_address=self._broadcast)
|
||||||
else:
|
else:
|
||||||
self.send_key("KEY_POWERON")
|
self.send_key("KEY_POWERON")
|
||||||
|
|
||||||
|
@ -32,6 +32,7 @@ from homeassistant.const import (
|
|||||||
ATTR_ENTITY_ID,
|
ATTR_ENTITY_ID,
|
||||||
ATTR_FRIENDLY_NAME,
|
ATTR_FRIENDLY_NAME,
|
||||||
ATTR_SUPPORTED_FEATURES,
|
ATTR_SUPPORTED_FEATURES,
|
||||||
|
CONF_BROADCAST_ADDRESS,
|
||||||
CONF_HOST,
|
CONF_HOST,
|
||||||
CONF_MAC,
|
CONF_MAC,
|
||||||
CONF_NAME,
|
CONF_NAME,
|
||||||
@ -67,6 +68,19 @@ MOCK_CONFIG = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ENTITY_ID_BROADCAST = f"{DOMAIN}.fake_broadcast"
|
||||||
|
MOCK_CONFIG_BROADCAST = {
|
||||||
|
DOMAIN: {
|
||||||
|
CONF_PLATFORM: SAMSUNGTV_DOMAIN,
|
||||||
|
CONF_HOST: "fake_broadcast",
|
||||||
|
CONF_NAME: "fake_broadcast",
|
||||||
|
CONF_PORT: 8001,
|
||||||
|
CONF_TIMEOUT: 10,
|
||||||
|
CONF_MAC: "38:f9:d3:82:b4:f1",
|
||||||
|
CONF_BROADCAST_ADDRESS: "192.168.5.255",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ENTITY_ID_NOMAC = f"{DOMAIN}.fake_nomac"
|
ENTITY_ID_NOMAC = f"{DOMAIN}.fake_nomac"
|
||||||
MOCK_CONFIG_NOMAC = {
|
MOCK_CONFIG_NOMAC = {
|
||||||
DOMAIN: {
|
DOMAIN: {
|
||||||
@ -565,7 +579,22 @@ async def test_turn_on_with_mac(hass, remote, wakeonlan):
|
|||||||
)
|
)
|
||||||
# key and update called
|
# key and update called
|
||||||
assert wakeonlan.send_magic_packet.call_count == 1
|
assert wakeonlan.send_magic_packet.call_count == 1
|
||||||
assert wakeonlan.send_magic_packet.call_args_list == [call("38:f9:d3:82:b4:f1")]
|
assert wakeonlan.send_magic_packet.call_args_list == [
|
||||||
|
call("38:f9:d3:82:b4:f1", ip_address="255.255.255.255")
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
async def test_turn_on_with_mac_and_broadcast(hass, remote, wakeonlan):
|
||||||
|
"""Test turn on."""
|
||||||
|
await setup_samsungtv(hass, MOCK_CONFIG_BROADCAST)
|
||||||
|
assert await hass.services.async_call(
|
||||||
|
DOMAIN, SERVICE_TURN_ON, {ATTR_ENTITY_ID: ENTITY_ID_BROADCAST}, True
|
||||||
|
)
|
||||||
|
# key and update called
|
||||||
|
assert wakeonlan.send_magic_packet.call_count == 1
|
||||||
|
assert wakeonlan.send_magic_packet.call_args_list == [
|
||||||
|
call("38:f9:d3:82:b4:f1", ip_address="192.168.5.255")
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
async def test_turn_on_without_mac(hass, remote):
|
async def test_turn_on_without_mac(hass, remote):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user