Merge pull request #37668 from home-assistant/rc

This commit is contained in:
Paulus Schoutsen 2020-07-08 22:50:16 -07:00 committed by GitHub
commit aa39dede59
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
17 changed files with 206 additions and 76 deletions

View file

@ -351,7 +351,7 @@ async def _async_log_pending_setups(
remaining = [domain for domain in domains if domain in setup_started] remaining = [domain for domain in domains if domain in setup_started]
if remaining: if remaining:
_LOGGER.info( _LOGGER.warning(
"Waiting on integrations to complete setup: %s", ", ".join(remaining), "Waiting on integrations to complete setup: %s", ", ".join(remaining),
) )

View file

@ -19,7 +19,7 @@ _LOGGER = logging.getLogger(__name__)
DOMAIN = "denonavr" DOMAIN = "denonavr"
SUPPORTED_MANUFACTURERS = ["Denon", "DENON", "Marantz"] SUPPORTED_MANUFACTURERS = ["Denon", "DENON", "DENON PROFESSIONAL", "Marantz"]
IGNORED_MODELS = ["HEOS 1", "HEOS 3", "HEOS 5", "HEOS 7"] IGNORED_MODELS = ["HEOS 1", "HEOS 3", "HEOS 5", "HEOS 7"]
CONF_SHOW_ALL_SOURCES = "show_all_sources" CONF_SHOW_ALL_SOURCES = "show_all_sources"

View file

@ -3,7 +3,7 @@
"name": "Denon AVR Network Receivers", "name": "Denon AVR Network Receivers",
"config_flow": true, "config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/denonavr", "documentation": "https://www.home-assistant.io/integrations/denonavr",
"requirements": ["denonavr==0.9.3", "getmac==0.8.2"], "requirements": ["denonavr==0.9.4", "getmac==0.8.2"],
"codeowners": ["@scarface-4711", "@starkillerOG"], "codeowners": ["@scarface-4711", "@starkillerOG"],
"ssdp": [ "ssdp": [
{ {
@ -14,6 +14,10 @@
"manufacturer": "DENON", "manufacturer": "DENON",
"deviceType": "urn:schemas-upnp-org:device:MediaRenderer:1" "deviceType": "urn:schemas-upnp-org:device:MediaRenderer:1"
}, },
{
"manufacturer": "DENON PROFESSIONAL",
"deviceType": "urn:schemas-upnp-org:device:MediaRenderer:1"
},
{ {
"manufacturer": "Marantz", "manufacturer": "Marantz",
"deviceType": "urn:schemas-upnp-org:device:MediaRenderer:1" "deviceType": "urn:schemas-upnp-org:device:MediaRenderer:1"
@ -26,6 +30,10 @@
"manufacturer": "DENON", "manufacturer": "DENON",
"deviceType": "urn:schemas-upnp-org:device:MediaServer:1" "deviceType": "urn:schemas-upnp-org:device:MediaServer:1"
}, },
{
"manufacturer": "DENON PROFESSIONAL",
"deviceType": "urn:schemas-upnp-org:device:MediaServer:1"
},
{ {
"manufacturer": "Marantz", "manufacturer": "Marantz",
"deviceType": "urn:schemas-upnp-org:device:MediaServer:1" "deviceType": "urn:schemas-upnp-org:device:MediaServer:1"
@ -38,6 +46,10 @@
"manufacturer": "DENON", "manufacturer": "DENON",
"deviceType": "urn:schemas-denon-com:device:AiosDevice:1" "deviceType": "urn:schemas-denon-com:device:AiosDevice:1"
}, },
{
"manufacturer": "DENON PROFESSIONAL",
"deviceType": "urn:schemas-denon-com:device:AiosDevice:1"
},
{ {
"manufacturer": "Marantz", "manufacturer": "Marantz",
"deviceType": "urn:schemas-denon-com:device:AiosDevice:1" "deviceType": "urn:schemas-denon-com:device:AiosDevice:1"

View file

@ -2,7 +2,7 @@
"domain": "dunehd", "domain": "dunehd",
"name": "Dune HD", "name": "Dune HD",
"documentation": "https://www.home-assistant.io/integrations/dunehd", "documentation": "https://www.home-assistant.io/integrations/dunehd",
"requirements": ["pdunehd==1.3.1"], "requirements": ["pdunehd==1.3.2"],
"codeowners": ["@bieniu"], "codeowners": ["@bieniu"],
"config_flow": true "config_flow": true
} }

View file

@ -3,5 +3,5 @@
"name": "KEF", "name": "KEF",
"documentation": "https://www.home-assistant.io/integrations/kef", "documentation": "https://www.home-assistant.io/integrations/kef",
"codeowners": ["@basnijholt"], "codeowners": ["@basnijholt"],
"requirements": ["aiokef==0.2.12", "getmac==0.8.2"] "requirements": ["aiokef==0.2.13", "getmac==0.8.2"]
} }

View file

@ -5,7 +5,7 @@
"documentation": "https://www.home-assistant.io/integrations/smappee", "documentation": "https://www.home-assistant.io/integrations/smappee",
"dependencies": ["http"], "dependencies": ["http"],
"requirements": [ "requirements": [
"pysmappee==0.1.2" "pysmappee==0.1.4"
], ],
"codeowners": [ "codeowners": [
"@bsmappee" "@bsmappee"

View file

@ -16,13 +16,6 @@ TREND_SENSORS = {
"total_power", "total_power",
DEVICE_CLASS_POWER, DEVICE_CLASS_POWER,
], ],
"total_reactive_power": [
"Total consumption - Reactive power",
None,
POWER_WATT,
"total_reactive_power",
DEVICE_CLASS_POWER,
],
"alwayson": [ "alwayson": [
"Always on - Active power", "Always on - Active power",
None, None,
@ -59,6 +52,15 @@ TREND_SENSORS = {
None, None,
], ],
} }
REACTIVE_SENSORS = {
"total_reactive_power": [
"Total consumption - Reactive power",
None,
POWER_WATT,
"total_reactive_power",
DEVICE_CLASS_POWER,
]
}
SOLAR_SENSORS = { SOLAR_SENSORS = {
"solar_power": [ "solar_power": [
"Total production - Active power", "Total production - Active power",
@ -88,48 +90,48 @@ VOLTAGE_SENSORS = {
"mdi:flash", "mdi:flash",
VOLT, VOLT,
"phase_voltage_a", "phase_voltage_a",
["ONE", "TWO", "THREE_STAR", "THREE_DELTA"],
None, None,
["ONE", "TWO", "THREE_STAR", "THREE_DELTA"],
], ],
"phase_voltages_b": [ "phase_voltages_b": [
"Phase voltages - B", "Phase voltages - B",
"mdi:flash", "mdi:flash",
VOLT, VOLT,
"phase_voltage_b", "phase_voltage_b",
["TWO", "THREE_STAR", "THREE_DELTA"],
None, None,
["TWO", "THREE_STAR", "THREE_DELTA"],
], ],
"phase_voltages_c": [ "phase_voltages_c": [
"Phase voltages - C", "Phase voltages - C",
"mdi:flash", "mdi:flash",
VOLT, VOLT,
"phase_voltage_c", "phase_voltage_c",
["THREE_STAR"],
None, None,
["THREE_STAR"],
], ],
"line_voltages_a": [ "line_voltages_a": [
"Line voltages - A", "Line voltages - A",
"mdi:flash", "mdi:flash",
VOLT, VOLT,
"line_voltage_a", "line_voltage_a",
["ONE", "TWO", "THREE_STAR", "THREE_DELTA"],
None, None,
["ONE", "TWO", "THREE_STAR", "THREE_DELTA"],
], ],
"line_voltages_b": [ "line_voltages_b": [
"Line voltages - B", "Line voltages - B",
"mdi:flash", "mdi:flash",
VOLT, VOLT,
"line_voltage_b", "line_voltage_b",
["TWO", "THREE_STAR", "THREE_DELTA"],
None, None,
["TWO", "THREE_STAR", "THREE_DELTA"],
], ],
"line_voltages_c": [ "line_voltages_c": [
"Line voltages - C", "Line voltages - C",
"mdi:flash", "mdi:flash",
VOLT, VOLT,
"line_voltage_c", "line_voltage_c",
["THREE_STAR", "THREE_DELTA"],
None, None,
["THREE_STAR", "THREE_DELTA"],
], ],
} }
@ -151,6 +153,17 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
) )
) )
if service_location.has_reactive_value:
for reactive_sensor in REACTIVE_SENSORS:
entities.append(
SmappeeSensor(
smappee_base=smappee_base,
service_location=service_location,
sensor=reactive_sensor,
attributes=REACTIVE_SENSORS[reactive_sensor],
)
)
# Add solar sensors # Add solar sensors
if service_location.has_solar_production: if service_location.has_solar_production:
for sensor in SOLAR_SENSORS: for sensor in SOLAR_SENSORS:
@ -180,17 +193,18 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
) )
) )
# Add phase- and line voltages # Add phase- and line voltages if available
for sensor_name, sensor in VOLTAGE_SENSORS.items(): if service_location.has_voltage_values:
if service_location.phase_type in sensor[4]: for sensor_name, sensor in VOLTAGE_SENSORS.items():
entities.append( if service_location.phase_type in sensor[5]:
SmappeeSensor( entities.append(
smappee_base=smappee_base, SmappeeSensor(
service_location=service_location, smappee_base=smappee_base,
sensor=sensor_name, service_location=service_location,
attributes=sensor, sensor=sensor_name,
attributes=sensor,
)
) )
)
# Add Gas and Water sensors # Add Gas and Water sensors
for sensor_id, sensor in service_location.sensors.items(): for sensor_id, sensor in service_location.sensors.items():

View file

@ -3,7 +3,7 @@
"name": "Sonarr", "name": "Sonarr",
"documentation": "https://www.home-assistant.io/integrations/sonarr", "documentation": "https://www.home-assistant.io/integrations/sonarr",
"codeowners": ["@ctalkington"], "codeowners": ["@ctalkington"],
"requirements": ["sonarr==0.2.2"], "requirements": ["sonarr==0.2.3"],
"config_flow": true, "config_flow": true,
"quality_scale": "silver" "quality_scale": "silver"
} }

View file

@ -31,23 +31,23 @@ async def async_setup(hass, config):
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) broadcast_port = call.data.get(CONF_BROADCAST_PORT)
service_kwargs = {}
if broadcast_address is not None:
service_kwargs["ip_address"] = broadcast_address
if broadcast_port is not None:
service_kwargs["port"] = broadcast_port
_LOGGER.info( _LOGGER.info(
"Send magic packet to mac %s (broadcast: %s, port: %s)", "Send magic packet to mac %s (broadcast: %s, port: %s)",
mac_address, mac_address,
broadcast_address, broadcast_address,
broadcast_port, broadcast_port,
) )
if broadcast_address is not None:
await hass.async_add_job( await hass.async_add_job(
partial( partial(wakeonlan.send_magic_packet, mac_address, **service_kwargs)
wakeonlan.send_magic_packet, )
mac_address,
ip_address=broadcast_address,
port=broadcast_port,
)
)
else:
await hass.async_add_job(partial(wakeonlan.send_magic_packet, mac_address))
hass.services.async_register( hass.services.async_register(
DOMAIN, DOMAIN,

View file

@ -96,14 +96,20 @@ class WolSwitch(SwitchEntity):
def turn_on(self, **kwargs): def turn_on(self, **kwargs):
"""Turn the device on.""" """Turn the device on."""
if self._broadcast_address: service_kwargs = {}
wakeonlan.send_magic_packet( if self._broadcast_address is not None:
self._mac_address, service_kwargs["ip_address"] = self._broadcast_address
ip_address=self._broadcast_address, if self._broadcast_port is not None:
port=self._broadcast_port, service_kwargs["port"] = self._broadcast_port
)
else: _LOGGER.info(
wakeonlan.send_magic_packet(self._mac_address) "Send magic packet to mac %s (broadcast: %s, port: %s)",
self._mac_address,
self._broadcast_address,
self._broadcast_port,
)
wakeonlan.send_magic_packet(self._mac_address, **service_kwargs)
def turn_off(self, **kwargs): def turn_off(self, **kwargs):
"""Turn the device off if an off action is present.""" """Turn the device off if an off action is present."""

View file

@ -2,9 +2,9 @@
from typing import Callable, List from typing import Callable, List
from homeassistant.components.binary_sensor import ( from homeassistant.components.binary_sensor import (
DEVICE_CLASS_PRESENCE, DEVICE_CLASS_OCCUPANCY,
DOMAIN as BINARY_SENSOR_DOMAIN, DOMAIN as BINARY_SENSOR_DOMAIN,
BinarySensorDevice, BinarySensorEntity,
) )
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
@ -26,7 +26,7 @@ async def async_setup_entry(
async_add_entities(entities, True) async_add_entities(entities, True)
class WithingsHealthBinarySensor(BaseWithingsSensor, BinarySensorDevice): class WithingsHealthBinarySensor(BaseWithingsSensor, BinarySensorEntity):
"""Implementation of a Withings sensor.""" """Implementation of a Withings sensor."""
@property @property
@ -37,4 +37,4 @@ class WithingsHealthBinarySensor(BaseWithingsSensor, BinarySensorDevice):
@property @property
def device_class(self) -> str: def device_class(self) -> str:
"""Provide the device class.""" """Provide the device class."""
return DEVICE_CLASS_PRESENCE return DEVICE_CLASS_OCCUPANCY

View file

@ -1,7 +1,7 @@
"""Constants used by Home Assistant components.""" """Constants used by Home Assistant components."""
MAJOR_VERSION = 0 MAJOR_VERSION = 0
MINOR_VERSION = 112 MINOR_VERSION = 112
PATCH_VERSION = "3" PATCH_VERSION = "4"
__short_version__ = f"{MAJOR_VERSION}.{MINOR_VERSION}" __short_version__ = f"{MAJOR_VERSION}.{MINOR_VERSION}"
__version__ = f"{__short_version__}.{PATCH_VERSION}" __version__ = f"{__short_version__}.{PATCH_VERSION}"
REQUIRED_PYTHON_VER = (3, 7, 0) REQUIRED_PYTHON_VER = (3, 7, 0)

View file

@ -26,6 +26,10 @@ SSDP = {
"deviceType": "urn:schemas-upnp-org:device:MediaRenderer:1", "deviceType": "urn:schemas-upnp-org:device:MediaRenderer:1",
"manufacturer": "DENON" "manufacturer": "DENON"
}, },
{
"deviceType": "urn:schemas-upnp-org:device:MediaRenderer:1",
"manufacturer": "DENON PROFESSIONAL"
},
{ {
"deviceType": "urn:schemas-upnp-org:device:MediaRenderer:1", "deviceType": "urn:schemas-upnp-org:device:MediaRenderer:1",
"manufacturer": "Marantz" "manufacturer": "Marantz"
@ -38,6 +42,10 @@ SSDP = {
"deviceType": "urn:schemas-upnp-org:device:MediaServer:1", "deviceType": "urn:schemas-upnp-org:device:MediaServer:1",
"manufacturer": "DENON" "manufacturer": "DENON"
}, },
{
"deviceType": "urn:schemas-upnp-org:device:MediaServer:1",
"manufacturer": "DENON PROFESSIONAL"
},
{ {
"deviceType": "urn:schemas-upnp-org:device:MediaServer:1", "deviceType": "urn:schemas-upnp-org:device:MediaServer:1",
"manufacturer": "Marantz" "manufacturer": "Marantz"
@ -50,6 +58,10 @@ SSDP = {
"deviceType": "urn:schemas-denon-com:device:AiosDevice:1", "deviceType": "urn:schemas-denon-com:device:AiosDevice:1",
"manufacturer": "DENON" "manufacturer": "DENON"
}, },
{
"deviceType": "urn:schemas-denon-com:device:AiosDevice:1",
"manufacturer": "DENON PROFESSIONAL"
},
{ {
"deviceType": "urn:schemas-denon-com:device:AiosDevice:1", "deviceType": "urn:schemas-denon-com:device:AiosDevice:1",
"manufacturer": "Marantz" "manufacturer": "Marantz"

View file

@ -200,7 +200,7 @@ aioimaplib==0.7.15
aiokafka==0.5.1 aiokafka==0.5.1
# homeassistant.components.kef # homeassistant.components.kef
aiokef==0.2.12 aiokef==0.2.13
# homeassistant.components.lifx # homeassistant.components.lifx
aiolifx==0.6.7 aiolifx==0.6.7
@ -475,7 +475,7 @@ defusedxml==0.6.0
deluge-client==1.7.1 deluge-client==1.7.1
# homeassistant.components.denonavr # homeassistant.components.denonavr
denonavr==0.9.3 denonavr==0.9.4
# homeassistant.components.devolo_home_control # homeassistant.components.devolo_home_control
devolo-home-control-api==0.11.0 devolo-home-control-api==0.11.0
@ -1050,7 +1050,7 @@ panasonic_viera==0.3.5
pcal9535a==0.7 pcal9535a==0.7
# homeassistant.components.dunehd # homeassistant.components.dunehd
pdunehd==1.3.1 pdunehd==1.3.2
# homeassistant.components.pencom # homeassistant.components.pencom
pencompy==0.0.3 pencompy==0.0.3
@ -1610,7 +1610,7 @@ pysignalclirestapi==0.3.4
pysma==0.3.5 pysma==0.3.5
# homeassistant.components.smappee # homeassistant.components.smappee
pysmappee==0.1.2 pysmappee==0.1.4
# homeassistant.components.smartthings # homeassistant.components.smartthings
pysmartapp==0.3.2 pysmartapp==0.3.2
@ -2003,7 +2003,7 @@ somecomfort==0.5.2
somfy-mylink-synergy==1.0.6 somfy-mylink-synergy==1.0.6
# homeassistant.components.sonarr # homeassistant.components.sonarr
sonarr==0.2.2 sonarr==0.2.3
# homeassistant.components.marytts # homeassistant.components.marytts
speak2mary==1.4.0 speak2mary==1.4.0

View file

@ -227,7 +227,7 @@ debugpy==1.0.0b11
defusedxml==0.6.0 defusedxml==0.6.0
# homeassistant.components.denonavr # homeassistant.components.denonavr
denonavr==0.9.3 denonavr==0.9.4
# homeassistant.components.devolo_home_control # homeassistant.components.devolo_home_control
devolo-home-control-api==0.11.0 devolo-home-control-api==0.11.0
@ -461,7 +461,7 @@ paho-mqtt==1.5.0
panasonic_viera==0.3.5 panasonic_viera==0.3.5
# homeassistant.components.dunehd # homeassistant.components.dunehd
pdunehd==1.3.1 pdunehd==1.3.2
# homeassistant.components.aruba # homeassistant.components.aruba
# homeassistant.components.cisco_ios # homeassistant.components.cisco_ios
@ -715,7 +715,7 @@ pysignalclirestapi==0.3.4
pysma==0.3.5 pysma==0.3.5
# homeassistant.components.smappee # homeassistant.components.smappee
pysmappee==0.1.2 pysmappee==0.1.4
# homeassistant.components.smartthings # homeassistant.components.smartthings
pysmartapp==0.3.2 pysmartapp==0.3.2
@ -853,7 +853,7 @@ solaredge==0.0.2
somecomfort==0.5.2 somecomfort==0.5.2
# homeassistant.components.sonarr # homeassistant.components.sonarr
sonarr==0.2.2 sonarr==0.2.3
# homeassistant.components.marytts # homeassistant.components.marytts
speak2mary==1.4.0 speak2mary==1.4.0

View file

@ -28,6 +28,28 @@ async def test_send_magic_packet(hass):
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 assert mocked_wakeonlan.mock_calls[-1][2]["port"] == bc_port
await hass.services.async_call(
DOMAIN,
SERVICE_SEND_MAGIC_PACKET,
{"mac": mac, "broadcast_address": bc_ip},
blocking=True,
)
assert len(mocked_wakeonlan.mock_calls) == 2
assert mocked_wakeonlan.mock_calls[-1][1][0] == mac
assert mocked_wakeonlan.mock_calls[-1][2]["ip_address"] == bc_ip
assert "port" not in mocked_wakeonlan.mock_calls[-1][2]
await hass.services.async_call(
DOMAIN,
SERVICE_SEND_MAGIC_PACKET,
{"mac": mac, "broadcast_port": bc_port},
blocking=True,
)
assert len(mocked_wakeonlan.mock_calls) == 3
assert mocked_wakeonlan.mock_calls[-1][1][0] == mac
assert mocked_wakeonlan.mock_calls[-1][2]["port"] == bc_port
assert "ip_address" not in mocked_wakeonlan.mock_calls[-1][2]
with pytest.raises(vol.Invalid): with pytest.raises(vol.Invalid):
await hass.services.async_call( await hass.services.async_call(
DOMAIN, DOMAIN,
@ -35,11 +57,11 @@ async def test_send_magic_packet(hass):
{"broadcast_address": bc_ip}, {"broadcast_address": bc_ip},
blocking=True, blocking=True,
) )
assert len(mocked_wakeonlan.mock_calls) == 1 assert len(mocked_wakeonlan.mock_calls) == 3
await hass.services.async_call( await hass.services.async_call(
DOMAIN, SERVICE_SEND_MAGIC_PACKET, {"mac": mac}, blocking=True DOMAIN, SERVICE_SEND_MAGIC_PACKET, {"mac": mac}, blocking=True
) )
assert len(mocked_wakeonlan.mock_calls) == 2 assert len(mocked_wakeonlan.mock_calls) == 4
assert mocked_wakeonlan.mock_calls[-1][1][0] == mac assert mocked_wakeonlan.mock_calls[-1][1][0] == mac
assert not mocked_wakeonlan.mock_calls[-1][2] assert not mocked_wakeonlan.mock_calls[-1][2]

View file

@ -5,18 +5,13 @@ import homeassistant.components.switch as switch
from homeassistant.const import STATE_OFF, STATE_ON from homeassistant.const import STATE_OFF, STATE_ON
from homeassistant.setup import setup_component from homeassistant.setup import setup_component
from tests.async_mock import patch from tests.async_mock import Mock, patch
from tests.common import get_test_home_assistant, mock_service from tests.common import get_test_home_assistant, mock_service
from tests.components.switch import common from tests.components.switch import common
TEST_STATE = None TEST_STATE = None
def send_magic_packet(*macs, **kwargs):
"""Fake call for sending magic packets."""
return
def call(cmd, stdout, stderr): def call(cmd, stdout, stderr):
"""Return fake subprocess return codes.""" """Return fake subprocess return codes."""
if cmd[5] == "validhostname" and TEST_STATE: if cmd[5] == "validhostname" and TEST_STATE:
@ -32,6 +27,8 @@ def system():
class TestWolSwitch(unittest.TestCase): class TestWolSwitch(unittest.TestCase):
"""Test the wol switch.""" """Test the wol switch."""
send_magic_packet = Mock(return_value=None)
def setUp(self): def setUp(self):
"""Set up things to be run when tests are started.""" """Set up things to be run when tests are started."""
self.hass = get_test_home_assistant() self.hass = get_test_home_assistant()
@ -116,17 +113,22 @@ class TestWolSwitch(unittest.TestCase):
@patch("wakeonlan.send_magic_packet", new=send_magic_packet) @patch("wakeonlan.send_magic_packet", new=send_magic_packet)
@patch("subprocess.call", new=call) @patch("subprocess.call", new=call)
def test_broadcast_config(self): def test_broadcast_config_ip_and_port(self):
"""Test with broadcast address config.""" """Test with broadcast address and broadcast port config."""
mac = "00-01-02-03-04-05"
broadcast_address = "255.255.255.255"
port = 999
assert setup_component( assert setup_component(
self.hass, self.hass,
switch.DOMAIN, switch.DOMAIN,
{ {
"switch": { "switch": {
"platform": "wake_on_lan", "platform": "wake_on_lan",
"mac": "00-01-02-03-04-05", "mac": mac,
"broadcast_address": "255.255.255.255", "broadcast_address": broadcast_address,
"broadcast_port": 999, "broadcast_port": port,
} }
}, },
) )
@ -138,6 +140,68 @@ class TestWolSwitch(unittest.TestCase):
common.turn_on(self.hass, "switch.wake_on_lan") common.turn_on(self.hass, "switch.wake_on_lan")
self.hass.block_till_done() self.hass.block_till_done()
self.send_magic_packet.assert_called_with(
mac, ip_address=broadcast_address, port=port
)
@patch("wakeonlan.send_magic_packet", new=send_magic_packet)
@patch("subprocess.call", new=call)
def test_broadcast_config_ip(self):
"""Test with only broadcast address."""
mac = "00-01-02-03-04-05"
broadcast_address = "255.255.255.255"
assert setup_component(
self.hass,
switch.DOMAIN,
{
"switch": {
"platform": "wake_on_lan",
"mac": mac,
"broadcast_address": broadcast_address,
}
},
)
self.hass.block_till_done()
state = self.hass.states.get("switch.wake_on_lan")
assert STATE_OFF == state.state
common.turn_on(self.hass, "switch.wake_on_lan")
self.hass.block_till_done()
self.send_magic_packet.assert_called_with(mac, ip_address=broadcast_address)
@patch("wakeonlan.send_magic_packet", new=send_magic_packet)
@patch("subprocess.call", new=call)
def test_broadcast_config_port(self):
"""Test with only broadcast port config."""
mac = "00-01-02-03-04-05"
port = 999
assert setup_component(
self.hass,
switch.DOMAIN,
{
"switch": {
"platform": "wake_on_lan",
"mac": mac,
"broadcast_port": port,
}
},
)
self.hass.block_till_done()
state = self.hass.states.get("switch.wake_on_lan")
assert STATE_OFF == state.state
common.turn_on(self.hass, "switch.wake_on_lan")
self.hass.block_till_done()
self.send_magic_packet.assert_called_with(mac, port=port)
@patch("wakeonlan.send_magic_packet", new=send_magic_packet) @patch("wakeonlan.send_magic_packet", new=send_magic_packet)
@patch("subprocess.call", new=call) @patch("subprocess.call", new=call)
def test_off_script(self): def test_off_script(self):