# Buggy code
async def connect(self, **kwargs) -> bool:
    """Connect to the specified GATT server.

    Keyword Args:
        timeout (float): Timeout for required ``discover`` call. Defaults to 2.0.

    Returns:
        Boolean representing connection status.

    """
    # Try to find the desired device.
    devices = await discover(timeout=kwargs.get("timeout", 2.0), loop=self.loop)
    sought_device = list(
        filter(lambda x: x.address.upper() == self.address.upper(), devices)
    )

    if len(sought_device):
        self._device_info = sought_device[0].details
    else:
        raise BleakError("Device with address {0} was not found.".format(self.address))

    logger.debug("Connecting to BLE device @ {0}".format(self.address))

    args = [UInt64(self._device_info.BluetoothAddress)]
    if self._address_type is not None:
        args.append(
            BluetoothAddressType.Public
            if self._address_type == "public"
            else BluetoothAddressType.Random
        )
    self._requester = await wrap_IAsyncOperation(
        IAsyncOperation[BluetoothLEDevice](
            BluetoothLEDevice.FromBluetoothAddressAsync(*args)
        ),
        return_type=BluetoothLEDevice,
        loop=self.loop,
    )

    def _ConnectionStatusChanged_Handler(sender, args):
        logger.debug("_ConnectionStatusChanged_Handler: " + args.ToString())

    self._requester.ConnectionStatusChanged += _ConnectionStatusChanged_Handler

    # Obtain services, which also leads to connection being established.
    services = await self.get_services()
    connected = False
    if self._services_resolved:
        # If services has been resolved, then we assume that we are connected. This is due to
        # some issues with getting `is_connected` to give correct response here.
        connected = True
    else:
        for _ in range(5):
            await asyncio.sleep(0.2, loop=self.loop)
            connected = await self.is_connected()
            if connected:
                break

    if connected:
        logger.debug("Connection successful.")
    else:
        raise BleakError("Connection to {0} was not successful!".format(self.address))

    return connected


# 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 connect(self, **kwargs) -> bool:
    """Connect to the specified GATT server.

    Keyword Args:
        timeout (float): Timeout for required ``discover`` call. Defaults to 2.0.

    Returns:
        Boolean representing connection status.

    """
    # Try to find the desired device.
    timeout = kwargs.get("timeout", self._timeout)
    devices = await discover(timeout=timeout, loop=self.loop)
    sought_device = list(
        filter(lambda x: x.address.upper() == self.address.upper(), devices)
    )

    if len(sought_device):
        self._device_info = sought_device[0].details
    else:
        raise BleakError("Device with address {0} was not found.".format(self.address))

    logger.debug("Connecting to BLE device @ {0}".format(self.address))

    args = [UInt64(self._device_info.BluetoothAddress)]
    if self._address_type is not None:
        args.append(
            BluetoothAddressType.Public
            if self._address_type == "public"
            else BluetoothAddressType.Random
        )
    self._requester = await wrap_IAsyncOperation(
        IAsyncOperation[BluetoothLEDevice](
            BluetoothLEDevice.FromBluetoothAddressAsync(*args)
        ),
        return_type=BluetoothLEDevice,
        loop=self.loop,
    )

    def _ConnectionStatusChanged_Handler(sender, args):
        logger.debug("_ConnectionStatusChanged_Handler: " + args.ToString())

    self._requester.ConnectionStatusChanged += _ConnectionStatusChanged_Handler

    # Obtain services, which also leads to connection being established.
    services = await self.get_services()
    connected = False
    if self._services_resolved:
        # If services has been resolved, then we assume that we are connected. This is due to
        # some issues with getting `is_connected` to give correct response here.
        connected = True
    else:
        for _ in range(5):
            await asyncio.sleep(0.2, loop=self.loop)
            connected = await self.is_connected()
            if connected:
                break

    if connected:
        logger.debug("Connection successful.")
    else:
        raise BleakError("Connection to {0} was not successful!".format(self.address))

    return connected