# Buggy code
async def read_gatt_char(self, _uuid: str, **kwargs) -> bytearray:
    """Perform read operation on the specified GATT characteristic.

    Args:
        _uuid (str or UUID): The uuid of the characteristics to read from.

    Returns:
        (bytearray) The read data.

    """
    characteristic = self.services.get_characteristic(str(_uuid))
    if not characteristic:
        # Special handling for BlueZ >= 5.48, where Battery Service (0000180f-0000-1000-8000-00805f9b34fb:)
        # has been moved to interface org.bluez.Battery1 instead of as a regular service.
        if _uuid == "00002a19-0000-1000-8000-00805f9b34fb" and (
            self._bluez_version[0] == 5 and self._bluez_version[1] >= 48
        ):
            props = await self._get_device_properties(interface=defs.BATTERY_INTERFACE)
            # Simulate regular characteristics read to be consistent over all platforms.
            value = bytearray([props.get("Percentage", "")])
            logger.debug(
                "Read Battery Level {0} | {1}: {2}".format(
                    _uuid, self._device_path, value
                )
            )
            return value
        raise BleakError(
            "Characteristic with UUID {0} could not be found!".format(_uuid)
        )

    value = bytearray(
        await self._bus.callRemote(
            characteristic.path,
            "ReadValue",
            interface=defs.GATT_CHARACTERISTIC_INTERFACE,
            destination=defs.BLUEZ_SERVICE,
            signature="a{sv}",
            body=[{}],
            returnSignature="ay",
        ).asFuture(self.loop)
    )

    logger.debug(
        "Read Characteristic {0} | {1}: {2}".format(_uuid, characteristic.path, value)
    )
    return value


# 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
async def read_gatt_char(self, _uuid: str, **kwargs) -> bytearray:
    """Perform read operation on the specified GATT characteristic.

    Args:
        _uuid (str or UUID): The uuid of the characteristics to read from.

    Returns:
        (bytearray) The read data.

    """
    characteristic = self.services.get_characteristic(str(_uuid))
    if not characteristic:
        # Special handling for BlueZ >= 5.48, where Battery Service (0000180f-0000-1000-8000-00805f9b34fb:)
        # has been moved to interface org.bluez.Battery1 instead of as a regular service.
        if _uuid == "00002a19-0000-1000-8000-00805f9b34fb" and (
            self._bluez_version[0] == 5 and self._bluez_version[1] >= 48
        ):
            props = await self._get_device_properties(interface=defs.BATTERY_INTERFACE)
            # Simulate regular characteristics read to be consistent over all platforms.
            value = bytearray([props.get("Percentage", "")])
            logger.debug(
                "Read Battery Level {0} | {1}: {2}".format(
                    _uuid, self._device_path, value
                )
            )
            return value
        if _uuid == "00002a00-0000-1000-8000-00805f9b34fb" and (
            self._bluez_version[0] == 5 and self._bluez_version[1] >= 48
        ):
            props = await self._get_device_properties(interface=defs.DEVICE_INTERFACE)
            # Simulate regular characteristics read to be consistent over all platforms.
            value = bytearray(props.get("Name", "").encode("ascii"))
            logger.debug(
                "Read Device Name {0} | {1}: {2}".format(
                    _uuid, self._device_path, value
                )
            )
            return value

        raise BleakError(
            "Characteristic with UUID {0} could not be found!".format(_uuid)
        )

    value = bytearray(
        await self._bus.callRemote(
            characteristic.path,
            "ReadValue",
            interface=defs.GATT_CHARACTERISTIC_INTERFACE,
            destination=defs.BLUEZ_SERVICE,
            signature="a{sv}",
            body=[{}],
            returnSignature="ay",
        ).asFuture(self.loop)
    )

    logger.debug(
        "Read Characteristic {0} | {1}: {2}".format(_uuid, characteristic.path, value)
    )
    return value