From 8d572b71d7543c1f9d7bee42557f58f6ba770f8b Mon Sep 17 00:00:00 2001 From: Mike A Date: Fri, 5 Jan 2024 21:46:37 +0100 Subject: [PATCH] List extra data in scanner results --- examples/device_scanner.py | 3 +++ findmy/scanner/scanner.py | 18 ++++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/examples/device_scanner.py b/examples/device_scanner.py index 24e7682..e58f0da 100644 --- a/examples/device_scanner.py +++ b/examples/device_scanner.py @@ -18,6 +18,9 @@ async def scan(): print(f" Lookup key: {device.hashed_adv_key_b64}") print(f" Status byte: {device.status:x}") print(f" Hint byte: {device.hint:x}") + print(f" Extra data:") + for k, v in sorted(device.additional_data.items()): + print(f" {k:20}: {v}") print() diff --git a/findmy/scanner/scanner.py b/findmy/scanner/scanner.py index a192859..044a01e 100644 --- a/findmy/scanner/scanner.py +++ b/findmy/scanner/scanner.py @@ -4,7 +4,7 @@ from __future__ import annotations import asyncio import logging import time -from typing import AsyncGenerator +from typing import Any, AsyncGenerator import bleak @@ -20,12 +20,13 @@ class OfflineFindingDevice(HasPublicKey): OF_TYPE = 0x12 OF_DATA_LEN = 25 - def __init__( + def __init__( # noqa: PLR0913 self, mac_bytes: bytes, status: int, public_key: bytes, hint: int, + additional_data: dict[Any, Any] | None = None, ) -> None: """Initialize an `OfflineFindingDevice`.""" self._mac_bytes: bytes = mac_bytes @@ -33,6 +34,8 @@ class OfflineFindingDevice(HasPublicKey): self._public_key: bytes = public_key self._hint: int = hint + self._additional_data: dict[Any, Any] = additional_data or {} + @property def mac_address(self) -> str: """MAC address of the device in AA:BB:CC:DD:EE:FF format.""" @@ -49,6 +52,11 @@ class OfflineFindingDevice(HasPublicKey): """Hint value as reported by the device.""" return self._hint % 255 + @property + def additional_data(self) -> dict[Any, Any]: + """Any additional data. No guarantees about the contents of this dictionary.""" + return self._additional_data + @property def adv_key_bytes(self) -> bytes: """See `HasPublicKey.adv_key_bytes`.""" @@ -59,6 +67,7 @@ class OfflineFindingDevice(HasPublicKey): cls, mac_address: str, payload: bytes, + additional_data: dict[Any, Any], ) -> OfflineFindingDevice | None: """Get an OfflineFindingDevice object from a BLE payload.""" if len(payload) < cls.OF_HEADER_SIZE: @@ -91,7 +100,7 @@ class OfflineFindingDevice(HasPublicKey): hint = payload[cls.OF_HEADER_SIZE + 24] - return OfflineFindingDevice(mac_bytes, status, pubkey, hint) + return OfflineFindingDevice(mac_bytes, status, pubkey, hint, additional_data) def __repr__(self) -> str: """Human-readable string representation of an OfflineFindingDevice.""" @@ -169,7 +178,8 @@ class OfflineFindingScanner: if not apple_data: return None - return OfflineFindingDevice.from_payload(device.address, apple_data) + additional_data = device.details.get("props", {}) + return OfflineFindingDevice.from_payload(device.address, apple_data, additional_data) async def scan_for( self,