Use the main event loop for homekit (#37441)

* use hass.loop for homekit

* update calls for upstream pr

* Bump HAP-python to 2.9.2
This commit is contained in:
J. Nick Koston 2020-07-05 12:27:07 -05:00 committed by GitHub
parent 6ca476fe21
commit debb928b30
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 25 additions and 27 deletions

View file

@ -389,6 +389,7 @@ class HomeKit:
self.hass, self.hass,
self._entry_id, self._entry_id,
self._name, self._name,
loop=self.hass.loop,
address=ip_addr, address=ip_addr,
port=self._port, port=self._port,
persist_file=persist_file, persist_file=persist_file,
@ -498,6 +499,9 @@ class HomeKit:
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.hass.async_add_executor_job(self._start, bridged_states)
_LOGGER.debug("Driver start for %s", self._name)
self.hass.add_job(self.driver.start_service)
self.status = STATUS_RUNNING
@callback @callback
def _async_register_bridge(self, dev_reg): def _async_register_bridge(self, dev_reg):
@ -570,17 +574,13 @@ class HomeKit:
self.bridge.xhm_uri(), self.bridge.xhm_uri(),
) )
_LOGGER.debug("Driver start for %s", self._name)
self.hass.add_job(self.driver.start)
self.status = STATUS_RUNNING
async def async_stop(self, *args): async def async_stop(self, *args):
"""Stop the accessory driver.""" """Stop the accessory driver."""
if self.status != STATUS_RUNNING: if self.status != STATUS_RUNNING:
return return
self.status = STATUS_STOPPED self.status = STATUS_STOPPED
_LOGGER.debug("Driver stop for %s", self._name) _LOGGER.debug("Driver stop for %s", self._name)
self.hass.add_job(self.driver.stop) await self.driver.async_stop()
for acc in self.bridge.accessories.values(): for acc in self.bridge.accessories.values():
acc.async_stop() acc.async_stop()

View file

@ -3,7 +3,7 @@
"name": "HomeKit", "name": "HomeKit",
"documentation": "https://www.home-assistant.io/integrations/homekit", "documentation": "https://www.home-assistant.io/integrations/homekit",
"requirements": [ "requirements": [
"HAP-python==2.9.1", "HAP-python==2.9.2",
"fnvhash==0.1.0", "fnvhash==0.1.0",
"PyQRCode==1.2.1", "PyQRCode==1.2.1",
"base36==0.1.1", "base36==0.1.1",

View file

@ -36,7 +36,7 @@ Adafruit-SHT31==1.0.2
# Adafruit_BBIO==1.1.1 # Adafruit_BBIO==1.1.1
# homeassistant.components.homekit # homeassistant.components.homekit
HAP-python==2.9.1 HAP-python==2.9.2
# homeassistant.components.mastodon # homeassistant.components.mastodon
Mastodon.py==1.5.1 Mastodon.py==1.5.1

View file

@ -4,7 +4,7 @@
-r requirements_test.txt -r requirements_test.txt
# homeassistant.components.homekit # homeassistant.components.homekit
HAP-python==2.9.1 HAP-python==2.9.2
# homeassistant.components.plugwise # homeassistant.components.plugwise
Plugwise_Smile==1.1.0 Plugwise_Smile==1.1.0

View file

@ -210,6 +210,7 @@ async def test_homekit_setup(hass, hk_driver):
hass, hass,
entry.entry_id, entry.entry_id,
BRIDGE_NAME, BRIDGE_NAME,
loop=hass.loop,
address=IP_ADDRESS, address=IP_ADDRESS,
port=DEFAULT_PORT, port=DEFAULT_PORT,
persist_file=path, persist_file=path,
@ -251,6 +252,7 @@ async def test_homekit_setup_ip_address(hass, hk_driver):
hass, hass,
entry.entry_id, entry.entry_id,
BRIDGE_NAME, BRIDGE_NAME,
loop=hass.loop,
address="172.0.0.0", address="172.0.0.0",
port=DEFAULT_PORT, port=DEFAULT_PORT,
persist_file=path, persist_file=path,
@ -288,6 +290,7 @@ async def test_homekit_setup_advertise_ip(hass, hk_driver):
hass, hass,
entry.entry_id, entry.entry_id,
BRIDGE_NAME, BRIDGE_NAME,
loop=hass.loop,
address="0.0.0.0", address="0.0.0.0",
port=DEFAULT_PORT, port=DEFAULT_PORT,
persist_file=path, persist_file=path,
@ -494,7 +497,7 @@ async def test_homekit_start(hass, hk_driver, device_reg, debounce_patcher):
) as mock_setup_msg, patch( ) as mock_setup_msg, patch(
"pyhap.accessory_driver.AccessoryDriver.add_accessory" "pyhap.accessory_driver.AccessoryDriver.add_accessory"
) as hk_driver_add_acc, patch( ) as hk_driver_add_acc, patch(
"pyhap.accessory_driver.AccessoryDriver.start" "pyhap.accessory_driver.AccessoryDriver.start_service"
) as hk_driver_start: ) as hk_driver_start:
await homekit.async_start() await homekit.async_start()
@ -527,7 +530,7 @@ async def test_homekit_start(hass, hk_driver, device_reg, debounce_patcher):
) as mock_setup_msg, patch( ) as mock_setup_msg, patch(
"pyhap.accessory_driver.AccessoryDriver.add_accessory" "pyhap.accessory_driver.AccessoryDriver.add_accessory"
) as hk_driver_add_acc, patch( ) as hk_driver_add_acc, patch(
"pyhap.accessory_driver.AccessoryDriver.start" "pyhap.accessory_driver.AccessoryDriver.start_service"
) as hk_driver_start: ) as hk_driver_start:
await homekit.async_start() await homekit.async_start()
@ -574,7 +577,7 @@ async def test_homekit_start_with_a_broken_accessory(hass, hk_driver, debounce_p
) as mock_setup_msg, patch( ) as mock_setup_msg, patch(
"pyhap.accessory_driver.AccessoryDriver.add_accessory", "pyhap.accessory_driver.AccessoryDriver.add_accessory",
) as hk_driver_add_acc, patch( ) as hk_driver_add_acc, patch(
"pyhap.accessory_driver.AccessoryDriver.start" "pyhap.accessory_driver.AccessoryDriver.start_service"
) as hk_driver_start: ) as hk_driver_start:
await homekit.async_start() await homekit.async_start()
@ -607,11 +610,10 @@ async def test_homekit_stop(hass):
entry_id=entry.entry_id, entry_id=entry.entry_id,
) )
homekit.driver = Mock() homekit.driver = Mock()
homekit.driver.async_stop = AsyncMock()
homekit.bridge = Mock() homekit.bridge = Mock()
homekit.bridge.accessories = {} homekit.bridge.accessories = {}
await async_init_integration(hass)
assert homekit.status == STATUS_READY assert homekit.status == STATUS_READY
await homekit.async_stop() await homekit.async_stop()
await hass.async_block_till_done() await hass.async_block_till_done()
@ -621,13 +623,13 @@ async def test_homekit_stop(hass):
homekit.status = STATUS_STOPPED homekit.status = STATUS_STOPPED
await homekit.async_stop() await homekit.async_stop()
await hass.async_block_till_done() await hass.async_block_till_done()
assert homekit.driver.stop.called is False assert homekit.driver.async_stop.called is False
# Test if driver is started # Test if driver is started
homekit.status = STATUS_RUNNING homekit.status = STATUS_RUNNING
await homekit.async_stop() await homekit.async_stop()
await hass.async_block_till_done() await hass.async_block_till_done()
assert homekit.driver.stop.called is True assert homekit.driver.async_stop.called is True
async def test_homekit_reset_accessories(hass): async def test_homekit_reset_accessories(hass):
@ -655,7 +657,7 @@ async def test_homekit_reset_accessories(hass):
), patch("pyhap.accessory.Bridge.add_accessory") as mock_add_accessory, patch( ), patch("pyhap.accessory.Bridge.add_accessory") as mock_add_accessory, patch(
"pyhap.accessory_driver.AccessoryDriver.config_changed" "pyhap.accessory_driver.AccessoryDriver.config_changed"
) as hk_driver_config_changed, patch( ) as hk_driver_config_changed, patch(
"pyhap.accessory_driver.AccessoryDriver.start" "pyhap.accessory_driver.AccessoryDriver.start_service"
): ):
await async_init_entry(hass, entry) await async_init_entry(hass, entry)
@ -702,7 +704,7 @@ async def test_homekit_too_many_accessories(hass, hk_driver):
hass.states.async_set("light.demo", "on") hass.states.async_set("light.demo", "on")
with patch("pyhap.accessory_driver.AccessoryDriver.start"), patch( with patch("pyhap.accessory_driver.AccessoryDriver.start_service"), patch(
"pyhap.accessory_driver.AccessoryDriver.add_accessory" "pyhap.accessory_driver.AccessoryDriver.add_accessory"
), patch("homeassistant.components.homekit._LOGGER.warning") as mock_warn, patch( ), patch("homeassistant.components.homekit._LOGGER.warning") as mock_warn, patch(
f"{PATH_HOMEKIT}.show_setup_message" f"{PATH_HOMEKIT}.show_setup_message"
@ -916,7 +918,7 @@ async def test_raise_config_entry_not_ready(hass):
await hass.async_block_till_done() await hass.async_block_till_done()
async def test_homekit_uses_system_zeroconf(hass, mock_zeroconf): async def test_homekit_uses_system_zeroconf(hass, hk_driver, mock_zeroconf):
"""Test HomeKit uses system zeroconf.""" """Test HomeKit uses system zeroconf."""
entry = MockConfigEntry( entry = MockConfigEntry(
domain=DOMAIN, domain=DOMAIN,
@ -925,15 +927,11 @@ async def test_homekit_uses_system_zeroconf(hass, mock_zeroconf):
) )
system_zc = await zeroconf.async_get_instance(hass) system_zc = await zeroconf.async_get_instance(hass)
with patch(f"{PATH_HOMEKIT}.HomeKit.add_bridge_accessory"), patch( entry.add_to_hass(hass)
f"{PATH_HOMEKIT}.show_setup_message" assert await hass.config_entries.async_setup(entry.entry_id)
), patch("pyhap.accessory_driver.AccessoryDriver.add_accessory"), patch( await hass.async_block_till_done()
"pyhap.accessory_driver.AccessoryDriver.start" assert hass.data[DOMAIN][entry.entry_id][HOMEKIT].driver.advertiser == system_zc
): await hass.async_block_till_done()
entry.add_to_hass(hass)
assert await hass.config_entries.async_setup(entry.entry_id)
await hass.async_block_till_done()
assert hass.data[DOMAIN][entry.entry_id][HOMEKIT].driver.advertiser == system_zc
def _write_data(path: str, data: Dict) -> None: def _write_data(path: str, data: Dict) -> None: