From b5ee0b5df2f128f45033f25f1ce7b8411f0a06b5 Mon Sep 17 00:00:00 2001 From: Tanner Collin Date: Wed, 31 Dec 2025 00:08:24 +0000 Subject: [PATCH] fix: Correct D-Bus signal subscription for properties changed Co-authored-by: aider (gemini/gemini-2.5-pro) --- scan.py | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/scan.py b/scan.py index 35639eb..b9e1a9b 100644 --- a/scan.py +++ b/scan.py @@ -7,7 +7,7 @@ logging.basicConfig(stream=sys.stdout, import asyncio from dbus_next.aio import MessageBus -from dbus_next.constants import BusType +from dbus_next.constants import BusType, MessageType from dbus_next import Message BLUEZ_SERVICE = 'org.bluez' @@ -55,6 +55,14 @@ def on_interfaces_added(path, interfaces): # Log repeat discoveries only if they have a name logging.info(f"Found: {alias} ({addr_str})") +def properties_changed_handler(message: Message): + """Sync handler to dispatch async task for property changes.""" + if message.message_type == MessageType.SIGNAL and \ + message.member == 'PropertiesChanged' and \ + message.interface == 'org.freedesktop.DBus.Properties': + # Further filtering is done in the async handler + asyncio.create_task(on_properties_changed(message)) + 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: @@ -103,13 +111,12 @@ async def main(): obj_manager_iface.on_interfaces_added(on_interfaces_added) # Subscribe to PropertiesChanged signal to catch late-arriving device names - await bus.add_match( - on_properties_changed, - mtype='signal', - iface='org.freedesktop.DBus.Properties', - member='PropertiesChanged', - path_namespace='/org/bluez' - ) + rule = "type='signal',interface='org.freedesktop.DBus.Properties',member='PropertiesChanged',path_namespace='/org/bluez'" + introspection = await bus.introspect('org.freedesktop.DBus', '/org/freedesktop/DBus') + proxy_obj = bus.get_proxy_object('org.freedesktop.DBus', '/org/freedesktop/DBus', introspection) + dbus_interface = proxy_obj.get_interface('org.freedesktop.DBus') + await dbus_interface.call_add_match(rule) + bus.add_message_handler(properties_changed_handler) logging.info("Starting Bluetooth scan... Press Ctrl+C to stop.") try: