# Buggy code
def _properties_changed_callback(self, message):
    """Notification handler.

    In the BlueZ DBus API, notifications come as
    PropertiesChanged callbacks on the GATT Characteristic interface
    that StartNotify has been called on.

    Args:
        message (): The PropertiesChanged DBus signal message relaying
            the new data on the GATT Characteristic.

    """

    logger.debug(
        "DBUS: path: {}, domain: {}, body: {}".format(
            message.path, message.body[0], message.body[1]
        )
    )

    if message.body[0] == defs.GATT_CHARACTERISTIC_INTERFACE:
        if message.path in self._notification_callbacks:
            logger.info(
                "GATT Char Properties Changed: {0} | {1}".format(
                    message.path, message.body[1:]
                )
            )
            self._notification_callbacks[message.path](message.path, message.body[1])
    elif message.body[0] == defs.DEVICE_INTERFACE:
        device_path = "/org/bluez/%s/dev_%s" % (
            self.device,
            self.address.replace(":", "_"),
        )
        if message.path == device_path:
            message_body_map = message.body[1]
            if "Connected" in message_body_map and not message_body_map["Connected"]:
                logger.debug("Device {} disconnected.".format(self.address))

                self.loop.create_task(self._cleanup())

                if self._disconnected_callback is not None:
                    self._disconnected_callback(self)


# Traceback (bleak.exc.BleakError)
/Users/zaytsev/PycharmProjects/bluetooth/venv/bin/python /Users/zaytsev/PycharmProjects/bluetooth/bleak_demo.py
DEBUG:bleak.backends.corebluetooth.CentralManagerDelegate:Bluetooth powered on
DEBUG:bleak.backends.corebluetooth.CentralManagerDelegate:Discovered device A0E49DB2-B7F1-4A65-AB2E-D75121192329: Unknown @ RSSI: -79
A0E49DB2-B7F1-4A65-AB2E-D75121192329: HUAWEI Band 2-b6e
DEBUG:bleak.backends.corebluetooth.client:Connecting to BLE device @ A0E49DB2-B7F1-4A65-AB2E-D75121192329
DEBUG:bleak.backends.corebluetooth.CentralManagerDelegate:Successfully connected to device uuid A0E49DB2-B7F1-4A65-AB2E-D75121192329
WARNING:bleak.backends.corebluetooth.PeripheralDelegate:PeripheralDelegate is not compliant
DEBUG:bleak.backends.corebluetooth.client:Retrieving services...
DEBUG:bleak.backends.corebluetooth.PeripheralDelegate:Services discovered
DEBUG:bleak.backends.corebluetooth.client:Retrieving characteristics for service 180F
DEBUG:bleak.backends.corebluetooth.PeripheralDelegate:Characteristics discovered
DEBUG:bleak.backends.corebluetooth.client:Retrieving descriptors for characteristic 2A19
DEBUG:bleak.backends.corebluetooth.PeripheralDelegate:Descriptor discovered 2A19
DEBUG:bleak.backends.corebluetooth.client:Retrieving characteristics for service 180A
DEBUG:bleak.backends.corebluetooth.PeripheralDelegate:Characteristics discovered
DEBUG:bleak.backends.corebluetooth.client:Retrieving descriptors for characteristic 2A29
DEBUG:bleak.backends.corebluetooth.PeripheralDelegate:Descriptor discovered 2A29
DEBUG:bleak.backends.corebluetooth.client:Retrieving descriptors for characteristic 2A24
DEBUG:bleak.backends.corebluetooth.PeripheralDelegate:Descriptor discovered 2A24
DEBUG:bleak.backends.corebluetooth.client:Retrieving descriptors for characteristic 2A26
DEBUG:bleak.backends.corebluetooth.PeripheralDelegate:Descriptor discovered 2A26
DEBUG:bleak.backends.corebluetooth.client:Retrieving descriptors for characteristic 2A28
DEBUG:bleak.backends.corebluetooth.PeripheralDelegate:Descriptor discovered 2A28
DEBUG:bleak.backends.corebluetooth.client:Retrieving descriptors for characteristic 2A50
DEBUG:bleak.backends.corebluetooth.PeripheralDelegate:Descriptor discovered 2A50
DEBUG:bleak.backends.corebluetooth.client:Retrieving characteristics for service 180D
DEBUG:bleak.backends.corebluetooth.PeripheralDelegate:Characteristics discovered
DEBUG:bleak.backends.corebluetooth.client:Retrieving descriptors for characteristic 2A37
DEBUG:bleak.backends.corebluetooth.PeripheralDelegate:Descriptor discovered 2A37
DEBUG:bleak.backends.corebluetooth.client:Retrieving descriptors for characteristic 2A38
DEBUG:bleak.backends.corebluetooth.PeripheralDelegate:Descriptor discovered 2A38
DEBUG:bleak.backends.corebluetooth.client:Retrieving characteristics for service FE86
DEBUG:bleak.backends.corebluetooth.PeripheralDelegate:Characteristics discovered
DEBUG:bleak.backends.corebluetooth.client:Retrieving descriptors for characteristic FE01
DEBUG:bleak.backends.corebluetooth.PeripheralDelegate:Descriptor discovered FE01
DEBUG:bleak.backends.corebluetooth.client:Retrieving descriptors for characteristic FE02
DEBUG:bleak.backends.corebluetooth.PeripheralDelegate:Descriptor discovered FE02
DEBUG:bleak.backends.corebluetooth.client:Retrieving descriptors for characteristic FE03
DEBUG:bleak.backends.corebluetooth.PeripheralDelegate:Descriptor discovered FE03
DEBUG:bleak.backends.corebluetooth.client:Retrieving descriptors for characteristic FE04
DEBUG:bleak.backends.corebluetooth.PeripheralDelegate:Descriptor discovered FE04
DEBUG:bleak.backends.corebluetooth.client:Retrieving services...
DEBUG:bleak.backends.corebluetooth.client:Retrieving characteristics for service 180F
DEBUG:bleak.backends.corebluetooth.CentralManagerDelegate:Peripheral Device disconnected!
Traceback (most recent call last):
File "/Users/zaytsev/PycharmProjects/bluetooth/bleak_demo.py", line 25, in <module>
loop.run_until_complete(ble_get_services(address, loop))
File "/usr/local/Cellar/python/3.7.4/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/base_events.py", line 579, in run_until_complete
return future.result()
File "/Users/zaytsev/PycharmProjects/bluetooth/bleak_demo.py", line 18, in ble_get_services
svcs = await client.get_services()
File "/Users/zaytsev/PycharmProjects/bluetooth/venv/lib/python3.7/site-packages/bleak/backends/corebluetooth/client.py", line 118, in get_services
self.services.add_service(BleakGATTServiceCoreBluetooth(service))
File "/Users/zaytsev/PycharmProjects/bluetooth/venv/lib/python3.7/site-packages/bleak/backends/service.py", line 101, in add_service
"This service is already present in this BleakGATTServiceCollection!"
bleak.exc.BleakError: This service is already present in this BleakGATTServiceCollection!

# Fixed code
def _properties_changed_callback(self, message):
    """Notification handler.

    In the BlueZ DBus API, notifications come as
    PropertiesChanged callbacks on the GATT Characteristic interface
    that StartNotify has been called on.

    Args:
        message (): The PropertiesChanged DBus signal message relaying
            the new data on the GATT Characteristic.

    """

    logger.debug(
        "DBUS: path: {}, domain: {}, body: {}".format(
            message.path, message.body[0], message.body[1]
        )
    )

    if message.body[0] == defs.GATT_CHARACTERISTIC_INTERFACE:
        if message.path in self._notification_callbacks:
            logger.info(
                "GATT Char Properties Changed: {0} | {1}".format(
                    message.path, message.body[1:]
                )
            )
            self._notification_callbacks[message.path](message.path, message.body[1])
    elif message.body[0] == defs.DEVICE_INTERFACE:
        device_path = "/org/bluez/%s/dev_%s" % (
            self.device,
            self.address.replace(":", "_"),
        )
        if message.path.lower() == device_path.lower():
            message_body_map = message.body[1]
            if "Connected" in message_body_map and not message_body_map["Connected"]:
                logger.debug("Device {} disconnected.".format(self.address))

                self.loop.create_task(self._cleanup())

                if self._disconnected_callback is not None:
                    self._disconnected_callback(self)