# Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

## Unreleased

## 3.0.2 (2026-05-02)

### Changed

- Changed default value of `BlueZNotifyArgs.use_start_notify` to `False`. Fixes #1951.

## 3.0.1 (2026-03-25)

### Fixed

- Fixed `AttributeError` in `start_notify()` and `stop_notify()` on Android. Fixes #1834.

## 3.0.0 (2026-03-22)

### Added

- Added `adapter` attribute to `bleak.args.bluez.BlueZClientArgs` and `bleak.args.bluez.BlueZScannerArgs`.

- Added `bluez` keyword argument to `BleakClient`.

- Added new `bleak.args.bluez.BlueZClientArgs` class.

- Added `bleak.exc.BleakGATTProtocolError` and `bleak.exc.BleakGATTProtocolErrorCode` classes.

- Added type hints and documentation for `use_cached` kwarg for `read_gatt_char()` and `read_gatt_descriptor()` methods in `BleakClient`.

- Added support for `"use_cached"` kwarg to `read_gatt_char()` and `read_gatt_descriptor()` methods in BlueZ backend.

### Changed

- Deprecated `adapter` keyword argument in `BleakScanner` and `BleakClient`.

- Changed GATT read and write methods to raise `BleakGATTProtocolError` when a GATT protocol error occurs.

- Changed start/stop scanning on CoreBluetooth so that the `isScanning` property is not checked anymore.

- Changed `BleakClient.write_gatt_descriptor()` to raise `ValueError` when attempting to write to the descriptor 0x2902 (Client Characteristic Configuration Descriptor, CCCD). Use `start_notify()` and `stop_notify()` instead.

### Fixed

- Fixed occasional `EOFError` when disconnecting in BlueZ backend. Fixes #1921.

- Fixed a potential deadlock when turning off Bluetooth manually while starting scanning on CoreBluetooth.

- Fixed reading descriptors 0x2900, 0x2902 and 0x2903 on CoreBluetooth backend.

- Fixed cyclic references problem in CoreBluetooth backend causing memory leaks.

- Fixed typehint for `BleakScanner.__aexit__()`.

### Removed

- Removed undocumented/deprecated `device` keyword argument from `BleakScannerBlueZDBus` and `BleakClientBlueZDBus`.

## 2.1.1 (2025-12-31)

### Changed

- Changed default connect timeout for `BleakClient` from 10 to 30 seconds.

### Fixed

- Fixed some cases of `BleakError: Could not get GATT services: Unreachable` in WinRT backend by adding a retry when getting GATT services.

## 2.1.0 (2025-12-28)

### Added

- Added `bluez` parameter to `BleakClient.start_notify()` to allow forcing using “StartNotify” instead of “AcquireNotify” on BlueZ backend. Fixes #1885.

- Added `bleak.args.SizedBuffer` type for better type hinting of buffer protocol parameters.

### Fixed

- Fixed calling `logging.debug()` in WinRT backend. Fixes #1882.

- Fixed calling `logging.warning()` in BlueZ backend.

## 2.0.0 (2025-11-22)

### Added

- Added `bleak.backends.get_default_backend()` and `BleakBackend` enum for a centralized backend detection.

- Added `BleakClient().backend_id` and `BleakScanner().backend_id` properties to identify the backend in use.

### Changed

- Use `"AcquireNotify"` rather than `"StartNotify"` for Linux backend on supported characteristics

- Allow multiple calls to `disconnect()` on Windows to align behavior over all backends.

- Raise new `BleakBluetoothNotAvailableError` when Bluetooth is not supported, turned off or permission is denied.

### Fixed

- Fixed potential race condition causing timeout while connecting in WinRT backend.

- Fixed file handle leak in BlueZ backend when D-Bus connection is lost and re-established.

- Fixed crash in CoreBluetooth backend if an ObjC delegate callback is called after the asyncio run loop stops.

- Fixed possible deadlock when starting scanning on Windows when Bluetooth is turned off.

- Fixed “Bluetooth device is turned off” Exception on macOS, when a Bluetooth permission request popup is shown to the user by the OS.

### Removed

- Removed support for Python 3.9.

- Removed support for macOS < 10.15.

## 1.1.1 (2025-09-07)

### Fixed

- Fixed D-Bus connection leak on connection failure in BlueZ backend.

- Fixed characteristic’s max write without response size using wrong characteristic’s value. Fixes #1820.

- Fixed `AttributeError` in Python4Android backend when accessing `is_connected` before connecting. Fixes #1791.

## 1.1.0 (2025-08-10)

### Added

- Added support for Pythonista iOS app backend.

- Added `BleakClient.name` property for getting the peripheral’s name. Fixes #1802.

### Fixed

- Fixed `BleakClient.connect()` on Android when service characteristics have descriptors. Fixes #1803.

- Fixed disconnect callback not called on Windows when Bleak initiates disconnection.

## 1.0.1 (2025-06-30)

### Changed

- Added deprecation warnings for importing `bleak.args.*` types from `bleak.backends.*`.

### Fixed

- Restored `**kwargs` in `BLEDevice()` constructor. Fixes #1783.

- Restored importing `OrPattern` from `bleak.backends.bluezdbus.advertisement_monitor`.

## 1.0.0 (2025-06-28)

### Added

- Added `pair` parameter to `BleakClient()` constructor to allow pairing before connecting. Fixes #309.

- Added `notification_discriminator` parameter to `start_notify()` on CoreBluetooth backend. Merged #1742.

### Changed

- Enabled extended advertising scanning in the WinRT backend. Merged #1705.

- Made response argument of class `BleakClient.write_gatt_char()` explicitly optional. Fixes #1730.

- Updated Poetry build system version to `>=2.0`. Merged #1718.

- Log to stderr instead of stdout when `BLEAK_LOGGING` is enabled. Merged #1709.

- Updated `winrt` backend to use PyWinRT >= 3.1.

- Changed return type of `connect()`, `disconnect()`, `pair()` and `unpair()` methods to `None`.

- Moved backend-specific arg types to new `bleak.args` sub-package.

- `BLEDevice.name` will now return `None` instead of the address when the name is not available. Merged #1762.

- Deprecated `protection_level` kwarg for pairing in WinRT backend. Merged #1770.

### Fixed

- Fixed resolvable private address not updated after connecting in BlueZ backend. Fixes #1737.

- Fixed possible `KeyError` when getting services in BlueZ backend. Fixes #1435.

- Fix D-Bus connection leak when connecting to a device fails in BlueZ backend. Fixes #1698.

- Fixed possible deadlock when connecting on WinRT backend when device is already connected. Fixes #1757.

- Fixed getting notifications from devices connected to BLE adapters with index >9 (hci10, hci11, …). Merged #1744.

- Fixed ATT error code 15 description to “Insufficient Encryption”. Merged #1746.

### Removed

- Removed support for Python 3.8. The minimum supported version is now Python 3.9.

- Removed deprecated parameters, properties and methods.

- Removed support for macOS < 10.13.

- Removed support for BlueZ < 5.55.

## 0.22.3 (2024-10-05)

### Changed

- Don’t change ctypes’ global state `bleak.backends.winrt.util`.

- Improved performance of BlueZ backend when there are many adapters.

- Added support for Python 3.13.

## 0.22.2 (2024-06-01)

### Changed

- Retrieve the BLE address required by `BleakClientWinRT` from scan response if advertising is None (WinRT).

- Changed type hint for `adv` attribute of `bleak.backends.winrt.scanner._RawAdvData`.

- `BleakGATTCharacteristic.max_write_without_response_size` is now dynamic.

### Fixed

- Fixed `discovered_devices_and_advertisement_data` returning devices that should be filtered out by service UUIDs. Fixes #1576.

- Fixed a `Descriptor None was not found!` exception occurring in `start_notify()` on Android. Fixes #823.

- Fixed exception raised when starting `BleakScanner` while running in a Windows GUI app.

## 0.22.1 (2024-05-07)

### Added

- Added `bleak.backends.winrt.util.allow_sta()` method to allow integration with graphical user interfaces on Windows. Fixes #1565.

## 0.22.0 (2024-05-04)

### Added

- Added `BleakCharacteristicNotFoundError` which is raised if a device does not support a characteristic.

- Added utility function to work around `pywin32` setting threading model to STA on Windows.

### Changed

- Updated PyObjC dependency on macOS to v10.x.

- Updated missing Bluetooth SIG characteristics and service UUIDs.

- Updated `BlueZManager` to remove empty interfaces from _properties during InterfacesRemoved message.

- Updated PyWinRT dependency to v2. Fixes #1529.

- Raise exception when trying to scan while in a single-treaded apartment (STA) on Windows. Fixes #1132.

### Fixed

- Fixed BlueZ version in passive scanning error message. Fixes #1433.

- Fixed mypy requiring `Unpack[ExtraArgs]` that were intended to be optional. Fixes #1487.

- Fixed `KeyError` in BlueZ `is_connected()` and `get_global_bluez_manager()` when device is not present. Fixes #1507.

- Fixed BlueZ `_wait_removed` completion on invalid object path. Fixes #1489.

- Fixed rare unhandled exception when scanning on macOS when using `use_bdaddr`. Fixes #1523.

- Fixed scanning silently failing on Windows when Bluetooth is off. Fixes #1535.

- Fixed using wrong value for `tx_power` in Android backend. Fixes #1532.

- Fixed 4-character UUIDs not working on `BleakClient.*_gatt_char` methods. Fixes #1498.

- Fixed race condition with getting max PDU size on Windows. Fixes #1497. [REVERTED in v0.22.2]

- Fixed filtering advertisement data by service UUID when multiple apps are scanning. Fixes #1534.

## 0.21.1 (2023-09-08)

### Changed

- Changed `dbus-fast` dependency to include v2.x. Fixes #1412.

## 0.21.0 (2023-09-02)

### Added

- Added `bleak.uuids.normalize_uuid_16()` function.

- Added `bleak.uuids.normalize_uuid_32()` function.

- Added `advertisement_data()` async iterator method to `BleakScanner`. Merged #1361.

- Added type hints for kwargs on `BleakScanner` class methods.

- Added support for Python 3.12.

### Changed

- Improved error messages when failing to get services in WinRT backend.

- Improved error messages with enum values in WinRT backend. Fixes #1284.

- Scanner backends modified to allow multiple advertisement callbacks. Merged #1367.

- Changed default handling of the `response` argument in `BleakClient.write_gatt_char`. Fixes #909.

- Bleak recipe now automatically installs bleak from GitHub release in Kivy example.

- Changed BlueZManager methods to raise BleakError when device is not in BlueZ.

- Optimized BlueZ backend device watchers and condition callbacks to avoid linear searches.

- Changed type hint for buffer protocol to `collections.abc.Buffer`.

### Fixed

- Fixed handling all access denied errors when enumerating characteristics on Windows. Fixes #1291.

- Added support for 32bit UUIDs. Fixes #1314.

- Fixed typing for `BaseBleakScanner` detection callback.

- Fixed possible crash in `_stopped_handler()` in WinRT backend. Fixes #1330.

- Reduced expensive logging in the BlueZ backend. Merged #1376.

- Fixed race condition with `"InterfaceRemoved"` when getting services in BlueZ backend.

- Fixed missing permissions and requirements in android Kivy example. Fixes #1184.

- Fixed WinRT backend sometimes hanging forever when a device goes out of range during connection. Fixes #1359.

### Removed

Dropped support for Python 3.7.

## 0.20.2 (2023-04-19)

### Fixed

- Fixed `org.bluez.Error.InProgress` in characteristic and descriptor read and write methods in BlueZ backend.

- Fixed `OSError: [WinError -2147483629] The object has been closed` when connecting on Windows. Fixes #1280.

## 0.20.1 (2023-03-24)

### Fixed

- Fixed possible garbage collection of running async callback from `BleakClient.start_notify()`.

- Fixed possible garbage collection of running async callback from `BleakScanner(detection_callback=)`.

- Fixed possible garbage collection of disconnect monitor in BlueZ backend. Fixed #1258.

## 0.20.0 (2023-03-17)

### Added

- Added `BLEAK_DBUS_AUTH_UID` environment variable for hardcoding D-Bus UID. Merged #1182.

- Added return type `None` to some scanner methods.

- Added optional hack to use Bluetooth address instead of UUID on macOS. Merged #1073.

- Added `BleakScanner.find_device_by_name()` class method.

- Added optional command line argument to use debug log level to all applicable examples.

- Added `bleak.uuids.normalize_uuid_str()` function.

- Added optional `services` argument to `BleakClient()` to filter services. Merged #654.

- Added automatic retry on `le-connection-abort-by-local` in BlueZ backend. Fixes #1220.

### Changed

- Dropped `async-timeout` dependency on Python >= 3.11.

- Deprecated `BLEDevice.rssi` and `BLEDevice.metadata`. Fixes #1025.

- `BLEDevice` now uses `__slots__` to reduce memory usage. Merged #1117.

- `BaseBleakClient.services` is now `None` instead of empty service collection until services are discovered.

- Include thread name in `BLEAK_LOGGING` output. Merged #1144.

- Updated PyObjC dependency on macOS to v9.x.

### Fixed

- Fixed invalid UTF-8 in `uuids.uuid16_dict`.

- Fixed `AttributeError` in `_ensure_success` in WinRT backend.

- Fixed `BleakScanner.stop()` can raise `BleakDBusError` with `org.bluez.Error.NotReady` in BlueZ backend.

- Fixed `BleakScanner.stop()` hanging in WinRT backend when Bluetooth is disabled.

- Fixed leaking services when `get_services()` is cancelled in WinRT backend.

- Fixed disconnect monitor task not always cancelled on the BlueZ client. Merged #1159.

- Fixed WinRT scanner never calling `detection_callback` when a device does not send a scan response. Fixes #1211.

- Fixed `BLEDevice` name sometimes incorrectly `None`.

- Fixed unhandled exception in `CentralManagerDelegate` destructor on macOS. Fixes #1219.

- Fixed object passed to `disconnected_callback` is not `BleakClient`. Fixes #1200.

## 0.19.5 (2022-11-19)

### Fixed

- Fixed more issues with getting services in WinRT backend.

## 0.19.4 (2022-11-06)

### Fixed

- Fixed `TypeError` in WinRT backend introduced in v0.19.3.

## 0.19.3 (2022-11-06)

### Fixed

- Fixed `TimeoutError` when connecting to certain devices with WinRT backend. Fixes #604.

## 0.19.2 (2022-11-06)

### Fixed

- Fixed crash when getting services in WinRT backend in Python 3.11. Fixes #1112.

- Fixed cache mode when retrying get services in WinRT backend. Merged #1102.

- Fixed `KeyError` crash in BlueZ backend when removing non-existent property. Fixes #1107.

## 0.19.1 (2022-10-29)

### Fixed

- Fixed crash in Android backend introduced in v0.19.0. Fixes #1085.

- Fixed service discovery blocking forever if device disconnects in BlueZ backend. Merged #1092.

- Fixed `AttributeError` crash when scanning on Windows builds < 19041. Fixes #1094.

## 0.19.0 (2022-10-13)

### Added

- Added support for Python 3.11. Merged #990.

- Added better error message for Bluetooth not authorized on macOS. Merged #1033.

- Added `BleakDeviceNotFoundError` which should is raised if a device can not be found by `connect`, `pair` and `unpair`. Merged #1022.

- Added `rssi` attribute to `AdvertisementData`. Merged #1047.

- Added `BleakScanner.discovered_devices_and_advertisement_data` property. Merged #1047.

- Added `return_adv` argument to `BleakScanner.discover` method. Merged #1047.

- Added `BleakClient.unpair()` implementation for BlueZ backend. Merged #1067.

### Changed

- Changed `AdvertisementData` to a named tuple. Merged #1047.

- A faster `unpack_variants` is now provided by dbus-fast. Merged #1055.

### Fixed

- On BlueZ, support creating additional instances running on a different event loops (i.e. multiple pytest-asyncio cases). Merged #1034.

- Fixed unhandled exception in `max_pdu_size_changed_handler` in WinRT backend. Fixes #1039.

- Fixed stale services in WinRT backend causing `WinError -2147483629`. Fixes #1061.

### Removed

Removed `bleak.__version__`. Use `importlib.metadata.version('bleak')` instead.

## 0.18.1 (2022-09-25)

### Fixed

- Reverted unintentional breaking parameter name changes. Fixes #1028.

## 0.18.0 (2022-09-23)

### Changed

- Relaxed `async-timeout` dependency version to support different installations. Merged #1009.

- `BleakClient.unpair()` in WinRT backend can be called without being connected first. Merged #1012.

- Use relative imports internally. Merged #1007.

- `BleakScanner` and `BleakClient` are now concrete classes. Fixes #582.

- Deprecated `BleakScanner.register_detection_callback()`.

- Deprecated `BleakScanner.set_scanning_filter()`.

- Deprecated `BleakClient.set_disconnected_callback()`.

- Deprecated `BleakClient.get_services()`.

- Refactored common code in `BleakClient.start_notify()`.

- (BREAKING) Changed notification callback argument from `int` to `BleakGattCharacteristic`. Fixes #759.

### Fixed

- Fixed `tx_power` not included in `AdvertisementData.__repr__` when 0. Merged #1017.

## 0.17.0 (2022-09-12)

### Added

- `AdvertisementData` class now has an attribute `tx_power`. Merged #987.

### Changed

- `BleakClient` methods now raise `BleakError` if called when not connected in WinRT backend. Merged #973.

- Extended disconnect timeout to 120 seconds in WinRT backend. Fixes #807.

- Changed version check for BlueZ battery workaround to exclude versions >= 5.55. Merged #976.

- Use Poetry for build system and dependencies. Merged #978.

- The BlueZ D-Bus backend implements a services cache between connections to significancy improve reconnect performance. To use the cache, call `connect` and `get_services` with the `dangerous_use_bleak_cache` argument to avoid services being resolved again. Merged #923.

- The BlueZ D-Bus backend now uses `dbus-fast` package instead of `dbus-next` which significantly improves performance. Merged #988.

- The BlueZ D-Bus backend will not avoid trying to connect to devices that are already connected. Fixes #992.

- Updated logging to lazy version and replaced format by f-string for `BleakClientWinRT`. #1000.

- Added deprecation warning to `discover()` method. Merged #1005.

- BlueZ adapter is chosen dynamically if not provided, instead of using hardcoded “hci0”. Fixes #513.

### Fixed

- Fixed wrong error message for BlueZ “Operation failed with ATT error”. Merged #975.

- Fixed possible `AttributeError` when enabling notifications for battery service in BlueZ backend. Merged #976.

- Fixed use of wrong enum in unpair function of WinRT backend. Merged #986.

- Fixed inconsistent return types for `properties` and `descriptors` properties of `BleakGATTCharacteristic`. Merged #989.

- Handle device being removed before `GetManagedObjects` returns in BlueZ backend. Fixes #996.

- Fixed crash in `max_pdu_size_changed_handler` in WinRT backend. Fixes #998.

- Fixes a race in the BlueZ D-Bus backend where the disconnect monitor would be removed before it could be awaited. Merged #999.

### Removed

- Removed `BLEDeviceCoreBluetooth` type from CoreBluetooth backend. Merged #977.

## 0.16.0 (2022-08-31)

### Added

- Added `BleakGattCharacteristic.max_write_without_response_size` property. Fixes #738.

### Fixed

- Fixed regression in v0.15 where devices removed from BlueZ while scanning were still listed in `BleakScanner.discovered_devices`. Fixes #942.

- Fixed possible bad connection state in BlueZ backend. Fixes #951.

### Changed

- Made BlueZ D-Bus signal callback logging lazy to improve performance. Merged #912.

- Switch to using `async_timeout` instead of `asyncio.wait_for for performance`. Merged #916.

- Improved performance of `BlueZManager.get_services()`. Fixes #927.

### Removed

- Removed explicit inheritance from object in class declarations. Merged #922.

- Removed first seen filter in `BleakScanner` detection callbacks on BlueZ backend. Merged #964.

## 0.15.1 (2022-08-03)

### Fixed

- The global BlueZ manager now disconnects correctly on exception. Merged #918.

- Handle the race in the BlueZ D-Bus backend where the device disconnects during the connection process which presented as `Failed to cancel connection`. Merged #919.

- Ensure the BlueZ D-Bus scanner can reconnect after DBus disconnection. Merged #920.

- Adjust default timeout for `read_gatt_char()` with CoreBluetooth to 20s. Fixes #926.

## 0.15.0 (2022-07-29)

### Added

- Added new `assigned_numbers` module and `AdvertisementDataType` enum.

- Added new `bluez` kwarg to `BleakScanner` in BlueZ backend.

- Added support for passive scanning in the BlueZ backend. Fixes #606.

- Added option to use cached services, characteristics and descriptors in WinRT backend. Fixes #686.

- Added `PendingDeprecationWarning` to use of `address_type` as keyword argument. It will be moved into the `winrt` keyword instead according to #623.

- Added better error message when adapter is not present in BlueZ backend. Fixes #889.

### Changed

- Add `py.typed` file so mypy discovers Bleak’s type annotations.

- UUID descriptions updated to 2022-03-16 assigned numbers document.

- Replace use of deprecated `asyncio.get_event_loop()` in Android backend.

- Adjust default timeout for `read_gatt_char()` with CoreBluetooth to 10s. Merged #891.

- `BleakScanner()` args `detection_callback` and `service_uuids` are no longer keyword-only.

- `BleakScanner()` arg `scanning_mode` is no longer Windows-only and is no longer keyword-only.

- All `BleakScanner()` instances in BlueZ backend now use common D-Bus object manager.

- Deprecated `filters` kwarg in `BleakScanner` in BlueZ backend.

- BlueZ version is now checked on first connection instead of import to avoid import side effects. Merged #907.

### Fixed

- Documentation fixes.

- On empty characteristic description from WinRT, use the lookup table instead of returning empty string.

- Fixed detection of first advertisement in BlueZ backend. Merged #903.

- Fixed performance issues in BlueZ backend caused by calling “GetManagedObjects” each time a `BleakScanner` scans or `BleakClient` is connected. Fixes #500.

- Fixed not handling “InterfacesRemoved” in `BleakClient` in BlueZ backend. Fixes #882.

- Fixed leaking D-Bus socket file descriptors in BlueZ backend. Fixes #805.

### Removed

- Removed fallback to call “ConnectDevice” when “Connect” fails in Bluez backend. Fixes #806.

## 0.14.3 (2022-04-29)

### Changed

- Suppress macOS 12 scanner bug error message for macOS 12.3 and higher. Fixes #720.

- Added filters `Discoverable` and `Pattern` to BlueZ D-Bus scanner. Fixes #790.

### Fixed

- Fixed reading the battery level returns a zero-filled `bytearray` on BlueZ >= 5.48. Fixes #750.

- Fixed unpairing does not work on windows with WinRT. Fixes #699

- Fixed leak of `_disconnect_futures` in `CentralManagerDelegate`.

- Fixed callback not removed from `_disconnect_callbacks` on disconnect in `CentralManagerDelegate`.

## 0.14.2 (2022-01-26)

### Changed

- Updated `bleak-winrt` dependency to v1.1.1. Fixes #741.

### Fixed

- Fixed `name` is `'Unknown'` in WinRT backend. Fixes #736.

## 0.14.1 (2022-01-12)

### Fixed

- Fixed `AttributeError` when passing `BLEDevice` to `BleakClient` constructor on WinRT backend. Fixes #731.

## 0.14.0 (2022-01-10)

### Added

- Added `service_uuids` kwarg to `BleakScanner`. This can be used to work around issue of scanning not working on macOS 12. Fixes #230. Works around #635.

- Added UUIDs for LEGO Powered Up Smart Hubs.

### Changed

- Changed WinRT backend to use GATT session status instead of actual device connection status.

- Changed handling of scan response data on WinRT backend. Advertising data and scan response data is now combined in callbacks like other platforms.

- Updated `bleak-winrt` dependency to v1.1.0. Fixes #698.

### Fixed

- Fixed `InvalidStateError` in CoreBluetooth backend when read and notification of the same characteristic are used. Fixes #675.

- Fixed reading a characteristic on CoreBluetooth backend also triggers notification callback.

- Fixed in Linux, scanner callback not setting metadata parameters. Merged #715.

## 0.13.0 (2021-10-20)

### Added

- Allow 16-bit UUID string arguments to `get_service()` and `get_characteristic()`.

- Added `register_uuids()` to augment the uuid-to-description mapping.

- Added support for Python 3.10.

- Added `force_indicate` keyword argument for WinRT backend client’s `start_notify` method. Fixes #526.

- Added python-for-android backend.

### Changed

- Changed from `winrt` dependency to `bleak-winrt`.

- Improved error when connecting to device fails in WinRT backend. Fixes #647.

- Changed examples to use `asyncio.run()`.

- Changed the default notify method for the WinRT backend from `Indicate` to `Notify`.

- Refactored GATT error handling in WinRT backend.

- Changed Windows Bluetooth packet capture instructions. Fixes #653.

- Replaced usage of deprecated `@abc.abstractproperty`.

- Use `asyncio.get_running_loop()` instead of `asyncio.get_event_loop()`.

- Changed “service is already present” exception to logged error in BlueZ backend. Merged #622.

- WinRT backend no longer waits for GATT session to close on disconnect. Fixes #1759.

### Removed

- Removed `dotnet` backend.

- Dropped support for Python 3.6.

- Removed `use_cached` kwarg from `BleakClient` `connect()` and `get_services()` methods. Fixes #646.

### Fixed

- Fixed unused timeout in the implementation of BleakScanner’s `find_device_by_address()` function.

- Fixed BleakClient ignoring the `adapter` kwarg. Fixes #607.

- Fixed writing descriptors in WinRT backend. Fixes #615.

- Fixed race on disconnect and cleanup of BlueZ matches when device disconnects early. Fixes #603.

- Fixed memory leaks on Windows.

- Fixed protocol error code descriptions on WinRT backend. Fixes #532.

- Fixed race condition hitting assentation in BlueZ `disconnect()` method. Fixes #641.

- Fixed enumerating services on a device with HID service on WinRT backend. Fixes #599.

- Fixed subprocess running to check BlueZ version each time a client is created. Fixes #602.

- Fixed exception when discovering services after reconnecting in CoreBluetooth backend.

## 0.12.1 (2021-07-07)

### Changed

- Changed minimum `winrt` package version to 1.0.21033.1. Fixes #589.

### Fixed

- Fixed unawaited future when writing without response on CoreBluetooth backend. Fixes #586.

## 0.12.0 (2021-06-19)

### Added

- Added `mtu_size` property for clients.

- Added WinRT backend.

- Added `BleakScanner.discovered_devices` property.

- Added an event to await when stopping scanners in WinRT and pythonnet backends. Fixes #556.

- Added `BleakScanner.find_device_by_filter` static method.

- Added `scanner_byname.py` example.

- Added optional command line argument to specify device to all applicable examples.

### Changed

- Added `Programming Language :: Python :: 3.9` classifier in `setup.py`.

- Deprecated `BleakScanner.get_discovered_devices()` async method.

- Added capability to handle async functions as detection callbacks in `BleakScanner`.

- Added error description in addition to error name when `BleakDBusError` is converted to string.

- Change typing of data parameter in write methods to `Union[bytes, bytearray, memoryview]`.

- Improved type hints in CoreBluetooth backend.

- Use delegate callbacks for `get_rssi()` on CoreBluetooth backend.

- Use `@objc.python_method` where possible in `PeripheralDelegate` class.

- Using ObjC key-value observer to wait for `BleakScanner.start()` and `stop()` in CoreBluetooth backend.

### Fixed

- Fixed `KeyError` when trying to connect to `BLEDevice` from advertising data callback on macOS. Fixes #448.

- Handling of undetected devices in `connect_by_bledevice.py` example. Fixes #487.

- Added `Optional` typehint for `BleakScanner.find_device_by_address`.

- Fixed `linux_autodoc_mock_import` in `docs/conf.py`.

- Minor fix for disconnection event handling in BlueZ backend. Fixes #491.

- Corrections for the Philips Hue lamp example. Merged #505.

- Fixed `BleakClientBlueZDBus.pair()` method always returning `True`. Fixes #503.

- Fixed waiting for notification start/stop to complete in CoreBluetooth backend.

- Fixed write without response on BlueZ < 5.51.

- Fixed error propagation for CoreBluetooth events.

- Fixed failed import on CI server when BlueZ is not installed.

- Fixed notification `value` should be `bytearray` on CoreBluetooth. Fixes #560.

- Fixed crash when cancelling connection when Python runtime shuts down on CoreBluetooth backend. Fixes #538.

- Fixed connecting to multiple devices using a single `BleakScanner` on CoreBluetooth backend.

- Fixed deadlock in CoreBluetooth backend when device disconnects while callbacks are pending. Fixes #535.

- Fixed deadlock when using more than one service, characteristic or descriptor with the same UUID on CoreBluetooth backend.

- Fixed exception raised when calling `BleakScanner.stop()` when already stopped in CoreBluetooth backend.

## 0.11.0 (2021-03-17)

### Added

- Updated `dotnet.client.BleakClientDotNet` connect method docstring.

- Added `AdvertisementServiceData` in BLEDevice in macOS devices

- Protection levels (encryption) in Windows backend pairing. Solves #405.

- Philips Hue lamp example script. Relates to #405.

- Keyword arguments to `get_services` method on `BleakClient`.

- Keyword argument `use_cached` on .NET backend, to enable uncached reading of services, characteristics and descriptors in Windows.

- Documentation on troubleshooting OS level caches for services.

- New example added: Async callbacks with a queue and external consumer

- `handle` property on `BleakGATTService` objects

- `service_handle` property on `BleakGATTCharacteristic` objects

- Added more specific type hints for `BleakGATTServiceCollection` properties.

- Added `asyncio` task to disconnect devices on event loop crash in BlueZ backend.

- Added filtering on advertisement data callbacks on BlueZ backend so that callbacks only occur when advertising data changes like on macOS backend.

- Added fallback to try `org.bluez.Adapter1.ConnectDevice` when trying to connect a device in BlueZ backend.

- Added UART service example.

### Fixed

- Fixed wrong OS write method called in `write_gatt_descriptor()` in Windows backend. Merged #403.

- Fixed `BaseBleakClient.services_resolved` not reset on disconnect on BlueZ backend. Merged #401.

- Fixed RSSI missing in discovered devices on macOS backend. Merged #400.

- Fixed scan result shows ‘Unknown’ name of the `BLEDevice`. Fixes #371.

- Fixed a broken check for the correct adapter in `BleakClientBlueZDBus`.

- Fixed #445 and #362 for Windows.

### Changed

- Using handles to identify the services. Added handle abstract property to BleakGATTService and storing the services by handle instead of UUID.

- Changed `BleakScanner.set_scanning_filter()` from async method to normal method.

- Changed BlueZ backend to use `dbus-next` instead of `txdbus`.

- Changed `BleakClient.is_connected` from async method to property.

- Consolidated D-Bus signal debug messages in BlueZ backend.

### Removed

- Removed all `__str__` methods from backend service, characteristic and descriptor implementations in favour of those in the abstract base classes.

## 0.10.0 (2020-12-11)

### Added

- Added `AdvertisementData` class used with detection callbacks across all supported platforms. Merged #334.

- Added `BleakError` raised during import on unsupported platforms.

- Added `rssi` parameter to `BLEDevice` constructor.

- Added `detection_callback` kwarg to `BleakScanner` constructor.

### Changed

- Updated minimum PyObjC version to 7.0.1.

- Consolidated implementation of `BleakScanner.register_detection_callback()`. All platforms now take callback with `BLEDevice` and `AdvertisementData` arguments.

- Consolidated `BleakScanner.find_device_by_address()` implementations.

- Renamed “device” kwarg to “adapter” in BleakClient and BleakScanner. Fixes #381.

### Fixed

- Fixed use of bare exceptions.

- Fixed `BleakClientBlueZDBus.start_notify()` misses initial notifications with fast Bluetooth devices. Fixed #374.

- Fix event callbacks on Windows not running in asyncio event loop thread.

- Fixed `BleakScanner.discover()` on older versions of macOS. Fixes #331.

- Fixed disconnect callback on BlueZ backend.

- Fixed calling `BleakClient.is_connected()` on Mac before connection.

- Fixed kwargs ignored in `BleakScanner.find_device_by_address()` in BlueZ backend. Fixes #360.

### Removed

- Removed duplicate definition of `BLEDevice` in BlueZ backend.

- Removed unused imports.

- Removed separate implementation of global `discover` method.

## 0.9.1 (2020-10-22)

### Added

- Added new attribute `_device_info` on `BleakClientBlueZDBus`. Merges #347.

- Added Pull Request Template.

### Changed

- Updated instructions on how to contribute, file issues and make PRs.

- Updated `AUTHORS.rst` file with development team.

### Fixed

- Fix well-known services not converted to UUIDs in `BLEDevice.metadata` in CoreBluetooth backend. Fixes #342.

- Fix advertising data replaced instead of merged in scanner in CoreBluetooth backend. Merged #343.

- Fix CBCentralManager not properly waited for during initialization in some cases.

- Fix AttributeError in CoreBluetooth when using BLEDeviceCoreBluetooth object.

## 0.9.0 (2020-10-20)

### Added

- Timeout for BlueZ backend connect call to avoid potential infinite hanging. Merged #306.

- Added Interfaces API docs again.

- Troubleshooting documentation.

- noqa flags added to `BleakBridge` imports.

- Adding a timeout on OSX so that the connect cannot hang forever. Merge #336.

### Changed

- `BleakCharacteristic.description()` on .NET now returns the same value as other platforms.

- Changed all adding and removal of .NET event handler from `+=`/`-=` syntax to calling `add_` and `remove_` methods instead. This allows for proper removal of event handlers in .NET backend.

- All code dependence on the `BleakBridge` is now removed. It is only imported to allow for access to UWP namespaces.

- Removing internal method `_start_notify` in the .NET backend.

- `GattSession` object now manages lifetime of .NET `BleakClient` connection.

- `BleakClient` in .NET backend will reuse previous device information when reconnecting so that it doesn’t have to scan/discover again.

### Fixed

- UUID property bug fixed in BlueZ backend. Merged #307.

- Fix for broken RTD documentation.

- Fix UUID string arguments should not be case sensitive.

- Fix `BleakGATTService.get_characteristic()` method overridden with `NotImplementedError` in BlueZ backend.

- Fix `AttributeError` when trying to connect using CoreBluetooth backend. Merged #323.

- Fix disconnect callback called multiple times in .NET backend. Fixes #312.

- Fix `BleakClient.disconnect()` method failing when called multiple times in .NET backend. Fixes #313.

- Fix `BleakClient.disconnect()` method failing when called multiple times in Core Bluetooth backend. Merge #333.

- Catch RemoteError in `is_connected` in BlueZ backend. Fixes #310,

- Prevent overwriting address in constructor of `BleakClient` in BlueZ backend. Merge #311.

- Fix nordic uart UUID. Merge #339.

## 0.8.0 (2020-09-22)

### Added

- Implemented `set_disconnected_callback` in the .NET backend `BleakClient` implementation.

- Added `find_device_by_address` method to the `BleakScanner` interface, for stopping scanning when a desired address is found.

- Implemented `find_device_by_address` in the .NET backend `BleakScanner` implementation and switched its `BleakClient` implementation to use that method in `connect`.

- Implemented `find_device_by_address` in the BlueZ backend `BleakScanner` implementation and switched its `BleakClient` implementation to use that method in `connect`.

- Implemented `find_device_by_address` in the Core Bluetooth backend `BleakScanner` implementation and switched its `BleakClient` implementation to use that method in `connect`.

- Added text representations of Protocol Errors that are visible in the .NET backend. Added these texts to errors raised.

- Added pairing method in `BleakClient` interface.

- Implemented pairing method in .NET backend.

- Implemented pairing method in the BlueZ backend.

- Added stumps and `NotImplementedError` on pairing in macOS backend.

- Added the possibility to connect using `BLEDevice` instead of a string address. This allows for skipping the discovery call when connecting.

### Removed

- Support for Python 3.5.

### Changed

- BREAKING CHANGE All notifications now have the characteristic’s integer handle instead of its UUID as a string as the first argument `sender` sent to notification callbacks. This provides the uniqueness of sender in notifications as well.

- Renamed `BleakClient` argument `address` to `address_or_ble_device`.

- Version 0.5.0 of BleakUWPBridge, with some modified methods and implementing `IDisposable`.

- Merged #224. All storing and passing of event loops in bleak is removed.

- Removed Objective C delegate compliance checks. Merged #253.

- Made context managers for .NET `DataReader` and `DataWriter`.

### Fixed

- .NET backend loop handling bug entered by #224 fixed.

- Removed default `DEBUG` level set to bleak logger. Fixes #251.

- More coherency in logger uses over all backends. Fixes #258

- Attempted fix of #255 and #133: cleanups, disposing of objects and creating new `BleakBridge` instances each disconnect.

- Fixed some type hints and docstrings.

- Modified the `connected_peripheral_delegate` handling in macOS backend to fix #213 and #116.

- Merged #270, fixing a critical bug in `get_services` method in Core Bluetooth backend.

- Improved handling of disconnections and `is_connected` in BlueZ backend to fix #259.

- Fix for `set_disconnected_callback` on Core Bluetooth. Fixes #276.

- Safer Core Bluetooth presence check. Merged #280.

## 0.7.1 (2020-07-02)

### Changed

- Improved, more explanatory error on BlueZ backend when `BleakClient` cannot find the desired device when trying to connect. (#238)

- Better-than-nothing documentation about scanning filters added (#230).

- Ran black on code which was forgotten in 0.7.0. Large diffs due to that.

- Re-adding Python 3.8 CI “tests” on Windows again.

### Fixed

- Fix when characteristic updates value faster than asyncio schedule (#240 & #241)

- Incorrect `MANIFEST.in` corrected. (#244)

## 0.7.0 (2020-06-30)

### Added

- Better feedback of communication errors to user in .NET backend and implementing error details proposed in #174.

- Two devices example file to use for e.g. debugging.

- Detection/discovery callbacks in Core Bluetooth backend `Scanner` implemented.

- Characteristic handle printout in `service_explorer.py`.

- Added scanning filters to .NET backend’s `discover` method.

### Changed

- Replace `NSRunLoop` with dispatch queue in Core Bluetooth backend. This causes callbacks to be dispatched on a background thread instead of on the main dispatch queue on the main thread. `call_soon_threadsafe()` is used to synchronize the events with the event loop where the central manager was created. Fixes #111.

- The Central Manager is no longer global in the Core Bluetooth backend. A new one is created for each `BleakClient` and `BleakScanner`. Fixes #206 and #105.

- Merged #167 and reworked characteristics handling in Bleak. Implemented in all backends; bleak now uses the characteristics’ handle to identify and keep track of them. Fixes #139 and #159 and allows connection for devices with multiple instances of the same characteristic UUIDs.

- In `requirements.txt` and `Pipfile`, the requirement on `pythonnet` was bumped to version 2.5.1, which seems to solve issues described in #217 and #225.

- Renamed `HISTORY.rst` to `CHANGELOG.rst` and adopted the Keep a Changelog format.

- Python 3.5 support from macOS is officially removed since pyobjc>6 requires 3.6+

- Pin `pyobjc` dependencies to use at least version 6.2. (PR #194)

- Pin development requirement on bump2version to version 1.0.0

- Added `.pyup.yml` for Pyup

- Using CBManagerState constants from pyobj instead of integers.

### Removed

- Removed documentation note about not using new event loops in Linux. This was fixed by #143.

- `_central_manager_delegate_ready` was removed in macOS backend.

- Removed the `bleak.backends.bluez.utils.get_gatt_service_path` method. It is not used by bleak and possibly generates errors.

### Fixed

- Improved handling of the txdbus connection to avoid hanging of disconnection clients in BlueZ backend. Fixes #216, #219 & #221.

- #150 hints at the device path not being possible to create as is done in the get_device_object_path method. Now, we try to get it from BlueZ first. Otherwise, use the old fallback.

- Minor documentation errors corrected.

- `CBManagerStatePoweredOn` is now properly handled in Core Bluetooth.

- Device enumeration in `discover``and ``Scanner` corrected. Fixes #211

- Updated documentation about scanning filters.

- Added workaround for `isScanning` attribute added in macOS 10.13. Fixes #234.

## 0.6.4 (2020-05-20)

### Fixed

- Fix for bumpversion usage

## 0.6.3 (2020-05-20)

### Added

- Building and releasing from Github Actions

### Removed

- Building and releasing on Azure Pipelines

## 0.6.2 (2020-05-15)

### Added

- Added `disconnection_callback` functionality for Core Bluetooth (#184 & #186)

- Added `requirements.txt`

### Fixed

- Better cleanup of Bluez notifications (#154)

- Fix for `read_gatt_char` in Core Bluetooth (#177)

- Fix for `is_disconnected` in Core Bluetooth (#187 & #185)

- Documentation fixes

## 0.6.1 (2020-03-09)

### Fixed

- Including #156, lost notifications on macOS backend, which was accidentally missed on previous release.

## 0.6.0 (2020-03-09)

- New Scanner object to allow for async device scanning.

- Updated `txdbus` requirement to version 1.1.1 (Merged #122)

- Implemented `write_gatt_descriptor` for Bluez backend.

- Large change in Bluez backend handling of Twisted reactors. Fixes #143

- Modified `set_disconnected_callback` to actually call the callback as a callback. Fixes #108.

- Added another required parameter to disconnect callbacks.

- Added Discovery filter option in BlueZ backend (Merged #124)

- Merge #138: comments about Bluez version check.

- Improved scanning data for macOS backend. Merge #126.

- Merges #141, a critical fix for macOS.

- Fix for #114, write with response on macOS.

- Fix for #87, DIctionary changes size on .NET backend.

- Fix for #127, uuid or str on macOS.

- Handles str/uuid for characteristics better.

- Merge #148, Run .NET backend notifications on event loop instead of main loop.

- Merge #146, adapt characteristic write log to account for WriteWithoutResponse on macOS.

- Fix for #145, Error in cleanup on Bluez backend.

- Fix for #151, only subscribe to BlueZ messages on DBus. Merge #152.

- Fix for #142, Merge #144, Improved scanning for macOS backend.

- Fix for #155, Merge #156, lost notifications on macOS backend.

- Improved type hints

- Improved error handling for .NET backend.

- Documentation fixes.

## 0.5.1 (2019-10-09)

- Active Scanning on Windows, #99 potentially solving #95

- Longer timeout in service discovery on BlueZ

- Added `timeout` to constructors and connect methods

- Fix for `get_services` on macOS. Relates to #101

- Fixes for disconnect callback on BlueZ, #86 and #83

- Fixed reading of device name in BlueZ. It is not readable as regular characteristic. #104

- Removed logger feedback in BlueZ discovery method.

- More verbose exceptions on macOS, #117 and #107

## 0.5.0 (2019-08-02)

- macOS support added (thanks to @kevincar)

- Merged #90 which fixed #89: Leaking callbacks in BlueZ

- Merged #92 which fixed #91, Prevent leaking of DBus connections on discovery

- Merged #96: Regex patterns

- Merged #86 which fixed #83 and #82

- Recovered old .NET discovery method to try for #95

- Merged #80: macOS development

## 0.4.3 (2019-06-30)

- Fix for #76

- Fix for #69

- Fix for #74

- Fix for #68

- Fix for #70

- Merged #66

## 0.4.2 (2019-05-17)

- Fix for missed part of PR #61.

## 0.4.1 (2019-05-17)

- Merging of PR #61, improvements and fixes for multiple issues for BlueZ backend

- Implementation of issue #57

- Fixing issue #59

- Documentation fixes.

## 0.4.0 (2019-04-10)

- Transferred code from the BleakUWPBridge C# support project to pythonnet code

- Fixed BlueZ >= 5.48 issues regarding Battery Service

- Fix for issue #55

## 0.3.0 (2019-03-18)

- Fix for issue #53: Windows and Python 3.7 error

- Azure Pipelines used for CI

## 0.2.4 (2018-11-30)

- Fix for issue #52: Timing issue getting characteristics

- Additional fix for issue #51.

- Bugfix for string method for BLEDevice.

## 0.2.3 (2018-11-28)

- Fix for issue #51: `dpkg-query not found on all Linux systems`

## 0.2.2 (2018-11-08)

- Made it compliant with Python 3.5 by removing f-strings

## 0.2.1 (2018-06-28)

- Improved logging on .NET discover method

- Some type annotation fixes in .NET code

## 0.2.0 (2018-04-26)

- Project added to Github

- First version on PyPI.

- Working Linux (BlueZ DBus API) backend.

- Working Windows (UWP Bluetooth API) backend.

## 0.1.0 (2017-10-23)

- Bleak created.