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]
if remaining:
_LOGGER.info(
_LOGGER.warning(
"Waiting on integrations to complete setup: %s", ", ".join(remaining),
)

View file

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

View file

@ -3,7 +3,7 @@
"name": "Denon AVR Network Receivers",
"config_flow": true,
"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"],
"ssdp": [
{
@ -14,6 +14,10 @@
"manufacturer": "DENON",
"deviceType": "urn:schemas-upnp-org:device:MediaRenderer:1"
},
{
"manufacturer": "DENON PROFESSIONAL",
"deviceType": "urn:schemas-upnp-org:device:MediaRenderer:1"
},
{
"manufacturer": "Marantz",
"deviceType": "urn:schemas-upnp-org:device:MediaRenderer:1"
@ -26,6 +30,10 @@
"manufacturer": "DENON",
"deviceType": "urn:schemas-upnp-org:device:MediaServer:1"
},
{
"manufacturer": "DENON PROFESSIONAL",
"deviceType": "urn:schemas-upnp-org:device:MediaServer:1"
},
{
"manufacturer": "Marantz",
"deviceType": "urn:schemas-upnp-org:device:MediaServer:1"
@ -38,6 +46,10 @@
"manufacturer": "DENON",
"deviceType": "urn:schemas-denon-com:device:AiosDevice:1"
},
{
"manufacturer": "DENON PROFESSIONAL",
"deviceType": "urn:schemas-denon-com:device:AiosDevice:1"
},
{
"manufacturer": "Marantz",
"deviceType": "urn:schemas-denon-com:device:AiosDevice:1"

View file

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

View file

@ -3,5 +3,5 @@
"name": "KEF",
"documentation": "https://www.home-assistant.io/integrations/kef",
"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",
"dependencies": ["http"],
"requirements": [
"pysmappee==0.1.2"
"pysmappee==0.1.4"
],
"codeowners": [
"@bsmappee"

View file

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

View file

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

View file

@ -31,23 +31,23 @@ async def async_setup(hass, config):
mac_address = call.data.get(CONF_MAC)
broadcast_address = call.data.get(CONF_BROADCAST_ADDRESS)
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(
"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(
partial(
wakeonlan.send_magic_packet,
mac_address,
ip_address=broadcast_address,
port=broadcast_port,
partial(wakeonlan.send_magic_packet, mac_address, **service_kwargs)
)
)
else:
await hass.async_add_job(partial(wakeonlan.send_magic_packet, mac_address))
hass.services.async_register(
DOMAIN,

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -227,7 +227,7 @@ debugpy==1.0.0b11
defusedxml==0.6.0
# homeassistant.components.denonavr
denonavr==0.9.3
denonavr==0.9.4
# homeassistant.components.devolo_home_control
devolo-home-control-api==0.11.0
@ -461,7 +461,7 @@ paho-mqtt==1.5.0
panasonic_viera==0.3.5
# homeassistant.components.dunehd
pdunehd==1.3.1
pdunehd==1.3.2
# homeassistant.components.aruba
# homeassistant.components.cisco_ios
@ -715,7 +715,7 @@ pysignalclirestapi==0.3.4
pysma==0.3.5
# homeassistant.components.smappee
pysmappee==0.1.2
pysmappee==0.1.4
# homeassistant.components.smartthings
pysmartapp==0.3.2
@ -853,7 +853,7 @@ solaredge==0.0.2
somecomfort==0.5.2
# homeassistant.components.sonarr
sonarr==0.2.2
sonarr==0.2.3
# homeassistant.components.marytts
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]["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):
await hass.services.async_call(
DOMAIN,
@ -35,11 +57,11 @@ async def test_send_magic_packet(hass):
{"broadcast_address": bc_ip},
blocking=True,
)
assert len(mocked_wakeonlan.mock_calls) == 1
assert len(mocked_wakeonlan.mock_calls) == 3
await hass.services.async_call(
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 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.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.components.switch import common
TEST_STATE = None
def send_magic_packet(*macs, **kwargs):
"""Fake call for sending magic packets."""
return
def call(cmd, stdout, stderr):
"""Return fake subprocess return codes."""
if cmd[5] == "validhostname" and TEST_STATE:
@ -32,6 +27,8 @@ def system():
class TestWolSwitch(unittest.TestCase):
"""Test the wol switch."""
send_magic_packet = Mock(return_value=None)
def setUp(self):
"""Set up things to be run when tests are started."""
self.hass = get_test_home_assistant()
@ -116,17 +113,22 @@ class TestWolSwitch(unittest.TestCase):
@patch("wakeonlan.send_magic_packet", new=send_magic_packet)
@patch("subprocess.call", new=call)
def test_broadcast_config(self):
"""Test with broadcast address config."""
def test_broadcast_config_ip_and_port(self):
"""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(
self.hass,
switch.DOMAIN,
{
"switch": {
"platform": "wake_on_lan",
"mac": "00-01-02-03-04-05",
"broadcast_address": "255.255.255.255",
"broadcast_port": 999,
"mac": mac,
"broadcast_address": broadcast_address,
"broadcast_port": port,
}
},
)
@ -138,6 +140,68 @@ class TestWolSwitch(unittest.TestCase):
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, 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("subprocess.call", new=call)
def test_off_script(self):