From 2c0a2e6b60e41e5159c0fd3ddfd761aac9b77d46 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 26 Nov 2022 17:33:49 -1000 Subject: [PATCH 1/2] feat: export ADAPTER_ constants for the underlying usb device --- src/bluetooth_adapters/__init__.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/bluetooth_adapters/__init__.py b/src/bluetooth_adapters/__init__.py index 9e4906a..86530e3 100644 --- a/src/bluetooth_adapters/__init__.py +++ b/src/bluetooth_adapters/__init__.py @@ -18,8 +18,12 @@ from .models import ( ADAPTER_ADDRESS, ADAPTER_HW_VERSION, + ADAPTER_MANUFACTURER, ADAPTER_PASSIVE_SCAN, + ADAPTER_PRODUCT, + ADAPTER_PRODUCT_ID, ADAPTER_SW_VERSION, + ADAPTER_VENDOR_ID, AdapterDetails, ) from .systems import get_adapters @@ -40,6 +44,10 @@ "ADAPTER_SW_VERSION", "ADAPTER_HW_VERSION", "ADAPTER_PASSIVE_SCAN", + "ADAPTER_MANUFACTURER", + "ADAPTER_PRODUCT", + "ADAPTER_VENDOR_ID", + "ADAPTER_PRODUCT_ID", "WINDOWS_DEFAULT_BLUETOOTH_ADAPTER", "MACOS_DEFAULT_BLUETOOTH_ADAPTER", "UNIX_DEFAULT_BLUETOOTH_ADAPTER", From edf8490ff0df3b002e766c22c5c851f9f7356e51 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 26 Nov 2022 17:39:21 -1000 Subject: [PATCH 2/2] feat: add adapter_model --- src/bluetooth_adapters/__init__.py | 3 ++- src/bluetooth_adapters/util.py | 13 +++++++++++++ tests/test_init.py | 31 ++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/bluetooth_adapters/__init__.py b/src/bluetooth_adapters/__init__.py index 86530e3..440a59c 100644 --- a/src/bluetooth_adapters/__init__.py +++ b/src/bluetooth_adapters/__init__.py @@ -27,7 +27,7 @@ AdapterDetails, ) from .systems import get_adapters -from .util import adapter_human_name, adapter_unique_name +from .util import adapter_human_name, adapter_model, adapter_unique_name __all__ = [ "AdvertisementHistory", @@ -35,6 +35,7 @@ "BlueZDBusObjects", "adapter_human_name", "adapter_unique_name", + "adapter_model", "get_bluetooth_adapters", "get_bluetooth_adapter_details", "get_dbus_managed_objects", diff --git a/src/bluetooth_adapters/util.py b/src/bluetooth_adapters/util.py index aa0062a..f8c345d 100644 --- a/src/bluetooth_adapters/util.py +++ b/src/bluetooth_adapters/util.py @@ -2,6 +2,12 @@ from __future__ import annotations from .const import DEFAULT_ADDRESS +from .models import ( + ADAPTER_PRODUCT, + ADAPTER_PRODUCT_ID, + ADAPTER_VENDOR_ID, + AdapterDetails, +) def adapter_human_name(adapter: str, address: str) -> str: @@ -12,3 +18,10 @@ def adapter_human_name(adapter: str, address: str) -> str: def adapter_unique_name(adapter: str, address: str) -> str: """Return a unique name for the adapter.""" return adapter if address == DEFAULT_ADDRESS else address + + +def adapter_model(details: AdapterDetails) -> str: + """Return a model for the adapter.""" + if (vendor_id := details.get(ADAPTER_VENDOR_ID)) and vendor_id != "Unknown": + return f"{details[ADAPTER_PRODUCT]} ({vendor_id}:{details[ADAPTER_PRODUCT_ID]})" + return details.get(ADAPTER_PRODUCT) or "Unknown" diff --git a/tests/test_init.py b/tests/test_init.py index 7a387a4..fe4ec86 100644 --- a/tests/test_init.py +++ b/tests/test_init.py @@ -9,9 +9,11 @@ import bluetooth_adapters.dbus as bluetooth_adapters_dbus from bluetooth_adapters import ( DEFAULT_ADDRESS, + AdapterDetails, AdvertisementHistory, BlueZDBusObjects, adapter_human_name, + adapter_model, adapter_unique_name, get_adapters, get_bluetooth_adapters, @@ -580,3 +582,32 @@ def test_adapter_unique_name(): """Test adapter unique name.""" assert adapter_unique_name("hci0", DEFAULT_ADDRESS) == "hci0" assert adapter_unique_name("hci0", "aa:bb:cc:dd:ee:ff") == "aa:bb:cc:dd:ee:ff" + + +def test_adapter_model(): + """Test adapter model.""" + windows_details = AdapterDetails( + { + "address": "00:00:00:00:00:00", + "passive_scan": False, + "sw_version": "18.7.0", + "manufacturer": "Microsoft", + "product": "Unknown Windows Model", + "vendor_id": "Unknown", + "product_id": "Unknown", + } + ) + assert adapter_model(windows_details) == "Unknown Windows Model" + linux_details = AdapterDetails( + { + "address": "00:1A:7D:DA:71:04", + "manufacturer": "XTech", + "product": "Bluetooth 4.0 USB Adapter", + "vendor_id": "0a12", + "product_id": "0001", + "hw_version": "usb:v1D6Bp0246d053F", + "passive_scan": False, + "sw_version": "homeassistant", + } + ) + assert adapter_model(linux_details) == "Bluetooth 4.0 USB Adapter (0a12:0001)"