mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 11:17:21 +00:00
Merge pull request #40243 from home-assistant/rc
This commit is contained in:
commit
bf741c1b26
@ -29,8 +29,11 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
|
|||||||
def get_service(hass, config, discovery_info=None):
|
def get_service(hass, config, discovery_info=None):
|
||||||
"""Get the Apprise notification service."""
|
"""Get the Apprise notification service."""
|
||||||
|
|
||||||
# Create our object
|
# Create our Apprise Asset Object
|
||||||
a_obj = apprise.Apprise()
|
asset = apprise.AppriseAsset(async_mode=False)
|
||||||
|
|
||||||
|
# Create our Apprise Instance (reference our asset)
|
||||||
|
a_obj = apprise.Apprise(asset=asset)
|
||||||
|
|
||||||
if config.get(CONF_FILE):
|
if config.get(CONF_FILE):
|
||||||
# Sourced from a Configuration File
|
# Sourced from a Configuration File
|
||||||
|
@ -1,12 +1,15 @@
|
|||||||
"""Support for fetching data from Broadlink devices."""
|
"""Support for fetching data from Broadlink devices."""
|
||||||
from abc import ABC, abstractmethod
|
from abc import ABC, abstractmethod
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
|
from functools import partial
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
import broadlink as blk
|
||||||
from broadlink.exceptions import (
|
from broadlink.exceptions import (
|
||||||
AuthorizationError,
|
AuthorizationError,
|
||||||
BroadlinkException,
|
BroadlinkException,
|
||||||
CommandNotSupportedError,
|
CommandNotSupportedError,
|
||||||
|
DeviceOfflineError,
|
||||||
StorageError,
|
StorageError,
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -18,6 +21,9 @@ _LOGGER = logging.getLogger(__name__)
|
|||||||
|
|
||||||
def get_update_manager(device):
|
def get_update_manager(device):
|
||||||
"""Return an update manager for a given Broadlink device."""
|
"""Return an update manager for a given Broadlink device."""
|
||||||
|
if device.api.model.startswith("RM mini"):
|
||||||
|
return BroadlinkRMMini3UpdateManager(device)
|
||||||
|
|
||||||
update_managers = {
|
update_managers = {
|
||||||
"A1": BroadlinkA1UpdateManager,
|
"A1": BroadlinkA1UpdateManager,
|
||||||
"MP1": BroadlinkMP1UpdateManager,
|
"MP1": BroadlinkMP1UpdateManager,
|
||||||
@ -95,6 +101,22 @@ class BroadlinkMP1UpdateManager(BroadlinkUpdateManager):
|
|||||||
return await self.device.async_request(self.device.api.check_power)
|
return await self.device.async_request(self.device.api.check_power)
|
||||||
|
|
||||||
|
|
||||||
|
class BroadlinkRMMini3UpdateManager(BroadlinkUpdateManager):
|
||||||
|
"""Manages updates for Broadlink RM mini 3 devices."""
|
||||||
|
|
||||||
|
async def async_fetch_data(self):
|
||||||
|
"""Fetch data from the device."""
|
||||||
|
hello = partial(
|
||||||
|
blk.discover,
|
||||||
|
discover_ip_address=self.device.api.host[0],
|
||||||
|
timeout=self.device.api.timeout,
|
||||||
|
)
|
||||||
|
devices = await self.device.hass.async_add_executor_job(hello)
|
||||||
|
if not devices:
|
||||||
|
raise DeviceOfflineError("The device is offline")
|
||||||
|
return {}
|
||||||
|
|
||||||
|
|
||||||
class BroadlinkRMUpdateManager(BroadlinkUpdateManager):
|
class BroadlinkRMUpdateManager(BroadlinkUpdateManager):
|
||||||
"""Manages updates for Broadlink RM2 and RM4 devices."""
|
"""Manages updates for Broadlink RM2 and RM4 devices."""
|
||||||
|
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"name": "CoolMasterNet",
|
"name": "CoolMasterNet",
|
||||||
"config_flow": true,
|
"config_flow": true,
|
||||||
"documentation": "https://www.home-assistant.io/integrations/coolmaster",
|
"documentation": "https://www.home-assistant.io/integrations/coolmaster",
|
||||||
"requirements": ["pycoolmasternet-async==0.1.1"],
|
"requirements": ["pycoolmasternet-async==0.1.2"],
|
||||||
"codeowners": ["@OnFreund"]
|
"codeowners": ["@OnFreund"]
|
||||||
}
|
}
|
||||||
|
@ -714,7 +714,7 @@ class KodiEntity(MediaPlayerEntity):
|
|||||||
_LOGGER.debug("Run API method %s, kwargs=%s", method, kwargs)
|
_LOGGER.debug("Run API method %s, kwargs=%s", method, kwargs)
|
||||||
result_ok = False
|
result_ok = False
|
||||||
try:
|
try:
|
||||||
result = self._kodi.call_method(method, **kwargs)
|
result = await self._kodi.call_method(method, **kwargs)
|
||||||
result_ok = True
|
result_ok = True
|
||||||
except jsonrpc_base.jsonrpc.ProtocolError as exc:
|
except jsonrpc_base.jsonrpc.ProtocolError as exc:
|
||||||
result = exc.args[2]["error"]
|
result = exc.args[2]["error"]
|
||||||
|
@ -100,7 +100,6 @@ def setup(hass, config):
|
|||||||
_LOGGER.error("Nextcloud setup failed - Check configuration")
|
_LOGGER.error("Nextcloud setup failed - Check configuration")
|
||||||
|
|
||||||
hass.data[DOMAIN] = get_data_points(ncm.data)
|
hass.data[DOMAIN] = get_data_points(ncm.data)
|
||||||
hass.data[DOMAIN]["instance"] = conf[CONF_URL]
|
|
||||||
|
|
||||||
def nextcloud_update(event_time):
|
def nextcloud_update(event_time):
|
||||||
"""Update data from nextcloud api."""
|
"""Update data from nextcloud api."""
|
||||||
@ -111,6 +110,7 @@ def setup(hass, config):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
hass.data[DOMAIN] = get_data_points(ncm.data)
|
hass.data[DOMAIN] = get_data_points(ncm.data)
|
||||||
|
hass.data[DOMAIN]["instance"] = conf[CONF_URL]
|
||||||
|
|
||||||
# Update sensors on time interval
|
# Update sensors on time interval
|
||||||
track_time_interval(hass, nextcloud_update, conf[CONF_SCAN_INTERVAL])
|
track_time_interval(hass, nextcloud_update, conf[CONF_SCAN_INTERVAL])
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
"config_flow": true,
|
"config_flow": true,
|
||||||
"documentation": "https://www.home-assistant.io/integrations/risco",
|
"documentation": "https://www.home-assistant.io/integrations/risco",
|
||||||
"requirements": [
|
"requirements": [
|
||||||
"pyrisco==0.3.0"
|
"pyrisco==0.3.1"
|
||||||
],
|
],
|
||||||
"codeowners": [
|
"codeowners": [
|
||||||
"@OnFreund"
|
"@OnFreund"
|
||||||
|
@ -2,6 +2,6 @@
|
|||||||
"domain": "velux",
|
"domain": "velux",
|
||||||
"name": "Velux",
|
"name": "Velux",
|
||||||
"documentation": "https://www.home-assistant.io/integrations/velux",
|
"documentation": "https://www.home-assistant.io/integrations/velux",
|
||||||
"requirements": ["pyvlx==0.2.16"],
|
"requirements": ["pyvlx==0.2.17"],
|
||||||
"codeowners": ["@Julius2342"]
|
"codeowners": ["@Julius2342"]
|
||||||
}
|
}
|
||||||
|
@ -94,7 +94,7 @@ async def async_unload_entry(
|
|||||||
and entry.data[CONF_DEVICE_CLASS] == DEVICE_CLASS_TV
|
and entry.data[CONF_DEVICE_CLASS] == DEVICE_CLASS_TV
|
||||||
for entry in hass.config_entries.async_entries(DOMAIN)
|
for entry in hass.config_entries.async_entries(DOMAIN)
|
||||||
):
|
):
|
||||||
hass.data[DOMAIN].pop(CONF_APPS)
|
hass.data[DOMAIN].pop(CONF_APPS, None)
|
||||||
|
|
||||||
if not hass.data[DOMAIN]:
|
if not hass.data[DOMAIN]:
|
||||||
hass.data.pop(DOMAIN)
|
hass.data.pop(DOMAIN)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
"""Constants used by Home Assistant components."""
|
"""Constants used by Home Assistant components."""
|
||||||
MAJOR_VERSION = 0
|
MAJOR_VERSION = 0
|
||||||
MINOR_VERSION = 115
|
MINOR_VERSION = 115
|
||||||
PATCH_VERSION = "0"
|
PATCH_VERSION = "1"
|
||||||
__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, 1)
|
REQUIRED_PYTHON_VER = (3, 7, 1)
|
||||||
|
@ -525,6 +525,11 @@ class _TrackTemplateResultInfo:
|
|||||||
|
|
||||||
self._last_info = self._info.copy()
|
self._last_info = self._info.copy()
|
||||||
self._create_listeners()
|
self._create_listeners()
|
||||||
|
_LOGGER.debug(
|
||||||
|
"Template group %s listens for %s",
|
||||||
|
self._track_templates,
|
||||||
|
self.listeners,
|
||||||
|
)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def listeners(self) -> Dict:
|
def listeners(self) -> Dict:
|
||||||
@ -683,6 +688,10 @@ class _TrackTemplateResultInfo:
|
|||||||
):
|
):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
_LOGGER.debug(
|
||||||
|
"Template update %s triggered by event: %s", template.template, event
|
||||||
|
)
|
||||||
|
|
||||||
self._info[template] = template.async_render_to_info(
|
self._info[template] = template.async_render_to_info(
|
||||||
track_template_.variables
|
track_template_.variables
|
||||||
)
|
)
|
||||||
@ -708,6 +717,11 @@ class _TrackTemplateResultInfo:
|
|||||||
|
|
||||||
if info_changed:
|
if info_changed:
|
||||||
self._update_listeners()
|
self._update_listeners()
|
||||||
|
_LOGGER.debug(
|
||||||
|
"Template group %s listens for %s",
|
||||||
|
self._track_templates,
|
||||||
|
self.listeners,
|
||||||
|
)
|
||||||
self._last_info = self._info.copy()
|
self._last_info = self._info.copy()
|
||||||
|
|
||||||
if not updates:
|
if not updates:
|
||||||
|
@ -1277,7 +1277,7 @@ pycocotools==2.0.1
|
|||||||
pycomfoconnect==0.3
|
pycomfoconnect==0.3
|
||||||
|
|
||||||
# homeassistant.components.coolmaster
|
# homeassistant.components.coolmaster
|
||||||
pycoolmasternet-async==0.1.1
|
pycoolmasternet-async==0.1.2
|
||||||
|
|
||||||
# homeassistant.components.avri
|
# homeassistant.components.avri
|
||||||
pycountry==19.8.18
|
pycountry==19.8.18
|
||||||
@ -1595,7 +1595,7 @@ pyrecswitch==1.0.2
|
|||||||
pyrepetier==3.0.5
|
pyrepetier==3.0.5
|
||||||
|
|
||||||
# homeassistant.components.risco
|
# homeassistant.components.risco
|
||||||
pyrisco==0.3.0
|
pyrisco==0.3.1
|
||||||
|
|
||||||
# homeassistant.components.sabnzbd
|
# homeassistant.components.sabnzbd
|
||||||
pysabnzbd==1.1.0
|
pysabnzbd==1.1.0
|
||||||
@ -1837,7 +1837,7 @@ pyvesync==1.1.0
|
|||||||
pyvizio==0.1.56
|
pyvizio==0.1.56
|
||||||
|
|
||||||
# homeassistant.components.velux
|
# homeassistant.components.velux
|
||||||
pyvlx==0.2.16
|
pyvlx==0.2.17
|
||||||
|
|
||||||
# homeassistant.components.volumio
|
# homeassistant.components.volumio
|
||||||
pyvolumio==0.1.2
|
pyvolumio==0.1.2
|
||||||
|
@ -616,7 +616,7 @@ pybotvac==0.0.17
|
|||||||
pychromecast==7.2.1
|
pychromecast==7.2.1
|
||||||
|
|
||||||
# homeassistant.components.coolmaster
|
# homeassistant.components.coolmaster
|
||||||
pycoolmasternet-async==0.1.1
|
pycoolmasternet-async==0.1.2
|
||||||
|
|
||||||
# homeassistant.components.avri
|
# homeassistant.components.avri
|
||||||
pycountry==19.8.18
|
pycountry==19.8.18
|
||||||
@ -769,7 +769,7 @@ pyps4-2ndscreen==1.1.1
|
|||||||
pyqwikswitch==0.93
|
pyqwikswitch==0.93
|
||||||
|
|
||||||
# homeassistant.components.risco
|
# homeassistant.components.risco
|
||||||
pyrisco==0.3.0
|
pyrisco==0.3.1
|
||||||
|
|
||||||
# homeassistant.components.acer_projector
|
# homeassistant.components.acer_projector
|
||||||
# homeassistant.components.zha
|
# homeassistant.components.zha
|
||||||
|
@ -85,6 +85,9 @@ class BroadlinkDevice:
|
|||||||
with patch(
|
with patch(
|
||||||
"homeassistant.components.broadlink.device.blk.gendevice",
|
"homeassistant.components.broadlink.device.blk.gendevice",
|
||||||
return_value=mock_api,
|
return_value=mock_api,
|
||||||
|
), patch(
|
||||||
|
"homeassistant.components.broadlink.updater.blk.discover",
|
||||||
|
return_value=[mock_api],
|
||||||
):
|
):
|
||||||
await hass.config_entries.async_setup(mock_entry.entry_id)
|
await hass.config_entries.async_setup(mock_entry.entry_id)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
@ -179,7 +179,7 @@ async def test_device_setup_update_authorization_error(hass):
|
|||||||
|
|
||||||
async def test_device_setup_update_authentication_error(hass):
|
async def test_device_setup_update_authentication_error(hass):
|
||||||
"""Test we handle an authentication error in the update step."""
|
"""Test we handle an authentication error in the update step."""
|
||||||
device = get_device("Living Room")
|
device = get_device("Garage")
|
||||||
mock_api = device.get_mock_api()
|
mock_api = device.get_mock_api()
|
||||||
mock_api.check_sensors.side_effect = blke.AuthorizationError()
|
mock_api.check_sensors.side_effect = blke.AuthorizationError()
|
||||||
mock_api.auth.side_effect = (None, blke.AuthenticationError())
|
mock_api.auth.side_effect = (None, blke.AuthenticationError())
|
||||||
@ -207,7 +207,7 @@ async def test_device_setup_update_authentication_error(hass):
|
|||||||
|
|
||||||
async def test_device_setup_update_broadlink_exception(hass):
|
async def test_device_setup_update_broadlink_exception(hass):
|
||||||
"""Test we handle a Broadlink exception in the update step."""
|
"""Test we handle a Broadlink exception in the update step."""
|
||||||
device = get_device("Living Room")
|
device = get_device("Garage")
|
||||||
mock_api = device.get_mock_api()
|
mock_api = device.get_mock_api()
|
||||||
mock_api.check_sensors.side_effect = blke.BroadlinkException()
|
mock_api.check_sensors.side_effect = blke.BroadlinkException()
|
||||||
mock_entry = device.get_mock_entry()
|
mock_entry = device.get_mock_entry()
|
||||||
|
@ -6,7 +6,7 @@ from homeassistant.components.vizio.const import DOMAIN
|
|||||||
from homeassistant.helpers.typing import HomeAssistantType
|
from homeassistant.helpers.typing import HomeAssistantType
|
||||||
from homeassistant.setup import async_setup_component
|
from homeassistant.setup import async_setup_component
|
||||||
|
|
||||||
from .const import MOCK_USER_VALID_TV_CONFIG, UNIQUE_ID
|
from .const import MOCK_SPEAKER_CONFIG, MOCK_USER_VALID_TV_CONFIG, UNIQUE_ID
|
||||||
|
|
||||||
from tests.common import MockConfigEntry
|
from tests.common import MockConfigEntry
|
||||||
|
|
||||||
@ -24,12 +24,12 @@ async def test_setup_component(
|
|||||||
assert len(hass.states.async_entity_ids(MP_DOMAIN)) == 1
|
assert len(hass.states.async_entity_ids(MP_DOMAIN)) == 1
|
||||||
|
|
||||||
|
|
||||||
async def test_load_and_unload(
|
async def test_tv_load_and_unload(
|
||||||
hass: HomeAssistantType,
|
hass: HomeAssistantType,
|
||||||
vizio_connect: pytest.fixture,
|
vizio_connect: pytest.fixture,
|
||||||
vizio_update: pytest.fixture,
|
vizio_update: pytest.fixture,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Test loading and unloading entry."""
|
"""Test loading and unloading TV entry."""
|
||||||
config_entry = MockConfigEntry(
|
config_entry = MockConfigEntry(
|
||||||
domain=DOMAIN, data=MOCK_USER_VALID_TV_CONFIG, unique_id=UNIQUE_ID
|
domain=DOMAIN, data=MOCK_USER_VALID_TV_CONFIG, unique_id=UNIQUE_ID
|
||||||
)
|
)
|
||||||
@ -43,3 +43,24 @@ async def test_load_and_unload(
|
|||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
assert len(hass.states.async_entity_ids(MP_DOMAIN)) == 0
|
assert len(hass.states.async_entity_ids(MP_DOMAIN)) == 0
|
||||||
assert DOMAIN not in hass.data
|
assert DOMAIN not in hass.data
|
||||||
|
|
||||||
|
|
||||||
|
async def test_speaker_load_and_unload(
|
||||||
|
hass: HomeAssistantType,
|
||||||
|
vizio_connect: pytest.fixture,
|
||||||
|
vizio_update: pytest.fixture,
|
||||||
|
) -> None:
|
||||||
|
"""Test loading and unloading speaker entry."""
|
||||||
|
config_entry = MockConfigEntry(
|
||||||
|
domain=DOMAIN, data=MOCK_SPEAKER_CONFIG, unique_id=UNIQUE_ID
|
||||||
|
)
|
||||||
|
config_entry.add_to_hass(hass)
|
||||||
|
assert await hass.config_entries.async_setup(config_entry.entry_id)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
assert len(hass.states.async_entity_ids(MP_DOMAIN)) == 1
|
||||||
|
assert DOMAIN in hass.data
|
||||||
|
|
||||||
|
assert await config_entry.async_unload(hass)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
assert len(hass.states.async_entity_ids(MP_DOMAIN)) == 0
|
||||||
|
assert DOMAIN not in hass.data
|
||||||
|
@ -541,7 +541,7 @@ async def test_track_template_error(hass, caplog):
|
|||||||
hass.states.async_set("switch.not_exist", "off")
|
hass.states.async_set("switch.not_exist", "off")
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
assert "lunch" not in caplog.text
|
assert "no filter named 'lunch'" not in caplog.text
|
||||||
assert "TemplateAssertionError" not in caplog.text
|
assert "TemplateAssertionError" not in caplog.text
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user