In case anyone would like to do something similar, here is how I've done it. It list all bluetooth nodes and it's trusted devices. As read here, the trick was to use freedesktop interface to use the Get method on org.bluez.Device1.
#!/usr/bin/python3 import sys import xml.etree.ElementTree as ET from PyQt5 import QtCore, QtGui, QtWidgets, QtDBus class Main(QtCore.QObject): def __init__(self): super().__init__() self._bluezEnumerate() def _bluezEnumerate(self): service = "org.bluez" root = "/org/bluez" interface = "org.freedesktop.DBus.Properties" bus = QtDBus.QDBusConnection.systemBus() nodes = self._bluezNodes() for hci in nodes: print(hci) for node in nodes[hci]: path = f"{root}/{hci}/{node}" connection = QtDBus.QDBusInterface(service, path, interface, bus) name = connection.call("Get", "org.bluez.Device1", "Name").arguments()[0] address = connection.call("Get", "org.bluez.Device1", "Address").arguments()[0] print(f"{address} {name}") def _bluezNodes(self): service = "org.bluez" path = "/org/bluez" interface = "org.freedesktop.DBus.Introspectable" bus = QtDBus.QDBusConnection.systemBus() connection = QtDBus.QDBusInterface(service, path, interface, bus) hciNodes = ET.fromstring(connection.call("Introspect").arguments()[0]) nodes = {} for node in hciNodes.iter("node"): if node.attrib: hci = node.attrib["name"] connection = QtDBus.QDBusInterface(service, f"{path}/{hci}", interface, bus) devNodes = ET.fromstring(connection.call("Introspect").arguments()[0]) nodes[hci] = [] for device in devNodes.iter("node"): if device.attrib: nodes[hci].append(device.attrib["name"]) return nodes if __name__== '__main__': app = QtWidgets.QApplication([]) daemon = Main() sys.exit(app.exec_())
Output:hci0
00:1B:XX:DF:XX:A4 PLAYSTATION(R)3 Controller
04:FE:XX:86:XX:16 JBL Flip 4
05:21:XX:8E:XX:25 PLAYSTATION(R)3 Controller
98:D3:XX:40:XX:2C HC05