Fix bluetooth discovery when advertisement format changes (#77286)

This commit is contained in:
J. Nick Koston 2022-08-24 17:36:21 -05:00 committed by GitHub
parent 5d1c9a2e94
commit 109d5c7084
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 95 additions and 8 deletions

View file

@ -49,8 +49,8 @@ class IntegrationMatchHistory:
"""Track which fields have been seen."""
manufacturer_data: bool
service_data: bool
service_uuids: bool
service_data: set[str]
service_uuids: set[str]
def seen_all_fields(
@ -59,9 +59,15 @@ def seen_all_fields(
"""Return if we have seen all fields."""
if not previous_match.manufacturer_data and advertisement_data.manufacturer_data:
return False
if not previous_match.service_data and advertisement_data.service_data:
if advertisement_data.service_data and (
not previous_match.service_data
or not previous_match.service_data.issuperset(advertisement_data.service_data)
):
return False
if not previous_match.service_uuids and advertisement_data.service_uuids:
if advertisement_data.service_uuids and (
not previous_match.service_uuids
or not previous_match.service_uuids.issuperset(advertisement_data.service_uuids)
):
return False
return True
@ -114,13 +120,13 @@ class IntegrationMatcher:
previous_match.manufacturer_data |= bool(
advertisement_data.manufacturer_data
)
previous_match.service_data |= bool(advertisement_data.service_data)
previous_match.service_uuids |= bool(advertisement_data.service_uuids)
previous_match.service_data |= set(advertisement_data.service_data)
previous_match.service_uuids |= set(advertisement_data.service_uuids)
else:
matched[device.address] = IntegrationMatchHistory(
manufacturer_data=bool(advertisement_data.manufacturer_data),
service_data=bool(advertisement_data.service_data),
service_uuids=bool(advertisement_data.service_uuids),
service_data=set(advertisement_data.service_data),
service_uuids=set(advertisement_data.service_uuids),
)
return matched_domains