From 22c72e025320b916343b48a09c49559c4728bc86 Mon Sep 17 00:00:00 2001 From: "Mike A." Date: Mon, 29 Sep 2025 20:48:16 +0200 Subject: [PATCH 1/3] feat: return early when fetching accessory reports --- findmy/reports/reports.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/findmy/reports/reports.py b/findmy/reports/reports.py index 14371fb..f5e3df4 100644 --- a/findmy/reports/reports.py +++ b/findmy/reports/reports.py @@ -384,7 +384,7 @@ class LocationReportsFetcher: if isinstance(device, RollingKeyPairSource): # key generator - return await self._fetch_accessory_report(device) + return await self._fetch_accessory_reports(device, only_latest=True) if not isinstance(device, list) or not all( isinstance(x, HasHashedPublicKey | RollingKeyPairSource) for x in device @@ -406,7 +406,7 @@ class LocationReportsFetcher: static_keys.append(dev) elif isinstance(dev, RollingKeyPairSource): # query immediately - reports[dev] = await self._fetch_accessory_report(dev) + reports[dev] = await self._fetch_accessory_reports(dev, only_latest=True) if static_keys: # batch request for static keys key_reports = await self._fetch_key_reports(static_keys) @@ -414,9 +414,10 @@ class LocationReportsFetcher: return reports - async def _fetch_accessory_report( + async def _fetch_accessory_reports( self, accessory: RollingKeyPairSource, + only_latest: bool = False, ) -> list[LocationReport]: logger.debug("Fetching location report for accessory") @@ -474,6 +475,11 @@ class LocationReportsFetcher: ): ret |= await _fetch() + # if we only want the latest report, we can stop here + # since we are iterating backwards in time + if only_latest and ret: + return sorted(ret) + # build mappings before adding to current keys for key in key_batch: key_to_ind[key].add(cur_index) From 7a67aa1b3ce0ac4e86f917a422ebb5b5335c3af5 Mon Sep 17 00:00:00 2001 From: "Mike A." Date: Mon, 29 Sep 2025 20:49:48 +0200 Subject: [PATCH 2/3] fix: make latest accessory reports fetchable again --- findmy/reports/reports.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/findmy/reports/reports.py b/findmy/reports/reports.py index f5e3df4..318b0b8 100644 --- a/findmy/reports/reports.py +++ b/findmy/reports/reports.py @@ -432,7 +432,7 @@ class LocationReportsFetcher: # state variables cur_keys_primary: set[str] = set() cur_keys_secondary: set[str] = set() - cur_index = accessory.get_max_index(start_date) + cur_index = accessory.get_max_index(end_date) ret: set[LocationReport] = set() async def _fetch() -> set[LocationReport]: @@ -455,7 +455,7 @@ class LocationReportsFetcher: return set(new_reports) - while cur_index >= accessory.get_min_index(end_date): + while cur_index >= accessory.get_min_index(start_date): key_batch = accessory.keys_at(cur_index) # split into primary and secondary keys From 653ce04f8d7eff6129ed12d1768bde6b606b3f7a Mon Sep 17 00:00:00 2001 From: "Mike A." Date: Mon, 29 Sep 2025 20:54:36 +0200 Subject: [PATCH 3/3] fix: prevent log spam when fetching accessories --- findmy/reports/reports.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/findmy/reports/reports.py b/findmy/reports/reports.py index 318b0b8..cec9eb1 100644 --- a/findmy/reports/reports.py +++ b/findmy/reports/reports.py @@ -447,7 +447,11 @@ class LocationReportsFetcher: report.decrypt(key) # update alignment data on every report - for i in key_to_ind[key]: + # iterate in reverse sorted order to prevent potentially + # excessive internal updates and logging in the accessory, + # because most accessories probably only really care about + # the latest index anyway. + for i in sorted(key_to_ind[key], reverse=True): accessory.update_alignment(report.timestamp, i) cur_keys_primary.clear()