Allow specifying port for wake_on_lan (#36510)

This commit is contained in:
Janitha Karunaratne 2020-06-10 17:05:24 -05:00 committed by GitHub
parent 59f935beb0
commit f1d5f95f7c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 56 additions and 11 deletions

View file

@ -5,7 +5,7 @@ import logging
import voluptuous as vol
import wakeonlan
from homeassistant.const import CONF_BROADCAST_ADDRESS, CONF_MAC
from homeassistant.const import CONF_BROADCAST_ADDRESS, CONF_BROADCAST_PORT, CONF_MAC
import homeassistant.helpers.config_validation as cv
_LOGGER = logging.getLogger(__name__)
@ -15,7 +15,11 @@ DOMAIN = "wake_on_lan"
SERVICE_SEND_MAGIC_PACKET = "send_magic_packet"
WAKE_ON_LAN_SEND_MAGIC_PACKET_SCHEMA = vol.Schema(
{vol.Required(CONF_MAC): cv.string, vol.Optional(CONF_BROADCAST_ADDRESS): cv.string}
{
vol.Required(CONF_MAC): cv.string,
vol.Optional(CONF_BROADCAST_ADDRESS): cv.string,
vol.Optional(CONF_BROADCAST_PORT): cv.port,
}
)
@ -26,10 +30,12 @@ async def async_setup(hass, config):
"""Send magic packet to wake up a device."""
mac_address = call.data.get(CONF_MAC)
broadcast_address = call.data.get(CONF_BROADCAST_ADDRESS)
broadcast_port = call.data.get(CONF_BROADCAST_PORT)
_LOGGER.info(
"Send magic packet to mac %s (broadcast: %s)",
"Send magic packet to mac %s (broadcast: %s, port: %s)",
mac_address,
broadcast_address,
broadcast_port,
)
if broadcast_address is not None:
await hass.async_add_job(
@ -37,6 +43,7 @@ async def async_setup(hass, config):
wakeonlan.send_magic_packet,
mac_address,
ip_address=broadcast_address,
port=broadcast_port,
)
)
else:

View file

@ -1,9 +1,12 @@
send_magic_packet:
description: Send a 'magic packet' to wake up a device with 'Wake-On-LAN' capabilities.
fields:
broadcast_address:
description: Optional broadcast IP where to send the magic packet.
example: 192.168.255.255
mac:
description: MAC address of the device to wake up.
example: "aa:bb:cc:dd:ee:ff"
broadcast_address:
description: Optional broadcast IP where to send the magic packet.
example: 192.168.255.255
broadcast_port:
description: Optional port where to send the magic packet.
example: 9

View file

@ -7,7 +7,13 @@ import voluptuous as vol
import wakeonlan
from homeassistant.components.switch import PLATFORM_SCHEMA, SwitchEntity
from homeassistant.const import CONF_BROADCAST_ADDRESS, CONF_HOST, CONF_MAC, CONF_NAME
from homeassistant.const import (
CONF_BROADCAST_ADDRESS,
CONF_BROADCAST_PORT,
CONF_HOST,
CONF_MAC,
CONF_NAME,
)
import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.script import Script
@ -22,6 +28,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
{
vol.Required(CONF_MAC): cv.string,
vol.Optional(CONF_BROADCAST_ADDRESS): cv.string,
vol.Optional(CONF_BROADCAST_PORT): cv.port,
vol.Optional(CONF_HOST): cv.string,
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
vol.Optional(CONF_OFF_ACTION): cv.SCRIPT_SCHEMA,
@ -32,26 +39,48 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
def setup_platform(hass, config, add_entities, discovery_info=None):
"""Set up a wake on lan switch."""
broadcast_address = config.get(CONF_BROADCAST_ADDRESS)
broadcast_port = config.get(CONF_BROADCAST_PORT)
host = config.get(CONF_HOST)
mac_address = config[CONF_MAC]
name = config[CONF_NAME]
off_action = config.get(CONF_OFF_ACTION)
add_entities(
[WolSwitch(hass, name, host, mac_address, off_action, broadcast_address)], True
[
WolSwitch(
hass,
name,
host,
mac_address,
off_action,
broadcast_address,
broadcast_port,
)
],
True,
)
class WolSwitch(SwitchEntity):
"""Representation of a wake on lan switch."""
def __init__(self, hass, name, host, mac_address, off_action, broadcast_address):
def __init__(
self,
hass,
name,
host,
mac_address,
off_action,
broadcast_address,
broadcast_port,
):
"""Initialize the WOL switch."""
self._hass = hass
self._name = name
self._host = host
self._mac_address = mac_address
self._broadcast_address = broadcast_address
self._broadcast_port = broadcast_port
self._off_script = Script(hass, off_action) if off_action else None
self._state = False
@ -69,7 +98,9 @@ class WolSwitch(SwitchEntity):
"""Turn the device on."""
if self._broadcast_address:
wakeonlan.send_magic_packet(
self._mac_address, ip_address=self._broadcast_address
self._mac_address,
ip_address=self._broadcast_address,
port=self._broadcast_port,
)
else:
wakeonlan.send_magic_packet(self._mac_address)

View file

@ -46,6 +46,7 @@ CONF_BINARY_SENSORS = "binary_sensors"
CONF_BLACKLIST = "blacklist"
CONF_BRIGHTNESS = "brightness"
CONF_BROADCAST_ADDRESS = "broadcast_address"
CONF_BROADCAST_PORT = "broadcast_port"
CONF_CLIENT_ID = "client_id"
CONF_CLIENT_SECRET = "client_secret"
CONF_CODE = "code"

View file

@ -13,18 +13,20 @@ async def test_send_magic_packet(hass):
with patch("homeassistant.components.wake_on_lan.wakeonlan") as mocked_wakeonlan:
mac = "aa:bb:cc:dd:ee:ff"
bc_ip = "192.168.255.255"
bc_port = 999
await async_setup_component(hass, DOMAIN, {})
await hass.services.async_call(
DOMAIN,
SERVICE_SEND_MAGIC_PACKET,
{"mac": mac, "broadcast_address": bc_ip},
{"mac": mac, "broadcast_address": bc_ip, "broadcast_port": bc_port},
blocking=True,
)
assert len(mocked_wakeonlan.mock_calls) == 1
assert mocked_wakeonlan.mock_calls[-1][1][0] == mac
assert mocked_wakeonlan.mock_calls[-1][2]["ip_address"] == bc_ip
assert mocked_wakeonlan.mock_calls[-1][2]["port"] == bc_port
with pytest.raises(vol.Invalid):
await hass.services.async_call(

View file

@ -126,6 +126,7 @@ class TestWolSwitch(unittest.TestCase):
"platform": "wake_on_lan",
"mac": "00-01-02-03-04-05",
"broadcast_address": "255.255.255.255",
"broadcast_port": 999,
}
},
)