Avoid homekit random id generation for existing entries (#114144)

This commit is contained in:
J. Nick Koston 2024-03-25 00:28:26 -10:00 committed by GitHub
parent 188dbfbd2a
commit ada781025b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 12 additions and 2 deletions

View File

@ -12,6 +12,7 @@ import socket
from typing import Any, cast from typing import Any, cast
from aiohttp import web from aiohttp import web
from pyhap import util as pyhap_util
from pyhap.characteristic import Characteristic from pyhap.characteristic import Characteristic
from pyhap.const import STANDALONE_AID from pyhap.const import STANDALONE_AID
from pyhap.loader import get_loader from pyhap.loader import get_loader
@ -580,6 +581,8 @@ class HomeKit:
self.driver.load() self.driver.load()
return True return True
# If there is no persist file, we need to generate a mac
self.driver.state.mac = pyhap_util.generate_mac()
return False return False
async def async_reset_accessories(self, entity_ids: Iterable[str]) -> None: async def async_reset_accessories(self, entity_ids: Iterable[str]) -> None:

View File

@ -72,6 +72,7 @@ from .const import (
CONF_LINKED_BATTERY_SENSOR, CONF_LINKED_BATTERY_SENSOR,
CONF_LOW_BATTERY_THRESHOLD, CONF_LOW_BATTERY_THRESHOLD,
DEFAULT_LOW_BATTERY_THRESHOLD, DEFAULT_LOW_BATTERY_THRESHOLD,
EMPTY_MAC,
EVENT_HOMEKIT_CHANGED, EVENT_HOMEKIT_CHANGED,
HK_CHARGING, HK_CHARGING,
HK_NOT_CHARGABLE, HK_NOT_CHARGABLE,
@ -683,7 +684,9 @@ class HomeDriver(AccessoryDriver): # type: ignore[misc]
**kwargs: Any, **kwargs: Any,
) -> None: ) -> None:
"""Initialize a AccessoryDriver object.""" """Initialize a AccessoryDriver object."""
super().__init__(**kwargs) # Always set an empty mac of pyhap will incur
# the cost of generating a new one for every driver
super().__init__(**kwargs, mac=EMPTY_MAC)
self.hass = hass self.hass = hass
self.entry_id = entry_id self.entry_id = entry_id
self._bridge_name = bridge_name self._bridge_name = bridge_name

View File

@ -10,6 +10,7 @@ PERSIST_LOCK_DATA = f"{DOMAIN}_persist_lock"
HOMEKIT_FILE = ".homekit.state" HOMEKIT_FILE = ".homekit.state"
SHUTDOWN_TIMEOUT = 30 SHUTDOWN_TIMEOUT = 30
CONF_ENTRY_INDEX = "index" CONF_ENTRY_INDEX = "index"
EMPTY_MAC = "00:00:00:00:00:00"
# ### Codecs #### # ### Codecs ####
VIDEO_CODEC_COPY = "copy" VIDEO_CODEC_COPY = "copy"

View File

@ -28,6 +28,7 @@ from homeassistant.components.homekit.const import (
CONF_LINKED_BATTERY_CHARGING_SENSOR, CONF_LINKED_BATTERY_CHARGING_SENSOR,
CONF_LINKED_BATTERY_SENSOR, CONF_LINKED_BATTERY_SENSOR,
CONF_LOW_BATTERY_THRESHOLD, CONF_LOW_BATTERY_THRESHOLD,
EMPTY_MAC,
MANUFACTURER, MANUFACTURER,
SERV_ACCESSORY_INFO, SERV_ACCESSORY_INFO,
) )
@ -747,7 +748,9 @@ def test_home_driver(iid_storage) -> None:
persist_file=path, persist_file=path,
) )
mock_driver.assert_called_with(address=ip_address, port=port, persist_file=path) mock_driver.assert_called_with(
address=ip_address, port=port, persist_file=path, mac=EMPTY_MAC
)
driver.state = Mock(pincode=pin, paired=False) driver.state = Mock(pincode=pin, paired=False)
xhm_uri_mock = Mock(return_value="X-HM://0") xhm_uri_mock = Mock(return_value="X-HM://0")
driver.accessory = Mock(display_name="any", xhm_uri=xhm_uri_mock) driver.accessory = Mock(display_name="any", xhm_uri=xhm_uri_mock)