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.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 .const import (
AID_STORAGE,
@ -441,9 +455,6 @@ class HomeKit:
def setup(self, zeroconf_instance):
"""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)
ip_addr = self._ip_address or get_local_ip()
persist_file = get_persist_fullpath_for_entry_id(self.hass, self._entry_id)
@ -590,7 +601,7 @@ class HomeKit:
bridged_states.append(state)
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)
self.hass.add_job(self.driver.start_service)
self.status = STATUS_RUNNING
@ -639,34 +650,20 @@ class HomeKit:
for device_id in devices_to_purge:
dev_reg.async_remove_device(device_id)
def _start(self, bridged_states):
# pylint: disable=unused-import, import-outside-toplevel
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,
)
async def _async_start(self, entity_states):
"""Start the accessory."""
if self._homekit_mode == HOMEKIT_MODE_ACCESSORY:
state = bridged_states[0]
state = entity_states[0]
conf = self._config.pop(state.entity_id, {})
acc = get_accessory(self.hass, self.driver, state, STANDALONE_AID, conf)
self.driver.add_accessory(acc)
else:
from .accessories import HomeBridge
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.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:
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")
zeroconf_mock = MagicMock()
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:
mock_ip.return_value = IP_ADDRESS
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()
path = get_persist_fullpath_for_entry_id(hass, entry.entry_id)
with patch(
f"{PATH_HOMEKIT}.accessories.HomeDriver", return_value=hk_driver
) as mock_driver:
with patch(f"{PATH_HOMEKIT}.HomeDriver", return_value=hk_driver) as mock_driver:
await hass.async_add_executor_job(homekit.setup, mock_zeroconf)
mock_driver.assert_called_with(
hass,
@ -283,9 +281,7 @@ async def test_homekit_setup_advertise_ip(hass, hk_driver, mock_zeroconf):
zeroconf_instance = MagicMock()
path = get_persist_fullpath_for_entry_id(hass, entry.entry_id)
with patch(
f"{PATH_HOMEKIT}.accessories.HomeDriver", return_value=hk_driver
) as mock_driver:
with patch(f"{PATH_HOMEKIT}.HomeDriver", return_value=hk_driver) as mock_driver:
await hass.async_add_executor_job(homekit.setup, zeroconf_instance)
mock_driver.assert_called_with(
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(
"pyhap.accessory_driver.AccessoryDriver.add_accessory"
), 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 hass.async_block_till_done()