Move homekit accessory creation to async (#45788)

This commit is contained in:
J. Nick Koston 2021-01-31 11:36:19 -10:00 committed by GitHub
parent 73d7d80731
commit 385b7e17ef
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 34 deletions

View file

@ -42,7 +42,21 @@ from homeassistant.helpers.reload import async_integration_yaml_config
from homeassistant.loader import IntegrationNotFound, async_get_integration from homeassistant.loader import IntegrationNotFound, async_get_integration
from homeassistant.util import get_local_ip from homeassistant.util import get_local_ip
from .accessories import get_accessory # pylint: disable=unused-import
from . import ( # noqa: F401
type_cameras,
type_covers,
type_fans,
type_humidifiers,
type_lights,
type_locks,
type_media_players,
type_security_systems,
type_sensors,
type_switches,
type_thermostats,
)
from .accessories import HomeBridge, HomeDriver, get_accessory
from .aidmanager import AccessoryAidStorage from .aidmanager import AccessoryAidStorage
from .const import ( from .const import (
AID_STORAGE, AID_STORAGE,
@ -441,9 +455,6 @@ class HomeKit:
def setup(self, zeroconf_instance): def setup(self, zeroconf_instance):
"""Set up bridge and accessory driver.""" """Set up bridge and accessory driver."""
# pylint: disable=import-outside-toplevel
from .accessories import HomeDriver
self.hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, self.async_stop) self.hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, self.async_stop)
ip_addr = self._ip_address or get_local_ip() ip_addr = self._ip_address or get_local_ip()
persist_file = get_persist_fullpath_for_entry_id(self.hass, self._entry_id) persist_file = get_persist_fullpath_for_entry_id(self.hass, self._entry_id)
@ -590,7 +601,7 @@ class HomeKit:
bridged_states.append(state) bridged_states.append(state)
self._async_register_bridge(dev_reg) self._async_register_bridge(dev_reg)
await self.hass.async_add_executor_job(self._start, bridged_states) await self._async_start(bridged_states)
_LOGGER.debug("Driver start for %s", self._name) _LOGGER.debug("Driver start for %s", self._name)
self.hass.add_job(self.driver.start_service) self.hass.add_job(self.driver.start_service)
self.status = STATUS_RUNNING self.status = STATUS_RUNNING
@ -639,34 +650,20 @@ class HomeKit:
for device_id in devices_to_purge: for device_id in devices_to_purge:
dev_reg.async_remove_device(device_id) dev_reg.async_remove_device(device_id)
def _start(self, bridged_states): async def _async_start(self, entity_states):
# pylint: disable=unused-import, import-outside-toplevel """Start the accessory."""
from . import ( # noqa: F401
type_cameras,
type_covers,
type_fans,
type_humidifiers,
type_lights,
type_locks,
type_media_players,
type_security_systems,
type_sensors,
type_switches,
type_thermostats,
)
if self._homekit_mode == HOMEKIT_MODE_ACCESSORY: if self._homekit_mode == HOMEKIT_MODE_ACCESSORY:
state = bridged_states[0] state = entity_states[0]
conf = self._config.pop(state.entity_id, {}) conf = self._config.pop(state.entity_id, {})
acc = get_accessory(self.hass, self.driver, state, STANDALONE_AID, conf) acc = get_accessory(self.hass, self.driver, state, STANDALONE_AID, conf)
self.driver.add_accessory(acc) self.driver.add_accessory(acc)
else: else:
from .accessories import HomeBridge
self.bridge = HomeBridge(self.hass, self.driver, self._name) self.bridge = HomeBridge(self.hass, self.driver, self._name)
for state in bridged_states: for state in entity_states:
self.add_bridge_accessory(state) self.add_bridge_accessory(state)
self.driver.add_accessory(self.bridge) acc = self.bridge
await self.hass.async_add_executor_job(self.driver.add_accessory, acc)
if not self.driver.state.paired: if not self.driver.state.paired:
show_setup_message( show_setup_message(

View file

@ -201,7 +201,7 @@ async def test_homekit_setup(hass, hk_driver, mock_zeroconf):
hass.states.async_set("light.demo2", "on") hass.states.async_set("light.demo2", "on")
zeroconf_mock = MagicMock() zeroconf_mock = MagicMock()
with patch( with patch(
f"{PATH_HOMEKIT}.accessories.HomeDriver", return_value=hk_driver f"{PATH_HOMEKIT}.HomeDriver", return_value=hk_driver
) as mock_driver, patch("homeassistant.util.get_local_ip") as mock_ip: ) as mock_driver, patch("homeassistant.util.get_local_ip") as mock_ip:
mock_ip.return_value = IP_ADDRESS mock_ip.return_value = IP_ADDRESS
await hass.async_add_executor_job(homekit.setup, zeroconf_mock) await hass.async_add_executor_job(homekit.setup, zeroconf_mock)
@ -245,9 +245,7 @@ async def test_homekit_setup_ip_address(hass, hk_driver, mock_zeroconf):
mock_zeroconf = MagicMock() mock_zeroconf = MagicMock()
path = get_persist_fullpath_for_entry_id(hass, entry.entry_id) path = get_persist_fullpath_for_entry_id(hass, entry.entry_id)
with patch( with patch(f"{PATH_HOMEKIT}.HomeDriver", return_value=hk_driver) as mock_driver:
f"{PATH_HOMEKIT}.accessories.HomeDriver", return_value=hk_driver
) as mock_driver:
await hass.async_add_executor_job(homekit.setup, mock_zeroconf) await hass.async_add_executor_job(homekit.setup, mock_zeroconf)
mock_driver.assert_called_with( mock_driver.assert_called_with(
hass, hass,
@ -283,9 +281,7 @@ async def test_homekit_setup_advertise_ip(hass, hk_driver, mock_zeroconf):
zeroconf_instance = MagicMock() zeroconf_instance = MagicMock()
path = get_persist_fullpath_for_entry_id(hass, entry.entry_id) path = get_persist_fullpath_for_entry_id(hass, entry.entry_id)
with patch( with patch(f"{PATH_HOMEKIT}.HomeDriver", return_value=hk_driver) as mock_driver:
f"{PATH_HOMEKIT}.accessories.HomeDriver", return_value=hk_driver
) as mock_driver:
await hass.async_add_executor_job(homekit.setup, zeroconf_instance) await hass.async_add_executor_job(homekit.setup, zeroconf_instance)
mock_driver.assert_called_with( mock_driver.assert_called_with(
hass, hass,
@ -735,7 +731,7 @@ async def test_homekit_too_many_accessories(hass, hk_driver, caplog, mock_zeroco
with patch("pyhap.accessory_driver.AccessoryDriver.start_service"), patch( with patch("pyhap.accessory_driver.AccessoryDriver.start_service"), patch(
"pyhap.accessory_driver.AccessoryDriver.add_accessory" "pyhap.accessory_driver.AccessoryDriver.add_accessory"
), patch(f"{PATH_HOMEKIT}.show_setup_message"), patch( ), patch(f"{PATH_HOMEKIT}.show_setup_message"), patch(
f"{PATH_HOMEKIT}.accessories.HomeBridge", _mock_bridge f"{PATH_HOMEKIT}.HomeBridge", _mock_bridge
): ):
await homekit.async_start() await homekit.async_start()
await hass.async_block_till_done() await hass.async_block_till_done()