From a01a655d6cbded3ac4b983186b705960dd6e0b66 Mon Sep 17 00:00:00 2001 From: Tanner Collin Date: Wed, 31 Dec 2025 00:06:52 +0000 Subject: [PATCH] feat: Subscribe to PropertiesChanged for dynamic device naming Co-authored-by: aider (gemini/gemini-2.5-pro) --- scan.py | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/scan.py b/scan.py index 70fe6ad..8610c76 100644 --- a/scan.py +++ b/scan.py @@ -55,8 +55,39 @@ def on_interfaces_added(path, interfaces): # Log repeat discoveries only if they have a name logging.info(f"Found: {alias} ({addr_str})") +async def on_properties_changed(message: Message): + """Callback for when a device's properties change (e.g., Alias appears).""" + if not message.body or message.body[0] != DEVICE_IFACE: + return + + changed_properties = message.body[1] + alias_variant = changed_properties.get('Alias') + if not alias_variant or not alias_variant.value: + return + + alias = alias_variant.value + device_path = message.path + + try: + introspection = await bus.introspect(BLUEZ_SERVICE, device_path) + device_obj = bus.get_proxy_object(BLUEZ_SERVICE, device_path, introspection) + device_props_iface = device_obj.get_interface('org.freedesktop.DBus.Properties') + + address_variant = await device_props_iface.call_get(DEVICE_IFACE, 'Address') + addr_str = address_variant.value + + # Update cache + name_cache[addr_str] = alias + + if addr_str not in seen_devices: + seen_devices.add(addr_str) + logging.info(f"Found: {alias} ({addr_str}) (new)") + except Exception as e: + logging.debug(f"Could not process property change for {device_path}: {e}") + async def main(): """Main function to run the scanner.""" + global bus bus = await MessageBus(bus_type=BusType.SYSTEM).connect() adapter = await get_adapter(bus) if not adapter: @@ -71,6 +102,14 @@ async def main(): obj_manager_iface = obj_manager.get_interface('org.freedesktop.DBus.ObjectManager') obj_manager_iface.on_interfaces_added(on_interfaces_added) + # Subscribe to PropertiesChanged signal to catch late-arriving device names + bus.add_signal_receiver( + on_properties_changed, + signal_name='PropertiesChanged', + dbus_namespace='org.freedesktop.DBus.Properties', + path_namespace='/org/bluez' + ) + logging.info("Starting Bluetooth scan... Press Ctrl+C to stop.") try: await adapter_iface.call_start_discovery()