Allow specifying port for wake_on_lan (#36510)
This commit is contained in:
parent
59f935beb0
commit
f1d5f95f7c
6 changed files with 56 additions and 11 deletions
|
@ -5,7 +5,7 @@ import logging
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
import wakeonlan
|
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
|
import homeassistant.helpers.config_validation as cv
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
@ -15,7 +15,11 @@ DOMAIN = "wake_on_lan"
|
||||||
SERVICE_SEND_MAGIC_PACKET = "send_magic_packet"
|
SERVICE_SEND_MAGIC_PACKET = "send_magic_packet"
|
||||||
|
|
||||||
WAKE_ON_LAN_SEND_MAGIC_PACKET_SCHEMA = vol.Schema(
|
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."""
|
"""Send magic packet to wake up a device."""
|
||||||
mac_address = call.data.get(CONF_MAC)
|
mac_address = call.data.get(CONF_MAC)
|
||||||
broadcast_address = call.data.get(CONF_BROADCAST_ADDRESS)
|
broadcast_address = call.data.get(CONF_BROADCAST_ADDRESS)
|
||||||
|
broadcast_port = call.data.get(CONF_BROADCAST_PORT)
|
||||||
_LOGGER.info(
|
_LOGGER.info(
|
||||||
"Send magic packet to mac %s (broadcast: %s)",
|
"Send magic packet to mac %s (broadcast: %s, port: %s)",
|
||||||
mac_address,
|
mac_address,
|
||||||
broadcast_address,
|
broadcast_address,
|
||||||
|
broadcast_port,
|
||||||
)
|
)
|
||||||
if broadcast_address is not None:
|
if broadcast_address is not None:
|
||||||
await hass.async_add_job(
|
await hass.async_add_job(
|
||||||
|
@ -37,6 +43,7 @@ async def async_setup(hass, config):
|
||||||
wakeonlan.send_magic_packet,
|
wakeonlan.send_magic_packet,
|
||||||
mac_address,
|
mac_address,
|
||||||
ip_address=broadcast_address,
|
ip_address=broadcast_address,
|
||||||
|
port=broadcast_port,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -1,9 +1,12 @@
|
||||||
send_magic_packet:
|
send_magic_packet:
|
||||||
description: Send a 'magic packet' to wake up a device with 'Wake-On-LAN' capabilities.
|
description: Send a 'magic packet' to wake up a device with 'Wake-On-LAN' capabilities.
|
||||||
fields:
|
fields:
|
||||||
broadcast_address:
|
|
||||||
description: Optional broadcast IP where to send the magic packet.
|
|
||||||
example: 192.168.255.255
|
|
||||||
mac:
|
mac:
|
||||||
description: MAC address of the device to wake up.
|
description: MAC address of the device to wake up.
|
||||||
example: "aa:bb:cc:dd:ee:ff"
|
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
|
||||||
|
|
|
@ -7,7 +7,13 @@ import voluptuous as vol
|
||||||
import wakeonlan
|
import wakeonlan
|
||||||
|
|
||||||
from homeassistant.components.switch import PLATFORM_SCHEMA, SwitchEntity
|
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
|
import homeassistant.helpers.config_validation as cv
|
||||||
from homeassistant.helpers.script import Script
|
from homeassistant.helpers.script import Script
|
||||||
|
|
||||||
|
@ -22,6 +28,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
|
||||||
{
|
{
|
||||||
vol.Required(CONF_MAC): cv.string,
|
vol.Required(CONF_MAC): cv.string,
|
||||||
vol.Optional(CONF_BROADCAST_ADDRESS): 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_HOST): cv.string,
|
||||||
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
|
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
|
||||||
vol.Optional(CONF_OFF_ACTION): cv.SCRIPT_SCHEMA,
|
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):
|
def setup_platform(hass, config, add_entities, discovery_info=None):
|
||||||
"""Set up a wake on lan switch."""
|
"""Set up a wake on lan switch."""
|
||||||
broadcast_address = config.get(CONF_BROADCAST_ADDRESS)
|
broadcast_address = config.get(CONF_BROADCAST_ADDRESS)
|
||||||
|
broadcast_port = config.get(CONF_BROADCAST_PORT)
|
||||||
host = config.get(CONF_HOST)
|
host = config.get(CONF_HOST)
|
||||||
mac_address = config[CONF_MAC]
|
mac_address = config[CONF_MAC]
|
||||||
name = config[CONF_NAME]
|
name = config[CONF_NAME]
|
||||||
off_action = config.get(CONF_OFF_ACTION)
|
off_action = config.get(CONF_OFF_ACTION)
|
||||||
|
|
||||||
add_entities(
|
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):
|
class WolSwitch(SwitchEntity):
|
||||||
"""Representation of a wake on lan switch."""
|
"""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."""
|
"""Initialize the WOL switch."""
|
||||||
self._hass = hass
|
self._hass = hass
|
||||||
self._name = name
|
self._name = name
|
||||||
self._host = host
|
self._host = host
|
||||||
self._mac_address = mac_address
|
self._mac_address = mac_address
|
||||||
self._broadcast_address = broadcast_address
|
self._broadcast_address = broadcast_address
|
||||||
|
self._broadcast_port = broadcast_port
|
||||||
self._off_script = Script(hass, off_action) if off_action else None
|
self._off_script = Script(hass, off_action) if off_action else None
|
||||||
self._state = False
|
self._state = False
|
||||||
|
|
||||||
|
@ -69,7 +98,9 @@ class WolSwitch(SwitchEntity):
|
||||||
"""Turn the device on."""
|
"""Turn the device on."""
|
||||||
if self._broadcast_address:
|
if self._broadcast_address:
|
||||||
wakeonlan.send_magic_packet(
|
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:
|
else:
|
||||||
wakeonlan.send_magic_packet(self._mac_address)
|
wakeonlan.send_magic_packet(self._mac_address)
|
||||||
|
|
|
@ -46,6 +46,7 @@ CONF_BINARY_SENSORS = "binary_sensors"
|
||||||
CONF_BLACKLIST = "blacklist"
|
CONF_BLACKLIST = "blacklist"
|
||||||
CONF_BRIGHTNESS = "brightness"
|
CONF_BRIGHTNESS = "brightness"
|
||||||
CONF_BROADCAST_ADDRESS = "broadcast_address"
|
CONF_BROADCAST_ADDRESS = "broadcast_address"
|
||||||
|
CONF_BROADCAST_PORT = "broadcast_port"
|
||||||
CONF_CLIENT_ID = "client_id"
|
CONF_CLIENT_ID = "client_id"
|
||||||
CONF_CLIENT_SECRET = "client_secret"
|
CONF_CLIENT_SECRET = "client_secret"
|
||||||
CONF_CODE = "code"
|
CONF_CODE = "code"
|
||||||
|
|
|
@ -13,18 +13,20 @@ async def test_send_magic_packet(hass):
|
||||||
with patch("homeassistant.components.wake_on_lan.wakeonlan") as mocked_wakeonlan:
|
with patch("homeassistant.components.wake_on_lan.wakeonlan") as mocked_wakeonlan:
|
||||||
mac = "aa:bb:cc:dd:ee:ff"
|
mac = "aa:bb:cc:dd:ee:ff"
|
||||||
bc_ip = "192.168.255.255"
|
bc_ip = "192.168.255.255"
|
||||||
|
bc_port = 999
|
||||||
|
|
||||||
await async_setup_component(hass, DOMAIN, {})
|
await async_setup_component(hass, DOMAIN, {})
|
||||||
|
|
||||||
await hass.services.async_call(
|
await hass.services.async_call(
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
SERVICE_SEND_MAGIC_PACKET,
|
SERVICE_SEND_MAGIC_PACKET,
|
||||||
{"mac": mac, "broadcast_address": bc_ip},
|
{"mac": mac, "broadcast_address": bc_ip, "broadcast_port": bc_port},
|
||||||
blocking=True,
|
blocking=True,
|
||||||
)
|
)
|
||||||
assert len(mocked_wakeonlan.mock_calls) == 1
|
assert len(mocked_wakeonlan.mock_calls) == 1
|
||||||
assert mocked_wakeonlan.mock_calls[-1][1][0] == mac
|
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]["ip_address"] == bc_ip
|
||||||
|
assert mocked_wakeonlan.mock_calls[-1][2]["port"] == bc_port
|
||||||
|
|
||||||
with pytest.raises(vol.Invalid):
|
with pytest.raises(vol.Invalid):
|
||||||
await hass.services.async_call(
|
await hass.services.async_call(
|
||||||
|
|
|
@ -126,6 +126,7 @@ class TestWolSwitch(unittest.TestCase):
|
||||||
"platform": "wake_on_lan",
|
"platform": "wake_on_lan",
|
||||||
"mac": "00-01-02-03-04-05",
|
"mac": "00-01-02-03-04-05",
|
||||||
"broadcast_address": "255.255.255.255",
|
"broadcast_address": "255.255.255.255",
|
||||||
|
"broadcast_port": 999,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
Loading…
Add table
Reference in a new issue